libmicrohttpd

HTTP/1.x server C library (MHD 1.x, stable)
Log | Files | Refs | Submodules | README | LICENSE

commit e3267428e1dde2841182018159ebbc6b4201e313
parent 3d1b499b37b4fbf244a432f0ace93df9babb6e71
Author: Christian Grothoff <christian@grothoff.org>
Date:   Thu, 23 Sep 2010 05:16:15 +0000

train hacking

Diffstat:
MChangeLog | 5+++++
MREADME | 14++++++--------
Mcontrib/coverage.sh | 1+
Msrc/daemon/daemon.c | 86++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-----------
Msrc/daemon/internal.c | 4+++-
Msrc/daemon/internal.h | 7+++++--
Msrc/include/microhttpd.h | 4++--
7 files changed, 96 insertions(+), 25 deletions(-)

diff --git a/ChangeLog b/ChangeLog @@ -1,3 +1,8 @@ +Wed Sep 22 09:48:59 CEST 2010 + Changed port argument from 'unsigned short' to 'uint16_t'. + Removed dead code when compiling with messages enabled. + Minimal unrelated code cleanup. -CG + Tue Sep 21 15:12:41 CEST 2010 Use "size_t" for buffer size instead of "int". -CG diff --git a/README b/README @@ -96,13 +96,12 @@ Untested features: Functions not covered by "make check": ====================================== -- MHD_get_connection_values -- MHD_set_connection_value -- parse_cookie_header -- parse_arguments -- MHD_del_response_header -- MHD_get_response_headers -- MHD_tls_connection_close +- file_reader (response.c); special case (sendfile) +- mhd_panic_std (daemon.c); special case (abort) +- MHD_poll (daemon.c) +- parse_options (daemon.c) +- MHD_set_panic_func (daemon.c) +- MHD_get_version (daemon.c) Missing documentation: @@ -111,4 +110,3 @@ Missing documentation: - manual: * document configuration options * document details on porting MHD (plibc, z/OS) - diff --git a/contrib/coverage.sh b/contrib/coverage.sh @@ -2,6 +2,7 @@ # make sure configure was run with coverage enabled... lcov --directory . --zerocounters make check +rm `find * -name "*_test.gc??"` `find src/testcurl -name "*.gc??"` `find src/testzzuf -name "*.gc??"` `find src/examples -name "*.gc??"` for n in `find * -name "*.gc*" | grep libs` do cd `dirname $n` diff --git a/src/daemon/daemon.c b/src/daemon/daemon.c @@ -110,9 +110,13 @@ MHD_PanicCallback mhd_panic; */ void *mhd_panic_cls; + /** * Trace up to and return master daemon. If the supplied daemon * is a master, then return the daemon itself. + * + * @param daemon handle to a daemon + * @return master daemon handle */ static struct MHD_Daemon* MHD_get_master (struct MHD_Daemon *daemon) @@ -127,19 +131,38 @@ MHD_get_master (struct MHD_Daemon *daemon) */ struct MHD_IPCount { + /** + * Address family. AF_INET or AF_INET6 for now. + */ int family; + + /** + * Actual address. + */ union { + /** + * IPv4 address. + */ struct in_addr ipv4; #if HAVE_IPV6 + /** + * IPv6 address. + */ struct in6_addr ipv6; #endif } addr; + + /** + * Counter. + */ unsigned int count; }; /** * Lock shared structure for IP connection counts + * + * @param daemon handle to daemon where lock is */ static void MHD_ip_count_lock(struct MHD_Daemon *daemon) @@ -155,6 +178,8 @@ MHD_ip_count_lock(struct MHD_Daemon *daemon) /** * Unlock shared structure for IP connection counts + * + * @param daemon handle to daemon where lock is */ static void MHD_ip_count_unlock(struct MHD_Daemon *daemon) @@ -172,6 +197,10 @@ MHD_ip_count_unlock(struct MHD_Daemon *daemon) * Tree comparison function for IP addresses (supplied to tsearch() family). * We compare everything in the struct up through the beginning of the * 'count' field. + * + * @param a1 first address to compare + * @param a2 second address to compare + * @return -1, 0 or 1 depending on result of compare */ static int MHD_ip_addr_compare(const void *a1, const void *a2) @@ -180,11 +209,15 @@ MHD_ip_addr_compare(const void *a1, const void *a2) } /** - * Parse address and initialize 'key' using the address. Returns MHD_YES - * on success and MHD_NO otherwise (e.g., invalid address type). + * Parse address and initialize 'key' using the address. + * + * @param addr address to parse + * @param addrlen number of bytes in addr + * @param key where to store the parsed address + * @return MHD_YES on success and MHD_NO otherwise (e.g., invalid address type) */ static int -MHD_ip_addr_to_key(struct sockaddr *addr, socklen_t addrlen, +MHD_ip_addr_to_key(const struct sockaddr *addr, socklen_t addrlen, struct MHD_IPCount *key) { memset(key, 0, sizeof(*key)); @@ -216,12 +249,16 @@ MHD_ip_addr_to_key(struct sockaddr *addr, socklen_t addrlen, /** * Check if IP address is over its limit. * + * @param daemon handle to daemon where connection counts are tracked + * @param addr address to add (or increment counter) + * @param addrlen number of bytes in addr * @return Return MHD_YES if IP below limit, MHD_NO if IP has surpassed limit. * Also returns MHD_NO if fails to allocate memory. */ static int MHD_ip_limit_add(struct MHD_Daemon *daemon, - struct sockaddr *addr, socklen_t addrlen) + const struct sockaddr *addr, + socklen_t addrlen) { struct MHD_IPCount *key; void *node; @@ -279,10 +316,15 @@ MHD_ip_limit_add(struct MHD_Daemon *daemon, /** * Decrement connection count for IP address, removing from table * count reaches 0 + * + * @param daemon handle to daemon where connection counts are tracked + * @param addr address to remove (or decrement counter) + * @param addrlen number of bytes in addr */ static void MHD_ip_limit_del(struct MHD_Daemon *daemon, - struct sockaddr *addr, socklen_t addrlen) + const struct sockaddr *addr, + socklen_t addrlen) { struct MHD_IPCount search_key; struct MHD_IPCount *found_key; @@ -341,7 +383,7 @@ static pthread_mutex_t MHD_gnutls_init_mutex; /** * Callback for receiving data from the socket. * - * @param conn the MHD connection structure + * @param connection the MHD connection structure * @param other where to write received data to * @param i maximum size of other (in bytes) * @return number of bytes actually received @@ -364,7 +406,7 @@ recv_tls_adapter (struct MHD_Connection *connection, void *other, size_t i) /** * Callback for writing data to the socket. * - * @param conn the MHD connection structure + * @param connection the MHD connection structure * @param other data to write * @param i number of bytes to write * @return actual number of bytes written @@ -388,6 +430,7 @@ send_tls_adapter (struct MHD_Connection *connection, /** * Read and setup our certificate and key. * + * @param daemon handle to daemon to initialize * @return 0 on success */ static int @@ -417,6 +460,7 @@ MHD_init_daemon_certificate (struct MHD_Daemon *daemon) /** * Initialize security aspects of the HTTPS daemon * + * @param daemon handle to daemon to initialize * @return 0 on success */ static int @@ -491,7 +535,10 @@ MHD_get_fdset (struct MHD_Daemon *daemon, /** * Main function of the thread that handles an individual - * connection when MHD_USE_THREAD_PER_CONNECTION. + * connection when MHD_USE_THREAD_PER_CONNECTION is set. + * + * @param data the 'struct MHD_Connection' this thread will handle + * @return always NULL */ static void * MHD_handle_connection (void *data) @@ -709,6 +756,9 @@ socket_set_nonblocking (int fd) * Accept an incoming connection and create the MHD_Connection object for * it. This function also enforces policy by way of checking with the * accept policy callback. + * + * @param daemon handle with the listen socket + * @return MHD_YES on success */ static int MHD_accept_connection (struct MHD_Daemon *daemon) @@ -919,6 +969,8 @@ MHD_accept_connection (struct MHD_Daemon *daemon) * Free resources associated with all closed connections. * (destroy responses, free buffers, etc.). A connection * is known to be closed if the socket_fd is -1. + * + * @param daemon daemon to clean up */ static void MHD_cleanup_connections (struct MHD_Daemon *daemon) @@ -1022,6 +1074,7 @@ MHD_get_timeout (struct MHD_Daemon *daemon, unsigned long long *timeout) /** * Main select call. * + * @param daemon daemon to run select loop for * @param may_block YES if blocking, NO if non-blocking * @return MHD_NO on serious errors, MHD_YES on success */ @@ -1131,6 +1184,8 @@ MHD_select (struct MHD_Daemon *daemon, int may_block) /** * Poll for new connection. Used only with THREAD_PER_CONNECTION + * + * @param daemon daemon to run poll loop for */ static int MHD_poll (struct MHD_Daemon *daemon) @@ -1190,6 +1245,9 @@ MHD_run (struct MHD_Daemon *daemon) /** * Thread that runs the select loop until the daemon * is explicitly shut down. + * + * @param cls 'struct MHD_Deamon' to run select loop in a thread for + * @return always NULL (on shutdown) */ static void * MHD_select_thread (void *cls) @@ -1219,7 +1277,7 @@ MHD_select_thread (void *cls) */ struct MHD_Daemon * MHD_start_daemon (unsigned int options, - unsigned short port, + uint16_t port, MHD_AcceptPolicyCallback apc, void *apc_cls, MHD_AccessHandlerCallback dh, void *dh_cls, ...) @@ -1241,6 +1299,7 @@ typedef void (*VfprintfFunctionPointerType)(void *, const char *, va_list); * Parse a list of options given as varargs. * * @param daemon the daemon to initialize + * @param servaddr where to store the server's listen address * @param ap the options * @return MHD_YES on success, MHD_NO on error */ @@ -1254,6 +1313,7 @@ parse_options_va (struct MHD_Daemon *daemon, * Parse a list of options given as varargs. * * @param daemon the daemon to initialize + * @param servaddr where to store the server's listen address * @param ... the options * @return MHD_YES on success, MHD_NO on error */ @@ -1276,6 +1336,7 @@ parse_options (struct MHD_Daemon *daemon, * Parse a list of options given as varargs. * * @param daemon the daemon to initialize + * @param servaddr where to store the server's listen address * @param ap the options * @return MHD_YES on success, MHD_NO on error */ @@ -1514,10 +1575,11 @@ parse_options_va (struct MHD_Daemon *daemon, */ struct MHD_Daemon * MHD_start_daemon_va (unsigned int options, - unsigned short port, + uint16_t port, MHD_AcceptPolicyCallback apc, void *apc_cls, - MHD_AccessHandlerCallback dh, void *dh_cls, va_list ap) + MHD_AccessHandlerCallback dh, void *dh_cls, + va_list ap) { const int on = 1; struct MHD_Daemon *retVal; @@ -1761,7 +1823,7 @@ MHD_start_daemon_va (unsigned int options, if ((options & MHD_USE_DEBUG) != 0) MHD_DLOG (retVal, "Failed to bind to port %u: %s\n", - port, + (unsigned int) port, STRERROR (errno)); #endif CLOSE (socket_fd); diff --git a/src/daemon/internal.c b/src/daemon/internal.c @@ -27,10 +27,11 @@ #include "internal.h" #if HAVE_MESSAGES +#if DEBUG_STATES /** * State to string dictionary. */ -char * +const char * MHD_state_to_string (enum MHD_CONNECTION_STATE state) { switch (state) @@ -82,6 +83,7 @@ MHD_state_to_string (enum MHD_CONNECTION_STATE state) } } #endif +#endif #if HAVE_MESSAGES /** diff --git a/src/daemon/internal.h b/src/daemon/internal.h @@ -392,7 +392,10 @@ enum MHD_CONNECTION_STATE #define DEBUG_STATES MHD_NO #if HAVE_MESSAGES -char *MHD_state_to_string (enum MHD_CONNECTION_STATE state); +#if DEBUG_STATES +const char * +MHD_state_to_string (enum MHD_CONNECTION_STATE state); +#endif #endif /** @@ -871,7 +874,7 @@ struct MHD_Daemon /** * Listen port. */ - unsigned short port; + uint16_t port; #if HTTPS_SUPPORT /** diff --git a/src/include/microhttpd.h b/src/include/microhttpd.h @@ -939,7 +939,7 @@ typedef int * @return NULL on error, handle to daemon on success */ struct MHD_Daemon *MHD_start_daemon_va (unsigned int options, - unsigned short port, + uint16_t port, MHD_AcceptPolicyCallback apc, void *apc_cls, MHD_AccessHandlerCallback dh, @@ -961,7 +961,7 @@ struct MHD_Daemon *MHD_start_daemon_va (unsigned int options, * @return NULL on error, handle to daemon on success */ struct MHD_Daemon *MHD_start_daemon (unsigned int flags, - unsigned short port, + uint16_t port, MHD_AcceptPolicyCallback apc, void *apc_cls, MHD_AccessHandlerCallback dh,