summaryrefslogtreecommitdiff
path: root/src/daemon/daemon.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/daemon/daemon.c')
-rw-r--r--src/daemon/daemon.c747
1 files changed, 361 insertions, 386 deletions
diff --git a/src/daemon/daemon.c b/src/daemon/daemon.c
index 2fbd3abc..3b2ebab0 100644
--- a/src/daemon/daemon.c
+++ b/src/daemon/daemon.c
@@ -48,30 +48,28 @@
* already exists
*/
int
-MHD_register_handler(struct MHD_Daemon * daemon,
- const char * uri_prefix,
- MHD_AccessHandlerCallback dh,
- void * dh_cls) {
- struct MHD_Access_Handler * ah;
-
- if ( (daemon == NULL) ||
- (uri_prefix == NULL) ||
- (dh == NULL) )
- return MHD_NO;
+MHD_register_handler (struct MHD_Daemon *daemon,
+ const char *uri_prefix,
+ MHD_AccessHandlerCallback dh, void *dh_cls)
+{
+ struct MHD_Access_Handler *ah;
+
+ if ((daemon == NULL) || (uri_prefix == NULL) || (dh == NULL))
+ return MHD_NO;
ah = daemon->handlers;
- while (ah != NULL) {
- if (0 == strcmp(uri_prefix,
- ah->uri_prefix))
- return MHD_NO;
- ah = ah->next;
- }
- ah = malloc(sizeof(struct MHD_Access_Handler));
+ while (ah != NULL)
+ {
+ if (0 == strcmp (uri_prefix, ah->uri_prefix))
+ return MHD_NO;
+ ah = ah->next;
+ }
+ ah = malloc (sizeof (struct MHD_Access_Handler));
ah->next = daemon->handlers;
- ah->uri_prefix = strdup(uri_prefix);
+ ah->uri_prefix = strdup (uri_prefix);
ah->dh = dh;
ah->dh_cls = dh_cls;
daemon->handlers = ah;
- return MHD_YES;
+ return MHD_YES;
}
@@ -84,34 +82,33 @@ MHD_register_handler(struct MHD_Daemon * daemon,
* is not known for this daemon
*/
int
-MHD_unregister_handler(struct MHD_Daemon * daemon,
- const char * uri_prefix,
- MHD_AccessHandlerCallback dh,
- void * dh_cls) {
- struct MHD_Access_Handler * prev;
- struct MHD_Access_Handler * pos;
-
- if ( (daemon == NULL) ||
- (uri_prefix == NULL) ||
- (dh == NULL) )
- return MHD_NO;
+MHD_unregister_handler (struct MHD_Daemon *daemon,
+ const char *uri_prefix,
+ MHD_AccessHandlerCallback dh, void *dh_cls)
+{
+ struct MHD_Access_Handler *prev;
+ struct MHD_Access_Handler *pos;
+
+ if ((daemon == NULL) || (uri_prefix == NULL) || (dh == NULL))
+ return MHD_NO;
pos = daemon->handlers;
prev = NULL;
- while (pos != NULL) {
- if ( (dh == pos->dh) &&
- (dh_cls == pos->dh_cls) &&
- (0 == strcmp(uri_prefix,
- pos->uri_prefix)) ) {
- if (prev == NULL)
- daemon->handlers = pos->next;
- else
- prev->next = pos->next;
- free(pos);
- return MHD_YES;
+ while (pos != NULL)
+ {
+ if ((dh == pos->dh) &&
+ (dh_cls == pos->dh_cls) &&
+ (0 == strcmp (uri_prefix, pos->uri_prefix)))
+ {
+ if (prev == NULL)
+ daemon->handlers = pos->next;
+ else
+ prev->next = pos->next;
+ free (pos);
+ return MHD_YES;
+ }
+ prev = pos;
+ pos = pos->next;
}
- prev = pos;
- pos = pos->next;
- }
return MHD_NO;
}
@@ -123,34 +120,32 @@ MHD_unregister_handler(struct MHD_Daemon * daemon,
* options for this call.
*/
int
-MHD_get_fdset(struct MHD_Daemon * daemon,
- fd_set * read_fd_set,
- fd_set * write_fd_set,
- fd_set * except_fd_set,
- int * max_fd) {
- struct MHD_Connection * pos;
-
- if ( (daemon == NULL) ||
- (read_fd_set == NULL) ||
- (write_fd_set == NULL) ||
- (except_fd_set == NULL) ||
- (max_fd == NULL) ||
- ( (daemon->options & MHD_USE_THREAD_PER_CONNECTION) != 0) )
- return MHD_NO;
- FD_SET(daemon->socket_fd,
- read_fd_set);
- if ( (*max_fd) < daemon->socket_fd)
+MHD_get_fdset (struct MHD_Daemon *daemon,
+ fd_set * read_fd_set,
+ fd_set * write_fd_set, fd_set * except_fd_set, int *max_fd)
+{
+ struct MHD_Connection *pos;
+
+ if ((daemon == NULL) ||
+ (read_fd_set == NULL) ||
+ (write_fd_set == NULL) ||
+ (except_fd_set == NULL) ||
+ (max_fd == NULL) ||
+ ((daemon->options & MHD_USE_THREAD_PER_CONNECTION) != 0))
+ return MHD_NO;
+ FD_SET (daemon->socket_fd, read_fd_set);
+ if ((*max_fd) < daemon->socket_fd)
*max_fd = daemon->socket_fd;
pos = daemon->connections;
- while (pos != NULL) {
- if (MHD_YES != MHD_connection_get_fdset(pos,
- read_fd_set,
- write_fd_set,
- except_fd_set,
- max_fd))
- return MHD_NO;
- pos = pos->next;
- }
+ while (pos != NULL)
+ {
+ if (MHD_YES != MHD_connection_get_fdset (pos,
+ read_fd_set,
+ write_fd_set,
+ except_fd_set, max_fd))
+ return MHD_NO;
+ pos = pos->next;
+ }
return MHD_YES;
}
@@ -160,8 +155,9 @@ MHD_get_fdset(struct MHD_Daemon * daemon,
* connection.
*/
static void *
-MHD_handle_connection(void * data) {
- struct MHD_Connection * con = data;
+MHD_handle_connection (void *data)
+{
+ struct MHD_Connection *con = data;
int num_ready;
fd_set rs;
fd_set ws;
@@ -169,42 +165,35 @@ MHD_handle_connection(void * data) {
int max;
if (con == NULL)
- abort();
- while ( (! con->daemon->shutdown) &&
- (con->socket_fd != -1) ) {
- FD_ZERO(&rs);
- FD_ZERO(&ws);
- FD_ZERO(&es);
- max = 0;
- MHD_connection_get_fdset(con,
- &rs,
- &ws,
- &es,
- &max);
- num_ready = SELECT(max + 1,
- &rs,
- &ws,
- &es,
- NULL);
- if (num_ready <= 0) {
- if (errno == EINTR)
- continue;
- break;
+ abort ();
+ while ((!con->daemon->shutdown) && (con->socket_fd != -1))
+ {
+ FD_ZERO (&rs);
+ FD_ZERO (&ws);
+ FD_ZERO (&es);
+ max = 0;
+ MHD_connection_get_fdset (con, &rs, &ws, &es, &max);
+ num_ready = SELECT (max + 1, &rs, &ws, &es, NULL);
+ if (num_ready <= 0)
+ {
+ if (errno == EINTR)
+ continue;
+ break;
+ }
+ if (((FD_ISSET (con->socket_fd, &rs)) &&
+ (MHD_YES != MHD_connection_handle_read (con))) ||
+ ((con->socket_fd != -1) &&
+ (FD_ISSET (con->socket_fd, &ws)) &&
+ (MHD_YES != MHD_connection_handle_write (con))))
+ break;
+ if ((con->headersReceived == 1) && (con->response == NULL))
+ MHD_call_connection_handler (con);
+ }
+ if (con->socket_fd != -1)
+ {
+ CLOSE (con->socket_fd);
+ con->socket_fd = -1;
}
- if ( ( (FD_ISSET(con->socket_fd, &rs)) &&
- (MHD_YES != MHD_connection_handle_read(con)) ) ||
- ( (con->socket_fd != -1) &&
- (FD_ISSET(con->socket_fd, &ws)) &&
- (MHD_YES != MHD_connection_handle_write(con)) ) )
- break;
- if ( (con->headersReceived == 1) &&
- (con->response == NULL) )
- MHD_call_connection_handler(con);
- }
- if (con->socket_fd != -1) {
- CLOSE(con->socket_fd);
- con->socket_fd = -1;
- }
return NULL;
}
@@ -215,77 +204,66 @@ MHD_handle_connection(void * data) {
* accept policy callback.
*/
static int
-MHD_accept_connection(struct MHD_Daemon * daemon) {
- struct MHD_Connection * connection;
+MHD_accept_connection (struct MHD_Daemon *daemon)
+{
+ struct MHD_Connection *connection;
struct sockaddr_in6 addr6;
- struct sockaddr * addr = (struct sockaddr*) &addr6;
+ struct sockaddr *addr = (struct sockaddr *) &addr6;
socklen_t addrlen;
int s;
- if (sizeof(struct sockaddr) > sizeof(struct sockaddr_in6))
- abort(); /* fatal, serious error */
- addrlen = sizeof(struct sockaddr_in6);
- memset(addr,
- 0,
- sizeof(struct sockaddr_in6));
- s = ACCEPT(daemon->socket_fd,
- addr,
- &addrlen);
- if ( (s < 0) ||
- (addrlen <= 0) ) {
- MHD_DLOG(daemon,
- "Error accepting connection: %s\n",
- STRERROR(errno));
- if (s != -1)
- CLOSE(s); /* just in case */
- return MHD_NO;
- }
- if (daemon->max_connections == 0) {
- /* above connection limit - reject */
- CLOSE(s);
- return MHD_NO;
- }
- if ( (daemon->apc != NULL) &&
- (MHD_NO == daemon->apc(daemon->apc_cls,
- addr,
- addrlen)) ) {
- CLOSE(s);
- return MHD_YES;
- }
- connection = malloc(sizeof(struct MHD_Connection));
- memset(connection,
- 0,
- sizeof(struct MHD_Connection));
+ if (sizeof (struct sockaddr) > sizeof (struct sockaddr_in6))
+ abort (); /* fatal, serious error */
+ addrlen = sizeof (struct sockaddr_in6);
+ memset (addr, 0, sizeof (struct sockaddr_in6));
+ s = ACCEPT (daemon->socket_fd, addr, &addrlen);
+ if ((s < 0) || (addrlen <= 0))
+ {
+ MHD_DLOG (daemon, "Error accepting connection: %s\n", STRERROR (errno));
+ if (s != -1)
+ CLOSE (s); /* just in case */
+ return MHD_NO;
+ }
+ if (daemon->max_connections == 0)
+ {
+ /* above connection limit - reject */
+ CLOSE (s);
+ return MHD_NO;
+ }
+ if ((daemon->apc != NULL) &&
+ (MHD_NO == daemon->apc (daemon->apc_cls, addr, addrlen)))
+ {
+ CLOSE (s);
+ return MHD_YES;
+ }
+ connection = malloc (sizeof (struct MHD_Connection));
+ memset (connection, 0, sizeof (struct MHD_Connection));
connection->pool = NULL;
- connection->addr = malloc(addrlen);
- if (connection->addr == NULL) {
- CLOSE(s);
- free(connection);
- return MHD_NO;
- }
- memcpy(connection->addr,
- addr,
- addrlen);
+ connection->addr = malloc (addrlen);
+ if (connection->addr == NULL)
+ {
+ CLOSE (s);
+ free (connection);
+ return MHD_NO;
+ }
+ memcpy (connection->addr, addr, addrlen);
connection->addr_len = addrlen;
connection->socket_fd = s;
connection->daemon = daemon;
- if ( (0 != (daemon->options & MHD_USE_THREAD_PER_CONNECTION) ) &&
- (0 != pthread_create(&connection->pid,
- NULL,
- &MHD_handle_connection,
- connection)) ) {
- MHD_DLOG(daemon,
- "Failed to create a thread: %s\n",
- STRERROR(errno));
- CLOSE(s);
- free(connection->addr);
- free(connection);
- return MHD_NO;
- }
+ if ((0 != (daemon->options & MHD_USE_THREAD_PER_CONNECTION)) &&
+ (0 != pthread_create (&connection->pid,
+ NULL, &MHD_handle_connection, connection)))
+ {
+ MHD_DLOG (daemon, "Failed to create a thread: %s\n", STRERROR (errno));
+ CLOSE (s);
+ free (connection->addr);
+ free (connection);
+ return MHD_NO;
+ }
connection->next = daemon->connections;
daemon->connections = connection;
- daemon->max_connections--;
+ daemon->max_connections--;
return MHD_YES;
}
@@ -301,43 +279,46 @@ MHD_accept_connection(struct MHD_Daemon * daemon) {
* the upload data buffer is full).
*/
static void
-MHD_cleanup_connections(struct MHD_Daemon * daemon) {
- struct MHD_Connection * pos;
- struct MHD_Connection * prev;
- void * unused;
+MHD_cleanup_connections (struct MHD_Daemon *daemon)
+{
+ struct MHD_Connection *pos;
+ struct MHD_Connection *prev;
+ void *unused;
pos = daemon->connections;
prev = NULL;
- while (pos != NULL) {
- if (pos->socket_fd == -1) {
- if (prev == NULL)
- daemon->connections = pos->next;
- else
- prev->next = pos->next;
- if (0 != (daemon->options & MHD_USE_THREAD_PER_CONNECTION)) {
- pthread_kill(pos->pid, SIGALRM);
- pthread_join(pos->pid, &unused);
- }
- if (pos->response != NULL)
- MHD_destroy_response(pos->response);
- MHD_pool_destroy(pos->pool);
- free(pos->addr);
- free(pos);
- daemon->max_connections++;
- if (prev == NULL)
- pos = daemon->connections;
- else
- pos = prev->next;
- continue;
+ while (pos != NULL)
+ {
+ if (pos->socket_fd == -1)
+ {
+ if (prev == NULL)
+ daemon->connections = pos->next;
+ else
+ prev->next = pos->next;
+ if (0 != (daemon->options & MHD_USE_THREAD_PER_CONNECTION))
+ {
+ pthread_kill (pos->pid, SIGALRM);
+ pthread_join (pos->pid, &unused);
+ }
+ if (pos->response != NULL)
+ MHD_destroy_response (pos->response);
+ MHD_pool_destroy (pos->pool);
+ free (pos->addr);
+ free (pos);
+ daemon->max_connections++;
+ if (prev == NULL)
+ pos = daemon->connections;
+ else
+ pos = prev->next;
+ continue;
+ }
+
+ if ((pos->headersReceived == 1) && (pos->response == NULL))
+ MHD_call_connection_handler (pos);
+
+ prev = pos;
+ pos = pos->next;
}
-
- if ( (pos->headersReceived == 1) &&
- (pos->response == NULL) )
- MHD_call_connection_handler(pos);
-
- prev = pos;
- pos = pos->next;
- }
}
@@ -348,9 +329,9 @@ MHD_cleanup_connections(struct MHD_Daemon * daemon) {
* @return MHD_NO on serious errors, MHD_YES on success
*/
static int
-MHD_select(struct MHD_Daemon * daemon,
- int may_block) {
- struct MHD_Connection * pos;
+MHD_select (struct MHD_Daemon *daemon, int may_block)
+{
+ struct MHD_Connection *pos;
int num_ready;
fd_set rs;
fd_set ws;
@@ -361,61 +342,58 @@ MHD_select(struct MHD_Daemon * daemon,
timeout.tv_sec = 0;
timeout.tv_usec = 0;
- if(daemon == NULL)
- abort();
- FD_ZERO(&rs);
- FD_ZERO(&ws);
- FD_ZERO(&es);
+ if (daemon == NULL)
+ abort ();
+ FD_ZERO (&rs);
+ FD_ZERO (&ws);
+ FD_ZERO (&es);
max = 0;
- if (0 == (daemon->options & MHD_USE_THREAD_PER_CONNECTION)) {
- /* single-threaded, go over everything */
- if (MHD_NO == MHD_get_fdset(daemon,
- &rs,
- &ws,
- &es,
- &max))
+ if (0 == (daemon->options & MHD_USE_THREAD_PER_CONNECTION))
+ {
+ /* single-threaded, go over everything */
+ if (MHD_NO == MHD_get_fdset (daemon, &rs, &ws, &es, &max))
+ return MHD_NO;
+ }
+ else
+ {
+ /* accept only, have one thread per connection */
+ max = daemon->socket_fd;
+ FD_SET (daemon->socket_fd, &rs);
+ }
+ num_ready = SELECT (max + 1,
+ &rs, &ws, &es, may_block == MHD_NO ? &timeout : NULL);
+ if (num_ready < 0)
+ {
+ if (errno == EINTR)
+ return MHD_YES;
+ MHD_DLOG (daemon, "Select failed: %s\n", STRERROR (errno));
return MHD_NO;
- } else {
- /* accept only, have one thread per connection */
- max = daemon->socket_fd;
- FD_SET(daemon->socket_fd, &rs);
- }
- num_ready = SELECT(max + 1,
- &rs,
- &ws,
- &es,
- may_block == MHD_NO ? &timeout : NULL);
- if (num_ready < 0) {
- if (errno == EINTR)
- return MHD_YES;
- MHD_DLOG(daemon,
- "Select failed: %s\n",
- STRERROR(errno));
- return MHD_NO;
- }
+ }
ds = daemon->socket_fd;
if (ds == -1)
return MHD_YES;
- if (FD_ISSET(ds,
- &rs))
- MHD_accept_connection(daemon);
- if (0 == (daemon->options & MHD_USE_THREAD_PER_CONNECTION)) {
- /* do not have a thread per connection, process all connections now */
- pos = daemon->connections;
- while (pos != NULL) {
- ds = pos->socket_fd;
- if (ds == -1) {
- pos = pos->next;
- continue;
- }
- if (FD_ISSET(ds, &rs))
- MHD_connection_handle_read(pos);
- if (FD_ISSET(ds, &ws))
- MHD_connection_handle_write(pos);
- pos = pos->next;
+ if (FD_ISSET (ds, &rs))
+ MHD_accept_connection (daemon);
+ if (0 == (daemon->options & MHD_USE_THREAD_PER_CONNECTION))
+ {
+ /* do not have a thread per connection, process all connections now */
+ pos = daemon->connections;
+ while (pos != NULL)
+ {
+ ds = pos->socket_fd;
+ if (ds == -1)
+ {
+ pos = pos->next;
+ continue;
+ }
+ if (FD_ISSET (ds, &rs))
+ MHD_connection_handle_read (pos);
+ if (FD_ISSET (ds, &ws))
+ MHD_connection_handle_write (pos);
+ pos = pos->next;
+ }
}
- }
return MHD_YES;
}
@@ -431,13 +409,14 @@ MHD_select(struct MHD_Daemon * daemon,
* options for this call.
*/
int
-MHD_run(struct MHD_Daemon * daemon) {
- if ( (daemon->shutdown != 0) ||
- (0 != (daemon->options & MHD_USE_THREAD_PER_CONNECTION)) ||
- (0 != (daemon->options & MHD_USE_SELECT_INTERNALLY)) )
+MHD_run (struct MHD_Daemon *daemon)
+{
+ if ((daemon->shutdown != 0) ||
+ (0 != (daemon->options & MHD_USE_THREAD_PER_CONNECTION)) ||
+ (0 != (daemon->options & MHD_USE_SELECT_INTERNALLY)))
return MHD_NO;
- MHD_select(daemon, MHD_NO);
- MHD_cleanup_connections(daemon);
+ MHD_select (daemon, MHD_NO);
+ MHD_cleanup_connections (daemon);
return MHD_YES;
}
@@ -447,12 +426,14 @@ MHD_run(struct MHD_Daemon * daemon) {
* is explicitly shut down.
*/
static void *
-MHD_select_thread(void * cls) {
- struct MHD_Daemon * daemon = cls;
- while (daemon->shutdown == 0) {
- MHD_select(daemon, MHD_YES);
- MHD_cleanup_connections(daemon);
- }
+MHD_select_thread (void *cls)
+{
+ struct MHD_Daemon *daemon = cls;
+ while (daemon->shutdown == 0)
+ {
+ MHD_select (daemon, MHD_YES);
+ MHD_cleanup_connections (daemon);
+ }
return NULL;
}
@@ -469,88 +450,75 @@ MHD_select_thread(void * cls) {
* @return NULL on error, handle to daemon on success
*/
struct MHD_Daemon *
-MHD_start_daemon(unsigned int options,
- unsigned short port,
- MHD_AcceptPolicyCallback apc,
- void * apc_cls,
- MHD_AccessHandlerCallback dh,
- void * dh_cls,
- ...) {
+MHD_start_daemon (unsigned int options,
+ unsigned short port,
+ MHD_AcceptPolicyCallback apc,
+ void *apc_cls,
+ MHD_AccessHandlerCallback dh, void *dh_cls, ...)
+{
const int on = 1;
- struct MHD_Daemon * retVal;
+ struct MHD_Daemon *retVal;
int socket_fd;
- struct sockaddr_in servaddr4;
- struct sockaddr_in6 servaddr6;
- const struct sockaddr * servaddr;
+ struct sockaddr_in servaddr4;
+ struct sockaddr_in6 servaddr6;
+ const struct sockaddr *servaddr;
socklen_t addrlen;
va_list ap;
enum MHD_OPTION opt;
-
+
if ((options & MHD_USE_SSL) != 0)
return NULL;
- if ( (port == 0) ||
- (dh == NULL) )
+ if ((port == 0) || (dh == NULL))
return NULL;
if ((options & MHD_USE_IPv6) != 0)
- socket_fd = SOCKET(PF_INET6, SOCK_STREAM, 0);
+ socket_fd = SOCKET (PF_INET6, SOCK_STREAM, 0);
else
- socket_fd = SOCKET(PF_INET, SOCK_STREAM, 0);
- if (socket_fd < 0) {
- if ((options & MHD_USE_DEBUG) != 0)
- fprintf(stderr,
- "Call to socket failed: %s\n",
- STRERROR(errno));
- return NULL;
- }
- if ( (SETSOCKOPT(socket_fd,
- SOL_SOCKET,
- SO_REUSEADDR,
- &on,
- sizeof(on)) < 0) &&
- (options & MHD_USE_DEBUG) != 0)
- fprintf(stderr,
- "setsockopt failed: %s\n",
- STRERROR(errno));
- if ((options & MHD_USE_IPv6) != 0) {
- memset(&servaddr6,
- 0,
- sizeof(struct sockaddr_in6));
- servaddr6.sin6_family = AF_INET6;
- servaddr6.sin6_port = htons(port);
- servaddr = (struct sockaddr*) &servaddr6;
- addrlen = sizeof(struct sockaddr_in6);
- } else {
- memset(&servaddr4,
- 0,
- sizeof(struct sockaddr_in));
- servaddr4.sin_family = AF_INET;
- servaddr4.sin_port = htons(port);
- servaddr = (struct sockaddr*) &servaddr4;
- addrlen = sizeof(struct sockaddr_in);
- }
- if (BIND(socket_fd,
- servaddr,
- addrlen) < 0) {
- if ( (options & MHD_USE_DEBUG) != 0)
- fprintf(stderr,
- "Failed to bind to port %u: %s\n",
- port,
- STRERROR(errno));
- CLOSE(socket_fd);
- return NULL;
- }
- if (LISTEN(socket_fd, 20) < 0) {
- if ((options & MHD_USE_DEBUG) != 0)
- fprintf(stderr,
- "Failed to listen for connections: %s\n",
- STRERROR(errno));
- CLOSE(socket_fd);
- return NULL;
- }
- retVal = malloc(sizeof(struct MHD_Daemon));
- memset(retVal,
- 0,
- sizeof(struct MHD_Daemon));
+ socket_fd = SOCKET (PF_INET, SOCK_STREAM, 0);
+ if (socket_fd < 0)
+ {
+ if ((options & MHD_USE_DEBUG) != 0)
+ fprintf (stderr, "Call to socket failed: %s\n", STRERROR (errno));
+ return NULL;
+ }
+ if ((SETSOCKOPT (socket_fd,
+ SOL_SOCKET,
+ SO_REUSEADDR,
+ &on, sizeof (on)) < 0) && (options & MHD_USE_DEBUG) != 0)
+ fprintf (stderr, "setsockopt failed: %s\n", STRERROR (errno));
+ if ((options & MHD_USE_IPv6) != 0)
+ {
+ memset (&servaddr6, 0, sizeof (struct sockaddr_in6));
+ servaddr6.sin6_family = AF_INET6;
+ servaddr6.sin6_port = htons (port);
+ servaddr = (struct sockaddr *) &servaddr6;
+ addrlen = sizeof (struct sockaddr_in6);
+ }
+ else
+ {
+ memset (&servaddr4, 0, sizeof (struct sockaddr_in));
+ servaddr4.sin_family = AF_INET;
+ servaddr4.sin_port = htons (port);
+ servaddr = (struct sockaddr *) &servaddr4;
+ addrlen = sizeof (struct sockaddr_in);
+ }
+ if (BIND (socket_fd, servaddr, addrlen) < 0)
+ {
+ if ((options & MHD_USE_DEBUG) != 0)
+ fprintf (stderr,
+ "Failed to bind to port %u: %s\n", port, STRERROR (errno));
+ CLOSE (socket_fd);
+ return NULL;
+ }
+ if (LISTEN (socket_fd, 20) < 0)
+ {
+ if ((options & MHD_USE_DEBUG) != 0)
+ fprintf (stderr,
+ "Failed to listen for connections: %s\n", STRERROR (errno));
+ CLOSE (socket_fd);
+ return NULL;
+ }
+ retVal = malloc (sizeof (struct MHD_Daemon));
+ memset (retVal, 0, sizeof (struct MHD_Daemon));
retVal->options = options;
retVal->port = port;
retVal->apc = apc;
@@ -562,35 +530,34 @@ MHD_start_daemon(unsigned int options,
retVal->default_handler.next = NULL;
retVal->max_connections = MHD_MAX_CONNECTIONS_DEFAULT;
retVal->pool_size = MHD_POOL_SIZE_DEFAULT;
- va_start(ap, dh_cls);
- while (MHD_OPTION_END != (opt = va_arg(ap, enum MHD_OPTION))) {
- switch (opt) {
- case MHD_OPTION_CONNECTION_MEMORY_LIMIT:
- retVal->pool_size = va_arg(ap, unsigned int);
- break;
- case MHD_OPTION_CONNECTION_LIMIT:
- retVal->max_connections = va_arg(ap, unsigned int);
- break;
- default:
- fprintf(stderr,
- "Invalid MHD_OPTION argument! (Did you terminate the list with MHD_OPTION_END?)\n");
- abort();
+ va_start (ap, dh_cls);
+ while (MHD_OPTION_END != (opt = va_arg (ap, enum MHD_OPTION)))
+ {
+ switch (opt)
+ {
+ case MHD_OPTION_CONNECTION_MEMORY_LIMIT:
+ retVal->pool_size = va_arg (ap, unsigned int);
+ break;
+ case MHD_OPTION_CONNECTION_LIMIT:
+ retVal->max_connections = va_arg (ap, unsigned int);
+ break;
+ default:
+ fprintf (stderr,
+ "Invalid MHD_OPTION argument! (Did you terminate the list with MHD_OPTION_END?)\n");
+ abort ();
+ }
+ }
+ va_end (ap);
+ if (((0 != (options & MHD_USE_THREAD_PER_CONNECTION)) ||
+ (0 != (options & MHD_USE_SELECT_INTERNALLY))) &&
+ (0 != pthread_create (&retVal->pid, NULL, &MHD_select_thread, retVal)))
+ {
+ MHD_DLOG (retVal,
+ "Failed to create listen thread: %s\n", STRERROR (errno));
+ free (retVal);
+ CLOSE (socket_fd);
+ return NULL;
}
- }
- va_end(ap);
- if ( ( (0 != (options & MHD_USE_THREAD_PER_CONNECTION)) ||
- (0 != (options & MHD_USE_SELECT_INTERNALLY)) ) &&
- (0 != pthread_create(&retVal->pid,
- NULL,
- &MHD_select_thread,
- retVal)) ) {
- MHD_DLOG(retVal,
- "Failed to create listen thread: %s\n",
- STRERROR(errno));
- free(retVal);
- CLOSE(socket_fd);
- return NULL;
- }
return retVal;
}
@@ -598,27 +565,31 @@ MHD_start_daemon(unsigned int options,
* Shutdown an http daemon.
*/
void
-MHD_stop_daemon(struct MHD_Daemon * daemon) {
- void * unused;
+MHD_stop_daemon (struct MHD_Daemon *daemon)
+{
+ void *unused;
if (daemon == NULL)
return;
daemon->shutdown = 1;
- CLOSE(daemon->socket_fd);
+ CLOSE (daemon->socket_fd);
daemon->socket_fd = -1;
- if ( (0 != (daemon->options & MHD_USE_THREAD_PER_CONNECTION)) ||
- (0 != (daemon->options & MHD_USE_SELECT_INTERNALLY)) ) {
- pthread_kill(daemon->pid, SIGALRM);
- pthread_join(daemon->pid, &unused);
- }
- while (daemon->connections != NULL) {
- if (-1 != daemon->connections->socket_fd) {
- CLOSE(daemon->connections->socket_fd);
- daemon->connections->socket_fd = -1;
+ if ((0 != (daemon->options & MHD_USE_THREAD_PER_CONNECTION)) ||
+ (0 != (daemon->options & MHD_USE_SELECT_INTERNALLY)))
+ {
+ pthread_kill (daemon->pid, SIGALRM);
+ pthread_join (daemon->pid, &unused);
+ }
+ while (daemon->connections != NULL)
+ {
+ if (-1 != daemon->connections->socket_fd)
+ {
+ CLOSE (daemon->connections->socket_fd);
+ daemon->connections->socket_fd = -1;
+ }
+ MHD_cleanup_connections (daemon);
}
- MHD_cleanup_connections(daemon);
- }
- free(daemon);
+ free (daemon);
}
#ifndef WINDOWS
@@ -627,23 +598,27 @@ static struct sigaction sig;
static struct sigaction old;
-static void sigalrmHandler(int sig) {
+static void
+sigalrmHandler (int sig)
+{
}
/**
* Initialize the signal handler for SIGALRM.
*/
-void __attribute__ ((constructor)) MHD_pthread_handlers_ltdl_init() {
+void __attribute__ ((constructor)) MHD_pthread_handlers_ltdl_init ()
+{
/* make sure SIGALRM does not kill us */
- memset(&sig, 0, sizeof(struct sigaction));
- memset(&old, 0, sizeof(struct sigaction));
+ memset (&sig, 0, sizeof (struct sigaction));
+ memset (&old, 0, sizeof (struct sigaction));
sig.sa_flags = SA_NODEFER;
- sig.sa_handler = &sigalrmHandler;
- sigaction(SIGALRM, &sig, &old);
+ sig.sa_handler = &sigalrmHandler;
+ sigaction (SIGALRM, &sig, &old);
}
-void __attribute__ ((destructor)) MHD_pthread_handlers_ltdl_fini() {
- sigaction(SIGALRM, &old, &sig);
+void __attribute__ ((destructor)) MHD_pthread_handlers_ltdl_fini ()
+{
+ sigaction (SIGALRM, &old, &sig);
}
#endif