gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] r22731 - in libmicrohttpd: . doc src/daemon src/include src


From: gnunet
Subject: [GNUnet-SVN] r22731 - in libmicrohttpd: . doc src/daemon src/include src/testcurl/https
Date: Tue, 17 Jul 2012 22:39:44 +0200

Author: grothoff
Date: 2012-07-17 22:39:44 +0200 (Tue, 17 Jul 2012)
New Revision: 22731

Modified:
   libmicrohttpd/ChangeLog
   libmicrohttpd/doc/microhttpd.texi
   libmicrohttpd/src/daemon/daemon.c
   libmicrohttpd/src/daemon/internal.h
   libmicrohttpd/src/include/microhttpd.h
   libmicrohttpd/src/testcurl/https/mhds_session_info_test.c
Log:
adding experimental extension 'HD_USE_NO_LISTEN_SOCKET'

Modified: libmicrohttpd/ChangeLog
===================================================================
--- libmicrohttpd/ChangeLog     2012-07-17 20:35:08 UTC (rev 22730)
+++ libmicrohttpd/ChangeLog     2012-07-17 20:39:44 UTC (rev 22731)
@@ -1,3 +1,6 @@
+Tue Jul 17 22:37:05 CEST 2012
+       Adding experimental (!) code for MHD operation without listen socket. 
-CG
+
 Tue Jul 17 22:15:57 CEST 2012
        Making sendfile test pass again on non-W32 systems. -CG
 

Modified: libmicrohttpd/doc/microhttpd.texi
===================================================================
--- libmicrohttpd/doc/microhttpd.texi   2012-07-17 20:35:08 UTC (rev 22730)
+++ libmicrohttpd/doc/microhttpd.texi   2012-07-17 20:39:44 UTC (rev 22731)
@@ -398,6 +398,17 @@
 and that DO provide other mechanisms for cache control.  See also
 RFC 2616, section 14.18 (exception 3).
 
+
address@hidden MHD_USE_NO_LISTEN_SOCKET
address@hidden listen
address@hidden proxy
address@hidden embedded systems
+Run the HTTP server without any listen socket.  This option only makes
+sense if @code{MHD_add_connection} is going to be used exclusively to
+connect HTTP clients to the HTTP server.  This option is incompatible
+with using a thread pool; if it is used,
address@hidden is ignored.
+
 @end table
 @end deftp
 

Modified: libmicrohttpd/src/daemon/daemon.c
===================================================================
--- libmicrohttpd/src/daemon/daemon.c   2012-07-17 20:35:08 UTC (rev 22730)
+++ libmicrohttpd/src/daemon/daemon.c   2012-07-17 20:39:44 UTC (rev 22731)
@@ -121,6 +121,7 @@
   return daemon;
 }
 
+
 /**
  * Maintain connection count for single address.
  */
@@ -154,6 +155,7 @@
   unsigned int count;
 };
 
+
 /**
  * Lock shared structure for IP connection counts and connection DLLs.
  *
@@ -171,6 +173,7 @@
     }
 }
 
+
 /**
  * Unlock shared structure for IP connection counts and connection DLLs.
  *
@@ -203,6 +206,7 @@
   return memcmp (a1, a2, offsetof(struct MHD_IPCount, count));
 }
 
+
 /**
  * Parse address and initialize 'key' using the address.
  *
@@ -241,6 +245,7 @@
   return MHD_NO;
 }
 
+
 /**
  * Check if IP address is over its limit.
  *
@@ -308,6 +313,7 @@
   return result;
 }
 
+
 /**
  * Decrement connection count for IP address, removing from table
  * count reaches 0
@@ -372,9 +378,11 @@
   MHD_ip_count_unlock (daemon);
 }
 
+
 #if HTTPS_SUPPORT
 static pthread_mutex_t MHD_gnutls_init_mutex;
 
+
 /**
  * Callback for receiving data from the socket.
  *
@@ -442,19 +450,21 @@
   gnutls_datum_t key;
   gnutls_datum_t cert;
 
-  if (daemon->https_mem_trust) {
-               cert.data = (unsigned char *) daemon->https_mem_trust;
-               cert.size = strlen(daemon->https_mem_trust);
-               if (gnutls_certificate_set_x509_trust_mem(daemon->x509_cred, 
&cert,
-                               GNUTLS_X509_FMT_PEM) < 0) {
+  if (daemon->https_mem_trust) 
+    {
+      cert.data = (unsigned char *) daemon->https_mem_trust;
+      cert.size = strlen (daemon->https_mem_trust);
+      if (gnutls_certificate_set_x509_trust_mem (daemon->x509_cred, &cert,
+                                                GNUTLS_X509_FMT_PEM) < 0) 
+       {
 #if HAVE_MESSAGES
-                       MHD_DLOG(daemon,
-                                       "Bad trust certificate format\n");
+         MHD_DLOG(daemon,
+                  "Bad trust certificate format\n");
 #endif
-                       return -1;
-               }
+         return -1;
        }
-
+    }
+  
   /* certificate & key loaded from memory */
   if (daemon->https_mem_cert && daemon->https_mem_key)
     {
@@ -473,6 +483,7 @@
   return -1;
 }
 
+
 /**
  * Initialize security aspects of the HTTPS daemon
  *
@@ -516,41 +527,44 @@
  */
 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)
+               fd_set *read_fd_set,
+               fd_set *write_fd_set, 
+              fd_set *except_fd_set,
+              int *max_fd)
 {
   struct MHD_Connection *pos;
-  struct MHD_Connection *next;
   int fd;
 
-  if ((daemon == NULL) || (read_fd_set == NULL) || (write_fd_set == NULL)
-      || (except_fd_set == NULL) || (max_fd == NULL)
-      || (-1 == (fd = daemon->socket_fd)) || (daemon->shutdown == MHD_YES)
-      || ((daemon->options & MHD_USE_THREAD_PER_CONNECTION) != 0)
-      || ((daemon->options & MHD_USE_POLL) != 0))
+  if ( (NULL == daemon) 
+       || (NULL == read_fd_set) 
+       || (NULL == write_fd_set)
+       || (NULL == except_fd_set) 
+       || (NULL == max_fd)
+       || (MHD_YES == daemon->shutdown)
+       || (0 != (daemon->options & MHD_USE_THREAD_PER_CONNECTION))
+       || (0 != (daemon->options & MHD_USE_POLL)))
     return MHD_NO;
-
-  FD_SET (fd, read_fd_set);
-  /* update max file descriptor */
-  if ((*max_fd) < fd) 
-    *max_fd = fd;
-
-  next = daemon->connections_head;
-  while (NULL != (pos = next))
-    {
-      next = pos->next;
-      if (MHD_YES != MHD_connection_get_fdset (pos,
-                                               read_fd_set,
-                                               write_fd_set,
-                                               except_fd_set, max_fd))
-        return MHD_NO;
-    }
+  fd = daemon->socket_fd;
+  if (-1 != fd)
+  {
+    FD_SET (fd, read_fd_set);
+    /* update max file descriptor */
+    if ((*max_fd) < fd) 
+      *max_fd = fd;
+  }
+  for (pos = daemon->connections_head; NULL != pos; pos = pos->next)
+    if (MHD_YES != MHD_connection_get_fdset (pos,
+                                            read_fd_set,
+                                            write_fd_set,
+                                            except_fd_set, max_fd))
+      return MHD_NO;    
 #if DEBUG_CONNECT
   MHD_DLOG (daemon, "Maximum socket in select set: %d\n", *max_fd);
 #endif
   return MHD_YES;
 }
 
+
 /**
  * Main function of the thread that handles an individual
  * connection when MHD_USE_THREAD_PER_CONNECTION is set.
@@ -577,7 +591,8 @@
 #endif
 
   timeout = con->daemon->connection_timeout;
-  while ( (!con->daemon->shutdown) && (con->state != MHD_CONNECTION_CLOSED) ) 
+  while ( (MHD_YES != con->daemon->shutdown) && 
+         (MHD_CONNECTION_CLOSED != con->state) ) 
     {
       tvp = NULL;
       if (timeout > 0)
@@ -687,6 +702,7 @@
   return NULL;
 }
 
+
 /**
  * Callback for receiving data from the socket.
  *
@@ -700,8 +716,8 @@
                    void *other, 
                    size_t i)
 {
-  if ( (connection->socket_fd == -1) ||
-       (connection->state == MHD_CONNECTION_CLOSED) )
+  if ( (-1 == connection->socket_fd) ||
+       (MHD_CONNECTION_CLOSED == connection->state) )
     {
       errno = ENOTCONN;
       return -1;
@@ -711,6 +727,7 @@
   return RECV (connection->socket_fd, other, i, MSG_NOSIGNAL);
 }
 
+
 /**
  * Callback for writing data to the socket.
  *
@@ -1342,8 +1359,9 @@
 
       /* If we're at the connection limit, no need to
          accept new connections. */
-      if ( (daemon->max_connections == 0) && (daemon->socket_fd != -1) )
-        FD_CLR(daemon->socket_fd, &rs);
+      if ( (0 == daemon->max_connections) && 
+          (-1 != daemon->socket_fd) )
+        FD_CLR (daemon->socket_fd, &rs);
     }
   else
     {
@@ -1354,14 +1372,13 @@
       FD_SET (max, &rs);
     }
 
-#ifndef HAVE_LISTEN_SHUTDOWN
-  if (-1 == daemon->wpipe[0])
-    return MHD_NO;
-  FD_SET (daemon->wpipe[0], &rs);
-  /* update max file descriptor */
-  if (max < daemon->wpipe[0])
-    max = daemon->wpipe[0];
-#endif
+  if (-1 != daemon->wpipe[0])
+    {
+      FD_SET (daemon->wpipe[0], &rs);
+      /* update max file descriptor */
+      if (max < daemon->wpipe[0])
+       max = daemon->wpipe[0];
+    }
 
   tv = NULL;
   if (may_block == MHD_NO)
@@ -1391,12 +1408,12 @@
 #endif
       return MHD_NO;
     }
-  ds = daemon->socket_fd;
-  if (ds == -1)
+  if (MHD_YES == daemon->shutdown)
     return MHD_YES;
 
   /* select connection thread handling type */
-  if (FD_ISSET (ds, &rs))
+  if ( (-1 != (ds = daemon->socket_fd)) &&
+       (FD_ISSET (ds, &rs)) )
     MHD_accept_connection (daemon);
   if (0 == (daemon->options & MHD_USE_THREAD_PER_CONNECTION))
     {
@@ -1445,35 +1462,33 @@
       pos = pos->next;
     }
   {
- #ifdef HAVE_LISTEN_SHUTDOWN
-    struct pollfd p[1 + num_connections];
- #else
     struct pollfd p[2 + num_connections];
- #endif
     struct MHD_Pollfd mp;
     unsigned MHD_LONG_LONG ltimeout;
     unsigned int i;
     int timeout;
     unsigned int poll_server;
+    int poll_listen;
     
     memset (p, 0, sizeof (p));
-    if ( (daemon->max_connections > 0) && (daemon->socket_fd != -1) )
+    poll_server = 0;
+    poll_listen = -1;
+    if ( (-1 != daemon->socket_fd) &&
+        (0 != daemon->max_connections) )
       {
-       p[0].fd = daemon->socket_fd;
-       p[0].events = POLLIN;
-       p[0].revents = 0;
-#ifdef HAVE_LISTEN_SHUTDOWN
-       poll_server = 1;
-#else
-       p[1].fd = daemon->wpipe[0];
-       p[1].events = POLLIN;
-       p[1].revents = 0;
-       poll_server = 2;
-#endif
+       /* only listen if we are not at the connection limit */
+       p[poll_server].fd = daemon->socket_fd;
+       p[poll_server].events = POLLIN;
+       p[poll_server].revents = 0;
+       poll_listen = (int) poll_server;
+       poll_server++;
       }
-    else
+    if (-1 != daemon->wpipe[0]) 
       {
-       poll_server = 0;
+       p[poll_server].fd = daemon->wpipe[0];
+       p[poll_server].events = POLLIN;
+       p[poll_server].revents = 0;
+       poll_server++;
       }
     if (may_block == MHD_NO)
       timeout = 0;
@@ -1484,8 +1499,7 @@
       timeout = (ltimeout > INT_MAX) ? INT_MAX : (int) ltimeout;
     
     i = 0;
-    pos = daemon->connections_head;
-    while (pos != NULL)
+    for (pos = daemon->connections_head; NULL != pos; pos = pos->next)
       {
        memset(&mp, 0, sizeof (struct MHD_Pollfd));
        MHD_connection_get_pollfd (pos, &mp);
@@ -1495,22 +1509,19 @@
        if (mp.events & MHD_POLL_ACTION_OUT) 
          p[poll_server+i].events |= POLLOUT;
        i++;
-       pos = pos->next;
       }
     if (poll (p, poll_server + num_connections, timeout) < 0) 
       {
-       if (errno == EINTR)
+       if (EINTR == errno)
          return MHD_YES;
 #if HAVE_MESSAGES
        MHD_DLOG (daemon, "poll failed: %s\n", STRERROR (errno));
 #endif
        return MHD_NO;
       }
-    /* handle shutdown cases */
-    if (daemon->shutdown == MHD_YES) 
+    /* handle shutdown */
+    if (MHD_YES == daemon->shutdown)
       return MHD_NO;  
-    if (daemon->socket_fd < 0) 
-      return MHD_YES; 
     i = 0;
     next = daemon->connections_head;
     while (NULL != (pos = next))
@@ -1531,8 +1542,8 @@
        pos->idle_handler (pos);
        i++;
       }
-    if ( (0 != poll_server) &&
-        (0 != (p[0].revents & POLLIN)) )
+    if ( (-1 != poll_listen) &&
+        (0 != (p[poll_listen].revents & POLLIN)) )
       MHD_accept_connection (daemon);
   }
   return MHD_YES;
@@ -1550,41 +1561,47 @@
 MHD_poll_listen_socket (struct MHD_Daemon *daemon,
                        int may_block)
 {
-#ifdef HAVE_LISTEN_SHUTDOWN
-  struct pollfd p[1];
-#else
   struct pollfd p[2];
-#endif
   int timeout;
-  
+  unsigned int poll_count;
+  int poll_listen;
+    
   memset (&p, 0, sizeof (p));
-  p[0].fd = daemon->socket_fd;
-  p[0].events = POLLIN;
-  p[0].revents = 0;
-#ifndef HAVE_LISTEN_SHUTDOWN
-  p[1].fd = daemon->wpipe[0];
-  p[1].events = POLLIN;
-  p[1].revents = 0;
-#endif
-  if (may_block == MHD_NO)
+  poll_count = 0;
+  poll_listen = -1;
+  if (-1 != daemon->socket_fd)
+    {
+      p[poll_count].fd = daemon->socket_fd;
+      p[poll_count].events = POLLIN;
+      p[poll_count].revents = 0;
+      poll_listen = poll_count;
+      poll_count++;
+    }
+  if (-1 != daemon->wpipe[0])
+    {
+      p[poll_count].fd = daemon->wpipe[0];
+      p[poll_count].events = POLLIN;
+      p[poll_count].revents = 0;
+      poll_count++;
+    }
+  if (MHD_NO == may_block)
     timeout = 0;
   else
     timeout = -1;
-  if (poll (p, (sizeof(p)/sizeof(struct pollfd)), timeout) < 0)
+  if (poll (p, poll_count, timeout) < 0)
     {
-      if (errno == EINTR)
+      if (EINTR == errno)
        return MHD_YES;
 #if HAVE_MESSAGES
       MHD_DLOG (daemon, "poll failed: %s\n", STRERROR (errno));
 #endif
       return MHD_NO;
     }
-  /* handle shutdown cases */
-  if (daemon->shutdown == MHD_YES) 
+  /* handle shutdown */
+  if (MHD_YES == daemon->shutdown)
     return MHD_NO;  
-  if (daemon->socket_fd < 0) 
-    return MHD_YES; 
-  if (0 != (p[0].revents & POLLIN))
+  if ( (-1 != poll_listen) &&
+       (0 != (p[poll_listen].revents & POLLIN)) )
     MHD_accept_connection (daemon);  
   return MHD_YES;
 }
@@ -1628,18 +1645,14 @@
 int
 MHD_run (struct MHD_Daemon *daemon)
 {
-  if ((daemon->shutdown != MHD_NO) || (0 != (daemon->options
-                                             & MHD_USE_THREAD_PER_CONNECTION))
-      || (0 != (daemon->options & MHD_USE_SELECT_INTERNALLY)))
+  if ( (MHD_YES == daemon->shutdown) || 
+       (0 != (daemon->options & MHD_USE_THREAD_PER_CONNECTION)) ||
+       (0 != (daemon->options & MHD_USE_SELECT_INTERNALLY)) )
     return MHD_NO;
-  if ((daemon->options & MHD_USE_POLL) == 0) 
-    {
-      MHD_select (daemon, MHD_NO);
-    }
-  else
-    {
-      MHD_poll (daemon, MHD_NO);
-    }
+  if (0 == (daemon->options & MHD_USE_POLL)) 
+    MHD_select (daemon, MHD_NO);    
+  else    
+    MHD_poll (daemon, MHD_NO);    
   MHD_cleanup_connections (daemon);
   return MHD_YES;
 }
@@ -1656,9 +1669,10 @@
 MHD_select_thread (void *cls)
 {
   struct MHD_Daemon *daemon = cls;
-  while (daemon->shutdown == MHD_NO)
+
+  while (MHD_YES != daemon->shutdown)
     {
-      if ((daemon->options & MHD_USE_POLL) == 0) 
+      if (0 == (daemon->options & MHD_USE_POLL)) 
        MHD_select (daemon, MHD_YES);
       else 
        MHD_poll (daemon, MHD_YES);      
@@ -1686,17 +1700,26 @@
                   void *apc_cls,
                   MHD_AccessHandlerCallback dh, void *dh_cls, ...)
 {
-  struct MHD_Daemon *ret;
+  struct MHD_Daemon *daemon;
   va_list ap;
 
   va_start (ap, dh_cls);
-  ret = MHD_start_daemon_va (options, port, apc, apc_cls, dh, dh_cls, ap);
+  daemon = MHD_start_daemon_va (options, port, apc, apc_cls, dh, dh_cls, ap);
   va_end (ap);
-  return ret;
+  return daemon;
 }
 
 
-typedef void (*VfprintfFunctionPointerType)(void *, const char *, va_list);
+/**
+ * Signature of the MHD custom logger function.
+ *
+ * @param cls closure
+ * @param format format string
+ * @param va arguments to the format string (fprintf-style)
+ */
+typedef void (*VfprintfFunctionPointerType)(void *cls,
+                                           const char *format, 
+                                           va_list va);
 
 
 /**
@@ -2009,7 +2032,7 @@
  
   /* use SOCK_STREAM rather than ai_socktype: some getaddrinfo
    * implementations do not set ai_socktype, e.g. RHL6.2. */
-  fd = SOCKET(domain, ctype, protocol);
+  fd = SOCKET (domain, ctype, protocol);
   if ( (-1 == fd) && (EINVAL == errno) && (0 != sock_cloexec) )
   {
     sock_cloexec = 0;
@@ -2090,6 +2113,7 @@
   socklen_t addrlen;
   unsigned int i;
   int res_thread_create;
+  int use_pipe;
 
   if ((port == 0) || (dh == NULL))
     return NULL;
@@ -2116,10 +2140,15 @@
   retVal->pool_size = MHD_POOL_SIZE_DEFAULT;
   retVal->unescape_callback = &MHD_http_unescape;
   retVal->connection_timeout = 0;       /* no timeout */
-#ifndef HAVE_LISTEN_SHUTDOWN
   retVal->wpipe[0] = -1;
   retVal->wpipe[1] = -1;
-  if (0 != PIPE (retVal->wpipe))
+#ifdef HAVE_LISTEN_SHUTDOWN
+  use_pipe = (0 != (retVal->options & MHD_USE_NO_LISTEN_SOCKET));
+#else
+  use_pipe = 1; /* yes, must use pipe to signal shutdown */
+#endif
+  if ( (use_pipe) &&
+       (0 != PIPE (retVal->wpipe)) )
     {
 #if HAVE_MESSAGES
       FPRINTF(stderr, 
@@ -2143,7 +2172,6 @@
       return NULL;
     }
 #endif
-#endif
 #ifdef DAUTH_SUPPORT
   retVal->digest_auth_rand_size = 0;
   retVal->digest_auth_random = NULL;
@@ -2155,13 +2183,13 @@
   retVal->custom_error_log_cls = stderr;
 #endif
 #if HTTPS_SUPPORT
-  if (options & MHD_USE_SSL)
+  if (0 != (options & MHD_USE_SSL))
     {
       /* lock MHD_gnutls_global mutex since it uses reference counting */
       if (0 != pthread_mutex_lock (&MHD_gnutls_init_mutex))
        {
 #if HAVE_MESSAGES
-         MHD_DLOG (retVal, "Failed to aquire gnutls mutex\n");
+         MHD_DLOG (retVal, "Failed to acquire gnutls mutex\n");
 #endif
           mhd_panic (mhd_panic_cls, __FILE__, __LINE__, NULL);
        }
@@ -2258,8 +2286,10 @@
       goto free_and_fail;
     }
 #endif
-  if (retVal->socket_fd == -1)
+  if ( (-1 == retVal->socket_fd) &&
+       (0 == (retVal->options & MHD_USE_NO_LISTEN_SOCKET)) )
     {
+      /* try to open listen socket */
       if ((options & MHD_USE_IPv6) != 0)
 #if HAVE_INET6
        socket_fd = create_socket (PF_INET6, SOCK_STREAM, 0);
@@ -2403,7 +2433,8 @@
       MHD_DLOG (retVal,
                "MHD failed to initialize IP connection limit mutex\n");
 #endif
-      CLOSE (socket_fd);
+      if (-1 != socket_fd)
+       CLOSE (socket_fd);
       goto free_and_fail;
     }
   if (0 != pthread_mutex_init (&retVal->cleanup_connection_mutex, NULL))
@@ -2413,7 +2444,8 @@
                "MHD failed to initialize IP connection limit mutex\n");
 #endif
       pthread_mutex_destroy (&retVal->cleanup_connection_mutex);
-      CLOSE (socket_fd);
+      if (-1 != socket_fd)
+       CLOSE (socket_fd);
       goto free_and_fail;
     }
 
@@ -2425,7 +2457,8 @@
       MHD_DLOG (retVal, 
                "Failed to initialize TLS support\n");
 #endif
-      CLOSE (socket_fd);
+      if (-1 != socket_fd)
+       CLOSE (socket_fd);
       pthread_mutex_destroy (&retVal->cleanup_connection_mutex);
       pthread_mutex_destroy (&retVal->per_ip_connection_mutex);
       goto free_and_fail;
@@ -2434,6 +2467,7 @@
   if ( ( (0 != (options & MHD_USE_THREAD_PER_CONNECTION)) ||
         ( (0 != (options & MHD_USE_SELECT_INTERNALLY)) &&
           (0 == retVal->worker_pool_size)) ) && 
+       (0 == (retVal->options & MHD_USE_NO_LISTEN_SOCKET)) &&
        (0 != (res_thread_create =
              create_thread (&retVal->pid, retVal, &MHD_select_thread, 
retVal))))
     {
@@ -2444,10 +2478,12 @@
 #endif
       pthread_mutex_destroy (&retVal->cleanup_connection_mutex);
       pthread_mutex_destroy (&retVal->per_ip_connection_mutex);
-      CLOSE (socket_fd);
+      if (-1 != socket_fd)
+       CLOSE (socket_fd);
       goto free_and_fail;
     }
-  if (retVal->worker_pool_size > 0)
+  if ( (retVal->worker_pool_size > 0) &&
+       (0 == (retVal->options & MHD_USE_NO_LISTEN_SOCKET)) )
     {
 #ifndef MINGW
       int sk_flags;
@@ -2535,7 +2571,8 @@
      MHD_USE_SELECT_INTERNALLY mode. */
   if (i == 0)
     {
-      CLOSE (socket_fd);
+      if (-1 != socket_fd)
+       CLOSE (socket_fd);
       pthread_mutex_destroy (&retVal->cleanup_connection_mutex);
       pthread_mutex_destroy (&retVal->per_ip_connection_mutex);
       if (NULL != retVal->worker_pool)
@@ -2653,16 +2690,25 @@
   fd = daemon->socket_fd;
   daemon->socket_fd = -1;
   /* Prepare workers for shutdown */
-  for (i = 0; i < daemon->worker_pool_size; ++i)
+  if (NULL != daemon->worker_pool)
     {
-      daemon->worker_pool[i].shutdown = MHD_YES;
-      daemon->worker_pool[i].socket_fd = -1;
+      /* MHD_USE_NO_LISTEN_SOCKET disables thread pools, hence we need to 
check */
+      for (i = 0; i < daemon->worker_pool_size; ++i)
+       {
+         daemon->worker_pool[i].shutdown = MHD_YES;
+         daemon->worker_pool[i].socket_fd = -1;
+       }
     }
+  if (daemon->wpipe[1] != -1)
+    {
+      WRITE (daemon->wpipe[1], "e", 1);
+    }
 #ifdef HAVE_LISTEN_SHUTDOWN
-  SHUTDOWN (fd, SHUT_RDWR);
-#else
-  if (daemon->wpipe[1] != -1)
-    WRITE (daemon->wpipe[1], "e", 1);
+  else
+    {
+      /* fd must not be -1 here, otherwise we'd have used the wpipe */
+      SHUTDOWN (fd, SHUT_RDWR);
+    }
 #endif
 #if DEBUG_CLOSE
 #if HAVE_MESSAGES
@@ -2672,40 +2718,47 @@
 
 
   /* Signal workers to stop and clean them up */
-  for (i = 0; i < daemon->worker_pool_size; ++i)
+  if (NULL != daemon->worker_pool)
     {
-      if (0 != (rc = pthread_join (daemon->worker_pool[i].pid, &unused)))
+      /* MHD_USE_NO_LISTEN_SOCKET disables thread pools, hence we need to 
check */
+      for (i = 0; i < daemon->worker_pool_size; ++i)
        {
+         if (0 != (rc = pthread_join (daemon->worker_pool[i].pid, &unused)))
+           {
 #if HAVE_MESSAGES
-         MHD_DLOG (daemon, "Failed to join a thread: %s\n",
-                   STRERROR (rc));
+             MHD_DLOG (daemon, "Failed to join a thread: %s\n",
+                       STRERROR (rc));
 #endif
-         abort();
+             abort();
+           }
+         close_all_connections (&daemon->worker_pool[i]);
        }
-      close_all_connections (&daemon->worker_pool[i]);
+      free (daemon->worker_pool);
     }
-  free (daemon->worker_pool);
-
-  /* clean up master threads */
-  if ((0 != (daemon->options & MHD_USE_THREAD_PER_CONNECTION)) ||
-      ((0 != (daemon->options & MHD_USE_SELECT_INTERNALLY))
-        && (0 == daemon->worker_pool_size)))
+  else
     {
-      if (0 != (rc = pthread_join (daemon->pid, &unused)))
+      /* clean up master threads */
+      if ((0 != (daemon->options & MHD_USE_THREAD_PER_CONNECTION)) ||
+         ((0 != (daemon->options & MHD_USE_SELECT_INTERNALLY))
+          && (0 == daemon->worker_pool_size)))
        {
+         if (0 != (rc = pthread_join (daemon->pid, &unused)))
+           {
 #if HAVE_MESSAGES
-         MHD_DLOG (daemon, "Failed to join a thread: %s\n",
-                   STRERROR (rc));
+             MHD_DLOG (daemon, "Failed to join a thread: %s\n",
+                       STRERROR (rc));
 #endif
-         abort();
+             abort();
+           }
        }
     }
   close_all_connections (daemon);
-  CLOSE (fd);
+  if (-1 != fd)
+    CLOSE (fd);
 
   /* TLS clean up */
 #if HTTPS_SUPPORT
-  if (daemon->options & MHD_USE_SSL)
+  if (0 != (daemon->options & MHD_USE_SSL))
     {
       gnutls_priority_deinit (daemon->priority_cache);
       if (daemon->x509_cred)
@@ -2714,7 +2767,7 @@
       if (0 != pthread_mutex_lock (&MHD_gnutls_init_mutex))
        {
 #if HAVE_MESSAGES
-         MHD_DLOG (daemon, "Failed to aquire gnutls mutex\n");
+         MHD_DLOG (daemon, "Failed to acquire gnutls mutex\n");
 #endif
          abort();
        }
@@ -2735,8 +2788,7 @@
   pthread_mutex_destroy (&daemon->per_ip_connection_mutex);
   pthread_mutex_destroy (&daemon->cleanup_connection_mutex);
 
-#ifndef HAVE_LISTEN_SHUTDOWN
-  if (daemon->wpipe[1] != -1)
+  if (-1 != daemon->wpipe[1])
     {
       char c;
 
@@ -2746,7 +2798,6 @@
       CLOSE (daemon->wpipe[0]);
       CLOSE (daemon->wpipe[1]);
     }
-#endif
 
   free (daemon);
 }
@@ -2770,7 +2821,7 @@
     {
     case MHD_DAEMON_INFO_LISTEN_FD:
       return (const union MHD_DaemonInfo *) &daemon->socket_fd;
-   default:
+    default:
       return NULL;
     };
 }
@@ -2791,7 +2842,8 @@
  * @param cb new error handler
  * @param cls passed to error handler
  */
-void MHD_set_panic_func (MHD_PanicCallback cb, void *cls)
+void 
+MHD_set_panic_func (MHD_PanicCallback cb, void *cls)
 {
   mhd_panic = cb;
   mhd_panic_cls = cls;

Modified: libmicrohttpd/src/daemon/internal.h
===================================================================
--- libmicrohttpd/src/daemon/internal.h 2012-07-17 20:35:08 UTC (rev 22730)
+++ libmicrohttpd/src/daemon/internal.h 2012-07-17 20:39:44 UTC (rev 22731)
@@ -902,12 +902,12 @@
    */
   int socket_fd;
 
-#ifndef HAVE_LISTEN_SHUTDOWN
   /**
-   * Pipe we use to signal shutdown.
+   * Pipe we use to signal shutdown, unless
+   * 'HAVE_LISTEN_SHUTDOWN' is defined AND we have a listen
+   * socket (which we can then 'shutdown' to stop listening).
    */
   int wpipe[2];
-#endif
 
   /**
    * Are we shutting down?

Modified: libmicrohttpd/src/include/microhttpd.h
===================================================================
--- libmicrohttpd/src/include/microhttpd.h      2012-07-17 20:35:08 UTC (rev 
22730)
+++ libmicrohttpd/src/include/microhttpd.h      2012-07-17 20:39:44 UTC (rev 
22731)
@@ -374,8 +374,17 @@
    * and that DO provide other mechanisms for cache control.  See also
    * RFC 2616, section 14.18 (exception 3).
    */
-  MHD_SUPPRESS_DATE_NO_CLOCK = 128
+  MHD_SUPPRESS_DATE_NO_CLOCK = 128,
 
+  /**
+   * Run without a listen socket.  This option only makes sense if
+   * 'MHD_add_connection' is to be used exclusively to connect HTTP
+   * clients to the HTTP server.  This option is incompatible with
+   * using a thread pool; if it is used, 'MHD_OPTION_THREAD_POOL_SIZE'
+   * is ignored.
+   */
+  MHD_USE_NO_LISTEN_SOCKET = 256
+
 };
 
 

Modified: libmicrohttpd/src/testcurl/https/mhds_session_info_test.c
===================================================================
--- libmicrohttpd/src/testcurl/https/mhds_session_info_test.c   2012-07-17 
20:35:08 UTC (rev 22730)
+++ libmicrohttpd/src/testcurl/https/mhds_session_info_test.c   2012-07-17 
20:39:44 UTC (rev 22731)
@@ -162,6 +162,7 @@
   return 0;
 }
 
+
 int
 main (int argc, char *const *argv)
 {




reply via email to

[Prev in Thread] Current Thread [Next in Thread]