Home | History | Annotate | Download | only in microhttpd
      1 /*
      2   This file is part of libmicrohttpd
      3   Copyright (C) 2007-2014 Daniel Pittman and Christian Grothoff
      4 
      5   This library is free software; you can redistribute it and/or
      6   modify it under the terms of the GNU Lesser General Public
      7   License as published by the Free Software Foundation; either
      8   version 2.1 of the License, or (at your option) any later version.
      9 
     10   This library is distributed in the hope that it will be useful,
     11   but WITHOUT ANY WARRANTY; without even the implied warranty of
     12   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     13   Lesser General Public License for more details.
     14 
     15   You should have received a copy of the GNU Lesser General Public
     16   License along with this library; if not, write to the Free Software
     17   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
     18 
     19 */
     20 
     21 /**
     22  * @file microhttpd/daemon.c
     23  * @brief  A minimal-HTTP server library
     24  * @author Daniel Pittman
     25  * @author Christian Grothoff
     26  */
     27 #if defined(_WIN32) && !defined(__CYGWIN__)
     28 /* override small default value */
     29 #define FD_SETSIZE 1024
     30 #define MHD_DEFAULT_FD_SETSIZE 64
     31 #else
     32 #define MHD_DEFAULT_FD_SETSIZE FD_SETSIZE
     33 #endif
     34 #include "platform.h"
     35 #include "internal.h"
     36 #include "response.h"
     37 #include "connection.h"
     38 #include "memorypool.h"
     39 #include <limits.h>
     40 #include "autoinit_funcs.h"
     41 
     42 #if HAVE_SEARCH_H
     43 #include <search.h>
     44 #else
     45 #include "tsearch.h"
     46 #endif
     47 
     48 #if HTTPS_SUPPORT
     49 #include "connection_https.h"
     50 #include <openssl/ssl.h>
     51 #endif
     52 
     53 #if defined(HAVE_POLL_H) && defined(HAVE_POLL)
     54 #include <poll.h>
     55 #endif
     56 
     57 #ifdef LINUX
     58 #include <sys/sendfile.h>
     59 #endif
     60 
     61 #ifdef _WIN32
     62 #ifndef WIN32_LEAN_AND_MEAN
     63 #define WIN32_LEAN_AND_MEAN 1
     64 #endif /* !WIN32_LEAN_AND_MEAN */
     65 #include <windows.h>
     66 #include <process.h>
     67 #endif
     68 
     69 #ifndef HAVE_ACCEPT4
     70 #define HAVE_ACCEPT4 0
     71 #endif
     72 
     73 /**
     74  * Default connection limit.
     75  */
     76 #ifndef WINDOWS
     77 #define MHD_MAX_CONNECTIONS_DEFAULT FD_SETSIZE - 4
     78 #else
     79 #define MHD_MAX_CONNECTIONS_DEFAULT FD_SETSIZE
     80 #endif
     81 
     82 /**
     83  * Default memory allowed per connection.
     84  */
     85 #define MHD_POOL_SIZE_DEFAULT (32 * 1024)
     86 
     87 #ifdef TCP_FASTOPEN
     88 /**
     89  * Default TCP fastopen queue size.
     90  */
     91 #define MHD_TCP_FASTOPEN_QUEUE_SIZE_DEFAULT 10
     92 #endif
     93 
     94 /**
     95  * Print extra messages with reasons for closing
     96  * sockets? (only adds non-error messages).
     97  */
     98 #define DEBUG_CLOSE MHD_NO
     99 
    100 /**
    101  * Print extra messages when establishing
    102  * connections? (only adds non-error messages).
    103  */
    104 #define DEBUG_CONNECT MHD_NO
    105 
    106 #ifndef LINUX
    107 #ifndef MSG_NOSIGNAL
    108 #define MSG_NOSIGNAL 0
    109 #endif
    110 #endif
    111 
    112 #ifndef SOCK_CLOEXEC
    113 #define SOCK_CLOEXEC 0
    114 #endif
    115 
    116 #ifndef EPOLL_CLOEXEC
    117 #define EPOLL_CLOEXEC 0
    118 #endif
    119 
    120 
    121 /**
    122  * Default implementation of the panic function,
    123  * prints an error message and aborts.
    124  *
    125  * @param cls unused
    126  * @param file name of the file with the problem
    127  * @param line line number with the problem
    128  * @param reason error message with details
    129  */
    130 static void
    131 mhd_panic_std (void *cls,
    132 	       const char *file,
    133 	       unsigned int line,
    134 	       const char *reason)
    135 {
    136 #if HAVE_MESSAGES
    137   fprintf (stderr, "Fatal error in GNU libmicrohttpd %s:%u: %s\n",
    138 	   file, line, reason);
    139 #endif
    140   abort ();
    141 }
    142 
    143 
    144 /**
    145  * Handler for fatal errors.
    146  */
    147 MHD_PanicCallback mhd_panic;
    148 
    149 /**
    150  * Closure argument for "mhd_panic".
    151  */
    152 void *mhd_panic_cls;
    153 
    154 #ifdef _WIN32
    155 /**
    156  * Track initialization of winsock
    157  */
    158 static int mhd_winsock_inited_ = 0;
    159 #endif
    160 
    161 /**
    162  * Trace up to and return master daemon. If the supplied daemon
    163  * is a master, then return the daemon itself.
    164  *
    165  * @param daemon handle to a daemon
    166  * @return master daemon handle
    167  */
    168 static struct MHD_Daemon*
    169 MHD_get_master (struct MHD_Daemon *daemon)
    170 {
    171   while (NULL != daemon->master)
    172     daemon = daemon->master;
    173   return daemon;
    174 }
    175 
    176 
    177 /**
    178  * Maintain connection count for single address.
    179  */
    180 struct MHD_IPCount
    181 {
    182   /**
    183    * Address family. AF_INET or AF_INET6 for now.
    184    */
    185   int family;
    186 
    187   /**
    188    * Actual address.
    189    */
    190   union
    191   {
    192     /**
    193      * IPv4 address.
    194      */
    195     struct in_addr ipv4;
    196 #if HAVE_INET6
    197     /**
    198      * IPv6 address.
    199      */
    200     struct in6_addr ipv6;
    201 #endif
    202   } addr;
    203 
    204   /**
    205    * Counter.
    206    */
    207   unsigned int count;
    208 };
    209 
    210 
    211 /**
    212  * Lock shared structure for IP connection counts and connection DLLs.
    213  *
    214  * @param daemon handle to daemon where lock is
    215  */
    216 static void
    217 MHD_ip_count_lock (struct MHD_Daemon *daemon)
    218 {
    219   if (MHD_YES != MHD_mutex_lock_(&daemon->per_ip_connection_mutex))
    220     {
    221       MHD_PANIC ("Failed to acquire IP connection limit mutex\n");
    222     }
    223 }
    224 
    225 
    226 /**
    227  * Unlock shared structure for IP connection counts and connection DLLs.
    228  *
    229  * @param daemon handle to daemon where lock is
    230  */
    231 static void
    232 MHD_ip_count_unlock (struct MHD_Daemon *daemon)
    233 {
    234   if (MHD_YES != MHD_mutex_unlock_(&daemon->per_ip_connection_mutex))
    235     {
    236       MHD_PANIC ("Failed to release IP connection limit mutex\n");
    237     }
    238 }
    239 
    240 
    241 /**
    242  * Tree comparison function for IP addresses (supplied to tsearch() family).
    243  * We compare everything in the struct up through the beginning of the
    244  * 'count' field.
    245  *
    246  * @param a1 first address to compare
    247  * @param a2 second address to compare
    248  * @return -1, 0 or 1 depending on result of compare
    249  */
    250 static int
    251 MHD_ip_addr_compare (const void *a1, const void *a2)
    252 {
    253   return memcmp (a1, a2, offsetof (struct MHD_IPCount, count));
    254 }
    255 
    256 
    257 /**
    258  * Parse address and initialize 'key' using the address.
    259  *
    260  * @param addr address to parse
    261  * @param addrlen number of bytes in addr
    262  * @param key where to store the parsed address
    263  * @return #MHD_YES on success and #MHD_NO otherwise (e.g., invalid address type)
    264  */
    265 static int
    266 MHD_ip_addr_to_key (const struct sockaddr *addr,
    267 		    socklen_t addrlen,
    268 		    struct MHD_IPCount *key)
    269 {
    270   memset(key, 0, sizeof(*key));
    271 
    272   /* IPv4 addresses */
    273   if (sizeof (struct sockaddr_in) == addrlen)
    274     {
    275       const struct sockaddr_in *addr4 = (const struct sockaddr_in*) addr;
    276       key->family = AF_INET;
    277       memcpy (&key->addr.ipv4, &addr4->sin_addr, sizeof(addr4->sin_addr));
    278       return MHD_YES;
    279     }
    280 
    281 #if HAVE_INET6
    282   /* IPv6 addresses */
    283   if (sizeof (struct sockaddr_in6) == addrlen)
    284     {
    285       const struct sockaddr_in6 *addr6 = (const struct sockaddr_in6*) addr;
    286       key->family = AF_INET6;
    287       memcpy (&key->addr.ipv6, &addr6->sin6_addr, sizeof(addr6->sin6_addr));
    288       return MHD_YES;
    289     }
    290 #endif
    291 
    292   /* Some other address */
    293   return MHD_NO;
    294 }
    295 
    296 
    297 /**
    298  * Check if IP address is over its limit.
    299  *
    300  * @param daemon handle to daemon where connection counts are tracked
    301  * @param addr address to add (or increment counter)
    302  * @param addrlen number of bytes in addr
    303  * @return Return #MHD_YES if IP below limit, #MHD_NO if IP has surpassed limit.
    304  *   Also returns #MHD_NO if fails to allocate memory.
    305  */
    306 static int
    307 MHD_ip_limit_add (struct MHD_Daemon *daemon,
    308 		  const struct sockaddr *addr,
    309 		  socklen_t addrlen)
    310 {
    311   struct MHD_IPCount *key;
    312   void **nodep;
    313   void *node;
    314   int result;
    315 
    316   daemon = MHD_get_master (daemon);
    317   /* Ignore if no connection limit assigned */
    318   if (0 == daemon->per_ip_connection_limit)
    319     return MHD_YES;
    320 
    321   if (NULL == (key = malloc (sizeof(*key))))
    322     return MHD_NO;
    323 
    324   /* Initialize key */
    325   if (MHD_NO == MHD_ip_addr_to_key (addr, addrlen, key))
    326     {
    327       /* Allow unhandled address types through */
    328       free (key);
    329       return MHD_YES;
    330     }
    331   MHD_ip_count_lock (daemon);
    332 
    333   /* Search for the IP address */
    334   if (NULL == (nodep = tsearch (key,
    335 				&daemon->per_ip_connection_count,
    336 				&MHD_ip_addr_compare)))
    337     {
    338 #if HAVE_MESSAGES
    339       MHD_DLOG (daemon,
    340 		"Failed to add IP connection count node\n");
    341 #endif
    342       MHD_ip_count_unlock (daemon);
    343       free (key);
    344       return MHD_NO;
    345     }
    346   node = *nodep;
    347   /* If we got an existing node back, free the one we created */
    348   if (node != key)
    349     free(key);
    350   key = (struct MHD_IPCount *) node;
    351   /* Test if there is room for another connection; if so,
    352    * increment count */
    353   result = (key->count < daemon->per_ip_connection_limit);
    354   if (MHD_YES == result)
    355     ++key->count;
    356 
    357   MHD_ip_count_unlock (daemon);
    358   return result;
    359 }
    360 
    361 
    362 /**
    363  * Decrement connection count for IP address, removing from table
    364  * count reaches 0.
    365  *
    366  * @param daemon handle to daemon where connection counts are tracked
    367  * @param addr address to remove (or decrement counter)
    368  * @param addrlen number of bytes in @a addr
    369  */
    370 static void
    371 MHD_ip_limit_del (struct MHD_Daemon *daemon,
    372 		  const struct sockaddr *addr,
    373 		  socklen_t addrlen)
    374 {
    375   struct MHD_IPCount search_key;
    376   struct MHD_IPCount *found_key;
    377   void **nodep;
    378 
    379   daemon = MHD_get_master (daemon);
    380   /* Ignore if no connection limit assigned */
    381   if (0 == daemon->per_ip_connection_limit)
    382     return;
    383   /* Initialize search key */
    384   if (MHD_NO == MHD_ip_addr_to_key (addr, addrlen, &search_key))
    385     return;
    386 
    387   MHD_ip_count_lock (daemon);
    388 
    389   /* Search for the IP address */
    390   if (NULL == (nodep = tfind (&search_key,
    391 			      &daemon->per_ip_connection_count,
    392 			      &MHD_ip_addr_compare)))
    393     {
    394       /* Something's wrong if we couldn't find an IP address
    395        * that was previously added */
    396       MHD_PANIC ("Failed to find previously-added IP address\n");
    397     }
    398   found_key = (struct MHD_IPCount *) *nodep;
    399   /* Validate existing count for IP address */
    400   if (0 == found_key->count)
    401     {
    402       MHD_PANIC ("Previously-added IP address had 0 count\n");
    403     }
    404   /* Remove the node entirely if count reduces to 0 */
    405   if (0 == --found_key->count)
    406     {
    407       tdelete (found_key,
    408 	       &daemon->per_ip_connection_count,
    409 	       &MHD_ip_addr_compare);
    410       free (found_key);
    411     }
    412 
    413   MHD_ip_count_unlock (daemon);
    414 }
    415 
    416 
    417 #if HTTPS_SUPPORT
    418 
    419 static ssize_t
    420 recv_param_adapter (struct MHD_Connection *connection,
    421                     void *other,
    422                     size_t i);
    423 static ssize_t
    424 send_param_adapter (struct MHD_Connection *connection,
    425                     const void *other,
    426                     size_t i);
    427 
    428 // Internal functions for implementing OpenSSL BIO.
    429 static int
    430 MHD_bio_write (BIO* bio, const char* buf, int size)
    431 {
    432   struct MHD_Connection* connection = (struct MHD_Connection*)bio->ptr;
    433   BIO_clear_retry_flags (bio);
    434   ssize_t written = send_param_adapter (connection, buf, size);
    435   if (written < size)
    436     {
    437       BIO_set_retry_write (bio);
    438     }
    439   return written;
    440 }
    441 
    442 static int
    443 MHD_bio_read (BIO* bio, char* buf, int size)
    444 {
    445   struct MHD_Connection* connection = (struct MHD_Connection*)bio->ptr;
    446   BIO_clear_retry_flags (bio);
    447   ssize_t read = recv_param_adapter (connection, buf, size);
    448   if (read < size)
    449     {
    450       BIO_set_retry_read (bio);
    451     }
    452   return read;
    453 }
    454 
    455 static long
    456 MHD_bio_ctrl (BIO* bio, int cmd, long num, void* ptr)
    457 {
    458   if (cmd == BIO_CTRL_FLUSH)
    459     {
    460       return 1;
    461     }
    462   return 0;
    463 }
    464 
    465 static int
    466 MHD_bio_new (BIO* bio)
    467 {
    468   bio->shutdown = 0;
    469   bio->init = 0;
    470   bio->num = -1;  // not used.
    471   return 1;
    472 }
    473 
    474 static int
    475 MHD_bio_free (BIO* bio)
    476 {
    477   if (!bio)
    478     return 0;
    479 
    480   if (bio->init)
    481     {
    482       bio->ptr = NULL;
    483       bio->init = 0;
    484     }
    485   return 1;
    486 }
    487 
    488 // Describes a BIO built on [send|recv]_param_adapter().
    489 BIO_METHOD MHD_bio_method =
    490 {
    491     BIO_TYPE_SOURCE_SINK,
    492     "mhd",          // name
    493     MHD_bio_write,  // write function
    494     MHD_bio_read,   // read function
    495     NULL,           // puts function, not implemented
    496     NULL,           // gets function, not implemented
    497     MHD_bio_ctrl,   // control function
    498     MHD_bio_new,    // creation
    499     MHD_bio_free,   // free
    500     NULL,           // callback function, not used
    501 };
    502 
    503 
    504 /**
    505  * Callback for receiving data from the socket.
    506  *
    507  * @param connection the MHD_Connection structure
    508  * @param other where to write received data to
    509  * @param i maximum size of other (in bytes)
    510  * @return number of bytes actually received
    511  */
    512 static ssize_t
    513 recv_tls_adapter (struct MHD_Connection *connection, void *other, size_t i)
    514 {
    515   int res;
    516 
    517   if (MHD_YES == connection->tls_read_ready)
    518     {
    519       connection->daemon->num_tls_read_ready--;
    520       connection->tls_read_ready = MHD_NO;
    521     }
    522   res = SSL_read (connection->tls_session, other, i);
    523   if ( res < 0 && SSL_want_read (connection->tls_session) )
    524     {
    525       MHD_set_socket_errno_ (EINTR);
    526 #if EPOLL_SUPPORT
    527       connection->epoll_state &= ~MHD_EPOLL_STATE_READ_READY;
    528 #endif
    529       return -1;
    530     }
    531   if (res < 0)
    532     {
    533       /* Likely 'GNUTLS_E_INVALID_SESSION' (client communication
    534 	 disrupted); set errno to something caller will interpret
    535 	 correctly as a hard error */
    536       MHD_set_socket_errno_ (ECONNRESET);
    537       return res;
    538     }
    539   if (res == i)
    540     {
    541       connection->tls_read_ready = MHD_YES;
    542       connection->daemon->num_tls_read_ready++;
    543     }
    544   return res;
    545 }
    546 
    547 
    548 /**
    549  * Callback for writing data to the socket.
    550  *
    551  * @param connection the MHD connection structure
    552  * @param other data to write
    553  * @param i number of bytes to write
    554  * @return actual number of bytes written
    555  */
    556 static ssize_t
    557 send_tls_adapter (struct MHD_Connection *connection,
    558                   const void *other, size_t i)
    559 {
    560   int res;
    561 
    562   res = SSL_write (connection->tls_session, other, i);
    563   if ( res < 0 && SSL_want_write (connection->tls_session) )
    564     {
    565       MHD_set_socket_errno_ (EINTR);
    566 #if EPOLL_SUPPORT
    567       connection->epoll_state &= ~MHD_EPOLL_STATE_WRITE_READY;
    568 #endif
    569       return -1;
    570     }
    571   if (res < 0)
    572     {
    573       /* some other GNUTLS error, should set 'errno'; as we do not
    574          really understand the error (not listed in GnuTLS
    575          documentation explicitly), we set 'errno' to something that
    576          will cause the connection to fail. */
    577       MHD_set_socket_errno_ (ECONNRESET);
    578       return -1;
    579     }
    580   return res;
    581 }
    582 
    583 
    584 /**
    585  * Initialize security aspects of the HTTPS daemon
    586  *
    587  * @param daemon handle to daemon to initialize
    588  * @return 0 on success
    589  */
    590 static int
    591 MHD_TLS_init (struct MHD_Daemon *daemon)
    592 {
    593   int ret;
    594   daemon->tls_context = SSL_CTX_new (TLSv1_2_server_method());
    595   if (NULL == daemon->tls_context)
    596     return -1;
    597   if (NULL != daemon->https_mem_trust)
    598     {
    599       ret = 0;
    600       BIO* mem_bio = BIO_new_mem_buf ((void*)daemon->https_mem_trust, -1);
    601       X509* x509 = PEM_read_bio_X509 (mem_bio, NULL, NULL, NULL);
    602       BIO_free(mem_bio);
    603       if (x509 != NULL)
    604         {
    605           ret = SSL_CTX_add_client_CA (daemon->tls_context, x509);
    606         }
    607       if (ret == 0)
    608         {
    609 #if HAVE_MESSAGES
    610           MHD_DLOG (daemon,
    611                     "Bad trust certificate format\n");
    612 #endif
    613           return -1;
    614         }
    615     }
    616 
    617   if (NULL != daemon->https_mem_dhparams)
    618     {
    619       ret = 0;
    620       BIO* mem_bio = BIO_new_mem_buf ((void*)daemon->https_mem_dhparams, -1);
    621       DH* dh = PEM_read_bio_DHparams (mem_bio, NULL, NULL, NULL);
    622       BIO_free (mem_bio);
    623       if (dh != NULL)
    624         {
    625           ret = SSL_CTX_set_tmp_dh (daemon->tls_context, dh);
    626         }
    627       if (ret == 0)
    628         {
    629 #if HAVE_MESSAGES
    630           MHD_DLOG (daemon,
    631                     "Bad DH parameters format\n");
    632 #endif
    633           return -1;
    634         }
    635     }
    636 
    637   /* certificate & key loaded from memory */
    638   if ( (NULL != daemon->https_mem_cert) &&
    639        (NULL != daemon->https_mem_key) )
    640     {
    641       ret = 0;
    642       BIO* mem_bio = BIO_new_mem_buf ((void*)daemon->https_mem_key, -1);
    643       EVP_PKEY* key = PEM_read_bio_PrivateKey (mem_bio, NULL, NULL,
    644                                                (void*)daemon->https_key_password);
    645       BIO_free (mem_bio);
    646       if (key != NULL)
    647         {
    648           ret = SSL_CTX_use_PrivateKey (daemon->tls_context, key);
    649         }
    650       if (ret == 0)
    651         {
    652 #if HAVE_MESSAGES
    653           MHD_DLOG (daemon,
    654                     "Bad private key format\n");
    655 #endif
    656           return -1;
    657         }
    658       ret = 0;
    659       mem_bio = BIO_new_mem_buf ((void*)daemon->https_mem_cert, -1);
    660       X509* x509 = PEM_read_bio_X509 (mem_bio, NULL, NULL, NULL);
    661       BIO_free (mem_bio);
    662       if (x509 != NULL)
    663         {
    664           ret = SSL_CTX_use_certificate (daemon->tls_context, x509);
    665         }
    666       if (ret == 0)
    667         {
    668 #if HAVE_MESSAGES
    669           MHD_DLOG (daemon,
    670                     "Bad certificate format\n");
    671 #endif
    672           return -1;
    673         }
    674       if (1 != SSL_CTX_check_private_key (daemon->tls_context))
    675          {
    676 #if HAVE_MESSAGES
    677           MHD_DLOG (daemon,
    678                     "Invalid key / certificate combination\n");
    679 #endif
    680           return -1;
    681         }
    682     }
    683   else
    684     {
    685 #if HAVE_MESSAGES
    686       MHD_DLOG (daemon,
    687                 "You need to specify a certificate and key location\n");
    688 #endif
    689       return -1;
    690     }
    691   if (NULL != daemon->https_mem_cipher)
    692     {
    693       ret = SSL_CTX_set_cipher_list (daemon->tls_context,
    694                                      daemon->https_mem_cipher);
    695       if (ret == 0)
    696         {
    697 #if HAVE_MESSAGES
    698           MHD_DLOG (daemon,
    699                     "Bad cipher string format\n");
    700 #endif
    701           return -1;
    702         }
    703     }
    704   else
    705     {
    706       ret = SSL_CTX_set_cipher_list (daemon->tls_context,
    707                                      "HIGH!SHA1!DH@STRENGTH");
    708       if (ret == 0)
    709          {
    710 #if HAVE_MESSAGES
    711           MHD_DLOG (daemon,
    712                     "Failed to setup default cipher string\n");
    713 #endif
    714           return -1;
    715         }
    716     }
    717   return 0;
    718 }
    719 
    720 static void
    721 MHD_TLS_deinit (struct MHD_Daemon *daemon)
    722 {
    723   SSL_CTX_free (daemon->tls_context);
    724 }
    725 #endif
    726 
    727 
    728 /**
    729  * Add @a fd to the @a set.  If @a fd is
    730  * greater than @a max_fd, set @a max_fd to @a fd.
    731  *
    732  * @param fd file descriptor to add to the @a set
    733  * @param set set to modify
    734  * @param max_fd maximum value to potentially update
    735  * @param fd_setsize value of FD_SETSIZE
    736  * @return #MHD_YES on success, #MHD_NO otherwise
    737  */
    738 static int
    739 add_to_fd_set (MHD_socket fd,
    740 	       fd_set *set,
    741 	       MHD_socket *max_fd,
    742 	       unsigned int fd_setsize)
    743 {
    744   if (NULL == set)
    745     return MHD_NO;
    746 #ifdef MHD_WINSOCK_SOCKETS
    747   if (set->fd_count >= fd_setsize)
    748     {
    749       if (FD_ISSET(fd, set))
    750         return MHD_YES;
    751       else
    752         return MHD_NO;
    753     }
    754 #else  // ! MHD_WINSOCK_SOCKETS
    755   if (fd >= fd_setsize)
    756     return MHD_NO;
    757 #endif // ! MHD_WINSOCK_SOCKETS
    758   FD_SET (fd, set);
    759   if ( (NULL != max_fd) && (MHD_INVALID_SOCKET != fd) &&
    760        ((fd > *max_fd) || (MHD_INVALID_SOCKET == *max_fd)) )
    761     *max_fd = fd;
    762 
    763   return MHD_YES;
    764 }
    765 
    766 #undef MHD_get_fdset
    767 
    768 /**
    769  * Obtain the `select()` sets for this daemon.
    770  * Daemon's FDs will be added to fd_sets. To get only
    771  * daemon FDs in fd_sets, call FD_ZERO for each fd_set
    772  * before calling this function. FD_SETSIZE is assumed
    773  * to be platform's default.
    774  *
    775  * @param daemon daemon to get sets from
    776  * @param read_fd_set read set
    777  * @param write_fd_set write set
    778  * @param except_fd_set except set
    779  * @param max_fd increased to largest FD added (if larger
    780  *               than existing value); can be NULL
    781  * @return #MHD_YES on success, #MHD_NO if this
    782  *         daemon was not started with the right
    783  *         options for this call or any FD didn't
    784  *         fit fd_set.
    785  * @ingroup event
    786  */
    787 int
    788 MHD_get_fdset (struct MHD_Daemon *daemon,
    789                fd_set *read_fd_set,
    790                fd_set *write_fd_set,
    791 	       fd_set *except_fd_set,
    792 	       MHD_socket *max_fd)
    793 {
    794   return MHD_get_fdset2(daemon, read_fd_set,
    795       write_fd_set, except_fd_set,
    796       max_fd, MHD_DEFAULT_FD_SETSIZE);
    797 }
    798 
    799 /**
    800  * Obtain the `select()` sets for this daemon.
    801  * Daemon's FDs will be added to fd_sets. To get only
    802  * daemon FDs in fd_sets, call FD_ZERO for each fd_set
    803  * before calling this function. Passing custom FD_SETSIZE
    804  * as @a fd_setsize allow usage of larger/smaller than
    805  * platform's default fd_sets.
    806  *
    807  * @param daemon daemon to get sets from
    808  * @param read_fd_set read set
    809  * @param write_fd_set write set
    810  * @param except_fd_set except set
    811  * @param max_fd increased to largest FD added (if larger
    812  *               than existing value); can be NULL
    813  * @param fd_setsize value of FD_SETSIZE
    814  * @return #MHD_YES on success, #MHD_NO if this
    815  *         daemon was not started with the right
    816  *         options for this call or any FD didn't
    817  *         fit fd_set.
    818  * @ingroup event
    819  */
    820 int
    821 MHD_get_fdset2 (struct MHD_Daemon *daemon,
    822                fd_set *read_fd_set,
    823                fd_set *write_fd_set,
    824                fd_set *except_fd_set,
    825                MHD_socket *max_fd,
    826                unsigned int fd_setsize)
    827 {
    828   struct MHD_Connection *pos;
    829 
    830   if ( (NULL == daemon)
    831        || (NULL == read_fd_set)
    832        || (NULL == write_fd_set)
    833        || (MHD_YES == daemon->shutdown)
    834        || (0 != (daemon->options & MHD_USE_THREAD_PER_CONNECTION))
    835        || (0 != (daemon->options & MHD_USE_POLL)))
    836     return MHD_NO;
    837 #if EPOLL_SUPPORT
    838   if (0 != (daemon->options & MHD_USE_EPOLL_LINUX_ONLY))
    839     {
    840       /* we're in epoll mode, use the epoll FD as a stand-in for
    841 	 the entire event set */
    842 
    843       return add_to_fd_set (daemon->epoll_fd, read_fd_set, max_fd, fd_setsize);
    844     }
    845 #endif
    846   if (MHD_INVALID_SOCKET != daemon->socket_fd &&
    847       MHD_YES != add_to_fd_set (daemon->socket_fd, read_fd_set, max_fd, fd_setsize))
    848     return MHD_NO;
    849 
    850   for (pos = daemon->connections_head; NULL != pos; pos = pos->next)
    851     {
    852       switch (pos->event_loop_info)
    853 	{
    854 	case MHD_EVENT_LOOP_INFO_READ:
    855 	  if (MHD_YES != add_to_fd_set (pos->socket_fd, read_fd_set, max_fd, fd_setsize))
    856 	    return MHD_NO;
    857 	  break;
    858 	case MHD_EVENT_LOOP_INFO_WRITE:
    859 	  if (MHD_YES != add_to_fd_set (pos->socket_fd, write_fd_set, max_fd, fd_setsize))
    860 	    return MHD_NO;
    861 	  if (pos->read_buffer_size > pos->read_buffer_offset &&
    862 	      MHD_YES != add_to_fd_set (pos->socket_fd, read_fd_set, max_fd, fd_setsize))
    863             return MHD_NO;
    864 	  break;
    865 	case MHD_EVENT_LOOP_INFO_BLOCK:
    866 	  if (pos->read_buffer_size > pos->read_buffer_offset &&
    867 	      MHD_YES != add_to_fd_set (pos->socket_fd, read_fd_set, max_fd, fd_setsize))
    868             return MHD_NO;
    869 	  break;
    870 	case MHD_EVENT_LOOP_INFO_CLEANUP:
    871 	  /* this should never happen */
    872 	  break;
    873 	}
    874     }
    875 #if DEBUG_CONNECT
    876 #if HAVE_MESSAGES
    877   if (NULL != max_fd)
    878     MHD_DLOG (daemon,
    879               "Maximum socket in select set: %d\n",
    880               *max_fd);
    881 #endif
    882 #endif
    883   return MHD_YES;
    884 }
    885 
    886 
    887 /**
    888  * Main function of the thread that handles an individual
    889  * connection when #MHD_USE_THREAD_PER_CONNECTION is set.
    890  *
    891  * @param data the `struct MHD_Connection` this thread will handle
    892  * @return always 0
    893  */
    894 static MHD_THRD_RTRN_TYPE_ MHD_THRD_CALL_SPEC_
    895 MHD_handle_connection (void *data)
    896 {
    897   struct MHD_Connection *con = data;
    898   int num_ready;
    899   fd_set rs;
    900   fd_set ws;
    901   MHD_socket max;
    902   struct timeval tv;
    903   struct timeval *tvp;
    904   unsigned int timeout;
    905   time_t now;
    906 #if WINDOWS
    907   MHD_pipe spipe = con->daemon->wpipe[0];
    908   char tmp;
    909 #ifdef HAVE_POLL
    910   int extra_slot;
    911 #endif /* HAVE_POLL */
    912 #define EXTRA_SLOTS 1
    913 #else  /* !WINDOWS */
    914 #define EXTRA_SLOTS 0
    915 #endif /* !WINDOWS */
    916 #ifdef HAVE_POLL
    917   struct pollfd p[1 + EXTRA_SLOTS];
    918 #endif
    919 
    920   timeout = con->daemon->connection_timeout;
    921   while ( (MHD_YES != con->daemon->shutdown) &&
    922 	  (MHD_CONNECTION_CLOSED != con->state) )
    923     {
    924       tvp = NULL;
    925       if (timeout > 0)
    926 	{
    927 	  now = MHD_monotonic_time();
    928 	  if (now - con->last_activity > timeout)
    929 	    tv.tv_sec = 0;
    930 	  else
    931 	    tv.tv_sec = timeout - (now - con->last_activity);
    932 	  tv.tv_usec = 0;
    933 	  tvp = &tv;
    934 	}
    935 #if HTTPS_SUPPORT
    936       if (MHD_YES == con->tls_read_ready)
    937 	{
    938 	  /* do not block (more data may be inside of TLS buffers waiting for us) */
    939 	  tv.tv_sec = 0;
    940 	  tv.tv_usec = 0;
    941 	  tvp = &tv;
    942 	}
    943 #endif
    944       if (0 == (con->daemon->options & MHD_USE_POLL))
    945 	{
    946 	  /* use select */
    947 	  int err_state = 0;
    948 	  FD_ZERO (&rs);
    949 	  FD_ZERO (&ws);
    950 	  max = 0;
    951 	  switch (con->event_loop_info)
    952 	    {
    953 	    case MHD_EVENT_LOOP_INFO_READ:
    954 	      if (MHD_YES !=
    955                   add_to_fd_set (con->socket_fd, &rs, &max, FD_SETSIZE))
    956 	        err_state = 1;
    957 	      break;
    958 	    case MHD_EVENT_LOOP_INFO_WRITE:
    959 	      if (MHD_YES !=
    960                   add_to_fd_set (con->socket_fd, &ws, &max, FD_SETSIZE))
    961                 err_state = 1;
    962 	      if ( (con->read_buffer_size > con->read_buffer_offset) &&
    963                    (MHD_YES !=
    964                     add_to_fd_set (con->socket_fd, &rs, &max, FD_SETSIZE)) )
    965 	        err_state = 1;
    966 	      break;
    967 	    case MHD_EVENT_LOOP_INFO_BLOCK:
    968 	      if ( (con->read_buffer_size > con->read_buffer_offset) &&
    969                    (MHD_YES !=
    970                     add_to_fd_set (con->socket_fd, &rs, &max, FD_SETSIZE)) )
    971 	        err_state = 1;
    972 	      tv.tv_sec = 0;
    973 	      tv.tv_usec = 0;
    974 	      tvp = &tv;
    975 	      break;
    976 	    case MHD_EVENT_LOOP_INFO_CLEANUP:
    977 	      /* how did we get here!? */
    978 	      goto exit;
    979 	    }
    980 #if WINDOWS
    981           if (MHD_INVALID_PIPE_ != spipe)
    982             {
    983               if (MHD_YES !=
    984                   add_to_fd_set (spipe, &rs, &max, FD_SETSIZE))
    985                 err_state = 1;
    986             }
    987 #endif
    988             if (0 != err_state)
    989               {
    990 #if HAVE_MESSAGES
    991                 MHD_DLOG (con->daemon,
    992                           "Can't add FD to fd_set\n");
    993 #endif
    994                 goto exit;
    995               }
    996 
    997 	  num_ready = MHD_SYS_select_ (max + 1, &rs, &ws, NULL, tvp);
    998 	  if (num_ready < 0)
    999 	    {
   1000 	      if (EINTR == MHD_socket_errno_)
   1001 		continue;
   1002 #if HAVE_MESSAGES
   1003 	      MHD_DLOG (con->daemon,
   1004 			"Error during select (%d): `%s'\n",
   1005 			MHD_socket_errno_,
   1006 			MHD_socket_last_strerr_ ());
   1007 #endif
   1008 	      break;
   1009 	    }
   1010 #if WINDOWS
   1011           /* drain signaling pipe */
   1012           if ( (MHD_INVALID_PIPE_ != spipe) &&
   1013                (FD_ISSET (spipe, &rs)) )
   1014             (void) MHD_pipe_read_ (spipe, &tmp, sizeof (tmp));
   1015 #endif
   1016 	  /* call appropriate connection handler if necessary */
   1017 	  if ( (FD_ISSET (con->socket_fd, &rs))
   1018 #if HTTPS_SUPPORT
   1019 	       || (MHD_YES == con->tls_read_ready)
   1020 #endif
   1021 	       )
   1022 	    con->read_handler (con);
   1023 	  if (FD_ISSET (con->socket_fd, &ws))
   1024 	    con->write_handler (con);
   1025 	  if (MHD_NO == con->idle_handler (con))
   1026 	    goto exit;
   1027 	}
   1028 #ifdef HAVE_POLL
   1029       else
   1030 	{
   1031 	  /* use poll */
   1032 	  memset (&p, 0, sizeof (p));
   1033 	  p[0].fd = con->socket_fd;
   1034 	  switch (con->event_loop_info)
   1035 	    {
   1036 	    case MHD_EVENT_LOOP_INFO_READ:
   1037 	      p[0].events |= POLLIN;
   1038 	      break;
   1039 	    case MHD_EVENT_LOOP_INFO_WRITE:
   1040 	      p[0].events |= POLLOUT;
   1041 	      if (con->read_buffer_size > con->read_buffer_offset)
   1042 		p[0].events |= POLLIN;
   1043 	      break;
   1044 	    case MHD_EVENT_LOOP_INFO_BLOCK:
   1045 	      if (con->read_buffer_size > con->read_buffer_offset)
   1046 		p[0].events |= POLLIN;
   1047 	      tv.tv_sec = 0;
   1048 	      tv.tv_usec = 0;
   1049 	      tvp = &tv;
   1050 	      break;
   1051 	    case MHD_EVENT_LOOP_INFO_CLEANUP:
   1052 	      /* how did we get here!? */
   1053 	      goto exit;
   1054 	    }
   1055 #if WINDOWS
   1056           extra_slot = 0;
   1057           if (MHD_INVALID_PIPE_ != spipe)
   1058             {
   1059               p[1].events |= POLLIN;
   1060               p[1].fd = spipe;
   1061               p[1].revents = 0;
   1062               extra_slot = 1;
   1063             }
   1064 #endif
   1065 	  if (MHD_sys_poll_ (p,
   1066 #if WINDOWS
   1067                     1 + extra_slot,
   1068 #else
   1069                     1,
   1070 #endif
   1071 		    (NULL == tvp) ? -1 : tv.tv_sec * 1000) < 0)
   1072 	    {
   1073 	      if (EINTR == MHD_socket_errno_)
   1074 		continue;
   1075 #if HAVE_MESSAGES
   1076 	      MHD_DLOG (con->daemon,
   1077                         "Error during poll: `%s'\n",
   1078 			MHD_socket_last_strerr_ ());
   1079 #endif
   1080 	      break;
   1081 	    }
   1082 #if WINDOWS
   1083           /* drain signaling pipe */
   1084           if ( (MHD_INVALID_PIPE_ != spipe) &&
   1085                (0 != (p[1].revents & (POLLERR | POLLHUP))) )
   1086             (void) MHD_pipe_read_ (spipe, &tmp, sizeof (tmp));
   1087 #endif
   1088 	  if ( (0 != (p[0].revents & POLLIN))
   1089 #if HTTPS_SUPPORT
   1090 	       || (MHD_YES == con->tls_read_ready)
   1091 #endif
   1092 	       )
   1093 	    con->read_handler (con);
   1094 	  if (0 != (p[0].revents & POLLOUT))
   1095 	    con->write_handler (con);
   1096 	  if (0 != (p[0].revents & (POLLERR | POLLHUP)))
   1097 	    MHD_connection_close (con, MHD_REQUEST_TERMINATED_WITH_ERROR);
   1098 	  if (MHD_NO == con->idle_handler (con))
   1099 	    goto exit;
   1100 	}
   1101 #endif
   1102     }
   1103   if (MHD_CONNECTION_IN_CLEANUP != con->state)
   1104     {
   1105 #if DEBUG_CLOSE
   1106 #if HAVE_MESSAGES
   1107       MHD_DLOG (con->daemon,
   1108                 "Processing thread terminating, closing connection\n");
   1109 #endif
   1110 #endif
   1111       if (MHD_CONNECTION_CLOSED != con->state)
   1112 	MHD_connection_close (con,
   1113 			      MHD_REQUEST_TERMINATED_DAEMON_SHUTDOWN);
   1114       con->idle_handler (con);
   1115     }
   1116 exit:
   1117   if (NULL != con->response)
   1118     {
   1119       MHD_destroy_response (con->response);
   1120       con->response = NULL;
   1121     }
   1122 
   1123   if (NULL != con->daemon->notify_connection)
   1124     con->daemon->notify_connection (con->daemon->notify_connection_cls,
   1125                                     con,
   1126                                     &con->socket_context,
   1127                                     MHD_CONNECTION_NOTIFY_CLOSED);
   1128 
   1129   return (MHD_THRD_RTRN_TYPE_)0;
   1130 }
   1131 
   1132 
   1133 /**
   1134  * Callback for receiving data from the socket.
   1135  *
   1136  * @param connection the MHD connection structure
   1137  * @param other where to write received data to
   1138  * @param i maximum size of other (in bytes)
   1139  * @return number of bytes actually received
   1140  */
   1141 static ssize_t
   1142 recv_param_adapter (struct MHD_Connection *connection,
   1143 		    void *other,
   1144 		    size_t i)
   1145 {
   1146   ssize_t ret;
   1147 
   1148   if ( (MHD_INVALID_SOCKET == connection->socket_fd) ||
   1149        (MHD_CONNECTION_CLOSED == connection->state) )
   1150     {
   1151       MHD_set_socket_errno_ (ENOTCONN);
   1152       return -1;
   1153     }
   1154   ret = recv (connection->socket_fd, other, i, MSG_NOSIGNAL);
   1155 #if EPOLL_SUPPORT
   1156   if (ret < (ssize_t) i)
   1157     {
   1158       /* partial read --- no longer read-ready */
   1159       connection->epoll_state &= ~MHD_EPOLL_STATE_READ_READY;
   1160     }
   1161 #endif
   1162   return ret;
   1163 }
   1164 
   1165 
   1166 /**
   1167  * Callback for writing data to the socket.
   1168  *
   1169  * @param connection the MHD connection structure
   1170  * @param other data to write
   1171  * @param i number of bytes to write
   1172  * @return actual number of bytes written
   1173  */
   1174 static ssize_t
   1175 send_param_adapter (struct MHD_Connection *connection,
   1176                     const void *other,
   1177 		    size_t i)
   1178 {
   1179   ssize_t ret;
   1180 #if LINUX
   1181   MHD_socket fd;
   1182   off_t offset;
   1183   off_t left;
   1184 #endif
   1185 
   1186   if ( (MHD_INVALID_SOCKET == connection->socket_fd) ||
   1187        (MHD_CONNECTION_CLOSED == connection->state) )
   1188     {
   1189       MHD_set_socket_errno_ (ENOTCONN);
   1190       return -1;
   1191     }
   1192   if (0 != (connection->daemon->options & MHD_USE_SSL))
   1193     return send (connection->socket_fd, other, i, MSG_NOSIGNAL);
   1194 #if LINUX
   1195   if ( (connection->write_buffer_append_offset ==
   1196 	connection->write_buffer_send_offset) &&
   1197        (NULL != connection->response) &&
   1198        (MHD_INVALID_SOCKET != (fd = connection->response->fd)) )
   1199     {
   1200       /* can use sendfile */
   1201       offset = (off_t) connection->response_write_position + connection->response->fd_off;
   1202       left = connection->response->total_size - connection->response_write_position;
   1203       if (left > SSIZE_MAX)
   1204 	left = SSIZE_MAX; /* cap at return value limit */
   1205       if (-1 != (ret = sendfile (connection->socket_fd,
   1206 				 fd,
   1207 				 &offset,
   1208 				 (size_t) left)))
   1209 	{
   1210 #if EPOLL_SUPPORT
   1211 	  if (ret < left)
   1212 	    {
   1213 	      /* partial write --- no longer write-ready */
   1214 	      connection->epoll_state &= ~MHD_EPOLL_STATE_WRITE_READY;
   1215 	    }
   1216 #endif
   1217 	  return ret;
   1218 	}
   1219       const int err = MHD_socket_errno_;
   1220       if ( (EINTR == err) || (EAGAIN == err) || (EWOULDBLOCK == err) )
   1221 	return 0;
   1222       if ( (EINVAL == err) || (EBADF == err) )
   1223 	return -1;
   1224       /* None of the 'usual' sendfile errors occurred, so we should try
   1225 	 to fall back to 'SEND'; see also this thread for info on
   1226 	 odd libc/Linux behavior with sendfile:
   1227 	 http://lists.gnu.org/archive/html/libmicrohttpd/2011-02/msg00015.html */
   1228     }
   1229 #endif
   1230   ret = send (connection->socket_fd, other, i, MSG_NOSIGNAL);
   1231 #if EPOLL_SUPPORT
   1232   if (ret < (ssize_t) i)
   1233     {
   1234       /* partial write --- no longer write-ready */
   1235       connection->epoll_state &= ~MHD_EPOLL_STATE_WRITE_READY;
   1236     }
   1237 #endif
   1238   /* Handle broken kernel / libc, returning -1 but not setting errno;
   1239      kill connection as that should be safe; reported on mailinglist here:
   1240      http://lists.gnu.org/archive/html/libmicrohttpd/2014-10/msg00023.html */
   1241   if ( (-1 == ret) && (0 == errno) )
   1242     errno = ECONNRESET;
   1243   return ret;
   1244 }
   1245 
   1246 
   1247 /**
   1248  * Signature of main function for a thread.
   1249  *
   1250  * @param cls closure argument for the function
   1251  * @return termination code from the thread
   1252  */
   1253 typedef MHD_THRD_RTRN_TYPE_ (MHD_THRD_CALL_SPEC_ *ThreadStartRoutine)(void *cls);
   1254 
   1255 
   1256 /**
   1257  * Create a thread and set the attributes according to our options.
   1258  *
   1259  * @param thread handle to initialize
   1260  * @param daemon daemon with options
   1261  * @param start_routine main function of thread
   1262  * @param arg argument for start_routine
   1263  * @return 0 on success
   1264  */
   1265 static int
   1266 create_thread (MHD_thread_handle_ *thread,
   1267 	       const struct MHD_Daemon *daemon,
   1268 	       ThreadStartRoutine start_routine,
   1269 	       void *arg)
   1270 {
   1271 #if defined(MHD_USE_POSIX_THREADS)
   1272   pthread_attr_t attr;
   1273   pthread_attr_t *pattr;
   1274   int ret;
   1275 
   1276   if (0 != daemon->thread_stack_size)
   1277     {
   1278       if (0 != (ret = pthread_attr_init (&attr)))
   1279 	goto ERR;
   1280       if (0 != (ret = pthread_attr_setstacksize (&attr, daemon->thread_stack_size)))
   1281 	{
   1282 	  pthread_attr_destroy (&attr);
   1283 	  goto ERR;
   1284 	}
   1285       pattr = &attr;
   1286     }
   1287   else
   1288     {
   1289       pattr = NULL;
   1290     }
   1291   ret = pthread_create (thread, pattr,
   1292 			start_routine, arg);
   1293 #ifdef HAVE_PTHREAD_SETNAME_NP
   1294   (void) pthread_setname_np (*thread, "libmicrohttpd");
   1295 #endif /* HAVE_PTHREAD_SETNAME_NP */
   1296   if (0 != daemon->thread_stack_size)
   1297     pthread_attr_destroy (&attr);
   1298   return ret;
   1299  ERR:
   1300 #if HAVE_MESSAGES
   1301   MHD_DLOG (daemon,
   1302 	    "Failed to set thread stack size\n");
   1303 #endif
   1304   errno = EINVAL;
   1305   return ret;
   1306 #elif defined(MHD_USE_W32_THREADS)
   1307   unsigned threadID;
   1308   *thread = (HANDLE)_beginthreadex(NULL, (unsigned)daemon->thread_stack_size, start_routine,
   1309                           arg, 0, &threadID);
   1310   if (NULL == (*thread))
   1311     return errno;
   1312 
   1313   W32_SetThreadName(threadID, "libmicrohttpd");
   1314 
   1315   return 0;
   1316 #endif
   1317 }
   1318 
   1319 
   1320 /**
   1321  * Add another client connection to the set of connections
   1322  * managed by MHD.  This API is usually not needed (since
   1323  * MHD will accept inbound connections on the server socket).
   1324  * Use this API in special cases, for example if your HTTP
   1325  * server is behind NAT and needs to connect out to the
   1326  * HTTP client.
   1327  *
   1328  * The given client socket will be managed (and closed!) by MHD after
   1329  * this call and must no longer be used directly by the application
   1330  * afterwards.
   1331  *
   1332  * Per-IP connection limits are ignored when using this API.
   1333  *
   1334  * @param daemon daemon that manages the connection
   1335  * @param client_socket socket to manage (MHD will expect
   1336  *        to receive an HTTP request from this socket next).
   1337  * @param addr IP address of the client
   1338  * @param addrlen number of bytes in @a addr
   1339  * @param external_add perform additional operations needed due
   1340  *        to the application calling us directly
   1341  * @return #MHD_YES on success, #MHD_NO if this daemon could
   1342  *        not handle the connection (i.e. malloc failed, etc).
   1343  *        The socket will be closed in any case; 'errno' is
   1344  *        set to indicate further details about the error.
   1345  */
   1346 static int
   1347 internal_add_connection (struct MHD_Daemon *daemon,
   1348 			 MHD_socket client_socket,
   1349 			 const struct sockaddr *addr,
   1350 			 socklen_t addrlen,
   1351 			 int external_add)
   1352 {
   1353   struct MHD_Connection *connection;
   1354   int res_thread_create;
   1355   unsigned int i;
   1356   int eno;
   1357   struct MHD_Daemon *worker;
   1358 #if OSX
   1359   static int on = 1;
   1360 #endif
   1361 
   1362   if (NULL != daemon->worker_pool)
   1363     {
   1364       /* have a pool, try to find a pool with capacity; we use the
   1365 	 socket as the initial offset into the pool for load
   1366 	 balancing */
   1367       for (i=0;i<daemon->worker_pool_size;i++)
   1368         {
   1369           worker = &daemon->worker_pool[(i + client_socket) % daemon->worker_pool_size];
   1370           if (worker->connections < worker->connection_limit)
   1371             return internal_add_connection (worker,
   1372                                             client_socket,
   1373                                             addr, addrlen,
   1374                                             external_add);
   1375         }
   1376       /* all pools are at their connection limit, must refuse */
   1377       if (0 != MHD_socket_close_ (client_socket))
   1378 	MHD_PANIC ("close failed\n");
   1379 #if ENFILE
   1380       errno = ENFILE;
   1381 #endif
   1382       return MHD_NO;
   1383     }
   1384 
   1385 #ifndef WINDOWS
   1386   if ( (client_socket >= FD_SETSIZE) &&
   1387        (0 == (daemon->options & (MHD_USE_POLL | MHD_USE_EPOLL_LINUX_ONLY))) )
   1388     {
   1389 #if HAVE_MESSAGES
   1390       MHD_DLOG (daemon,
   1391 		"Socket descriptor larger than FD_SETSIZE: %d > %d\n",
   1392 		client_socket,
   1393 		FD_SETSIZE);
   1394 #endif
   1395       if (0 != MHD_socket_close_ (client_socket))
   1396 	MHD_PANIC ("close failed\n");
   1397 #if EINVAL
   1398       errno = EINVAL;
   1399 #endif
   1400       return MHD_NO;
   1401     }
   1402 #endif
   1403 
   1404 
   1405 #if HAVE_MESSAGES
   1406 #if DEBUG_CONNECT
   1407   MHD_DLOG (daemon,
   1408             "Accepted connection on socket %d\n",
   1409             client_socket);
   1410 #endif
   1411 #endif
   1412   if ( (daemon->connections == daemon->connection_limit) ||
   1413        (MHD_NO == MHD_ip_limit_add (daemon, addr, addrlen)) )
   1414     {
   1415       /* above connection limit - reject */
   1416 #if HAVE_MESSAGES
   1417       MHD_DLOG (daemon,
   1418                 "Server reached connection limit (closing inbound connection)\n");
   1419 #endif
   1420       if (0 != MHD_socket_close_ (client_socket))
   1421 	MHD_PANIC ("close failed\n");
   1422 #if ENFILE
   1423       errno = ENFILE;
   1424 #endif
   1425       return MHD_NO;
   1426     }
   1427 
   1428   /* apply connection acceptance policy if present */
   1429   if ( (NULL != daemon->apc) &&
   1430        (MHD_NO == daemon->apc (daemon->apc_cls,
   1431 			       addr, addrlen)) )
   1432     {
   1433 #if DEBUG_CLOSE
   1434 #if HAVE_MESSAGES
   1435       MHD_DLOG (daemon,
   1436                 "Connection rejected, closing connection\n");
   1437 #endif
   1438 #endif
   1439       if (0 != MHD_socket_close_ (client_socket))
   1440 	MHD_PANIC ("close failed\n");
   1441       MHD_ip_limit_del (daemon, addr, addrlen);
   1442 #if EACCESS
   1443       errno = EACCESS;
   1444 #endif
   1445       return MHD_NO;
   1446     }
   1447 
   1448 #if OSX
   1449 #ifdef SOL_SOCKET
   1450 #ifdef SO_NOSIGPIPE
   1451   setsockopt (client_socket,
   1452 	      SOL_SOCKET, SO_NOSIGPIPE,
   1453 	      &on, sizeof (on));
   1454 #endif
   1455 #endif
   1456 #endif
   1457 
   1458   if (NULL == (connection = malloc (sizeof (struct MHD_Connection))))
   1459     {
   1460       eno = errno;
   1461 #if HAVE_MESSAGES
   1462       MHD_DLOG (daemon,
   1463 		"Error allocating memory: %s\n",
   1464 		MHD_strerror_ (errno));
   1465 #endif
   1466       if (0 != MHD_socket_close_ (client_socket))
   1467 	MHD_PANIC ("close failed\n");
   1468       MHD_ip_limit_del (daemon, addr, addrlen);
   1469       errno = eno;
   1470       return MHD_NO;
   1471     }
   1472   memset (connection,
   1473           0,
   1474           sizeof (struct MHD_Connection));
   1475   connection->pool = MHD_pool_create (daemon->pool_size);
   1476   if (NULL == connection->pool)
   1477     {
   1478 #if HAVE_MESSAGES
   1479       MHD_DLOG (daemon,
   1480 		"Error allocating memory: %s\n",
   1481 		MHD_strerror_ (errno));
   1482 #endif
   1483       if (0 != MHD_socket_close_ (client_socket))
   1484 	MHD_PANIC ("close failed\n");
   1485       MHD_ip_limit_del (daemon, addr, addrlen);
   1486       free (connection);
   1487 #if ENOMEM
   1488       errno = ENOMEM;
   1489 #endif
   1490       return MHD_NO;
   1491     }
   1492 
   1493   connection->connection_timeout = daemon->connection_timeout;
   1494   if (NULL == (connection->addr = malloc (addrlen)))
   1495     {
   1496       eno = errno;
   1497 #if HAVE_MESSAGES
   1498       MHD_DLOG (daemon,
   1499 		"Error allocating memory: %s\n",
   1500 		MHD_strerror_ (errno));
   1501 #endif
   1502       if (0 != MHD_socket_close_ (client_socket))
   1503 	MHD_PANIC ("close failed\n");
   1504       MHD_ip_limit_del (daemon, addr, addrlen);
   1505       MHD_pool_destroy (connection->pool);
   1506       free (connection);
   1507       errno = eno;
   1508       return MHD_NO;
   1509     }
   1510   memcpy (connection->addr, addr, addrlen);
   1511   connection->addr_len = addrlen;
   1512   connection->socket_fd = client_socket;
   1513   connection->daemon = daemon;
   1514   connection->last_activity = MHD_monotonic_time();
   1515 
   1516   /* set default connection handlers  */
   1517   MHD_set_http_callbacks_ (connection);
   1518   connection->recv_cls = &recv_param_adapter;
   1519   connection->send_cls = &send_param_adapter;
   1520 
   1521   if (0 == (connection->daemon->options & MHD_USE_EPOLL_TURBO))
   1522     {
   1523       /* non-blocking sockets are required on most systems and for GNUtls;
   1524 	 however, they somehow cause serious problems on CYGWIN (#1824);
   1525 	 in turbo mode, we assume that non-blocking was already set
   1526 	 by 'accept4' or whoever calls 'MHD_add_connection' */
   1527 #ifdef CYGWIN
   1528       if (0 != (daemon->options & MHD_USE_SSL))
   1529 #endif
   1530 	{
   1531 	  /* make socket non-blocking */
   1532 #if !defined(WINDOWS) || defined(CYGWIN)
   1533 	  int flags = fcntl (connection->socket_fd, F_GETFL);
   1534 	  if ( (-1 == flags) ||
   1535 	       (0 != fcntl (connection->socket_fd, F_SETFL, flags | O_NONBLOCK)) )
   1536 	    {
   1537 #if HAVE_MESSAGES
   1538 	      MHD_DLOG (daemon,
   1539 			"Failed to make socket non-blocking: %s\n",
   1540 			MHD_socket_last_strerr_ ());
   1541 #endif
   1542 	    }
   1543 #else
   1544 	  unsigned long flags = 1;
   1545 	  if (0 != ioctlsocket (connection->socket_fd, FIONBIO, &flags))
   1546 	    {
   1547 #if HAVE_MESSAGES
   1548 	      MHD_DLOG (daemon,
   1549 			"Failed to make socket non-blocking: %s\n",
   1550 			MHD_socket_last_strerr_ ());
   1551 #endif
   1552 	    }
   1553 #endif
   1554 	}
   1555     }
   1556 
   1557 #if HTTPS_SUPPORT
   1558   if (0 != (daemon->options & MHD_USE_SSL))
   1559     {
   1560       connection->recv_cls = &recv_tls_adapter;
   1561       connection->send_cls = &send_tls_adapter;
   1562       connection->state = MHD_TLS_CONNECTION_INIT;
   1563       MHD_set_https_callbacks (connection);
   1564       connection->tls_session = SSL_new (daemon->tls_context);
   1565       BIO* bio = BIO_new (&MHD_bio_method);
   1566       if (bio)
   1567         {
   1568           bio->ptr = connection;
   1569           bio->init = 1;
   1570         }
   1571       SSL_set_bio (connection->tls_session, bio, bio);
   1572       SSL_set_app_data (connection->tls_session, connection);
   1573     }
   1574 #endif
   1575 
   1576   if ( (0 != (daemon->options & MHD_USE_THREAD_PER_CONNECTION)) &&
   1577        (MHD_YES != MHD_mutex_lock_ (&daemon->cleanup_connection_mutex)) )
   1578     MHD_PANIC ("Failed to acquire cleanup mutex\n");
   1579   XDLL_insert (daemon->normal_timeout_head,
   1580 	       daemon->normal_timeout_tail,
   1581 	       connection);
   1582   DLL_insert (daemon->connections_head,
   1583 	      daemon->connections_tail,
   1584 	      connection);
   1585   if  ( (0 != (daemon->options & MHD_USE_THREAD_PER_CONNECTION)) &&
   1586 	(MHD_YES != MHD_mutex_unlock_ (&daemon->cleanup_connection_mutex)) )
   1587     MHD_PANIC ("Failed to release cleanup mutex\n");
   1588 
   1589   if (NULL != daemon->notify_connection)
   1590     daemon->notify_connection (daemon->notify_connection_cls,
   1591                                connection,
   1592                                &connection->socket_context,
   1593                                MHD_CONNECTION_NOTIFY_STARTED);
   1594 
   1595   /* attempt to create handler thread */
   1596   if (0 != (daemon->options & MHD_USE_THREAD_PER_CONNECTION))
   1597     {
   1598       res_thread_create = create_thread (&connection->pid,
   1599                                          daemon,
   1600 					 &MHD_handle_connection,
   1601                                          connection);
   1602       if (0 != res_thread_create)
   1603         {
   1604 	  eno = errno;
   1605 #if HAVE_MESSAGES
   1606           MHD_DLOG (daemon,
   1607                     "Failed to create a thread: %s\n",
   1608                     MHD_strerror_ (res_thread_create));
   1609 #endif
   1610 	  goto cleanup;
   1611         }
   1612     }
   1613   else
   1614     if ( (MHD_YES == external_add) &&
   1615 	 (MHD_INVALID_PIPE_ != daemon->wpipe[1]) &&
   1616 	 (1 != MHD_pipe_write_ (daemon->wpipe[1], "n", 1)) )
   1617       {
   1618 #if HAVE_MESSAGES
   1619 	MHD_DLOG (daemon,
   1620 		  "failed to signal new connection via pipe");
   1621 #endif
   1622       }
   1623 #if EPOLL_SUPPORT
   1624   if (0 != (daemon->options & MHD_USE_EPOLL_LINUX_ONLY))
   1625     {
   1626       if (0 == (daemon->options & MHD_USE_EPOLL_TURBO))
   1627 	{
   1628 	  struct epoll_event event;
   1629 
   1630 	  event.events = EPOLLIN | EPOLLOUT | EPOLLET;
   1631 	  event.data.ptr = connection;
   1632 	  if (0 != epoll_ctl (daemon->epoll_fd,
   1633 			      EPOLL_CTL_ADD,
   1634 			      client_socket,
   1635 			      &event))
   1636 	    {
   1637 	      eno = errno;
   1638 #if HAVE_MESSAGES
   1639               MHD_DLOG (daemon,
   1640                         "Call to epoll_ctl failed: %s\n",
   1641                         MHD_socket_last_strerr_ ());
   1642 #endif
   1643 	      goto cleanup;
   1644 	    }
   1645 	  connection->epoll_state |= MHD_EPOLL_STATE_IN_EPOLL_SET;
   1646 	}
   1647       else
   1648 	{
   1649 	  connection->epoll_state |= MHD_EPOLL_STATE_READ_READY | MHD_EPOLL_STATE_WRITE_READY
   1650 	    | MHD_EPOLL_STATE_IN_EREADY_EDLL;
   1651 	  EDLL_insert (daemon->eready_head,
   1652 		       daemon->eready_tail,
   1653 		       connection);
   1654 	}
   1655     }
   1656 #endif
   1657   daemon->connections++;
   1658   return MHD_YES;
   1659  cleanup:
   1660   if (NULL != daemon->notify_connection)
   1661     daemon->notify_connection (daemon->notify_connection_cls,
   1662                                connection,
   1663                                &connection->socket_context,
   1664                                MHD_CONNECTION_NOTIFY_CLOSED);
   1665   if (0 != MHD_socket_close_ (client_socket))
   1666     MHD_PANIC ("close failed\n");
   1667   MHD_ip_limit_del (daemon, addr, addrlen);
   1668   if ( (0 != (daemon->options & MHD_USE_THREAD_PER_CONNECTION)) &&
   1669        (MHD_YES != MHD_mutex_lock_ (&daemon->cleanup_connection_mutex)) )
   1670     MHD_PANIC ("Failed to acquire cleanup mutex\n");
   1671   DLL_remove (daemon->connections_head,
   1672 	      daemon->connections_tail,
   1673 	      connection);
   1674   XDLL_remove (daemon->normal_timeout_head,
   1675 	       daemon->normal_timeout_tail,
   1676 	       connection);
   1677   if ( (0 != (daemon->options & MHD_USE_THREAD_PER_CONNECTION)) &&
   1678        (MHD_YES != MHD_mutex_unlock_ (&daemon->cleanup_connection_mutex)) )
   1679     MHD_PANIC ("Failed to release cleanup mutex\n");
   1680   MHD_pool_destroy (connection->pool);
   1681   free (connection->addr);
   1682   free (connection);
   1683 #if EINVAL
   1684   errno = eno;
   1685 #endif
   1686   return MHD_NO;
   1687 }
   1688 
   1689 
   1690 /**
   1691  * Suspend handling of network data for a given connection.  This can
   1692  * be used to dequeue a connection from MHD's event loop (external
   1693  * select, internal select or thread pool; not applicable to
   1694  * thread-per-connection!) for a while.
   1695  *
   1696  * If you use this API in conjunction with a internal select or a
   1697  * thread pool, you must set the option #MHD_USE_PIPE_FOR_SHUTDOWN to
   1698  * ensure that a resumed connection is immediately processed by MHD.
   1699  *
   1700  * Suspended connections continue to count against the total number of
   1701  * connections allowed (per daemon, as well as per IP, if such limits
   1702  * are set).  Suspended connections will NOT time out; timeouts will
   1703  * restart when the connection handling is resumed.  While a
   1704  * connection is suspended, MHD will not detect disconnects by the
   1705  * client.
   1706  *
   1707  * The only safe time to suspend a connection is from the
   1708  * #MHD_AccessHandlerCallback.
   1709  *
   1710  * Finally, it is an API violation to call #MHD_stop_daemon while
   1711  * having suspended connections (this will at least create memory and
   1712  * socket leaks or lead to undefined behavior).  You must explicitly
   1713  * resume all connections before stopping the daemon.
   1714  *
   1715  * @param connection the connection to suspend
   1716  */
   1717 void
   1718 MHD_suspend_connection (struct MHD_Connection *connection)
   1719 {
   1720   struct MHD_Daemon *daemon;
   1721 
   1722   daemon = connection->daemon;
   1723   if (MHD_USE_SUSPEND_RESUME != (daemon->options & MHD_USE_SUSPEND_RESUME))
   1724     MHD_PANIC ("Cannot suspend connections without enabling MHD_USE_SUSPEND_RESUME!\n");
   1725   if ( (0 != (daemon->options & MHD_USE_THREAD_PER_CONNECTION)) &&
   1726        (MHD_YES != MHD_mutex_lock_ (&daemon->cleanup_connection_mutex)) )
   1727     MHD_PANIC ("Failed to acquire cleanup mutex\n");
   1728   DLL_remove (daemon->connections_head,
   1729               daemon->connections_tail,
   1730               connection);
   1731   DLL_insert (daemon->suspended_connections_head,
   1732               daemon->suspended_connections_tail,
   1733               connection);
   1734   if (connection->connection_timeout == daemon->connection_timeout)
   1735     XDLL_remove (daemon->normal_timeout_head,
   1736                  daemon->normal_timeout_tail,
   1737                  connection);
   1738   else
   1739     XDLL_remove (daemon->manual_timeout_head,
   1740                  daemon->manual_timeout_tail,
   1741                  connection);
   1742 #if EPOLL_SUPPORT
   1743   if (0 != (daemon->options & MHD_USE_EPOLL_LINUX_ONLY))
   1744     {
   1745       if (0 != (connection->epoll_state & MHD_EPOLL_STATE_IN_EREADY_EDLL))
   1746         {
   1747           EDLL_remove (daemon->eready_head,
   1748                        daemon->eready_tail,
   1749                        connection);
   1750           connection->epoll_state &= ~MHD_EPOLL_STATE_IN_EREADY_EDLL;
   1751         }
   1752       if (0 != (connection->epoll_state & MHD_EPOLL_STATE_IN_EPOLL_SET))
   1753         {
   1754           if (0 != epoll_ctl (daemon->epoll_fd,
   1755                               EPOLL_CTL_DEL,
   1756                               connection->socket_fd,
   1757                               NULL))
   1758             MHD_PANIC ("Failed to remove FD from epoll set\n");
   1759           connection->epoll_state &= ~MHD_EPOLL_STATE_IN_EPOLL_SET;
   1760         }
   1761       connection->epoll_state |= MHD_EPOLL_STATE_SUSPENDED;
   1762     }
   1763 #endif
   1764   connection->suspended = MHD_YES;
   1765   if ( (0 != (daemon->options & MHD_USE_THREAD_PER_CONNECTION)) &&
   1766        (MHD_YES != MHD_mutex_unlock_ (&daemon->cleanup_connection_mutex)) )
   1767     MHD_PANIC ("Failed to release cleanup mutex\n");
   1768 }
   1769 
   1770 
   1771 /**
   1772  * Resume handling of network data for suspended connection.  It is
   1773  * safe to resume a suspended connection at any time.  Calling this function
   1774  * on a connection that was not previously suspended will result
   1775  * in undefined behavior.
   1776  *
   1777  * @param connection the connection to resume
   1778  */
   1779 void
   1780 MHD_resume_connection (struct MHD_Connection *connection)
   1781 {
   1782   struct MHD_Daemon *daemon;
   1783 
   1784   daemon = connection->daemon;
   1785   if (MHD_USE_SUSPEND_RESUME != (daemon->options & MHD_USE_SUSPEND_RESUME))
   1786     MHD_PANIC ("Cannot resume connections without enabling MHD_USE_SUSPEND_RESUME!\n");
   1787   if ( (0 != (daemon->options & MHD_USE_THREAD_PER_CONNECTION)) &&
   1788        (MHD_YES != MHD_mutex_lock_ (&daemon->cleanup_connection_mutex)) )
   1789     MHD_PANIC ("Failed to acquire cleanup mutex\n");
   1790   connection->resuming = MHD_YES;
   1791   daemon->resuming = MHD_YES;
   1792   if ( (MHD_INVALID_PIPE_ != daemon->wpipe[1]) &&
   1793        (1 != MHD_pipe_write_ (daemon->wpipe[1], "r", 1)) )
   1794     {
   1795 #if HAVE_MESSAGES
   1796       MHD_DLOG (daemon,
   1797                 "failed to signal resume via pipe");
   1798 #endif
   1799     }
   1800   if ( (0 != (daemon->options & MHD_USE_THREAD_PER_CONNECTION)) &&
   1801        (MHD_YES != MHD_mutex_unlock_ (&daemon->cleanup_connection_mutex)) )
   1802     MHD_PANIC ("Failed to release cleanup mutex\n");
   1803 }
   1804 
   1805 
   1806 /**
   1807  * Run through the suspended connections and move any that are no
   1808  * longer suspended back to the active state.
   1809  *
   1810  * @param daemon daemon context
   1811  * @return #MHD_YES if a connection was actually resumed
   1812  */
   1813 static int
   1814 resume_suspended_connections (struct MHD_Daemon *daemon)
   1815 {
   1816   struct MHD_Connection *pos;
   1817   struct MHD_Connection *next = NULL;
   1818   int ret;
   1819 
   1820   ret = MHD_NO;
   1821   if ( (0 != (daemon->options & MHD_USE_THREAD_PER_CONNECTION)) &&
   1822        (MHD_YES != MHD_mutex_lock_ (&daemon->cleanup_connection_mutex)) )
   1823     MHD_PANIC ("Failed to acquire cleanup mutex\n");
   1824   if (MHD_YES == daemon->resuming)
   1825     next = daemon->suspended_connections_head;
   1826 
   1827   while (NULL != (pos = next))
   1828     {
   1829       next = pos->next;
   1830       if (MHD_NO == pos->resuming)
   1831         continue;
   1832       ret = MHD_YES;
   1833       DLL_remove (daemon->suspended_connections_head,
   1834                   daemon->suspended_connections_tail,
   1835                   pos);
   1836       DLL_insert (daemon->connections_head,
   1837                   daemon->connections_tail,
   1838                   pos);
   1839       if (pos->connection_timeout == daemon->connection_timeout)
   1840         XDLL_insert (daemon->normal_timeout_head,
   1841                      daemon->normal_timeout_tail,
   1842                      pos);
   1843       else
   1844         XDLL_insert (daemon->manual_timeout_head,
   1845                      daemon->manual_timeout_tail,
   1846                      pos);
   1847 #if EPOLL_SUPPORT
   1848       if (0 != (daemon->options & MHD_USE_EPOLL_LINUX_ONLY))
   1849         {
   1850           if (0 != (pos->epoll_state & MHD_EPOLL_STATE_IN_EREADY_EDLL))
   1851             MHD_PANIC ("Resumed connection was already in EREADY set\n");
   1852           /* we always mark resumed connections as ready, as we
   1853              might have missed the edge poll event during suspension */
   1854           EDLL_insert (daemon->eready_head,
   1855                        daemon->eready_tail,
   1856                        pos);
   1857           pos->epoll_state |= MHD_EPOLL_STATE_IN_EREADY_EDLL;
   1858           pos->epoll_state &= ~MHD_EPOLL_STATE_SUSPENDED;
   1859         }
   1860 #endif
   1861       pos->suspended = MHD_NO;
   1862       pos->resuming = MHD_NO;
   1863     }
   1864   daemon->resuming = MHD_NO;
   1865   if ( (0 != (daemon->options & MHD_USE_THREAD_PER_CONNECTION)) &&
   1866        (MHD_YES != MHD_mutex_unlock_ (&daemon->cleanup_connection_mutex)) )
   1867     MHD_PANIC ("Failed to release cleanup mutex\n");
   1868   return ret;
   1869 }
   1870 
   1871 
   1872 /**
   1873  * Change socket options to be non-blocking, non-inheritable.
   1874  *
   1875  * @param daemon daemon context
   1876  * @param sock socket to manipulate
   1877  */
   1878 static void
   1879 make_nonblocking_noninheritable (struct MHD_Daemon *daemon,
   1880 				 MHD_socket sock)
   1881 {
   1882 #ifdef WINDOWS
   1883   DWORD dwFlags;
   1884   unsigned long flags = 1;
   1885 
   1886   if (0 != ioctlsocket (sock, FIONBIO, &flags))
   1887     {
   1888 #if HAVE_MESSAGES
   1889       MHD_DLOG (daemon,
   1890 		"Failed to make socket non-blocking: %s\n",
   1891 		MHD_socket_last_strerr_ ());
   1892 #endif
   1893     }
   1894   if (!GetHandleInformation ((HANDLE) sock, &dwFlags) ||
   1895       ((dwFlags != (dwFlags & ~HANDLE_FLAG_INHERIT)) &&
   1896        !SetHandleInformation ((HANDLE) sock, HANDLE_FLAG_INHERIT, 0)))
   1897     {
   1898 #if HAVE_MESSAGES
   1899       MHD_DLOG (daemon,
   1900 		"Failed to make socket non-inheritable: %u\n",
   1901 		(unsigned int) GetLastError ());
   1902 #endif
   1903     }
   1904 #else
   1905   int flags;
   1906   int nonblock;
   1907 
   1908   nonblock = O_NONBLOCK;
   1909 #ifdef CYGWIN
   1910   if (0 == (daemon->options & MHD_USE_SSL))
   1911     nonblock = 0;
   1912 #endif
   1913   flags = fcntl (sock, F_GETFD);
   1914   if ( ( (-1 == flags) ||
   1915 	 ( (flags != (flags | FD_CLOEXEC)) &&
   1916 	   (0 != fcntl (sock, F_SETFD, flags | nonblock | FD_CLOEXEC)) ) ) )
   1917     {
   1918 #if HAVE_MESSAGES
   1919       MHD_DLOG (daemon,
   1920 		"Failed to make socket non-inheritable: %s\n",
   1921 		MHD_socket_last_strerr_ ());
   1922 #endif
   1923     }
   1924 #endif
   1925 }
   1926 
   1927 
   1928 /**
   1929  * Add another client connection to the set of connections managed by
   1930  * MHD.  This API is usually not needed (since MHD will accept inbound
   1931  * connections on the server socket).  Use this API in special cases,
   1932  * for example if your HTTP server is behind NAT and needs to connect
   1933  * out to the HTTP client, or if you are building a proxy.
   1934  *
   1935  * If you use this API in conjunction with a internal select or a
   1936  * thread pool, you must set the option
   1937  * #MHD_USE_PIPE_FOR_SHUTDOWN to ensure that the freshly added
   1938  * connection is immediately processed by MHD.
   1939  *
   1940  * The given client socket will be managed (and closed!) by MHD after
   1941  * this call and must no longer be used directly by the application
   1942  * afterwards.
   1943  *
   1944  * Per-IP connection limits are ignored when using this API.
   1945  *
   1946  * @param daemon daemon that manages the connection
   1947  * @param client_socket socket to manage (MHD will expect
   1948  *        to receive an HTTP request from this socket next).
   1949  * @param addr IP address of the client
   1950  * @param addrlen number of bytes in @a addr
   1951  * @return #MHD_YES on success, #MHD_NO if this daemon could
   1952  *        not handle the connection (i.e. malloc() failed, etc).
   1953  *        The socket will be closed in any case; `errno` is
   1954  *        set to indicate further details about the error.
   1955  * @ingroup specialized
   1956  */
   1957 int
   1958 MHD_add_connection (struct MHD_Daemon *daemon,
   1959 		    MHD_socket client_socket,
   1960 		    const struct sockaddr *addr,
   1961 		    socklen_t addrlen)
   1962 {
   1963   make_nonblocking_noninheritable (daemon,
   1964 				   client_socket);
   1965   return internal_add_connection (daemon,
   1966 				  client_socket,
   1967 				  addr, addrlen,
   1968 				  MHD_YES);
   1969 }
   1970 
   1971 
   1972 /**
   1973  * Accept an incoming connection and create the MHD_Connection object for
   1974  * it.  This function also enforces policy by way of checking with the
   1975  * accept policy callback.
   1976  *
   1977  * @param daemon handle with the listen socket
   1978  * @return #MHD_YES on success (connections denied by policy or due
   1979  *         to 'out of memory' and similar errors) are still considered
   1980  *         successful as far as #MHD_accept_connection() is concerned);
   1981  *         a return code of #MHD_NO only refers to the actual
   1982  *         accept() system call.
   1983  */
   1984 static int
   1985 MHD_accept_connection (struct MHD_Daemon *daemon)
   1986 {
   1987 #if HAVE_INET6
   1988   struct sockaddr_in6 addrstorage;
   1989 #else
   1990   struct sockaddr_in addrstorage;
   1991 #endif
   1992   struct sockaddr *addr = (struct sockaddr *) &addrstorage;
   1993   socklen_t addrlen;
   1994   MHD_socket s;
   1995   MHD_socket fd;
   1996   int nonblock;
   1997 
   1998   addrlen = sizeof (addrstorage);
   1999   memset (addr, 0, sizeof (addrstorage));
   2000   if (MHD_INVALID_SOCKET == (fd = daemon->socket_fd))
   2001     return MHD_NO;
   2002 #ifdef HAVE_SOCK_NONBLOCK
   2003   nonblock = SOCK_NONBLOCK;
   2004 #else
   2005   nonblock = 0;
   2006 #endif
   2007 #ifdef CYGWIN
   2008   if (0 == (daemon->options & MHD_USE_SSL))
   2009     nonblock = 0;
   2010 #endif
   2011 #if HAVE_ACCEPT4
   2012   s = accept4 (fd, addr, &addrlen, SOCK_CLOEXEC | nonblock);
   2013 #else
   2014   s = accept (fd, addr, &addrlen);
   2015 #endif
   2016   if ((MHD_INVALID_SOCKET == s) || (addrlen <= 0))
   2017     {
   2018 #if HAVE_MESSAGES
   2019       const int err = MHD_socket_errno_;
   2020       /* This could be a common occurance with multiple worker threads */
   2021       if ( (EINVAL == err) &&
   2022            (MHD_INVALID_SOCKET == daemon->socket_fd) )
   2023         return MHD_NO; /* can happen during shutdown */
   2024       if ((EAGAIN != err) && (EWOULDBLOCK != err))
   2025         MHD_DLOG (daemon,
   2026 		  "Error accepting connection: %s\n",
   2027 		  MHD_socket_last_strerr_ ());
   2028 #endif
   2029       if (MHD_INVALID_SOCKET != s)
   2030         {
   2031           if (0 != MHD_socket_close_ (s))
   2032 	    MHD_PANIC ("close failed\n");
   2033           /* just in case */
   2034         }
   2035       return MHD_NO;
   2036     }
   2037 #if !defined(HAVE_ACCEPT4) || HAVE_ACCEPT4+0 == 0 || !defined(HAVE_SOCK_NONBLOCK) || SOCK_CLOEXEC+0 == 0
   2038   make_nonblocking_noninheritable (daemon, s);
   2039 #endif
   2040 #if HAVE_MESSAGES
   2041 #if DEBUG_CONNECT
   2042   MHD_DLOG (daemon,
   2043             "Accepted connection on socket %d\n",
   2044             s);
   2045 #endif
   2046 #endif
   2047   (void) internal_add_connection (daemon, s,
   2048 				  addr, addrlen,
   2049 				  MHD_NO);
   2050   return MHD_YES;
   2051 }
   2052 
   2053 
   2054 /**
   2055  * Free resources associated with all closed connections.
   2056  * (destroy responses, free buffers, etc.).  All closed
   2057  * connections are kept in the "cleanup" doubly-linked list.
   2058  *
   2059  * @param daemon daemon to clean up
   2060  */
   2061 static void
   2062 MHD_cleanup_connections (struct MHD_Daemon *daemon)
   2063 {
   2064   struct MHD_Connection *pos;
   2065 
   2066   if ( (0 != (daemon->options & MHD_USE_THREAD_PER_CONNECTION)) &&
   2067        (MHD_YES != MHD_mutex_lock_ (&daemon->cleanup_connection_mutex)) )
   2068     MHD_PANIC ("Failed to acquire cleanup mutex\n");
   2069   while (NULL != (pos = daemon->cleanup_head))
   2070     {
   2071       DLL_remove (daemon->cleanup_head,
   2072 		  daemon->cleanup_tail,
   2073 		  pos);
   2074       if ( (0 != (daemon->options & MHD_USE_THREAD_PER_CONNECTION)) &&
   2075 	   (MHD_NO == pos->thread_joined) )
   2076 	{
   2077 	  if (0 != MHD_join_thread_ (pos->pid))
   2078 	    {
   2079 	      MHD_PANIC ("Failed to join a thread\n");
   2080 	    }
   2081 	}
   2082       MHD_pool_destroy (pos->pool);
   2083 #if HTTPS_SUPPORT
   2084       if (NULL != pos->tls_session)
   2085  	SSL_free (pos->tls_session);
   2086 #endif
   2087       if (NULL != daemon->notify_connection)
   2088         daemon->notify_connection (daemon->notify_connection_cls,
   2089                                    pos,
   2090                                    &pos->socket_context,
   2091                                    MHD_CONNECTION_NOTIFY_CLOSED);
   2092       MHD_ip_limit_del (daemon, pos->addr, pos->addr_len);
   2093 #if EPOLL_SUPPORT
   2094       if (0 != (pos->epoll_state & MHD_EPOLL_STATE_IN_EREADY_EDLL))
   2095 	{
   2096 	  EDLL_remove (daemon->eready_head,
   2097 		       daemon->eready_tail,
   2098 		       pos);
   2099 	  pos->epoll_state &= ~MHD_EPOLL_STATE_IN_EREADY_EDLL;
   2100 	}
   2101       if ( (0 != (daemon->options & MHD_USE_EPOLL_LINUX_ONLY)) &&
   2102 	   (MHD_INVALID_SOCKET != daemon->epoll_fd) &&
   2103 	   (0 != (pos->epoll_state & MHD_EPOLL_STATE_IN_EPOLL_SET)) )
   2104 	{
   2105 	  /* epoll documentation suggests that closing a FD
   2106 	     automatically removes it from the epoll set; however,
   2107 	     this is not true as if we fail to do manually remove it,
   2108 	     we are still seeing an event for this fd in epoll,
   2109 	     causing grief (use-after-free...) --- at least on my
   2110 	     system. */
   2111 	  if (0 != epoll_ctl (daemon->epoll_fd,
   2112 			      EPOLL_CTL_DEL,
   2113 			      pos->socket_fd,
   2114 			      NULL))
   2115 	    MHD_PANIC ("Failed to remove FD from epoll set\n");
   2116 	  pos->epoll_state &= ~MHD_EPOLL_STATE_IN_EPOLL_SET;
   2117 	}
   2118 #endif
   2119       if (NULL != pos->response)
   2120 	{
   2121 	  MHD_destroy_response (pos->response);
   2122 	  pos->response = NULL;
   2123 	}
   2124       if (MHD_INVALID_SOCKET != pos->socket_fd)
   2125 	{
   2126 #ifdef WINDOWS
   2127 	  shutdown (pos->socket_fd, SHUT_WR);
   2128 #endif
   2129 	  if (0 != MHD_socket_close_ (pos->socket_fd))
   2130 	    MHD_PANIC ("close failed\n");
   2131 	}
   2132       if (NULL != pos->addr)
   2133 	free (pos->addr);
   2134       free (pos);
   2135       daemon->connections--;
   2136     }
   2137   if ( (0 != (daemon->options & MHD_USE_THREAD_PER_CONNECTION)) &&
   2138        (MHD_YES != MHD_mutex_unlock_ (&daemon->cleanup_connection_mutex)) )
   2139     MHD_PANIC ("Failed to release cleanup mutex\n");
   2140 }
   2141 
   2142 
   2143 /**
   2144  * Obtain timeout value for `select()` for this daemon (only needed if
   2145  * connection timeout is used).  The returned value is how long
   2146  * `select()` or `poll()` should at most block, not the timeout value set
   2147  * for connections.  This function MUST NOT be called if MHD is
   2148  * running with #MHD_USE_THREAD_PER_CONNECTION.
   2149  *
   2150  * @param daemon daemon to query for timeout
   2151  * @param timeout set to the timeout (in milliseconds)
   2152  * @return #MHD_YES on success, #MHD_NO if timeouts are
   2153  *        not used (or no connections exist that would
   2154  *        necessiate the use of a timeout right now).
   2155  * @ingroup event
   2156  */
   2157 int
   2158 MHD_get_timeout (struct MHD_Daemon *daemon,
   2159 		 MHD_UNSIGNED_LONG_LONG *timeout)
   2160 {
   2161   time_t earliest_deadline;
   2162   time_t now;
   2163   struct MHD_Connection *pos;
   2164   int have_timeout;
   2165 
   2166   if (0 != (daemon->options & MHD_USE_THREAD_PER_CONNECTION))
   2167     {
   2168 #if HAVE_MESSAGES
   2169       MHD_DLOG (daemon,
   2170                 "Illegal call to MHD_get_timeout\n");
   2171 #endif
   2172       return MHD_NO;
   2173     }
   2174 
   2175 #if HTTPS_SUPPORT
   2176   if (0 != daemon->num_tls_read_ready)
   2177     {
   2178       /* if there is any TLS connection with data ready for
   2179 	 reading, we must not block in the event loop */
   2180       *timeout = 0;
   2181       return MHD_YES;
   2182     }
   2183 #endif
   2184 
   2185   have_timeout = MHD_NO;
   2186   earliest_deadline = 0; /* avoid compiler warnings */
   2187   for (pos = daemon->manual_timeout_head; NULL != pos; pos = pos->nextX)
   2188     {
   2189       if (0 != pos->connection_timeout)
   2190 	{
   2191 	  if ( (! have_timeout) ||
   2192 	       (earliest_deadline > pos->last_activity + pos->connection_timeout) )
   2193 	    earliest_deadline = pos->last_activity + pos->connection_timeout;
   2194 #if HTTPS_SUPPORT
   2195 	  if (  (0 != (daemon->options & MHD_USE_SSL)) &&
   2196 		(0 != SSL_pending (pos->tls_session)) )
   2197 	    earliest_deadline = 0;
   2198 #endif
   2199 	  have_timeout = MHD_YES;
   2200 	}
   2201     }
   2202   /* normal timeouts are sorted, so we only need to look at the 'head' */
   2203   pos = daemon->normal_timeout_head;
   2204   if ( (NULL != pos) &&
   2205        (0 != pos->connection_timeout) )
   2206     {
   2207       if ( (! have_timeout) ||
   2208 	   (earliest_deadline > pos->last_activity + pos->connection_timeout) )
   2209 	earliest_deadline = pos->last_activity + pos->connection_timeout;
   2210 #if HTTPS_SUPPORT
   2211       if (  (0 != (daemon->options & MHD_USE_SSL)) &&
   2212 	    (0 != SSL_pending (pos->tls_session)) )
   2213 	earliest_deadline = 0;
   2214 #endif
   2215       have_timeout = MHD_YES;
   2216     }
   2217 
   2218   if (MHD_NO == have_timeout)
   2219     return MHD_NO;
   2220   now = MHD_monotonic_time();
   2221   if (earliest_deadline < now)
   2222     *timeout = 0;
   2223   else
   2224     *timeout = 1000 * (1 + earliest_deadline - now);
   2225   return MHD_YES;
   2226 }
   2227 
   2228 
   2229 /**
   2230  * Run webserver operations. This method should be called by clients
   2231  * in combination with #MHD_get_fdset if the client-controlled select
   2232  * method is used.
   2233  *
   2234  * You can use this function instead of #MHD_run if you called
   2235  * `select()` on the result from #MHD_get_fdset.  File descriptors in
   2236  * the sets that are not controlled by MHD will be ignored.  Calling
   2237  * this function instead of #MHD_run is more efficient as MHD will
   2238  * not have to call `select()` again to determine which operations are
   2239  * ready.
   2240  *
   2241  * @param daemon daemon to run select loop for
   2242  * @param read_fd_set read set
   2243  * @param write_fd_set write set
   2244  * @param except_fd_set except set (not used, can be NULL)
   2245  * @return #MHD_NO on serious errors, #MHD_YES on success
   2246  * @ingroup event
   2247  */
   2248 int
   2249 MHD_run_from_select (struct MHD_Daemon *daemon,
   2250 		     const fd_set *read_fd_set,
   2251 		     const fd_set *write_fd_set,
   2252 		     const fd_set *except_fd_set)
   2253 {
   2254   MHD_socket ds;
   2255   char tmp;
   2256   struct MHD_Connection *pos;
   2257   struct MHD_Connection *next;
   2258 
   2259 #if EPOLL_SUPPORT
   2260   if (0 != (daemon->options & MHD_USE_EPOLL_LINUX_ONLY))
   2261     {
   2262       /* we're in epoll mode, the epoll FD stands for
   2263 	 the entire event set! */
   2264       if (daemon->epoll_fd >= FD_SETSIZE)
   2265 	return MHD_NO; /* poll fd too big, fail hard */
   2266       if (FD_ISSET (daemon->epoll_fd, read_fd_set))
   2267 	return MHD_run (daemon);
   2268       return MHD_YES;
   2269     }
   2270 #endif
   2271 
   2272   /* select connection thread handling type */
   2273   if ( (MHD_INVALID_SOCKET != (ds = daemon->socket_fd)) &&
   2274        (FD_ISSET (ds, (fd_set*)read_fd_set)) )
   2275     (void) MHD_accept_connection (daemon);
   2276   /* drain signaling pipe to avoid spinning select */
   2277   if ( (MHD_INVALID_PIPE_ != daemon->wpipe[0]) &&
   2278        (FD_ISSET (daemon->wpipe[0], (fd_set*)read_fd_set)) )
   2279     (void) MHD_pipe_read_ (daemon->wpipe[0], &tmp, sizeof (tmp));
   2280 
   2281   if (0 == (daemon->options & MHD_USE_THREAD_PER_CONNECTION))
   2282     {
   2283       /* do not have a thread per connection, process all connections now */
   2284       next = daemon->connections_head;
   2285       while (NULL != (pos = next))
   2286         {
   2287 	  next = pos->next;
   2288           ds = pos->socket_fd;
   2289           if (MHD_INVALID_SOCKET == ds)
   2290 	    continue;
   2291 	  switch (pos->event_loop_info)
   2292 	    {
   2293 	    case MHD_EVENT_LOOP_INFO_READ:
   2294 	      if ( (FD_ISSET (ds, (fd_set*)read_fd_set))
   2295 #if HTTPS_SUPPORT
   2296 		   || (MHD_YES == pos->tls_read_ready)
   2297 #endif
   2298 		   )
   2299 		pos->read_handler (pos);
   2300 	      break;
   2301 	    case MHD_EVENT_LOOP_INFO_WRITE:
   2302 	      if ( (FD_ISSET (ds, (fd_set*)read_fd_set)) &&
   2303 		   (pos->read_buffer_size > pos->read_buffer_offset) )
   2304 		pos->read_handler (pos);
   2305 	      if (FD_ISSET (ds, (fd_set*)write_fd_set))
   2306 		pos->write_handler (pos);
   2307 	      break;
   2308 	    case MHD_EVENT_LOOP_INFO_BLOCK:
   2309 	      if ( (FD_ISSET (ds, (fd_set*)read_fd_set)) &&
   2310 		   (pos->read_buffer_size > pos->read_buffer_offset) )
   2311 		pos->read_handler (pos);
   2312 	      break;
   2313 	    case MHD_EVENT_LOOP_INFO_CLEANUP:
   2314 	      /* should never happen */
   2315 	      break;
   2316 	    }
   2317 	  pos->idle_handler (pos);
   2318         }
   2319     }
   2320   MHD_cleanup_connections (daemon);
   2321   return MHD_YES;
   2322 }
   2323 
   2324 
   2325 /**
   2326  * Main internal select() call.  Will compute select sets, call select()
   2327  * and then #MHD_run_from_select with the result.
   2328  *
   2329  * @param daemon daemon to run select() loop for
   2330  * @param may_block #MHD_YES if blocking, #MHD_NO if non-blocking
   2331  * @return #MHD_NO on serious errors, #MHD_YES on success
   2332  */
   2333 static int
   2334 MHD_select (struct MHD_Daemon *daemon,
   2335 	    int may_block)
   2336 {
   2337   int num_ready;
   2338   fd_set rs;
   2339   fd_set ws;
   2340   fd_set es;
   2341   MHD_socket max;
   2342   struct timeval timeout;
   2343   struct timeval *tv;
   2344   MHD_UNSIGNED_LONG_LONG ltimeout;
   2345 
   2346   timeout.tv_sec = 0;
   2347   timeout.tv_usec = 0;
   2348   if (MHD_YES == daemon->shutdown)
   2349     return MHD_NO;
   2350   FD_ZERO (&rs);
   2351   FD_ZERO (&ws);
   2352   FD_ZERO (&es);
   2353   max = MHD_INVALID_SOCKET;
   2354   if (0 == (daemon->options & MHD_USE_THREAD_PER_CONNECTION))
   2355     {
   2356       if ( (MHD_USE_SUSPEND_RESUME == (daemon->options & MHD_USE_SUSPEND_RESUME)) &&
   2357            (MHD_YES == resume_suspended_connections (daemon)) )
   2358         may_block = MHD_NO;
   2359 
   2360       /* single-threaded, go over everything */
   2361       if (MHD_NO == MHD_get_fdset2 (daemon, &rs, &ws, &es, &max, FD_SETSIZE))
   2362         return MHD_NO;
   2363 
   2364       /* If we're at the connection limit, no need to
   2365          accept new connections; however, make sure
   2366          we do not miss the shutdown, so only do this
   2367          optimization if we have a shutdown signaling
   2368          pipe. */
   2369       if ( (MHD_INVALID_SOCKET != daemon->socket_fd) &&
   2370            (daemon->connections == daemon->connection_limit) &&
   2371            (0 != (daemon->options & MHD_USE_PIPE_FOR_SHUTDOWN)) )
   2372         FD_CLR (daemon->socket_fd, &rs);
   2373     }
   2374   else
   2375     {
   2376       /* accept only, have one thread per connection */
   2377       if ( (MHD_INVALID_SOCKET != daemon->socket_fd) &&
   2378            (MHD_YES != add_to_fd_set (daemon->socket_fd,
   2379                                       &rs,
   2380                                       &max,
   2381                                       FD_SETSIZE)) )
   2382         return MHD_NO;
   2383     }
   2384   if ( (MHD_INVALID_PIPE_ != daemon->wpipe[0]) &&
   2385        (MHD_YES != add_to_fd_set (daemon->wpipe[0],
   2386                                   &rs,
   2387                                   &max,
   2388                                   FD_SETSIZE)) )
   2389     return MHD_NO;
   2390 
   2391   tv = NULL;
   2392   if (MHD_NO == may_block)
   2393     {
   2394       timeout.tv_usec = 0;
   2395       timeout.tv_sec = 0;
   2396       tv = &timeout;
   2397     }
   2398   else if ( (0 == (daemon->options & MHD_USE_THREAD_PER_CONNECTION)) &&
   2399 	    (MHD_YES == MHD_get_timeout (daemon, &ltimeout)) )
   2400     {
   2401       /* ltimeout is in ms */
   2402       timeout.tv_usec = (ltimeout % 1000) * 1000;
   2403       timeout.tv_sec = ltimeout / 1000;
   2404       tv = &timeout;
   2405     }
   2406   if (MHD_INVALID_SOCKET == max)
   2407     return MHD_YES;
   2408   num_ready = MHD_SYS_select_ (max + 1, &rs, &ws, &es, tv);
   2409   if (MHD_YES == daemon->shutdown)
   2410     return MHD_NO;
   2411   if (num_ready < 0)
   2412     {
   2413       if (EINTR == MHD_socket_errno_)
   2414         return MHD_YES;
   2415 #if HAVE_MESSAGES
   2416       MHD_DLOG (daemon,
   2417                 "select failed: %s\n",
   2418                 MHD_socket_last_strerr_ ());
   2419 #endif
   2420       return MHD_NO;
   2421     }
   2422   return MHD_run_from_select (daemon, &rs, &ws, &es);
   2423 }
   2424 
   2425 
   2426 #ifdef HAVE_POLL
   2427 /**
   2428  * Process all of our connections and possibly the server
   2429  * socket using poll().
   2430  *
   2431  * @param daemon daemon to run poll loop for
   2432  * @param may_block #MHD_YES if blocking, #MHD_NO if non-blocking
   2433  * @return #MHD_NO on serious errors, #MHD_YES on success
   2434  */
   2435 static int
   2436 MHD_poll_all (struct MHD_Daemon *daemon,
   2437 	      int may_block)
   2438 {
   2439   unsigned int num_connections;
   2440   struct MHD_Connection *pos;
   2441   struct MHD_Connection *next;
   2442 
   2443   if ( (MHD_USE_SUSPEND_RESUME == (daemon->options & MHD_USE_SUSPEND_RESUME)) &&
   2444        (MHD_YES == resume_suspended_connections (daemon)) )
   2445     may_block = MHD_NO;
   2446 
   2447   /* count number of connections and thus determine poll set size */
   2448   num_connections = 0;
   2449   for (pos = daemon->connections_head; NULL != pos; pos = pos->next)
   2450     num_connections++;
   2451   {
   2452     MHD_UNSIGNED_LONG_LONG ltimeout;
   2453     unsigned int i;
   2454     int timeout;
   2455     unsigned int poll_server;
   2456     int poll_listen;
   2457     int poll_pipe;
   2458     char tmp;
   2459     struct pollfd *p;
   2460 
   2461     p = malloc(sizeof (struct pollfd) * (2 + num_connections));
   2462     if (NULL == p)
   2463       {
   2464 #if HAVE_MESSAGES
   2465         MHD_DLOG(daemon,
   2466                  "Error allocating memory: %s\n",
   2467                  MHD_strerror_(errno));
   2468 #endif
   2469         return MHD_NO;
   2470       }
   2471     memset (p, 0, sizeof (struct pollfd) * (2 + num_connections));
   2472     poll_server = 0;
   2473     poll_listen = -1;
   2474     if ( (MHD_INVALID_SOCKET != daemon->socket_fd) &&
   2475 	 (daemon->connections < daemon->connection_limit) )
   2476       {
   2477 	/* only listen if we are not at the connection limit */
   2478 	p[poll_server].fd = daemon->socket_fd;
   2479 	p[poll_server].events = POLLIN;
   2480 	p[poll_server].revents = 0;
   2481 	poll_listen = (int) poll_server;
   2482 	poll_server++;
   2483       }
   2484     poll_pipe = -1;
   2485     if (MHD_INVALID_PIPE_ != daemon->wpipe[0])
   2486       {
   2487 	p[poll_server].fd = daemon->wpipe[0];
   2488 	p[poll_server].events = POLLIN;
   2489 	p[poll_server].revents = 0;
   2490         poll_pipe = (int) poll_server;
   2491 	poll_server++;
   2492       }
   2493     if (may_block == MHD_NO)
   2494       timeout = 0;
   2495     else if ( (0 != (daemon->options & MHD_USE_THREAD_PER_CONNECTION)) ||
   2496 	      (MHD_YES != MHD_get_timeout (daemon, &ltimeout)) )
   2497       timeout = -1;
   2498     else
   2499       timeout = (ltimeout > INT_MAX) ? INT_MAX : (int) ltimeout;
   2500 
   2501     i = 0;
   2502     for (pos = daemon->connections_head; NULL != pos; pos = pos->next)
   2503       {
   2504 	p[poll_server+i].fd = pos->socket_fd;
   2505 	switch (pos->event_loop_info)
   2506 	  {
   2507 	  case MHD_EVENT_LOOP_INFO_READ:
   2508 	    p[poll_server+i].events |= POLLIN;
   2509 	    break;
   2510 	  case MHD_EVENT_LOOP_INFO_WRITE:
   2511 	    p[poll_server+i].events |= POLLOUT;
   2512 	    if (pos->read_buffer_size > pos->read_buffer_offset)
   2513 	      p[poll_server+i].events |= POLLIN;
   2514 	    break;
   2515 	  case MHD_EVENT_LOOP_INFO_BLOCK:
   2516 	    if (pos->read_buffer_size > pos->read_buffer_offset)
   2517 	      p[poll_server+i].events |= POLLIN;
   2518 	    break;
   2519 	  case MHD_EVENT_LOOP_INFO_CLEANUP:
   2520 	    timeout = 0; /* clean up "pos" immediately */
   2521 	    break;
   2522 	  }
   2523 	i++;
   2524       }
   2525     if (0 == poll_server + num_connections)
   2526       {
   2527         free(p);
   2528         return MHD_YES;
   2529       }
   2530     if (MHD_sys_poll_(p, poll_server + num_connections, timeout) < 0)
   2531       {
   2532 	if (EINTR == MHD_socket_errno_)
   2533       {
   2534         free(p);
   2535         return MHD_YES;
   2536       }
   2537 #if HAVE_MESSAGES
   2538 	MHD_DLOG (daemon,
   2539 		  "poll failed: %s\n",
   2540 		  MHD_socket_last_strerr_ ());
   2541 #endif
   2542         free(p);
   2543 	return MHD_NO;
   2544       }
   2545     /* handle shutdown */
   2546     if (MHD_YES == daemon->shutdown)
   2547       {
   2548         free(p);
   2549         return MHD_NO;
   2550       }
   2551     i = 0;
   2552     next = daemon->connections_head;
   2553     while (NULL != (pos = next))
   2554       {
   2555 	next = pos->next;
   2556 	switch (pos->event_loop_info)
   2557 	  {
   2558 	  case MHD_EVENT_LOOP_INFO_READ:
   2559 	    /* first, sanity checks */
   2560 	    if (i >= num_connections)
   2561 	      break; /* connection list changed somehow, retry later ... */
   2562 	    if (p[poll_server+i].fd != pos->socket_fd)
   2563 	      break; /* fd mismatch, something else happened, retry later ... */
   2564 	    /* normal handling */
   2565 	    if (0 != (p[poll_server+i].revents & POLLIN))
   2566 	      pos->read_handler (pos);
   2567 	    pos->idle_handler (pos);
   2568 	    i++;
   2569 	    break;
   2570 	  case MHD_EVENT_LOOP_INFO_WRITE:
   2571 	    /* first, sanity checks */
   2572 	    if (i >= num_connections)
   2573 	      break; /* connection list changed somehow, retry later ... */
   2574 	    if (p[poll_server+i].fd != pos->socket_fd)
   2575 	      break; /* fd mismatch, something else happened, retry later ... */
   2576 	    /* normal handling */
   2577 	    if (0 != (p[poll_server+i].revents & POLLIN))
   2578 	      pos->read_handler (pos);
   2579 	    if (0 != (p[poll_server+i].revents & POLLOUT))
   2580 	      pos->write_handler (pos);
   2581 	    pos->idle_handler (pos);
   2582 	    i++;
   2583 	    break;
   2584 	  case MHD_EVENT_LOOP_INFO_BLOCK:
   2585 	    if (0 != (p[poll_server+i].revents & POLLIN))
   2586 	      pos->read_handler (pos);
   2587 	    pos->idle_handler (pos);
   2588 	    break;
   2589 	  case MHD_EVENT_LOOP_INFO_CLEANUP:
   2590 	    pos->idle_handler (pos);
   2591 	    break;
   2592 	  }
   2593       }
   2594     /* handle 'listen' FD */
   2595     if ( (-1 != poll_listen) &&
   2596 	 (0 != (p[poll_listen].revents & POLLIN)) )
   2597       (void) MHD_accept_connection (daemon);
   2598 
   2599     /* handle pipe FD */
   2600     if ( (-1 != poll_pipe) &&
   2601          (0 != (p[poll_pipe].revents & POLLIN)) )
   2602       (void) MHD_pipe_read_ (daemon->wpipe[0], &tmp, sizeof (tmp));
   2603 
   2604     free(p);
   2605   }
   2606   return MHD_YES;
   2607 }
   2608 
   2609 
   2610 /**
   2611  * Process only the listen socket using poll().
   2612  *
   2613  * @param daemon daemon to run poll loop for
   2614  * @param may_block #MHD_YES if blocking, #MHD_NO if non-blocking
   2615  * @return #MHD_NO on serious errors, #MHD_YES on success
   2616  */
   2617 static int
   2618 MHD_poll_listen_socket (struct MHD_Daemon *daemon,
   2619 			int may_block)
   2620 {
   2621   struct pollfd p[2];
   2622   int timeout;
   2623   unsigned int poll_count;
   2624   int poll_listen;
   2625 
   2626   memset (&p, 0, sizeof (p));
   2627   poll_count = 0;
   2628   poll_listen = -1;
   2629   if (MHD_INVALID_SOCKET != daemon->socket_fd)
   2630     {
   2631       p[poll_count].fd = daemon->socket_fd;
   2632       p[poll_count].events = POLLIN;
   2633       p[poll_count].revents = 0;
   2634       poll_listen = poll_count;
   2635       poll_count++;
   2636     }
   2637   if (MHD_INVALID_PIPE_ != daemon->wpipe[0])
   2638     {
   2639       p[poll_count].fd = daemon->wpipe[0];
   2640       p[poll_count].events = POLLIN;
   2641       p[poll_count].revents = 0;
   2642       poll_count++;
   2643     }
   2644   if (MHD_NO == may_block)
   2645     timeout = 0;
   2646   else
   2647     timeout = -1;
   2648   if (0 == poll_count)
   2649     return MHD_YES;
   2650   if (MHD_sys_poll_(p, poll_count, timeout) < 0)
   2651     {
   2652       if (EINTR == MHD_socket_errno_)
   2653 	return MHD_YES;
   2654 #if HAVE_MESSAGES
   2655       MHD_DLOG (daemon,
   2656                 "poll failed: %s\n",
   2657                 MHD_socket_last_strerr_ ());
   2658 #endif
   2659       return MHD_NO;
   2660     }
   2661   /* handle shutdown */
   2662   if (MHD_YES == daemon->shutdown)
   2663     return MHD_NO;
   2664   if ( (-1 != poll_listen) &&
   2665        (0 != (p[poll_listen].revents & POLLIN)) )
   2666     (void) MHD_accept_connection (daemon);
   2667   return MHD_YES;
   2668 }
   2669 #endif
   2670 
   2671 
   2672 /**
   2673  * Do poll()-based processing.
   2674  *
   2675  * @param daemon daemon to run poll()-loop for
   2676  * @param may_block #MHD_YES if blocking, #MHD_NO if non-blocking
   2677  * @return #MHD_NO on serious errors, #MHD_YES on success
   2678  */
   2679 static int
   2680 MHD_poll (struct MHD_Daemon *daemon,
   2681 	  int may_block)
   2682 {
   2683 #ifdef HAVE_POLL
   2684   if (MHD_YES == daemon->shutdown)
   2685     return MHD_NO;
   2686   if (0 == (daemon->options & MHD_USE_THREAD_PER_CONNECTION))
   2687     return MHD_poll_all (daemon, may_block);
   2688   else
   2689     return MHD_poll_listen_socket (daemon, may_block);
   2690 #else
   2691   return MHD_NO;
   2692 #endif
   2693 }
   2694 
   2695 
   2696 #if EPOLL_SUPPORT
   2697 
   2698 /**
   2699  * How many events to we process at most per epoll() call?  Trade-off
   2700  * between required stack-size and number of system calls we have to
   2701  * make; 128 should be way enough to avoid more than one system call
   2702  * for most scenarios, and still be moderate in stack size
   2703  * consumption.  Embedded systems might want to choose a smaller value
   2704  * --- but why use epoll() on such a system in the first place?
   2705  */
   2706 #define MAX_EVENTS 128
   2707 
   2708 
   2709 /**
   2710  * Do epoll()-based processing (this function is allowed to
   2711  * block if @a may_block is set to #MHD_YES).
   2712  *
   2713  * @param daemon daemon to run poll loop for
   2714  * @param may_block #MHD_YES if blocking, #MHD_NO if non-blocking
   2715  * @return #MHD_NO on serious errors, #MHD_YES on success
   2716  */
   2717 static int
   2718 MHD_epoll (struct MHD_Daemon *daemon,
   2719 	   int may_block)
   2720 {
   2721   struct MHD_Connection *pos;
   2722   struct MHD_Connection *next;
   2723   struct epoll_event events[MAX_EVENTS];
   2724   struct epoll_event event;
   2725   int timeout_ms;
   2726   MHD_UNSIGNED_LONG_LONG timeout_ll;
   2727   int num_events;
   2728   unsigned int i;
   2729   unsigned int series_length;
   2730   char tmp;
   2731 
   2732   if (-1 == daemon->epoll_fd)
   2733     return MHD_NO; /* we're down! */
   2734   if (MHD_YES == daemon->shutdown)
   2735     return MHD_NO;
   2736   if ( (MHD_INVALID_SOCKET != daemon->socket_fd) &&
   2737        (daemon->connections < daemon->connection_limit) &&
   2738        (MHD_NO == daemon->listen_socket_in_epoll) )
   2739     {
   2740       event.events = EPOLLIN;
   2741       event.data.ptr = daemon;
   2742       if (0 != epoll_ctl (daemon->epoll_fd,
   2743 			  EPOLL_CTL_ADD,
   2744 			  daemon->socket_fd,
   2745 			  &event))
   2746 	{
   2747 #if HAVE_MESSAGES
   2748           MHD_DLOG (daemon,
   2749                     "Call to epoll_ctl failed: %s\n",
   2750                     MHD_socket_last_strerr_ ());
   2751 #endif
   2752 	  return MHD_NO;
   2753 	}
   2754       daemon->listen_socket_in_epoll = MHD_YES;
   2755     }
   2756   if ( (MHD_YES == daemon->listen_socket_in_epoll) &&
   2757        (daemon->connections == daemon->connection_limit) )
   2758     {
   2759       /* we're at the connection limit, disable listen socket
   2760 	 for event loop for now */
   2761       if (0 != epoll_ctl (daemon->epoll_fd,
   2762 			  EPOLL_CTL_DEL,
   2763 			  daemon->socket_fd,
   2764 			  NULL))
   2765 	MHD_PANIC ("Failed to remove listen FD from epoll set\n");
   2766       daemon->listen_socket_in_epoll = MHD_NO;
   2767     }
   2768   if (MHD_YES == may_block)
   2769     {
   2770       if (MHD_YES == MHD_get_timeout (daemon,
   2771 				      &timeout_ll))
   2772 	{
   2773 	  if (timeout_ll >= (MHD_UNSIGNED_LONG_LONG) INT_MAX)
   2774 	    timeout_ms = INT_MAX;
   2775 	  else
   2776 	    timeout_ms = (int) timeout_ll;
   2777 	}
   2778       else
   2779 	timeout_ms = -1;
   2780     }
   2781   else
   2782     timeout_ms = 0;
   2783 
   2784   /* drain 'epoll' event queue; need to iterate as we get at most
   2785      MAX_EVENTS in one system call here; in practice this should
   2786      pretty much mean only one round, but better an extra loop here
   2787      than unfair behavior... */
   2788   num_events = MAX_EVENTS;
   2789   while (MAX_EVENTS == num_events)
   2790     {
   2791       /* update event masks */
   2792       num_events = epoll_wait (daemon->epoll_fd,
   2793 			       events, MAX_EVENTS, timeout_ms);
   2794       if (-1 == num_events)
   2795 	{
   2796 	  if (EINTR == MHD_socket_errno_)
   2797 	    return MHD_YES;
   2798 #if HAVE_MESSAGES
   2799           MHD_DLOG (daemon,
   2800                     "Call to epoll_wait failed: %s\n",
   2801                     MHD_socket_last_strerr_ ());
   2802 #endif
   2803 	  return MHD_NO;
   2804 	}
   2805       for (i=0;i<(unsigned int) num_events;i++)
   2806 	{
   2807 	  if (NULL == events[i].data.ptr)
   2808 	    continue; /* shutdown signal! */
   2809           if ( (MHD_INVALID_PIPE_ != daemon->wpipe[0]) &&
   2810                (daemon->wpipe[0] == events[i].data.fd) )
   2811             {
   2812               (void) MHD_pipe_read_ (daemon->wpipe[0], &tmp, sizeof (tmp));
   2813               continue;
   2814             }
   2815 	  if (daemon != events[i].data.ptr)
   2816 	    {
   2817 	      /* this is an event relating to a 'normal' connection,
   2818 		 remember the event and if appropriate mark the
   2819 		 connection as 'eready'. */
   2820 	      pos = events[i].data.ptr;
   2821 	      if (0 != (events[i].events & EPOLLIN))
   2822 		{
   2823 		  pos->epoll_state |= MHD_EPOLL_STATE_READ_READY;
   2824 		  if ( ( (MHD_EVENT_LOOP_INFO_READ == pos->event_loop_info) ||
   2825 			 (pos->read_buffer_size > pos->read_buffer_offset) ) &&
   2826 		       (0 == (pos->epoll_state & MHD_EPOLL_STATE_IN_EREADY_EDLL) ) )
   2827 		    {
   2828 		      EDLL_insert (daemon->eready_head,
   2829 				   daemon->eready_tail,
   2830 				   pos);
   2831 		      pos->epoll_state |= MHD_EPOLL_STATE_IN_EREADY_EDLL;
   2832 		    }
   2833 		}
   2834 	      if (0 != (events[i].events & EPOLLOUT))
   2835 		{
   2836 		  pos->epoll_state |= MHD_EPOLL_STATE_WRITE_READY;
   2837 		  if ( (MHD_EVENT_LOOP_INFO_WRITE == pos->event_loop_info) &&
   2838 		       (0 == (pos->epoll_state & MHD_EPOLL_STATE_IN_EREADY_EDLL) ) )
   2839 		    {
   2840 		      EDLL_insert (daemon->eready_head,
   2841 				   daemon->eready_tail,
   2842 				   pos);
   2843 		      pos->epoll_state |= MHD_EPOLL_STATE_IN_EREADY_EDLL;
   2844 		    }
   2845 		}
   2846 	    }
   2847 	  else /* must be listen socket */
   2848 	    {
   2849 	      /* run 'accept' until it fails or we are not allowed to take
   2850 		 on more connections */
   2851 	      series_length = 0;
   2852 	      while ( (MHD_YES == MHD_accept_connection (daemon)) &&
   2853 		      (daemon->connections < daemon->connection_limit) &&
   2854 		      (series_length < 128) )
   2855                 series_length++;
   2856 	    }
   2857 	}
   2858     }
   2859 
   2860   /* we handle resumes here because we may have ready connections
   2861      that will not be placed into the epoll list immediately. */
   2862   if ( (MHD_USE_SUSPEND_RESUME == (daemon->options & MHD_USE_SUSPEND_RESUME)) &&
   2863        (MHD_YES == resume_suspended_connections (daemon)) )
   2864     may_block = MHD_NO;
   2865 
   2866   /* process events for connections */
   2867   while (NULL != (pos = daemon->eready_tail))
   2868     {
   2869       EDLL_remove (daemon->eready_head,
   2870 		   daemon->eready_tail,
   2871 		   pos);
   2872       pos->epoll_state &= ~MHD_EPOLL_STATE_IN_EREADY_EDLL;
   2873       if (MHD_EVENT_LOOP_INFO_READ == pos->event_loop_info)
   2874 	pos->read_handler (pos);
   2875       if (MHD_EVENT_LOOP_INFO_WRITE == pos->event_loop_info)
   2876 	pos->write_handler (pos);
   2877       pos->idle_handler (pos);
   2878     }
   2879 
   2880   /* Finally, handle timed-out connections; we need to do this here
   2881      as the epoll mechanism won't call the 'idle_handler' on everything,
   2882      as the other event loops do.  As timeouts do not get an explicit
   2883      event, we need to find those connections that might have timed out
   2884      here.
   2885 
   2886      Connections with custom timeouts must all be looked at, as we
   2887      do not bother to sort that (presumably very short) list. */
   2888   next = daemon->manual_timeout_head;
   2889   while (NULL != (pos = next))
   2890     {
   2891       next = pos->nextX;
   2892       pos->idle_handler (pos);
   2893     }
   2894   /* Connections with the default timeout are sorted by prepending
   2895      them to the head of the list whenever we touch the connection;
   2896      thus it sufficies to iterate from the tail until the first
   2897      connection is NOT timed out */
   2898   next = daemon->normal_timeout_tail;
   2899   while (NULL != (pos = next))
   2900     {
   2901       next = pos->prevX;
   2902       pos->idle_handler (pos);
   2903       if (MHD_CONNECTION_CLOSED != pos->state)
   2904 	break; /* sorted by timeout, no need to visit the rest! */
   2905     }
   2906   return MHD_YES;
   2907 }
   2908 #endif
   2909 
   2910 
   2911 /**
   2912  * Run webserver operations (without blocking unless in client
   2913  * callbacks).  This method should be called by clients in combination
   2914  * with #MHD_get_fdset if the client-controlled select method is used.
   2915  *
   2916  * This function is a convenience method, which is useful if the
   2917  * fd_sets from #MHD_get_fdset were not directly passed to `select()`;
   2918  * with this function, MHD will internally do the appropriate `select()`
   2919  * call itself again.  While it is always safe to call #MHD_run (in
   2920  * external select mode), you should call #MHD_run_from_select if
   2921  * performance is important (as it saves an expensive call to
   2922  * `select()`).
   2923  *
   2924  * @param daemon daemon to run
   2925  * @return #MHD_YES on success, #MHD_NO if this
   2926  *         daemon was not started with the right
   2927  *         options for this call.
   2928  * @ingroup event
   2929  */
   2930 int
   2931 MHD_run (struct MHD_Daemon *daemon)
   2932 {
   2933   if ( (MHD_YES == daemon->shutdown) ||
   2934        (0 != (daemon->options & MHD_USE_THREAD_PER_CONNECTION)) ||
   2935        (0 != (daemon->options & MHD_USE_SELECT_INTERNALLY)) )
   2936     return MHD_NO;
   2937   if (0 != (daemon->options & MHD_USE_POLL))
   2938   {
   2939     MHD_poll (daemon, MHD_NO);
   2940     MHD_cleanup_connections (daemon);
   2941   }
   2942 #if EPOLL_SUPPORT
   2943   else if (0 != (daemon->options & MHD_USE_EPOLL_LINUX_ONLY))
   2944   {
   2945     MHD_epoll (daemon, MHD_NO);
   2946     MHD_cleanup_connections (daemon);
   2947   }
   2948 #endif
   2949   else
   2950   {
   2951     MHD_select (daemon, MHD_NO);
   2952     /* MHD_select does MHD_cleanup_connections already */
   2953   }
   2954   return MHD_YES;
   2955 }
   2956 
   2957 
   2958 /**
   2959  * Thread that runs the select loop until the daemon
   2960  * is explicitly shut down.
   2961  *
   2962  * @param cls 'struct MHD_Deamon' to run select loop in a thread for
   2963  * @return always 0 (on shutdown)
   2964  */
   2965 static MHD_THRD_RTRN_TYPE_ MHD_THRD_CALL_SPEC_
   2966 MHD_select_thread (void *cls)
   2967 {
   2968   struct MHD_Daemon *daemon = cls;
   2969 
   2970   while (MHD_YES != daemon->shutdown)
   2971     {
   2972       if (0 != (daemon->options & MHD_USE_POLL))
   2973 	MHD_poll (daemon, MHD_YES);
   2974 #if EPOLL_SUPPORT
   2975       else if (0 != (daemon->options & MHD_USE_EPOLL_LINUX_ONLY))
   2976 	MHD_epoll (daemon, MHD_YES);
   2977 #endif
   2978       else
   2979 	MHD_select (daemon, MHD_YES);
   2980       MHD_cleanup_connections (daemon);
   2981     }
   2982   return (MHD_THRD_RTRN_TYPE_)0;
   2983 }
   2984 
   2985 
   2986 /**
   2987  * Process escape sequences ('%HH') Updates val in place; the
   2988  * result should be UTF-8 encoded and cannot be larger than the input.
   2989  * The result must also still be 0-terminated.
   2990  *
   2991  * @param cls closure (use NULL)
   2992  * @param connection handle to connection, not used
   2993  * @param val value to unescape (modified in the process)
   2994  * @return length of the resulting val (strlen(val) maybe
   2995  *  shorter afterwards due to elimination of escape sequences)
   2996  */
   2997 static size_t
   2998 unescape_wrapper (void *cls,
   2999                   struct MHD_Connection *connection,
   3000                   char *val)
   3001 {
   3002   return MHD_http_unescape (val);
   3003 }
   3004 
   3005 
   3006 /**
   3007  * Start a webserver on the given port.  Variadic version of
   3008  * #MHD_start_daemon_va.
   3009  *
   3010  * @param flags combination of `enum MHD_FLAG` values
   3011  * @param port port to bind to
   3012  * @param apc callback to call to check which clients
   3013  *        will be allowed to connect; you can pass NULL
   3014  *        in which case connections from any IP will be
   3015  *        accepted
   3016  * @param apc_cls extra argument to @a apc
   3017  * @param dh handler called for all requests (repeatedly)
   3018  * @param dh_cls extra argument to @a dh
   3019  * @return NULL on error, handle to daemon on success
   3020  * @ingroup event
   3021  */
   3022 struct MHD_Daemon *
   3023 MHD_start_daemon (unsigned int flags,
   3024                   uint16_t port,
   3025                   MHD_AcceptPolicyCallback apc,
   3026                   void *apc_cls,
   3027                   MHD_AccessHandlerCallback dh, void *dh_cls, ...)
   3028 {
   3029   struct MHD_Daemon *daemon;
   3030   va_list ap;
   3031 
   3032   va_start (ap, dh_cls);
   3033   daemon = MHD_start_daemon_va (flags, port, apc, apc_cls, dh, dh_cls, ap);
   3034   va_end (ap);
   3035   return daemon;
   3036 }
   3037 
   3038 
   3039 /**
   3040  * Stop accepting connections from the listening socket.  Allows
   3041  * clients to continue processing, but stops accepting new
   3042  * connections.  Note that the caller is responsible for closing the
   3043  * returned socket; however, if MHD is run using threads (anything but
   3044  * external select mode), it must not be closed until AFTER
   3045  * #MHD_stop_daemon has been called (as it is theoretically possible
   3046  * that an existing thread is still using it).
   3047  *
   3048  * Note that some thread modes require the caller to have passed
   3049  * #MHD_USE_PIPE_FOR_SHUTDOWN when using this API.  If this daemon is
   3050  * in one of those modes and this option was not given to
   3051  * #MHD_start_daemon, this function will return #MHD_INVALID_SOCKET.
   3052  *
   3053  * @param daemon daemon to stop accepting new connections for
   3054  * @return old listen socket on success, #MHD_INVALID_SOCKET if
   3055  *         the daemon was already not listening anymore
   3056  * @ingroup specialized
   3057  */
   3058 MHD_socket
   3059 MHD_quiesce_daemon (struct MHD_Daemon *daemon)
   3060 {
   3061   unsigned int i;
   3062   MHD_socket ret;
   3063 
   3064   ret = daemon->socket_fd;
   3065   if (MHD_INVALID_SOCKET == ret)
   3066     return MHD_INVALID_SOCKET;
   3067   if ( (MHD_INVALID_PIPE_ == daemon->wpipe[1]) &&
   3068        (0 != (daemon->options & (MHD_USE_SELECT_INTERNALLY | MHD_USE_THREAD_PER_CONNECTION))) )
   3069     {
   3070 #if HAVE_MESSAGES
   3071       MHD_DLOG (daemon,
   3072 		"Using MHD_quiesce_daemon in this mode requires MHD_USE_PIPE_FOR_SHUTDOWN\n");
   3073 #endif
   3074       return MHD_INVALID_SOCKET;
   3075     }
   3076 
   3077   if (NULL != daemon->worker_pool)
   3078     for (i = 0; i < daemon->worker_pool_size; i++)
   3079       {
   3080 	daemon->worker_pool[i].socket_fd = MHD_INVALID_SOCKET;
   3081 #if EPOLL_SUPPORT
   3082 	if ( (0 != (daemon->options & MHD_USE_EPOLL_LINUX_ONLY)) &&
   3083 	     (-1 != daemon->worker_pool[i].epoll_fd) &&
   3084 	     (MHD_YES == daemon->worker_pool[i].listen_socket_in_epoll) )
   3085 	  {
   3086 	    if (0 != epoll_ctl (daemon->worker_pool[i].epoll_fd,
   3087 				EPOLL_CTL_DEL,
   3088 				ret,
   3089 				NULL))
   3090 	      MHD_PANIC ("Failed to remove listen FD from epoll set\n");
   3091 	    daemon->worker_pool[i].listen_socket_in_epoll = MHD_NO;
   3092 	  }
   3093 #endif
   3094       }
   3095   daemon->socket_fd = MHD_INVALID_SOCKET;
   3096 #if EPOLL_SUPPORT
   3097   if ( (0 != (daemon->options & MHD_USE_EPOLL_LINUX_ONLY)) &&
   3098        (-1 != daemon->epoll_fd) &&
   3099        (MHD_YES == daemon->listen_socket_in_epoll) )
   3100     {
   3101       if (0 != epoll_ctl (daemon->epoll_fd,
   3102 			  EPOLL_CTL_DEL,
   3103 			  ret,
   3104 			  NULL))
   3105 	MHD_PANIC ("Failed to remove listen FD from epoll set\n");
   3106       daemon->listen_socket_in_epoll = MHD_NO;
   3107     }
   3108 #endif
   3109   return ret;
   3110 }
   3111 
   3112 
   3113 /**
   3114  * Signature of the MHD custom logger function.
   3115  *
   3116  * @param cls closure
   3117  * @param format format string
   3118  * @param va arguments to the format string (fprintf-style)
   3119  */
   3120 typedef void (*VfprintfFunctionPointerType)(void *cls,
   3121 					    const char *format,
   3122 					    va_list va);
   3123 
   3124 
   3125 /**
   3126  * Parse a list of options given as varargs.
   3127  *
   3128  * @param daemon the daemon to initialize
   3129  * @param servaddr where to store the server's listen address
   3130  * @param ap the options
   3131  * @return #MHD_YES on success, #MHD_NO on error
   3132  */
   3133 static int
   3134 parse_options_va (struct MHD_Daemon *daemon,
   3135 		  const struct sockaddr **servaddr,
   3136 		  va_list ap);
   3137 
   3138 
   3139 /**
   3140  * Parse a list of options given as varargs.
   3141  *
   3142  * @param daemon the daemon to initialize
   3143  * @param servaddr where to store the server's listen address
   3144  * @param ... the options
   3145  * @return #MHD_YES on success, #MHD_NO on error
   3146  */
   3147 static int
   3148 parse_options (struct MHD_Daemon *daemon,
   3149 	       const struct sockaddr **servaddr,
   3150 	       ...)
   3151 {
   3152   va_list ap;
   3153   int ret;
   3154 
   3155   va_start (ap, servaddr);
   3156   ret = parse_options_va (daemon, servaddr, ap);
   3157   va_end (ap);
   3158   return ret;
   3159 }
   3160 
   3161 
   3162 /**
   3163  * Parse a list of options given as varargs.
   3164  *
   3165  * @param daemon the daemon to initialize
   3166  * @param servaddr where to store the server's listen address
   3167  * @param ap the options
   3168  * @return #MHD_YES on success, #MHD_NO on error
   3169  */
   3170 static int
   3171 parse_options_va (struct MHD_Daemon *daemon,
   3172 		  const struct sockaddr **servaddr,
   3173 		  va_list ap)
   3174 {
   3175   enum MHD_OPTION opt;
   3176   struct MHD_OptionItem *oa;
   3177   unsigned int i;
   3178 #if HTTPS_SUPPORT
   3179   int ret;
   3180   const char *pstr;
   3181 #endif
   3182 
   3183   while (MHD_OPTION_END != (opt = (enum MHD_OPTION) va_arg (ap, int)))
   3184     {
   3185       switch (opt)
   3186         {
   3187         case MHD_OPTION_CONNECTION_MEMORY_LIMIT:
   3188           daemon->pool_size = va_arg (ap, size_t);
   3189           break;
   3190         case MHD_OPTION_CONNECTION_MEMORY_INCREMENT:
   3191           daemon->pool_increment= va_arg (ap, size_t);
   3192           break;
   3193         case MHD_OPTION_CONNECTION_LIMIT:
   3194           daemon->connection_limit = va_arg (ap, unsigned int);
   3195           break;
   3196         case MHD_OPTION_CONNECTION_TIMEOUT:
   3197           daemon->connection_timeout = va_arg (ap, unsigned int);
   3198           break;
   3199         case MHD_OPTION_NOTIFY_COMPLETED:
   3200           daemon->notify_completed =
   3201             va_arg (ap, MHD_RequestCompletedCallback);
   3202           daemon->notify_completed_cls = va_arg (ap, void *);
   3203           break;
   3204         case MHD_OPTION_NOTIFY_CONNECTION:
   3205           daemon->notify_connection =
   3206             va_arg (ap, MHD_NotifyConnectionCallback);
   3207           daemon->notify_connection_cls = va_arg (ap, void *);
   3208           break;
   3209         case MHD_OPTION_PER_IP_CONNECTION_LIMIT:
   3210           daemon->per_ip_connection_limit = va_arg (ap, unsigned int);
   3211           break;
   3212         case MHD_OPTION_SOCK_ADDR:
   3213           *servaddr = va_arg (ap, const struct sockaddr *);
   3214           break;
   3215         case MHD_OPTION_URI_LOG_CALLBACK:
   3216           daemon->uri_log_callback =
   3217             va_arg (ap, LogCallback);
   3218           daemon->uri_log_callback_cls = va_arg (ap, void *);
   3219           break;
   3220         case MHD_OPTION_THREAD_POOL_SIZE:
   3221           daemon->worker_pool_size = va_arg (ap, unsigned int);
   3222 	  if (daemon->worker_pool_size >= (SIZE_MAX / sizeof (struct MHD_Daemon)))
   3223 	    {
   3224 #if HAVE_MESSAGES
   3225 	      MHD_DLOG (daemon,
   3226 			"Specified thread pool size (%u) too big\n",
   3227 			daemon->worker_pool_size);
   3228 #endif
   3229 	      return MHD_NO;
   3230 	    }
   3231           break;
   3232 #if HTTPS_SUPPORT
   3233         case MHD_OPTION_HTTPS_MEM_KEY:
   3234 	  if (0 != (daemon->options & MHD_USE_SSL))
   3235 	    {
   3236 	      daemon->https_mem_key = va_arg (ap, const char *);
   3237 	    }
   3238 	  else
   3239 	    {
   3240 #if HAVE_MESSAGES
   3241 	    MHD_DLOG (daemon,
   3242 		      "MHD HTTPS option %d passed to MHD but MHD_USE_SSL not set\n",
   3243 		      opt);
   3244 #endif
   3245 	    }
   3246           break;
   3247         case MHD_OPTION_HTTPS_KEY_PASSWORD:
   3248 	  if (0 != (daemon->options & MHD_USE_SSL))
   3249 	    {
   3250 	      daemon->https_key_password = va_arg (ap, const char *);
   3251 	    }
   3252 	  else
   3253 	    {
   3254 #if HAVE_MESSAGES
   3255 	    MHD_DLOG (daemon,
   3256 		      "MHD HTTPS option %d passed to MHD but MHD_USE_SSL not set\n",
   3257 		      opt);
   3258 #endif
   3259 	    }
   3260           break;
   3261         case MHD_OPTION_HTTPS_MEM_CERT:
   3262 	  if (0 != (daemon->options & MHD_USE_SSL))
   3263 	    {
   3264 	      daemon->https_mem_cert = va_arg (ap, const char *);
   3265 	    }
   3266 	  else
   3267 	    {
   3268 #if HAVE_MESSAGES
   3269 	    MHD_DLOG (daemon,
   3270 		      "MHD HTTPS option %d passed to MHD but MHD_USE_SSL not set\n",
   3271 		      opt);
   3272 #endif
   3273 	    }
   3274           break;
   3275         case MHD_OPTION_HTTPS_MEM_TRUST:
   3276 	  if (0 != (daemon->options & MHD_USE_SSL))
   3277 	    {
   3278 	      daemon->https_mem_trust = va_arg (ap, const char *);
   3279 	    }
   3280 	  else
   3281 	    {
   3282 #if HAVE_MESSAGES
   3283 	    MHD_DLOG (daemon,
   3284 		      "MHD HTTPS option %d passed to MHD but MHD_USE_SSL not set\n",
   3285 		      opt);
   3286 #endif
   3287 	    }
   3288           break;
   3289 	case MHD_OPTION_HTTPS_CRED_TYPE:
   3290 	  break;
   3291         case MHD_OPTION_HTTPS_MEM_DHPARAMS:
   3292 	  if (0 != (daemon->options & MHD_USE_SSL))
   3293 	    {
   3294 	      daemon->https_mem_dhparams = va_arg (ap, const char *);
   3295 	    }
   3296 	  else
   3297 	    {
   3298 #if HAVE_MESSAGES
   3299 	    MHD_DLOG (daemon,
   3300 		      "MHD HTTPS option %d passed to MHD but MHD_USE_SSL not set\n",
   3301 		      opt);
   3302 #endif
   3303 	    }
   3304           break;
   3305         case MHD_OPTION_HTTPS_PRIORITIES:
   3306 	  if (0 != (daemon->options & MHD_USE_SSL))
   3307 	    {
   3308 	      daemon->https_mem_cipher = va_arg (ap, const char *);
   3309 	    }
   3310 	  else
   3311 	    {
   3312 #if HAVE_MESSAGES
   3313 	      MHD_DLOG (daemon,
   3314 			"MHD HTTPS option %d passed to MHD but MHD_USE_SSL not set\n",
   3315 			opt);
   3316 #endif
   3317 	    }
   3318           break;
   3319         case MHD_OPTION_HTTPS_CERT_CALLBACK:
   3320           break;
   3321 #endif
   3322 #ifdef DAUTH_SUPPORT
   3323 	case MHD_OPTION_DIGEST_AUTH_RANDOM:
   3324 	  daemon->digest_auth_rand_size = va_arg (ap, size_t);
   3325 	  daemon->digest_auth_random = va_arg (ap, const char *);
   3326 	  break;
   3327 	case MHD_OPTION_NONCE_NC_SIZE:
   3328 	  daemon->nonce_nc_size = va_arg (ap, unsigned int);
   3329 	  break;
   3330 #endif
   3331 	case MHD_OPTION_LISTEN_SOCKET:
   3332 	  daemon->socket_fd = va_arg (ap, MHD_socket);
   3333 	  break;
   3334         case MHD_OPTION_EXTERNAL_LOGGER:
   3335 #if HAVE_MESSAGES
   3336           daemon->custom_error_log =
   3337             va_arg (ap, VfprintfFunctionPointerType);
   3338           daemon->custom_error_log_cls = va_arg (ap, void *);
   3339 #else
   3340           va_arg (ap, VfprintfFunctionPointerType);
   3341           va_arg (ap, void *);
   3342 #endif
   3343           break;
   3344         case MHD_OPTION_THREAD_STACK_SIZE:
   3345           daemon->thread_stack_size = va_arg (ap, size_t);
   3346           break;
   3347 #ifdef TCP_FASTOPEN
   3348         case MHD_OPTION_TCP_FASTOPEN_QUEUE_SIZE:
   3349           daemon->fastopen_queue_size = va_arg (ap, unsigned int);
   3350           break;
   3351 #endif
   3352 	case MHD_OPTION_LISTENING_ADDRESS_REUSE:
   3353 	  daemon->listening_address_reuse = va_arg (ap, unsigned int) ? 1 : -1;
   3354 	  break;
   3355 	case MHD_OPTION_ARRAY:
   3356 	  oa = va_arg (ap, struct MHD_OptionItem*);
   3357 	  i = 0;
   3358 	  while (MHD_OPTION_END != (opt = oa[i].option))
   3359 	    {
   3360 	      switch (opt)
   3361 		{
   3362 		  /* all options taking 'size_t' */
   3363 		case MHD_OPTION_CONNECTION_MEMORY_LIMIT:
   3364 		case MHD_OPTION_CONNECTION_MEMORY_INCREMENT:
   3365 		case MHD_OPTION_THREAD_STACK_SIZE:
   3366 		  if (MHD_YES != parse_options (daemon,
   3367 						servaddr,
   3368 						opt,
   3369 						(size_t) oa[i].value,
   3370 						MHD_OPTION_END))
   3371 		    return MHD_NO;
   3372 		  break;
   3373 		  /* all options taking 'unsigned int' */
   3374 		case MHD_OPTION_NONCE_NC_SIZE:
   3375 		case MHD_OPTION_CONNECTION_LIMIT:
   3376 		case MHD_OPTION_CONNECTION_TIMEOUT:
   3377 		case MHD_OPTION_PER_IP_CONNECTION_LIMIT:
   3378 		case MHD_OPTION_THREAD_POOL_SIZE:
   3379                 case MHD_OPTION_TCP_FASTOPEN_QUEUE_SIZE:
   3380 		case MHD_OPTION_LISTENING_ADDRESS_REUSE:
   3381 		  if (MHD_YES != parse_options (daemon,
   3382 						servaddr,
   3383 						opt,
   3384 						(unsigned int) oa[i].value,
   3385 						MHD_OPTION_END))
   3386 		    return MHD_NO;
   3387 		  break;
   3388 		  /* all options taking 'enum' */
   3389 		case MHD_OPTION_HTTPS_CRED_TYPE:
   3390 		  if (MHD_YES != parse_options (daemon,
   3391 						servaddr,
   3392 						opt,
   3393 						(int) oa[i].value,
   3394 						MHD_OPTION_END))
   3395 		    return MHD_NO;
   3396 		  break;
   3397                   /* all options taking 'MHD_socket' */
   3398                 case MHD_OPTION_LISTEN_SOCKET:
   3399                   if (MHD_YES != parse_options (daemon,
   3400                                                 servaddr,
   3401                                                 opt,
   3402                                                 (MHD_socket) oa[i].value,
   3403                                                 MHD_OPTION_END))
   3404                     return MHD_NO;
   3405                   break;
   3406 		  /* all options taking one pointer */
   3407 		case MHD_OPTION_SOCK_ADDR:
   3408 		case MHD_OPTION_HTTPS_MEM_KEY:
   3409 		case MHD_OPTION_HTTPS_KEY_PASSWORD:
   3410 		case MHD_OPTION_HTTPS_MEM_CERT:
   3411 		case MHD_OPTION_HTTPS_MEM_TRUST:
   3412 	        case MHD_OPTION_HTTPS_MEM_DHPARAMS:
   3413 		case MHD_OPTION_HTTPS_PRIORITIES:
   3414 		case MHD_OPTION_ARRAY:
   3415                 case MHD_OPTION_HTTPS_CERT_CALLBACK:
   3416 		  if (MHD_YES != parse_options (daemon,
   3417 						servaddr,
   3418 						opt,
   3419 						oa[i].ptr_value,
   3420 						MHD_OPTION_END))
   3421 		    return MHD_NO;
   3422 		  break;
   3423 		  /* all options taking two pointers */
   3424 		case MHD_OPTION_NOTIFY_COMPLETED:
   3425 		case MHD_OPTION_NOTIFY_CONNECTION:
   3426 		case MHD_OPTION_URI_LOG_CALLBACK:
   3427 		case MHD_OPTION_EXTERNAL_LOGGER:
   3428 		case MHD_OPTION_UNESCAPE_CALLBACK:
   3429 		  if (MHD_YES != parse_options (daemon,
   3430 						servaddr,
   3431 						opt,
   3432 						(void *) oa[i].value,
   3433 						oa[i].ptr_value,
   3434 						MHD_OPTION_END))
   3435 		    return MHD_NO;
   3436 		  break;
   3437 		  /* options taking size_t-number followed by pointer */
   3438 		case MHD_OPTION_DIGEST_AUTH_RANDOM:
   3439 		  if (MHD_YES != parse_options (daemon,
   3440 						servaddr,
   3441 						opt,
   3442 						(size_t) oa[i].value,
   3443 						oa[i].ptr_value,
   3444 						MHD_OPTION_END))
   3445 		    return MHD_NO;
   3446 		  break;
   3447 		default:
   3448 		  return MHD_NO;
   3449 		}
   3450 	      i++;
   3451 	    }
   3452 	  break;
   3453         case MHD_OPTION_UNESCAPE_CALLBACK:
   3454           daemon->unescape_callback =
   3455             va_arg (ap, UnescapeCallback);
   3456           daemon->unescape_callback_cls = va_arg (ap, void *);
   3457           break;
   3458         default:
   3459 #if HAVE_MESSAGES
   3460           if (((opt >= MHD_OPTION_HTTPS_MEM_KEY) &&
   3461               (opt <= MHD_OPTION_HTTPS_PRIORITIES)) || (opt == MHD_OPTION_HTTPS_MEM_TRUST))
   3462             {
   3463               MHD_DLOG (daemon,
   3464 			"MHD HTTPS option %d passed to MHD compiled without HTTPS support\n",
   3465 			opt);
   3466             }
   3467           else
   3468             {
   3469               MHD_DLOG (daemon,
   3470 			"Invalid option %d! (Did you terminate the list with MHD_OPTION_END?)\n",
   3471 			opt);
   3472             }
   3473 #endif
   3474 	  return MHD_NO;
   3475         }
   3476     }
   3477   return MHD_YES;
   3478 }
   3479 
   3480 
   3481 /**
   3482  * Create a listen socket, if possible with SOCK_CLOEXEC flag set.
   3483  *
   3484  * @param daemon daemon for which we create the socket
   3485  * @param domain socket domain (i.e. PF_INET)
   3486  * @param type socket type (usually SOCK_STREAM)
   3487  * @param protocol desired protocol, 0 for default
   3488  */
   3489 static MHD_socket
   3490 create_socket (struct MHD_Daemon *daemon,
   3491 	       int domain, int type, int protocol)
   3492 {
   3493   int ctype = type | SOCK_CLOEXEC;
   3494   MHD_socket fd;
   3495 
   3496   /* use SOCK_STREAM rather than ai_socktype: some getaddrinfo
   3497    * implementations do not set ai_socktype, e.g. RHL6.2. */
   3498   fd = socket (domain, ctype, protocol);
   3499   if ( (MHD_INVALID_SOCKET == fd) && (EINVAL == MHD_socket_errno_) && (0 != SOCK_CLOEXEC) )
   3500   {
   3501     ctype = type;
   3502     fd = socket(domain, type, protocol);
   3503   }
   3504   if (MHD_INVALID_SOCKET == fd)
   3505     return MHD_INVALID_SOCKET;
   3506   if (type == ctype)
   3507     make_nonblocking_noninheritable (daemon, fd);
   3508   return fd;
   3509 }
   3510 
   3511 
   3512 #if EPOLL_SUPPORT
   3513 /**
   3514  * Setup epoll() FD for the daemon and initialize it to listen
   3515  * on the listen FD.
   3516  *
   3517  * @param daemon daemon to initialize for epoll()
   3518  * @return #MHD_YES on success, #MHD_NO on failure
   3519  */
   3520 static int
   3521 setup_epoll_to_listen (struct MHD_Daemon *daemon)
   3522 {
   3523   struct epoll_event event;
   3524 
   3525 #ifdef HAVE_EPOLL_CREATE1
   3526   daemon->epoll_fd = epoll_create1 (EPOLL_CLOEXEC);
   3527 #else  /* !HAVE_EPOLL_CREATE1 */
   3528   daemon->epoll_fd = epoll_create (MAX_EVENTS);
   3529 #endif /* !HAVE_EPOLL_CREATE1 */
   3530   if (-1 == daemon->epoll_fd)
   3531     {
   3532 #if HAVE_MESSAGES
   3533       MHD_DLOG (daemon,
   3534                 "Call to epoll_create1 failed: %s\n",
   3535                 MHD_socket_last_strerr_ ());
   3536 #endif
   3537       return MHD_NO;
   3538     }
   3539 #ifndef HAVE_EPOLL_CREATE1
   3540   else
   3541     {
   3542       int fdflags = fcntl (daemon->epoll_fd, F_GETFD);
   3543       if (0 > fdflags || 0 > fcntl (daemon->epoll_fd, F_SETFD, fdflags | FD_CLOEXEC))
   3544         {
   3545 #if HAVE_MESSAGES
   3546           MHD_DLOG (daemon,
   3547                     "Failed to change flags on epoll fd: %s\n",
   3548                     MHD_socket_last_strerr_ ());
   3549 #endif /* HAVE_MESSAGES */
   3550         }
   3551     }
   3552 #endif /* !HAVE_EPOLL_CREATE1 */
   3553   if (0 == EPOLL_CLOEXEC)
   3554     make_nonblocking_noninheritable (daemon,
   3555 				     daemon->epoll_fd);
   3556   if (MHD_INVALID_SOCKET == daemon->socket_fd)
   3557     return MHD_YES; /* non-listening daemon */
   3558   event.events = EPOLLIN;
   3559   event.data.ptr = daemon;
   3560   if (0 != epoll_ctl (daemon->epoll_fd,
   3561 		      EPOLL_CTL_ADD,
   3562 		      daemon->socket_fd,
   3563 		      &event))
   3564     {
   3565 #if HAVE_MESSAGES
   3566       MHD_DLOG (daemon,
   3567                 "Call to epoll_ctl failed: %s\n",
   3568                 MHD_socket_last_strerr_ ());
   3569 #endif
   3570       return MHD_NO;
   3571     }
   3572   if ( (MHD_INVALID_PIPE_ != daemon->wpipe[0]) &&
   3573        (MHD_USE_SUSPEND_RESUME == (daemon->options & MHD_USE_SUSPEND_RESUME)) )
   3574     {
   3575       event.events = EPOLLIN | EPOLLET;
   3576       event.data.ptr = NULL;
   3577       event.data.fd = daemon->wpipe[0];
   3578       if (0 != epoll_ctl (daemon->epoll_fd,
   3579                           EPOLL_CTL_ADD,
   3580                           daemon->wpipe[0],
   3581                           &event))
   3582         {
   3583 #if HAVE_MESSAGES
   3584           MHD_DLOG (daemon,
   3585                     "Call to epoll_ctl failed: %s\n",
   3586                     MHD_socket_last_strerr_ ());
   3587 #endif
   3588           return MHD_NO;
   3589         }
   3590     }
   3591   daemon->listen_socket_in_epoll = MHD_YES;
   3592   return MHD_YES;
   3593 }
   3594 #endif
   3595 
   3596 
   3597 /**
   3598  * Start a webserver on the given port.
   3599  *
   3600  * @param flags combination of `enum MHD_FLAG` values
   3601  * @param port port to bind to (in host byte order)
   3602  * @param apc callback to call to check which clients
   3603  *        will be allowed to connect; you can pass NULL
   3604  *        in which case connections from any IP will be
   3605  *        accepted
   3606  * @param apc_cls extra argument to @a apc
   3607  * @param dh handler called for all requests (repeatedly)
   3608  * @param dh_cls extra argument to @a dh
   3609  * @param ap list of options (type-value pairs,
   3610  *        terminated with #MHD_OPTION_END).
   3611  * @return NULL on error, handle to daemon on success
   3612  * @ingroup event
   3613  */
   3614 struct MHD_Daemon *
   3615 MHD_start_daemon_va (unsigned int flags,
   3616                      uint16_t port,
   3617                      MHD_AcceptPolicyCallback apc,
   3618                      void *apc_cls,
   3619                      MHD_AccessHandlerCallback dh, void *dh_cls,
   3620 		     va_list ap)
   3621 {
   3622   const int on = 1;
   3623   struct MHD_Daemon *daemon;
   3624   MHD_socket socket_fd;
   3625   struct sockaddr_in servaddr4;
   3626 #if HAVE_INET6
   3627   struct sockaddr_in6 servaddr6;
   3628 #endif
   3629   const struct sockaddr *servaddr = NULL;
   3630   socklen_t addrlen;
   3631   unsigned int i;
   3632   int res_thread_create;
   3633   int use_pipe;
   3634 
   3635 #ifndef HAVE_INET6
   3636   if (0 != (flags & MHD_USE_IPv6))
   3637     return NULL;
   3638 #endif
   3639 #ifndef HAVE_POLL
   3640   if (0 != (flags & MHD_USE_POLL))
   3641     return NULL;
   3642 #endif
   3643 #if ! HTTPS_SUPPORT
   3644   if (0 != (flags & MHD_USE_SSL))
   3645     return NULL;
   3646 #endif
   3647 #ifndef TCP_FASTOPEN
   3648   if (0 != (flags & MHD_USE_TCP_FASTOPEN))
   3649     return NULL;
   3650 #endif
   3651   if (NULL == dh)
   3652     return NULL;
   3653   if (NULL == (daemon = malloc (sizeof (struct MHD_Daemon))))
   3654     return NULL;
   3655   memset (daemon, 0, sizeof (struct MHD_Daemon));
   3656 #if EPOLL_SUPPORT
   3657   daemon->epoll_fd = -1;
   3658 #endif
   3659   /* try to open listen socket */
   3660   daemon->socket_fd = MHD_INVALID_SOCKET;
   3661   daemon->listening_address_reuse = 0;
   3662   daemon->options = flags;
   3663 #if WINDOWS
   3664   /* Winsock is broken with respect to 'shutdown';
   3665      this disables us calling 'shutdown' on W32. */
   3666   daemon->options |= MHD_USE_EPOLL_TURBO;
   3667 #endif
   3668   daemon->port = port;
   3669   daemon->apc = apc;
   3670   daemon->apc_cls = apc_cls;
   3671   daemon->default_handler = dh;
   3672   daemon->default_handler_cls = dh_cls;
   3673   daemon->connections = 0;
   3674   daemon->connection_limit = MHD_MAX_CONNECTIONS_DEFAULT;
   3675   daemon->pool_size = MHD_POOL_SIZE_DEFAULT;
   3676   daemon->pool_increment = MHD_BUF_INC_SIZE;
   3677   daemon->unescape_callback = &unescape_wrapper;
   3678   daemon->connection_timeout = 0;       /* no timeout */
   3679   daemon->wpipe[0] = MHD_INVALID_PIPE_;
   3680   daemon->wpipe[1] = MHD_INVALID_PIPE_;
   3681 #if HAVE_MESSAGES
   3682   daemon->custom_error_log = (MHD_LogCallback) &vfprintf;
   3683   daemon->custom_error_log_cls = stderr;
   3684 #endif
   3685 #ifdef HAVE_LISTEN_SHUTDOWN
   3686   use_pipe = (0 != (daemon->options & (MHD_USE_NO_LISTEN_SOCKET | MHD_USE_PIPE_FOR_SHUTDOWN)));
   3687 #else
   3688   use_pipe = 1; /* yes, must use pipe to signal shutdown */
   3689 #endif
   3690   if (0 == (flags & (MHD_USE_SELECT_INTERNALLY | MHD_USE_THREAD_PER_CONNECTION)))
   3691     use_pipe = 0; /* useless if we are using 'external' select */
   3692   if ( (use_pipe) && (0 != MHD_pipe_ (daemon->wpipe)) )
   3693     {
   3694 #if HAVE_MESSAGES
   3695       MHD_DLOG (daemon,
   3696 		"Failed to create control pipe: %s\n",
   3697 		MHD_strerror_ (errno));
   3698 #endif
   3699       free (daemon);
   3700       return NULL;
   3701     }
   3702 #ifndef WINDOWS
   3703   if ( (0 == (flags & (MHD_USE_POLL | MHD_USE_EPOLL_LINUX_ONLY))) &&
   3704        (1 == use_pipe) &&
   3705        (daemon->wpipe[0] >= FD_SETSIZE) )
   3706     {
   3707 #if HAVE_MESSAGES
   3708       MHD_DLOG (daemon,
   3709 		"file descriptor for control pipe exceeds maximum value\n");
   3710 #endif
   3711       if (0 != MHD_pipe_close_ (daemon->wpipe[0]))
   3712 	MHD_PANIC ("close failed\n");
   3713       if (0 != MHD_pipe_close_ (daemon->wpipe[1]))
   3714 	MHD_PANIC ("close failed\n");
   3715       free (daemon);
   3716       return NULL;
   3717     }
   3718 #endif
   3719 #ifdef DAUTH_SUPPORT
   3720   daemon->digest_auth_rand_size = 0;
   3721   daemon->digest_auth_random = NULL;
   3722   daemon->nonce_nc_size = 4; /* tiny */
   3723 #endif
   3724 
   3725 
   3726   if (MHD_YES != parse_options_va (daemon, &servaddr, ap))
   3727     {
   3728       free (daemon);
   3729       return NULL;
   3730     }
   3731 #ifdef DAUTH_SUPPORT
   3732   if (daemon->nonce_nc_size > 0)
   3733     {
   3734       if ( ( (size_t) (daemon->nonce_nc_size * sizeof (struct MHD_NonceNc))) /
   3735 	   sizeof(struct MHD_NonceNc) != daemon->nonce_nc_size)
   3736 	{
   3737 #if HAVE_MESSAGES
   3738 	  MHD_DLOG (daemon,
   3739 		    "Specified value for NC_SIZE too large\n");
   3740 #endif
   3741 	  free (daemon);
   3742 	  return NULL;
   3743 	}
   3744       daemon->nnc = malloc (daemon->nonce_nc_size * sizeof (struct MHD_NonceNc));
   3745       if (NULL == daemon->nnc)
   3746 	{
   3747 #if HAVE_MESSAGES
   3748 	  MHD_DLOG (daemon,
   3749 		    "Failed to allocate memory for nonce-nc map: %s\n",
   3750 		    MHD_strerror_ (errno));
   3751 #endif
   3752 	  free (daemon);
   3753 	  return NULL;
   3754 	}
   3755     }
   3756 
   3757   if (MHD_YES != MHD_mutex_create_ (&daemon->nnc_lock))
   3758     {
   3759 #if HAVE_MESSAGES
   3760       MHD_DLOG (daemon,
   3761 		"MHD failed to initialize nonce-nc mutex\n");
   3762 #endif
   3763       free (daemon->nnc);
   3764       free (daemon);
   3765       return NULL;
   3766     }
   3767 #endif
   3768 
   3769   /* Thread pooling currently works only with internal select thread model */
   3770   if ( (0 == (flags & MHD_USE_SELECT_INTERNALLY)) &&
   3771        (daemon->worker_pool_size > 0) )
   3772     {
   3773 #if HAVE_MESSAGES
   3774       MHD_DLOG (daemon,
   3775 		"MHD thread pooling only works with MHD_USE_SELECT_INTERNALLY\n");
   3776 #endif
   3777       goto free_and_fail;
   3778     }
   3779 
   3780   if ( (MHD_USE_SUSPEND_RESUME == (flags & MHD_USE_SUSPEND_RESUME)) &&
   3781        (0 != (flags & MHD_USE_THREAD_PER_CONNECTION)) )
   3782     {
   3783 #if HAVE_MESSAGES
   3784       MHD_DLOG (daemon,
   3785                 "Combining MHD_USE_THREAD_PER_CONNECTION and MHD_USE_SUSPEND_RESUME is not supported.\n");
   3786 #endif
   3787       goto free_and_fail;
   3788     }
   3789 
   3790 #ifdef __SYMBIAN32__
   3791   if (0 != (flags & (MHD_USE_SELECT_INTERNALLY | MHD_USE_THREAD_PER_CONNECTION)))
   3792     {
   3793 #if HAVE_MESSAGES
   3794       MHD_DLOG (daemon,
   3795 		"Threaded operations are not supported on Symbian.\n");
   3796 #endif
   3797       goto free_and_fail;
   3798     }
   3799 #endif
   3800   if ( (MHD_INVALID_SOCKET == daemon->socket_fd) &&
   3801        (0 == (daemon->options & MHD_USE_NO_LISTEN_SOCKET)) )
   3802     {
   3803       /* try to open listen socket */
   3804       if (0 != (flags & MHD_USE_IPv6))
   3805 	socket_fd = create_socket (daemon,
   3806 				   PF_INET6, SOCK_STREAM, 0);
   3807       else
   3808 	socket_fd = create_socket (daemon,
   3809 				   PF_INET, SOCK_STREAM, 0);
   3810       if (MHD_INVALID_SOCKET == socket_fd)
   3811 	{
   3812 #if HAVE_MESSAGES
   3813           MHD_DLOG (daemon,
   3814                     "Call to socket failed: %s\n",
   3815                     MHD_socket_last_strerr_ ());
   3816 #endif
   3817 	  goto free_and_fail;
   3818 	}
   3819 
   3820       /* Apply the socket options according to listening_address_reuse. */
   3821       if (0 == daemon->listening_address_reuse)
   3822         {
   3823           /* No user requirement, use "traditional" default SO_REUSEADDR,
   3824            and do not fail if it doesn't work */
   3825           if (0 > setsockopt (socket_fd,
   3826                               SOL_SOCKET,
   3827                               SO_REUSEADDR,
   3828                               (void*)&on, sizeof (on)))
   3829           {
   3830 #if HAVE_MESSAGES
   3831             MHD_DLOG (daemon,
   3832                       "setsockopt failed: %s\n",
   3833                       MHD_socket_last_strerr_ ());
   3834 #endif
   3835           }
   3836         }
   3837       else if (daemon->listening_address_reuse > 0)
   3838         {
   3839           /* User requested to allow reusing listening address:port.
   3840            * Use SO_REUSEADDR on Windows and SO_REUSEPORT on most platforms.
   3841            * Fail if SO_REUSEPORT does not exist or setsockopt fails.
   3842            */
   3843 #ifdef _WIN32
   3844           /* SO_REUSEADDR on W32 has the same semantics
   3845              as SO_REUSEPORT on BSD/Linux */
   3846           if (0 > setsockopt (socket_fd,
   3847                               SOL_SOCKET,
   3848                               SO_REUSEADDR,
   3849                               (void*)&on, sizeof (on)))
   3850             {
   3851 #if HAVE_MESSAGES
   3852               MHD_DLOG (daemon,
   3853                         "setsockopt failed: %s\n",
   3854                         MHD_socket_last_strerr_ ());
   3855 #endif
   3856               goto free_and_fail;
   3857             }
   3858 #else
   3859 #ifndef SO_REUSEPORT
   3860 #ifdef LINUX
   3861 /* Supported since Linux 3.9, but often not present (or commented out)
   3862    in the headers at this time; but 15 is reserved for this and
   3863    thus should be safe to use. */
   3864 #define SO_REUSEPORT 15
   3865 #endif
   3866 #endif
   3867 #ifdef SO_REUSEPORT
   3868           if (0 > setsockopt (socket_fd,
   3869                               SOL_SOCKET,
   3870                               SO_REUSEPORT,
   3871                               (void*)&on, sizeof (on)))
   3872             {
   3873 #if HAVE_MESSAGES
   3874               MHD_DLOG (daemon,
   3875                         "setsockopt failed: %s\n",
   3876                         MHD_socket_last_strerr_ ());
   3877 #endif
   3878               goto free_and_fail;
   3879             }
   3880 #else
   3881           /* we're supposed to allow address:port re-use, but
   3882              on this platform we cannot; fail hard */
   3883 #if HAVE_MESSAGES
   3884           MHD_DLOG (daemon,
   3885                     "Cannot allow listening address reuse: SO_REUSEPORT not defined\n");
   3886 #endif
   3887           goto free_and_fail;
   3888 #endif
   3889 #endif
   3890         }
   3891       else /* if (daemon->listening_address_reuse < 0) */
   3892         {
   3893           /* User requested to disallow reusing listening address:port.
   3894            * Do nothing except for Windows where SO_EXCLUSIVEADDRUSE
   3895            * is used. Fail if it does not exist or setsockopt fails.
   3896            */
   3897 #ifdef _WIN32
   3898 #ifdef SO_EXCLUSIVEADDRUSE
   3899           if (0 > setsockopt (socket_fd,
   3900                               SOL_SOCKET,
   3901                               SO_EXCLUSIVEADDRUSE,
   3902                               (void*)&on, sizeof (on)))
   3903             {
   3904 #if HAVE_MESSAGES
   3905               MHD_DLOG (daemon,
   3906                         "setsockopt failed: %s\n",
   3907                         MHD_socket_last_strerr_ ());
   3908 #endif
   3909               goto free_and_fail;
   3910             }
   3911 #else /* SO_EXCLUSIVEADDRUSE not defined on W32? */
   3912 #if HAVE_MESSAGES
   3913           MHD_DLOG (daemon,
   3914                     "Cannot disallow listening address reuse: SO_EXCLUSIVEADDRUSE not defined\n");
   3915 #endif
   3916           goto free_and_fail;
   3917 #endif
   3918 #endif /* _WIN32 */
   3919         }
   3920 
   3921       /* check for user supplied sockaddr */
   3922 #if HAVE_INET6
   3923       if (0 != (flags & MHD_USE_IPv6))
   3924 	addrlen = sizeof (struct sockaddr_in6);
   3925       else
   3926 #endif
   3927 	addrlen = sizeof (struct sockaddr_in);
   3928       if (NULL == servaddr)
   3929 	{
   3930 #if HAVE_INET6
   3931 	  if (0 != (flags & MHD_USE_IPv6))
   3932 	    {
   3933 	      memset (&servaddr6, 0, sizeof (struct sockaddr_in6));
   3934 	      servaddr6.sin6_family = AF_INET6;
   3935 	      servaddr6.sin6_port = htons (port);
   3936 #if HAVE_SOCKADDR_IN_SIN_LEN
   3937 	      servaddr6.sin6_len = sizeof (struct sockaddr_in6);
   3938 #endif
   3939 	      servaddr = (struct sockaddr *) &servaddr6;
   3940 	    }
   3941 	  else
   3942 #endif
   3943 	    {
   3944 	      memset (&servaddr4, 0, sizeof (struct sockaddr_in));
   3945 	      servaddr4.sin_family = AF_INET;
   3946 	      servaddr4.sin_port = htons (port);
   3947 #if HAVE_SOCKADDR_IN_SIN_LEN
   3948 	      servaddr4.sin_len = sizeof (struct sockaddr_in);
   3949 #endif
   3950 	      servaddr = (struct sockaddr *) &servaddr4;
   3951 	    }
   3952 	}
   3953       daemon->socket_fd = socket_fd;
   3954 
   3955       if (0 != (flags & MHD_USE_IPv6))
   3956 	{
   3957 #ifdef IPPROTO_IPV6
   3958 #ifdef IPV6_V6ONLY
   3959 	  /* Note: "IPV6_V6ONLY" is declared by Windows Vista ff., see "IPPROTO_IPV6 Socket Options"
   3960 	     (http://msdn.microsoft.com/en-us/library/ms738574%28v=VS.85%29.aspx);
   3961 	     and may also be missing on older POSIX systems; good luck if you have any of those,
   3962 	     your IPv6 socket may then also bind against IPv4 anyway... */
   3963 #ifndef WINDOWS
   3964 	  const int
   3965 #else
   3966 	  const char
   3967 #endif
   3968             on = (MHD_USE_DUAL_STACK != (flags & MHD_USE_DUAL_STACK));
   3969 	  if (0 > setsockopt (socket_fd,
   3970                               IPPROTO_IPV6, IPV6_V6ONLY,
   3971                               &on, sizeof (on)))
   3972       {
   3973 #if HAVE_MESSAGES
   3974             MHD_DLOG (daemon,
   3975                       "setsockopt failed: %s\n",
   3976                       MHD_socket_last_strerr_ ());
   3977 #endif
   3978       }
   3979 #endif
   3980 #endif
   3981 	}
   3982       if (-1 == bind (socket_fd, servaddr, addrlen))
   3983 	{
   3984 #if HAVE_MESSAGES
   3985           MHD_DLOG (daemon,
   3986                     "Failed to bind to port %u: %s\n",
   3987                     (unsigned int) port,
   3988                     MHD_socket_last_strerr_ ());
   3989 #endif
   3990 	  if (0 != MHD_socket_close_ (socket_fd))
   3991 	    MHD_PANIC ("close failed\n");
   3992 	  goto free_and_fail;
   3993 	}
   3994 #ifdef TCP_FASTOPEN
   3995       if (0 != (flags & MHD_USE_TCP_FASTOPEN))
   3996       {
   3997         if (0 == daemon->fastopen_queue_size)
   3998           daemon->fastopen_queue_size = MHD_TCP_FASTOPEN_QUEUE_SIZE_DEFAULT;
   3999         if (0 != setsockopt (socket_fd,
   4000                              IPPROTO_TCP, TCP_FASTOPEN,
   4001                              &daemon->fastopen_queue_size,
   4002                              sizeof (daemon->fastopen_queue_size)))
   4003         {
   4004 #if HAVE_MESSAGES
   4005           MHD_DLOG (daemon,
   4006                     "setsockopt failed: %s\n",
   4007                     MHD_socket_last_strerr_ ());
   4008 #endif
   4009         }
   4010       }
   4011 #endif
   4012 #if EPOLL_SUPPORT
   4013       if (0 != (flags & MHD_USE_EPOLL_LINUX_ONLY))
   4014 	{
   4015 	  int sk_flags = fcntl (socket_fd, F_GETFL);
   4016 	  if (0 != fcntl (socket_fd, F_SETFL, sk_flags | O_NONBLOCK))
   4017 	    {
   4018 #if HAVE_MESSAGES
   4019 	      MHD_DLOG (daemon,
   4020 			"Failed to make listen socket non-blocking: %s\n",
   4021 			MHD_socket_last_strerr_ ());
   4022 #endif
   4023 	      if (0 != MHD_socket_close_ (socket_fd))
   4024 		MHD_PANIC ("close failed\n");
   4025 	      goto free_and_fail;
   4026 	    }
   4027 	}
   4028 #endif
   4029       if (listen (socket_fd, 32) < 0)
   4030 	{
   4031 #if HAVE_MESSAGES
   4032           MHD_DLOG (daemon,
   4033                     "Failed to listen for connections: %s\n",
   4034                     MHD_socket_last_strerr_ ());
   4035 #endif
   4036 	  if (0 != MHD_socket_close_ (socket_fd))
   4037 	    MHD_PANIC ("close failed\n");
   4038 	  goto free_and_fail;
   4039 	}
   4040     }
   4041   else
   4042     {
   4043       socket_fd = daemon->socket_fd;
   4044     }
   4045 #ifndef WINDOWS
   4046   if ( (socket_fd >= FD_SETSIZE) &&
   4047        (0 == (flags & (MHD_USE_POLL | MHD_USE_EPOLL_LINUX_ONLY)) ) )
   4048     {
   4049 #if HAVE_MESSAGES
   4050       MHD_DLOG (daemon,
   4051                 "Socket descriptor larger than FD_SETSIZE: %d > %d\n",
   4052                 socket_fd,
   4053                 FD_SETSIZE);
   4054 #endif
   4055       if (0 != MHD_socket_close_ (socket_fd))
   4056 	MHD_PANIC ("close failed\n");
   4057       goto free_and_fail;
   4058     }
   4059 #endif
   4060 
   4061 #if EPOLL_SUPPORT
   4062   if ( (0 != (flags & MHD_USE_EPOLL_LINUX_ONLY)) &&
   4063        (0 == daemon->worker_pool_size) &&
   4064        (0 == (daemon->options & MHD_USE_NO_LISTEN_SOCKET)) )
   4065     {
   4066       if (0 != (flags & MHD_USE_THREAD_PER_CONNECTION))
   4067 	{
   4068 #if HAVE_MESSAGES
   4069 	  MHD_DLOG (daemon,
   4070 		    "Combining MHD_USE_THREAD_PER_CONNECTION and MHD_USE_EPOLL_LINUX_ONLY is not supported.\n");
   4071 #endif
   4072 	  goto free_and_fail;
   4073 	}
   4074       if (MHD_YES != setup_epoll_to_listen (daemon))
   4075 	goto free_and_fail;
   4076     }
   4077 #else
   4078   if (0 != (flags & MHD_USE_EPOLL_LINUX_ONLY))
   4079     {
   4080 #if HAVE_MESSAGES
   4081       MHD_DLOG (daemon,
   4082 		"epoll is not supported on this platform by this build.\n");
   4083 #endif
   4084       goto free_and_fail;
   4085     }
   4086 #endif
   4087 
   4088   if (MHD_YES != MHD_mutex_create_ (&daemon->per_ip_connection_mutex))
   4089     {
   4090 #if HAVE_MESSAGES
   4091       MHD_DLOG (daemon,
   4092                "MHD failed to initialize IP connection limit mutex\n");
   4093 #endif
   4094       if ( (MHD_INVALID_SOCKET != socket_fd) &&
   4095 	   (0 != MHD_socket_close_ (socket_fd)) )
   4096 	MHD_PANIC ("close failed\n");
   4097       goto free_and_fail;
   4098     }
   4099   if (MHD_YES != MHD_mutex_create_ (&daemon->cleanup_connection_mutex))
   4100     {
   4101 #if HAVE_MESSAGES
   4102       MHD_DLOG (daemon,
   4103                "MHD failed to initialize IP connection limit mutex\n");
   4104 #endif
   4105       (void) MHD_mutex_destroy_ (&daemon->cleanup_connection_mutex);
   4106       if ( (MHD_INVALID_SOCKET != socket_fd) &&
   4107 	   (0 != MHD_socket_close_ (socket_fd)) )
   4108 	MHD_PANIC ("close failed\n");
   4109       goto free_and_fail;
   4110     }
   4111 
   4112 #if HTTPS_SUPPORT
   4113   /* initialize HTTPS daemon certificate aspects & send / recv functions */
   4114   if ((0 != (flags & MHD_USE_SSL)) && (0 != MHD_TLS_init (daemon)))
   4115     {
   4116 #if HAVE_MESSAGES
   4117       MHD_DLOG (daemon,
   4118 		"Failed to initialize TLS support\n");
   4119 #endif
   4120       if ( (MHD_INVALID_SOCKET != socket_fd) &&
   4121 	   (0 != MHD_socket_close_ (socket_fd)) )
   4122 	MHD_PANIC ("close failed\n");
   4123       (void) MHD_mutex_destroy_ (&daemon->cleanup_connection_mutex);
   4124       (void) MHD_mutex_destroy_ (&daemon->per_ip_connection_mutex);
   4125       goto free_and_fail;
   4126     }
   4127 #endif
   4128   if ( ( (0 != (flags & MHD_USE_THREAD_PER_CONNECTION)) ||
   4129 	 ( (0 != (flags & MHD_USE_SELECT_INTERNALLY)) &&
   4130 	   (0 == daemon->worker_pool_size)) ) &&
   4131        (0 == (daemon->options & MHD_USE_NO_LISTEN_SOCKET)) &&
   4132        (0 != (res_thread_create =
   4133 	      create_thread (&daemon->pid, daemon, &MHD_select_thread, daemon))))
   4134     {
   4135 #if HAVE_MESSAGES
   4136       MHD_DLOG (daemon,
   4137                 "Failed to create listen thread: %s\n",
   4138 		MHD_strerror_ (res_thread_create));
   4139 #endif
   4140       (void) MHD_mutex_destroy_ (&daemon->cleanup_connection_mutex);
   4141       (void) MHD_mutex_destroy_ (&daemon->per_ip_connection_mutex);
   4142       if ( (MHD_INVALID_SOCKET != socket_fd) &&
   4143 	   (0 != MHD_socket_close_ (socket_fd)) )
   4144 	MHD_PANIC ("close failed\n");
   4145       goto free_and_fail;
   4146     }
   4147   if ( (daemon->worker_pool_size > 0) &&
   4148        (0 == (daemon->options & MHD_USE_NO_LISTEN_SOCKET)) )
   4149     {
   4150 #if !defined(WINDOWS) || defined(CYGWIN)
   4151       int sk_flags;
   4152 #else
   4153       unsigned long sk_flags;
   4154 #endif
   4155 
   4156       /* Coarse-grained count of connections per thread (note error
   4157        * due to integer division). Also keep track of how many
   4158        * connections are leftover after an equal split. */
   4159       unsigned int conns_per_thread = daemon->connection_limit
   4160                                       / daemon->worker_pool_size;
   4161       unsigned int leftover_conns = daemon->connection_limit
   4162                                     % daemon->worker_pool_size;
   4163 
   4164       i = 0; /* we need this in case fcntl or malloc fails */
   4165 
   4166       /* Accept must be non-blocking. Multiple children may wake up
   4167        * to handle a new connection, but only one will win the race.
   4168        * The others must immediately return. */
   4169 #if !defined(WINDOWS) || defined(CYGWIN)
   4170       sk_flags = fcntl (socket_fd, F_GETFL);
   4171       if (sk_flags < 0)
   4172         goto thread_failed;
   4173       if (0 != fcntl (socket_fd, F_SETFL, sk_flags | O_NONBLOCK))
   4174         goto thread_failed;
   4175 #else
   4176       sk_flags = 1;
   4177       if (SOCKET_ERROR == ioctlsocket (socket_fd, FIONBIO, &sk_flags))
   4178         goto thread_failed;
   4179 #endif /* WINDOWS && !CYGWIN */
   4180 
   4181       /* Allocate memory for pooled objects */
   4182       daemon->worker_pool = malloc (sizeof (struct MHD_Daemon)
   4183                                     * daemon->worker_pool_size);
   4184       if (NULL == daemon->worker_pool)
   4185         goto thread_failed;
   4186 
   4187       /* Start the workers in the pool */
   4188       for (i = 0; i < daemon->worker_pool_size; ++i)
   4189         {
   4190           /* Create copy of the Daemon object for each worker */
   4191           struct MHD_Daemon *d = &daemon->worker_pool[i];
   4192 
   4193           memcpy (d, daemon, sizeof (struct MHD_Daemon));
   4194           /* Adjust pooling params for worker daemons; note that memcpy()
   4195              has already copied MHD_USE_SELECT_INTERNALLY thread model into
   4196              the worker threads. */
   4197           d->master = daemon;
   4198           d->worker_pool_size = 0;
   4199           d->worker_pool = NULL;
   4200 
   4201           if ( (MHD_USE_SUSPEND_RESUME == (flags & MHD_USE_SUSPEND_RESUME)) &&
   4202                (0 != MHD_pipe_ (d->wpipe)) )
   4203             {
   4204 #if HAVE_MESSAGES
   4205               MHD_DLOG (daemon,
   4206                         "Failed to create worker control pipe: %s\n",
   4207                         MHD_pipe_last_strerror_() );
   4208 #endif
   4209               goto thread_failed;
   4210             }
   4211 #ifndef WINDOWS
   4212           if ( (0 == (flags & (MHD_USE_POLL | MHD_USE_EPOLL_LINUX_ONLY))) &&
   4213                (MHD_USE_SUSPEND_RESUME == (flags & MHD_USE_SUSPEND_RESUME)) &&
   4214                (d->wpipe[0] >= FD_SETSIZE) )
   4215             {
   4216 #if HAVE_MESSAGES
   4217               MHD_DLOG (daemon,
   4218                         "file descriptor for worker control pipe exceeds maximum value\n");
   4219 #endif
   4220               if (0 != MHD_pipe_close_ (d->wpipe[0]))
   4221                 MHD_PANIC ("close failed\n");
   4222               if (0 != MHD_pipe_close_ (d->wpipe[1]))
   4223                 MHD_PANIC ("close failed\n");
   4224               goto thread_failed;
   4225             }
   4226 #endif
   4227 
   4228           /* Divide available connections evenly amongst the threads.
   4229            * Thread indexes in [0, leftover_conns) each get one of the
   4230            * leftover connections. */
   4231           d->connection_limit = conns_per_thread;
   4232           if (i < leftover_conns)
   4233             ++d->connection_limit;
   4234 #if EPOLL_SUPPORT
   4235 	  if ( (0 != (daemon->options & MHD_USE_EPOLL_LINUX_ONLY)) &&
   4236 	       (MHD_YES != setup_epoll_to_listen (d)) )
   4237 	    goto thread_failed;
   4238 #endif
   4239           /* Must init cleanup connection mutex for each worker */
   4240           if (MHD_YES != MHD_mutex_create_ (&d->cleanup_connection_mutex))
   4241             {
   4242 #if HAVE_MESSAGES
   4243               MHD_DLOG (daemon,
   4244                        "MHD failed to initialize cleanup connection mutex for thread worker %d\n", i);
   4245 #endif
   4246               goto thread_failed;
   4247             }
   4248 
   4249           /* Spawn the worker thread */
   4250           if (0 != (res_thread_create =
   4251 		    create_thread (&d->pid, daemon, &MHD_select_thread, d)))
   4252             {
   4253 #if HAVE_MESSAGES
   4254               MHD_DLOG (daemon,
   4255                         "Failed to create pool thread: %s\n",
   4256 			MHD_strerror_ (res_thread_create));
   4257 #endif
   4258               /* Free memory for this worker; cleanup below handles
   4259                * all previously-created workers. */
   4260               (void) MHD_mutex_destroy_ (&d->cleanup_connection_mutex);
   4261               goto thread_failed;
   4262             }
   4263         }
   4264     }
   4265 #if HTTPS_SUPPORT
   4266   /* API promises to never use the password after initialization,
   4267      so we additionally NULL it here to not deref a dangling pointer. */
   4268   daemon->https_key_password = NULL;
   4269 #endif /* HTTPS_SUPPORT */
   4270 
   4271   return daemon;
   4272 
   4273 thread_failed:
   4274   /* If no worker threads created, then shut down normally. Calling
   4275      MHD_stop_daemon (as we do below) doesn't work here since it
   4276      assumes a 0-sized thread pool means we had been in the default
   4277      MHD_USE_SELECT_INTERNALLY mode. */
   4278   if (0 == i)
   4279     {
   4280       if ( (MHD_INVALID_SOCKET != socket_fd) &&
   4281 	   (0 != MHD_socket_close_ (socket_fd)) )
   4282 	MHD_PANIC ("close failed\n");
   4283       (void) MHD_mutex_destroy_ (&daemon->cleanup_connection_mutex);
   4284       (void) MHD_mutex_destroy_ (&daemon->per_ip_connection_mutex);
   4285       if (NULL != daemon->worker_pool)
   4286         free (daemon->worker_pool);
   4287       goto free_and_fail;
   4288     }
   4289 
   4290   /* Shutdown worker threads we've already created. Pretend
   4291      as though we had fully initialized our daemon, but
   4292      with a smaller number of threads than had been
   4293      requested. */
   4294   daemon->worker_pool_size = i;
   4295   MHD_stop_daemon (daemon);
   4296   return NULL;
   4297 
   4298  free_and_fail:
   4299   /* clean up basic memory state in 'daemon' and return NULL to
   4300      indicate failure */
   4301 #if EPOLL_SUPPORT
   4302   if (-1 != daemon->epoll_fd)
   4303     close (daemon->epoll_fd);
   4304 #endif
   4305 #ifdef DAUTH_SUPPORT
   4306   free (daemon->nnc);
   4307   (void) MHD_mutex_destroy_ (&daemon->nnc_lock);
   4308 #endif
   4309   free (daemon);
   4310   return NULL;
   4311 }
   4312 
   4313 
   4314 /**
   4315  * Close the given connection, remove it from all of its
   4316  * DLLs and move it into the cleanup queue.
   4317  *
   4318  * @param pos connection to move to cleanup
   4319  */
   4320 static void
   4321 close_connection (struct MHD_Connection *pos)
   4322 {
   4323   struct MHD_Daemon *daemon = pos->daemon;
   4324 
   4325   MHD_connection_close (pos,
   4326 			MHD_REQUEST_TERMINATED_DAEMON_SHUTDOWN);
   4327   if (0 != (daemon->options & MHD_USE_THREAD_PER_CONNECTION))
   4328     return; /* must let thread to the rest */
   4329   if (pos->connection_timeout == pos->daemon->connection_timeout)
   4330     XDLL_remove (daemon->normal_timeout_head,
   4331 		 daemon->normal_timeout_tail,
   4332 		 pos);
   4333   else
   4334     XDLL_remove (daemon->manual_timeout_head,
   4335 		 daemon->manual_timeout_tail,
   4336 		 pos);
   4337   DLL_remove (daemon->connections_head,
   4338 	      daemon->connections_tail,
   4339 	      pos);
   4340   pos->event_loop_info = MHD_EVENT_LOOP_INFO_CLEANUP;
   4341   DLL_insert (daemon->cleanup_head,
   4342 	      daemon->cleanup_tail,
   4343 	      pos);
   4344 }
   4345 
   4346 
   4347 /**
   4348  * Close all connections for the daemon; must only be called after
   4349  * all of the threads have been joined and there is no more concurrent
   4350  * activity on the connection lists.
   4351  *
   4352  * @param daemon daemon to close down
   4353  */
   4354 static void
   4355 close_all_connections (struct MHD_Daemon *daemon)
   4356 {
   4357   struct MHD_Connection *pos;
   4358 
   4359   /* first, make sure all threads are aware of shutdown; need to
   4360      traverse DLLs in peace... */
   4361   if ( (0 != (daemon->options & MHD_USE_THREAD_PER_CONNECTION)) &&
   4362        (MHD_YES != MHD_mutex_lock_ (&daemon->cleanup_connection_mutex)) )
   4363     MHD_PANIC ("Failed to acquire cleanup mutex\n");
   4364   for (pos = daemon->connections_head; NULL != pos; pos = pos->next)
   4365     {
   4366       shutdown (pos->socket_fd,
   4367                 (pos->read_closed == MHD_YES) ? SHUT_WR : SHUT_RDWR);
   4368 #if WINDOWS
   4369       if ( (0 != (daemon->options & MHD_USE_THREAD_PER_CONNECTION)) &&
   4370            (MHD_INVALID_PIPE_ != daemon->wpipe[1]) &&
   4371            (1 != MHD_pipe_write_ (daemon->wpipe[1], "e", 1)) )
   4372         MHD_PANIC ("failed to signal shutdown via pipe");
   4373 #endif
   4374     }
   4375   if ( (0 != (daemon->options & MHD_USE_THREAD_PER_CONNECTION)) &&
   4376        (MHD_YES != MHD_mutex_unlock_ (&daemon->cleanup_connection_mutex)) )
   4377     MHD_PANIC ("Failed to release cleanup mutex\n");
   4378 
   4379   /* now, collect threads from thread pool */
   4380   if (0 != (daemon->options & MHD_USE_THREAD_PER_CONNECTION))
   4381     {
   4382       for (pos = daemon->connections_head; NULL != pos; pos = pos->next)
   4383 	{
   4384 	  if (0 != MHD_join_thread_ (pos->pid))
   4385 	    MHD_PANIC ("Failed to join a thread\n");
   4386 	  pos->thread_joined = MHD_YES;
   4387 	}
   4388     }
   4389 
   4390   /* now that we're alone, move everyone to cleanup */
   4391   while (NULL != (pos = daemon->connections_head))
   4392     close_connection (pos);
   4393   MHD_cleanup_connections (daemon);
   4394 }
   4395 
   4396 
   4397 #if EPOLL_SUPPORT
   4398 /**
   4399  * Shutdown epoll()-event loop by adding 'wpipe' to its event set.
   4400  *
   4401  * @param daemon daemon of which the epoll() instance must be signalled
   4402  */
   4403 static void
   4404 epoll_shutdown (struct MHD_Daemon *daemon)
   4405 {
   4406   struct epoll_event event;
   4407 
   4408   if (MHD_INVALID_PIPE_ == daemon->wpipe[1])
   4409     {
   4410       /* wpipe was required in this mode, how could this happen? */
   4411       MHD_PANIC ("Internal error\n");
   4412     }
   4413   event.events = EPOLLOUT;
   4414   event.data.ptr = NULL;
   4415   if (0 != epoll_ctl (daemon->epoll_fd,
   4416 		      EPOLL_CTL_ADD,
   4417 		      daemon->wpipe[1],
   4418 		      &event))
   4419     MHD_PANIC ("Failed to add wpipe to epoll set to signal termination\n");
   4420 }
   4421 #endif
   4422 
   4423 
   4424 /**
   4425  * Shutdown an HTTP daemon.
   4426  *
   4427  * @param daemon daemon to stop
   4428  * @ingroup event
   4429  */
   4430 void
   4431 MHD_stop_daemon (struct MHD_Daemon *daemon)
   4432 {
   4433   MHD_socket fd;
   4434   unsigned int i;
   4435 
   4436   if (NULL == daemon)
   4437     return;
   4438   daemon->shutdown = MHD_YES;
   4439   fd = daemon->socket_fd;
   4440   daemon->socket_fd = MHD_INVALID_SOCKET;
   4441   /* Prepare workers for shutdown */
   4442   if (NULL != daemon->worker_pool)
   4443     {
   4444       /* MHD_USE_NO_LISTEN_SOCKET disables thread pools, hence we need to check */
   4445       for (i = 0; i < daemon->worker_pool_size; ++i)
   4446 	{
   4447 	  daemon->worker_pool[i].shutdown = MHD_YES;
   4448 	  daemon->worker_pool[i].socket_fd = MHD_INVALID_SOCKET;
   4449 #if EPOLL_SUPPORT
   4450 	  if ( (0 != (daemon->options & MHD_USE_EPOLL_LINUX_ONLY)) &&
   4451 	       (-1 != daemon->worker_pool[i].epoll_fd) &&
   4452 	       (MHD_INVALID_SOCKET == fd) )
   4453 	    epoll_shutdown (&daemon->worker_pool[i]);
   4454 #endif
   4455 	}
   4456     }
   4457   if (MHD_INVALID_PIPE_ != daemon->wpipe[1])
   4458     {
   4459       if (1 != MHD_pipe_write_ (daemon->wpipe[1], "e", 1))
   4460 	MHD_PANIC ("failed to signal shutdown via pipe");
   4461     }
   4462 #ifdef HAVE_LISTEN_SHUTDOWN
   4463   else
   4464     {
   4465       /* fd might be MHD_INVALID_SOCKET here due to 'MHD_quiesce_daemon' */
   4466       if (MHD_INVALID_SOCKET != fd)
   4467 	(void) shutdown (fd, SHUT_RDWR);
   4468     }
   4469 #endif
   4470 #if EPOLL_SUPPORT
   4471   if ( (0 != (daemon->options & MHD_USE_EPOLL_LINUX_ONLY)) &&
   4472        (-1 != daemon->epoll_fd) &&
   4473        (MHD_INVALID_SOCKET == fd) )
   4474     epoll_shutdown (daemon);
   4475 #endif
   4476 
   4477 #if DEBUG_CLOSE
   4478 #if HAVE_MESSAGES
   4479   MHD_DLOG (daemon,
   4480             "MHD listen socket shutdown\n");
   4481 #endif
   4482 #endif
   4483 
   4484 
   4485   /* Signal workers to stop and clean them up */
   4486   if (NULL != daemon->worker_pool)
   4487     {
   4488       /* MHD_USE_NO_LISTEN_SOCKET disables thread pools, hence we need to check */
   4489       for (i = 0; i < daemon->worker_pool_size; ++i)
   4490 	{
   4491 	  if (MHD_INVALID_PIPE_ != daemon->worker_pool[i].wpipe[1])
   4492 	    {
   4493 	      if (1 != MHD_pipe_write_ (daemon->worker_pool[i].wpipe[1], "e", 1))
   4494 		MHD_PANIC ("failed to signal shutdown via pipe");
   4495 	    }
   4496 	  if (0 != MHD_join_thread_ (daemon->worker_pool[i].pid))
   4497 	      MHD_PANIC ("Failed to join a thread\n");
   4498 	  close_all_connections (&daemon->worker_pool[i]);
   4499 	  (void) MHD_mutex_destroy_ (&daemon->worker_pool[i].cleanup_connection_mutex);
   4500 #if EPOLL_SUPPORT
   4501 	  if ( (-1 != daemon->worker_pool[i].epoll_fd) &&
   4502 	       (0 != MHD_socket_close_ (daemon->worker_pool[i].epoll_fd)) )
   4503 	    MHD_PANIC ("close failed\n");
   4504 #endif
   4505           if ( (MHD_USE_SUSPEND_RESUME == (daemon->options & MHD_USE_SUSPEND_RESUME)) )
   4506             {
   4507               if (MHD_INVALID_PIPE_ != daemon->worker_pool[i].wpipe[1])
   4508                 {
   4509 	           if (0 != MHD_pipe_close_ (daemon->worker_pool[i].wpipe[0]))
   4510 	             MHD_PANIC ("close failed\n");
   4511 	           if (0 != MHD_pipe_close_ (daemon->worker_pool[i].wpipe[1]))
   4512 	             MHD_PANIC ("close failed\n");
   4513                 }
   4514 	    }
   4515 	}
   4516       free (daemon->worker_pool);
   4517     }
   4518   else
   4519     {
   4520       /* clean up master threads */
   4521       if ((0 != (daemon->options & MHD_USE_THREAD_PER_CONNECTION)) ||
   4522 	  ((0 != (daemon->options & MHD_USE_SELECT_INTERNALLY))
   4523 	   && (0 == daemon->worker_pool_size)))
   4524 	{
   4525 	  if (0 != MHD_join_thread_ (daemon->pid))
   4526 	    {
   4527 	      MHD_PANIC ("Failed to join a thread\n");
   4528 	    }
   4529 	}
   4530     }
   4531   close_all_connections (daemon);
   4532   if ( (MHD_INVALID_SOCKET != fd) &&
   4533        (0 != MHD_socket_close_ (fd)) )
   4534     MHD_PANIC ("close failed\n");
   4535 
   4536   /* TLS clean up */
   4537 #if HTTPS_SUPPORT
   4538   if (0 != (daemon->options & MHD_USE_SSL))
   4539     {
   4540       MHD_TLS_deinit (daemon);
   4541     }
   4542 #endif
   4543 #if EPOLL_SUPPORT
   4544   if ( (0 != (daemon->options & MHD_USE_EPOLL_LINUX_ONLY)) &&
   4545        (-1 != daemon->epoll_fd) &&
   4546        (0 != MHD_socket_close_ (daemon->epoll_fd)) )
   4547     MHD_PANIC ("close failed\n");
   4548 #endif
   4549 
   4550 #ifdef DAUTH_SUPPORT
   4551   free (daemon->nnc);
   4552   (void) MHD_mutex_destroy_ (&daemon->nnc_lock);
   4553 #endif
   4554   (void) MHD_mutex_destroy_ (&daemon->per_ip_connection_mutex);
   4555   (void) MHD_mutex_destroy_ (&daemon->cleanup_connection_mutex);
   4556 
   4557   if (MHD_INVALID_PIPE_ != daemon->wpipe[1])
   4558     {
   4559       if (0 != MHD_pipe_close_ (daemon->wpipe[0]))
   4560 	MHD_PANIC ("close failed\n");
   4561       if (0 != MHD_pipe_close_ (daemon->wpipe[1]))
   4562 	MHD_PANIC ("close failed\n");
   4563     }
   4564   free (daemon);
   4565 }
   4566 
   4567 
   4568 /**
   4569  * Obtain information about the given daemon
   4570  * (not fully implemented!).
   4571  *
   4572  * @param daemon what daemon to get information about
   4573  * @param info_type what information is desired?
   4574  * @param ... depends on @a info_type
   4575  * @return NULL if this information is not available
   4576  *         (or if the @a info_type is unknown)
   4577  * @ingroup specialized
   4578  */
   4579 const union MHD_DaemonInfo *
   4580 MHD_get_daemon_info (struct MHD_Daemon *daemon,
   4581 		     enum MHD_DaemonInfoType info_type,
   4582 		     ...)
   4583 {
   4584   switch (info_type)
   4585     {
   4586     case MHD_DAEMON_INFO_KEY_SIZE:
   4587       return NULL; /* no longer supported */
   4588     case MHD_DAEMON_INFO_MAC_KEY_SIZE:
   4589       return NULL; /* no longer supported */
   4590     case MHD_DAEMON_INFO_LISTEN_FD:
   4591       return (const union MHD_DaemonInfo *) &daemon->socket_fd;
   4592 #if EPOLL_SUPPORT
   4593     case MHD_DAEMON_INFO_EPOLL_FD_LINUX_ONLY:
   4594       return (const union MHD_DaemonInfo *) &daemon->epoll_fd;
   4595 #endif
   4596     case MHD_DAEMON_INFO_CURRENT_CONNECTIONS:
   4597       MHD_cleanup_connections (daemon);
   4598       if (daemon->worker_pool)
   4599         {
   4600           /* Collect the connection information stored in the workers. */
   4601           unsigned int i;
   4602 
   4603           daemon->connections = 0;
   4604           for (i=0;i<daemon->worker_pool_size;i++)
   4605             {
   4606               MHD_cleanup_connections (&daemon->worker_pool[i]);
   4607               daemon->connections += daemon->worker_pool[i].connections;
   4608             }
   4609         }
   4610       return (const union MHD_DaemonInfo *) &daemon->connections;
   4611     default:
   4612       return NULL;
   4613     };
   4614 }
   4615 
   4616 
   4617 /**
   4618  * Sets the global error handler to a different implementation.  @a cb
   4619  * will only be called in the case of typically fatal, serious
   4620  * internal consistency issues.  These issues should only arise in the
   4621  * case of serious memory corruption or similar problems with the
   4622  * architecture.  While @a cb is allowed to return and MHD will then
   4623  * try to continue, this is never safe.
   4624  *
   4625  * The default implementation that is used if no panic function is set
   4626  * simply prints an error message and calls `abort()`.  Alternative
   4627  * implementations might call `exit()` or other similar functions.
   4628  *
   4629  * @param cb new error handler
   4630  * @param cls passed to @a cb
   4631  * @ingroup logging
   4632  */
   4633 void
   4634 MHD_set_panic_func (MHD_PanicCallback cb, void *cls)
   4635 {
   4636   mhd_panic = cb;
   4637   mhd_panic_cls = cls;
   4638 }
   4639 
   4640 
   4641 /**
   4642  * Obtain the version of this library
   4643  *
   4644  * @return static version string, e.g. "0.9.9"
   4645  * @ingroup specialized
   4646  */
   4647 const char *
   4648 MHD_get_version (void)
   4649 {
   4650 #ifdef PACKAGE_VERSION
   4651   return PACKAGE_VERSION;
   4652 #else  /* !PACKAGE_VERSION */
   4653   static char ver[12] = "\0\0\0\0\0\0\0\0\0\0\0";
   4654   if (0 == ver[0])
   4655   {
   4656     int res = MHD_snprintf_(ver, sizeof(ver), "%x.%x.%x",
   4657                             (((int)MHD_VERSION >> 24) & 0xFF),
   4658                             (((int)MHD_VERSION >> 16) & 0xFF),
   4659                             (((int)MHD_VERSION >> 8) & 0xFF));
   4660     if (0 >= res || sizeof(ver) <= res)
   4661       return "0.0.0"; /* Can't return real version*/
   4662   }
   4663   return ver;
   4664 #endif /* !PACKAGE_VERSION */
   4665 }
   4666 
   4667 
   4668 /**
   4669  * Get information about supported MHD features.
   4670  * Indicate that MHD was compiled with or without support for
   4671  * particular feature. Some features require additional support
   4672  * by kernel. Kernel support is not checked by this function.
   4673  *
   4674  * @param feature type of requested information
   4675  * @return #MHD_YES if feature is supported by MHD, #MHD_NO if
   4676  * feature is not supported or feature is unknown.
   4677  * @ingroup specialized
   4678  */
   4679 _MHD_EXTERN int
   4680 MHD_is_feature_supported(enum MHD_FEATURE feature)
   4681 {
   4682   switch(feature)
   4683     {
   4684     case MHD_FEATURE_MESSGES:
   4685 #if HAVE_MESSAGES
   4686       return MHD_YES;
   4687 #else
   4688       return MHD_NO;
   4689 #endif
   4690     case MHD_FEATURE_SSL:
   4691 #if HTTPS_SUPPORT
   4692       return MHD_YES;
   4693 #else
   4694       return MHD_NO;
   4695 #endif
   4696     case MHD_FEATURE_HTTPS_CERT_CALLBACK:
   4697       return MHD_NO;
   4698     case MHD_FEATURE_IPv6:
   4699 #ifdef HAVE_INET6
   4700       return MHD_YES;
   4701 #else
   4702       return MHD_NO;
   4703 #endif
   4704     case MHD_FEATURE_IPv6_ONLY:
   4705 #if defined(IPPROTO_IPV6) && defined(IPV6_V6ONLY)
   4706       return MHD_YES;
   4707 #else
   4708       return MHD_NO;
   4709 #endif
   4710     case MHD_FEATURE_POLL:
   4711 #ifdef HAVE_POLL
   4712       return MHD_YES;
   4713 #else
   4714       return MHD_NO;
   4715 #endif
   4716     case MHD_FEATURE_EPOLL:
   4717 #if EPOLL_SUPPORT
   4718       return MHD_YES;
   4719 #else
   4720       return MHD_NO;
   4721 #endif
   4722     case MHD_FEATURE_SHUTDOWN_LISTEN_SOCKET:
   4723 #ifdef HAVE_LISTEN_SHUTDOWN
   4724       return MHD_YES;
   4725 #else
   4726       return MHD_NO;
   4727 #endif
   4728     case MHD_FEATURE_SOCKETPAIR:
   4729 #ifdef MHD_DONT_USE_PIPES
   4730       return MHD_YES;
   4731 #else
   4732       return MHD_NO;
   4733 #endif
   4734     case MHD_FEATURE_TCP_FASTOPEN:
   4735 #ifdef TCP_FASTOPEN
   4736       return MHD_YES;
   4737 #else
   4738       return MHD_NO;
   4739 #endif
   4740     case MHD_FEATURE_BASIC_AUTH:
   4741 #if BAUTH_SUPPORT
   4742       return MHD_YES;
   4743 #else
   4744       return MHD_NO;
   4745 #endif
   4746     case MHD_FEATURE_DIGEST_AUTH:
   4747 #if DAUTH_SUPPORT
   4748       return MHD_YES;
   4749 #else
   4750       return MHD_NO;
   4751 #endif
   4752     case MHD_FEATURE_POSTPROCESSOR:
   4753 #if HAVE_POSTPROCESSOR
   4754       return MHD_YES;
   4755 #else
   4756       return MHD_NO;
   4757 #endif
   4758     case MHD_FEATURE_HTTPS_KEY_PASSWORD:
   4759 #if HTTPS_SUPPORT
   4760       return MHD_YES;
   4761 #else
   4762       return MHD_NO;
   4763 #endif
   4764     }
   4765   return MHD_NO;
   4766 }
   4767 
   4768 
   4769 /**
   4770  * Initialize do setup work.
   4771  */
   4772 void MHD_init(void)
   4773 {
   4774   mhd_panic = &mhd_panic_std;
   4775   mhd_panic_cls = NULL;
   4776 
   4777 #ifdef _WIN32
   4778   WSADATA wsd;
   4779   if (0 != WSAStartup(MAKEWORD(2, 2), &wsd))
   4780     MHD_PANIC ("Failed to initialize winsock\n");
   4781   mhd_winsock_inited_ = 1;
   4782   if (2 != LOBYTE(wsd.wVersion) && 2 != HIBYTE(wsd.wVersion))
   4783     MHD_PANIC ("Winsock version 2.2 is not available\n");
   4784 #endif
   4785 #if HTTPS_SUPPORT
   4786   SSL_library_init();
   4787 #endif
   4788 }
   4789 
   4790 
   4791 void MHD_fini(void)
   4792 {
   4793 #ifdef _WIN32
   4794   if (mhd_winsock_inited_)
   4795     WSACleanup();
   4796 #endif
   4797 }
   4798 
   4799 _SET_INIT_AND_DEINIT_FUNCS(MHD_init, MHD_fini);
   4800 
   4801 /* end of daemon.c */
   4802