41 static enum MHD_StatusCode
51 #ifndef MHD_WINSOCK_SOCKETS 62 MHD_SC_LISTEN_ADDRESS_REUSE_ENABLE_FAILED,
63 _(
"setsockopt failed: %s\n"),
66 return MHD_SC_LISTEN_ADDRESS_REUSE_ENABLE_FAILED;
75 #if defined(MHD_WINSOCK_SOCKETS) || defined(SO_REUSEPORT) 78 #ifndef MHD_WINSOCK_SOCKETS
88 MHD_SC_LISTEN_ADDRESS_REUSE_ENABLE_FAILED,
89 _(
"setsockopt failed: %s\n"),
92 return MHD_SC_LISTEN_ADDRESS_REUSE_ENABLE_FAILED;
100 MHD_SC_LISTEN_ADDRESS_REUSE_ENABLE_NOT_SUPPORTED,
101 _(
"Cannot allow listening address reuse: SO_REUSEPORT not defined\n"));
103 return MHD_SC_LISTEN_ADDRESS_REUSE_ENABLE_NOT_SUPPORTED;
114 #if (defined(MHD_WINSOCK_SOCKETS) && defined(SO_EXCLUSIVEADDRUSE)) || \ 115 (defined(__sun) && defined(SO_EXCLBIND)) 118 #ifdef SO_EXCLUSIVEADDRUSE
128 MHD_SC_LISTEN_ADDRESS_REUSE_DISABLE_FAILED,
129 _(
"setsockopt failed: %s\n"),
132 return MHD_SC_LISTEN_ADDRESS_REUSE_DISABLE_FAILED;
135 #elif defined(MHD_WINSOCK_SOCKETS) 138 MHD_SC_LISTEN_ADDRESS_REUSE_DISABLE_NOT_SUPPORTED,
139 _(
"Cannot disallow listening address reuse: SO_EXCLUSIVEADDRUSE not defined\n"));
141 return MHD_SC_LISTEN_ADDRESS_REUSE_DISABLE_NOT_SUPPORTED;
154 static enum MHD_StatusCode
157 enum MHD_StatusCode sc;
159 struct sockaddr_storage ss;
160 const struct sockaddr *sa;
196 return MHD_SC_AF_NOT_SUPPORTED_BY_BUILD;
221 MHD_SC_IPV6_NOT_SUPPORTED_BY_BUILD,
222 _(
"IPv6 not supported by this build\n"));
224 return MHD_SC_IPV6_NOT_SUPPORTED_BY_BUILD;
229 try_open_listen_socket:
237 goto try_open_listen_socket;
243 MHD_SC_FAILED_TO_OPEN_LISTEN_SOCKET,
244 _(
"Failed to create socket for listening: %s\n"),
247 return MHD_SC_FAILED_TO_OPEN_LISTEN_SOCKET;
257 #if defined IPPROTO_IPV6 && defined IPV6_V6ONLY 267 (
const void *) &v6_only,
272 MHD_SC_LISTEN_DUAL_STACK_CONFIGURATION_FAILED,
273 _(
"setsockopt failed: %s\n"),
280 MHD_SC_LISTEN_DUAL_STACK_CONFIGURATION_NOT_SUPPORTED,
281 _(
"Cannot explicitly setup dual stack behavior on this platform\n"));
290 sa = (
const struct sockaddr *) &daemon->
listen_sa;
299 #ifdef IN6ADDR_ANY_INIT 300 static const struct in6_addr static_in6any = IN6ADDR_ANY_INIT;
302 struct sockaddr_in6 *sin6 = (
struct sockaddr_in6 *) &ss;
304 addrlen =
sizeof (
struct sockaddr_in6);
307 sizeof (
struct sockaddr_in6));
308 sin6->sin6_family = AF_INET6;
310 #ifdef IN6ADDR_ANY_INIT 311 sin6->sin6_addr = static_in6any;
313 #if HAVE_STRUCT_SOCKADDR_IN6_SIN6_LEN 314 sin6->sin6_len =
sizeof (
struct sockaddr_in6);
320 struct sockaddr_in *sin4 = (
struct sockaddr_in *) &ss;
322 addrlen =
sizeof (
struct sockaddr_in);
325 sizeof (
struct sockaddr_in));
326 sin4->sin_family = AF_INET;
329 sin4->sin_addr.s_addr = htonl (INADDR_ANY);
330 #if HAVE_STRUCT_SOCKADDR_IN_SIN_LEN 331 sin4->sin_len =
sizeof (
struct sockaddr_in);
334 sa = (
const struct sockaddr *) &ss;
343 unsigned int port = 0;
345 switch (sa->sa_family)
348 if (addrlen ==
sizeof (
struct sockaddr_in))
349 port = ntohs (((
const struct sockaddr_in *) sa)->sin_port);
351 port = UINT16_MAX + 1;
354 if (addrlen ==
sizeof (
struct sockaddr_in6))
355 port = ntohs (((
const struct sockaddr_in6 *) sa)->sin6_port);
357 port = UINT16_MAX + 1;
364 MHD_SC_LISTEN_SOCKET_BIND_FAILED,
365 _(
"Failed to bind to port %u: %s\n"),
369 return MHD_SC_LISTEN_SOCKET_BIND_FAILED;
384 MHD_SC_FAST_OPEN_FAILURE,
385 _(
"setsockopt failed: %s\n"),
389 return MHD_SC_FAST_OPEN_FAILURE;
400 MHD_SC_LISTEN_FAILURE,
401 _(
"Failed to listen for connections: %s\n"),
404 return MHD_SC_LISTEN_FAILURE;
421 struct sockaddr_storage servaddr;
430 sizeof (
struct sockaddr_storage));
431 addrlen =
sizeof (servaddr);
433 (
struct sockaddr *) &servaddr,
438 MHD_SC_LISTEN_PORT_INTROSPECTION_FAILURE,
439 _(
"Failed to get listen port number: %s\n"),
444 #ifdef MHD_POSIX_SOCKETS 445 if (
sizeof (servaddr) < addrlen)
450 MHD_SC_LISTEN_PORT_INTROSPECTION_FAILURE,
451 _(
"Failed to get listen port number (`struct sockaddr_storage` too small!?)\n"));
456 switch (servaddr.ss_family)
460 struct sockaddr_in *s4 = (
struct sockaddr_in *) &servaddr;
468 struct sockaddr_in6 *s6 = (
struct sockaddr_in6 *) &servaddr;
482 MHD_SC_LISTEN_PORT_INTROSPECTION_UNKNOWN_AF,
483 _(
"Unknown address family!\n"));
503 #ifndef HAVE_MESSAGES 507 #ifdef USE_EPOLL_CREATE1 508 fd = epoll_create1 (EPOLL_CLOEXEC);
510 fd = epoll_create (MAX_EVENTS);
516 MHD_SC_EPOLL_CTL_CREATE_FAILED,
517 _(
"Call to epoll_create1 failed: %s\n"),
522 #if !defined(USE_EPOLL_CREATE1) 527 MHD_SC_EPOLL_CTL_CONFIGURE_NOINHERIT_FAILED,
528 _(
"Failed to set noninheritable mode on epoll FD.\n"));
545 static enum MHD_StatusCode
546 setup_epoll_to_listen (
struct MHD_Daemon *daemon)
548 struct epoll_event event;
552 daemon->epoll_fd = setup_epoll_fd (daemon);
553 if (-1 == daemon->epoll_fd)
554 return MHD_SC_EPOLL_CTL_CREATE_FAILED;
555 #if defined(HTTPS_SUPPORT) && defined(UPGRADE_SUPPORT) 558 daemon->epoll_upgrade_fd = setup_epoll_fd (daemon);
560 return MHD_SC_EPOLL_CTL_CREATE_FAILED;
566 event.events = EPOLLIN;
567 event.data.ptr = daemon;
568 if (0 != epoll_ctl (daemon->epoll_fd,
575 MHD_SC_EPOLL_CTL_ADD_FAILED,
576 _(
"Call to epoll_ctl failed: %s\n"),
579 return MHD_SC_EPOLL_CTL_ADD_FAILED;
581 daemon->listen_socket_in_epoll =
true;
582 if (MHD_ITC_IS_VALID_(daemon->
itc))
584 event.events = EPOLLIN;
585 event.data.ptr = (
void *) daemon->epoll_itc_marker;
586 if (0 != epoll_ctl (daemon->epoll_fd,
588 MHD_itc_r_fd_ (daemon->
itc),
593 MHD_SC_EPOLL_CTL_ADD_FAILED,
594 _(
"Call to epoll_ctl failed: %s\n"),
597 return MHD_SC_EPOLL_CTL_ADD_FAILED;
612 static MHD_THRD_RTRN_TYPE_ MHD_THRD_CALL_SPEC_
617 MHD_thread_init_ (&daemon->
pid);
623 MHD_PANIC (
"MHD_ELS_AUTO should have been mapped to preferred style");
634 MHD_PANIC (
"MHD_ELS_POLL not supported, should have failed earlier");
639 MHD_daemon_epoll_ (daemon,
642 MHD_PANIC (
"MHD_ELS_EPOLL not supported, should have failed earlier");
655 return (MHD_THRD_RTRN_TYPE_)0;
665 static enum MHD_StatusCode
676 enum MHD_StatusCode sc;
682 return MHD_SC_THREAD_POOL_MALLOC_FAILURE;
703 if (((
unsigned int) i) < leftover_conns)
708 if (! MHD_itc_init_ (d->
itc))
712 MHD_SC_ITC_INITIALIZATION_FAILED,
713 _(
"Failed to create worker inter-thread communication channel: %s\n"),
714 MHD_itc_last_strerror_() );
716 sc = MHD_SC_ITC_INITIALIZATION_FAILED;
725 MHD_SC_ITC_DESCRIPTOR_TOO_LARGE,
726 _(
"File descriptor for inter-thread communication channel exceeds maximum value\n"));
729 sc = MHD_SC_ITC_DESCRIPTOR_TOO_LARGE;
735 MHD_itc_set_invalid_ (d->
itc);
740 (MHD_SC_OK != (sc = setup_epoll_to_listen (d))) )
749 MHD_SC_THREAD_POOL_CREATE_MUTEX_FAILURE,
750 _(
"MHD failed to initialize cleanup connection mutex\n"));
754 sc = MHD_SC_THREAD_POOL_CREATE_MUTEX_FAILURE;
767 MHD_SC_THREAD_POOL_LAUNCH_FAILURE,
768 _(
"Failed to create pool thread: %s\n"),
776 sc = MHD_SC_THREAD_POOL_LAUNCH_FAILURE;
794 return MHD_SC_THREAD_LAUNCH_FAILURE;
817 enum MHD_StatusCode sc;
844 MHD_SC_SYSCALL_THREAD_COMBINATION_INVALID,
845 _(
"Combining MHD_USE_THREAD_PER_CONNECTION and MHD_USE_EPOLL is not supported.\n"));
847 return MHD_SC_SYSCALL_THREAD_COMBINATION_INVALID;
855 if (! MHD_itc_init_ (daemon->
itc))
859 MHD_SC_ITC_INITIALIZATION_FAILED,
860 _(
"Failed to create inter-thread communication channel: %s\n"),
861 MHD_itc_last_strerror_ ());
863 return MHD_SC_ITC_INITIALIZATION_FAILED;
871 MHD_SC_ITC_DESCRIPTOR_TOO_LARGE,
872 _(
"File descriptor for inter-thread communication channel exceeds maximum value\n"));
874 return MHD_SC_ITC_DESCRIPTOR_TOO_LARGE;
889 MHD_SC_LISTEN_SOCKET_TOO_LARGE,
890 _(
"Socket descriptor larger than FD_SETSIZE: %d > %d\n"),
894 return MHD_SC_LISTEN_SOCKET_TOO_LARGE;
903 MHD_SC_LISTEN_SOCKET_NONBLOCKING_FAILURE,
904 _(
"Failed to set nonblocking mode on listening socket: %s\n"),
914 return MHD_SC_LISTEN_SOCKET_NONBLOCKING_FAILURE;
923 (MHD_SC_OK != (sc = setup_epoll_to_listen (daemon))) )
930 if ( ( (MHD_TM_THREAD_PER_CONNECTION == daemon->
threading_mode) ||
943 MHD_SC_THREAD_MAIN_LAUNCH_FAILURE,
944 _(
"Failed to create listen thread: %s\n"),
947 return MHD_SC_THREAD_MAIN_LAUNCH_FAILURE;
enum MHD_EventLoopSyscall event_loop_syscall
non-public functions provided by daemon_select.c
MHD_thread_handle_ID_ pid
unsigned int global_connection_limit
size_t thread_stack_limit_b
#define MHD_mutex_destroy_chk_(pmutex)
void * MHD_calloc_(size_t nelem, size_t elsize)
enum MHD_StatusCode MHD_daemon_select_(struct MHD_Daemon *daemon, int may_block)
MHD_socket MHD_socket_create_listen_(int pf)
MHD_socket MHD_daemon_quiesce(struct MHD_Daemon *daemon)
non-public functions provided by daemon_epoll.c
internal shared structures
static enum MHD_StatusCode configure_listen_reuse(struct MHD_Daemon *daemon)
#define MHD_socket_last_strerr_()
struct MHD_Daemon * worker_pool
#define MHD_INVALID_SOCKET
enum MHD_FastOpenMethod fast_open_method
unsigned int worker_pool_size
function to close all connections open at a daemon
struct MHD_Daemon * master
functions to cleanup completed connection
enum MHD_StatusCode MHD_daemon_poll_(struct MHD_Daemon *daemon, bool may_block)
#define MHD_strerror_(errnum)
void MHD_daemon_close_all_connections_(struct MHD_Daemon *daemon)
#define MHD_create_named_thread_(t, n, s, r, a)
static void get_listen_port_number(struct MHD_Daemon *daemon)
#define MHD_itc_destroy_chk_(itc)
non-public functions provided by daemon_poll.c
#define MHD_SCKT_FD_FITS_FDSET_(fd, pset)
enum MHD_AddressFamily listen_af
int MHD_socket_nonblocking_(MHD_socket sock)
void MHD_connection_cleanup_(struct MHD_Daemon *daemon)
static enum MHD_StatusCode open_listen_socket(struct MHD_Daemon *daemon)
static MHD_THRD_RTRN_TYPE_ MHD_THRD_CALL_SPEC_ MHD_polling_thread(void *cls)
bool disallow_suspend_resume
bool MHD_resume_suspended_connections_(struct MHD_Daemon *daemon)
enum MHD_StatusCode MHD_daemon_start(struct MHD_Daemon *daemon)
static enum MHD_StatusCode setup_thread_pool(struct MHD_Daemon *daemon)
enum MHD_ThreadingMode threading_mode
struct sockaddr_storage listen_sa
MHD_mutex_ cleanup_connection_mutex
int MHD_socket_noninheritable_(MHD_socket sock)
unsigned int fo_queue_length
implementation of MHD_request_resume()