diff options
Diffstat (limited to 'src/microhttpd/daemon.c')
-rw-r--r-- | src/microhttpd/daemon.c | 101 |
1 files changed, 35 insertions, 66 deletions
diff --git a/src/microhttpd/daemon.c b/src/microhttpd/daemon.c index cf607da5..cdd6aae6 100644 --- a/src/microhttpd/daemon.c +++ b/src/microhttpd/daemon.c | |||
@@ -1753,62 +1753,6 @@ resume_suspended_connections (struct MHD_Daemon *daemon) | |||
1753 | 1753 | ||
1754 | 1754 | ||
1755 | /** | 1755 | /** |
1756 | * Change socket options to be non-inheritable. | ||
1757 | * | ||
1758 | * @param daemon daemon context | ||
1759 | * @param sock socket to manipulate | ||
1760 | * @return #MHD_YES if succeeded, #MHD_NO otherwise | ||
1761 | */ | ||
1762 | static int | ||
1763 | make_noninheritable (struct MHD_Daemon *daemon, | ||
1764 | MHD_socket sock) | ||
1765 | { | ||
1766 | #ifdef MHD_WINSOCK_SOCKETS | ||
1767 | if (!SetHandleInformation ((HANDLE)sock, HANDLE_FLAG_INHERIT, 0)) | ||
1768 | { | ||
1769 | #ifdef HAVE_MESSAGES | ||
1770 | MHD_DLOG (daemon, | ||
1771 | "Failed to make socket non-inheritable: %u\n", | ||
1772 | (unsigned int)GetLastError ()); | ||
1773 | #endif | ||
1774 | return MHD_NO; | ||
1775 | } | ||
1776 | #else /* MHD_POSIX_SOCKETS */ | ||
1777 | int flags; | ||
1778 | |||
1779 | flags = fcntl (sock, F_GETFD); | ||
1780 | if ( ( (-1 == flags) || | ||
1781 | ( (flags != (flags | FD_CLOEXEC)) && | ||
1782 | (0 != fcntl (sock, F_SETFD, flags | FD_CLOEXEC)) ) ) ) | ||
1783 | { | ||
1784 | #ifdef HAVE_MESSAGES | ||
1785 | MHD_DLOG (daemon, | ||
1786 | "Failed to make socket non-inheritable: %s\n", | ||
1787 | MHD_socket_last_strerr_ ()); | ||
1788 | #endif | ||
1789 | return MHD_NO; | ||
1790 | } | ||
1791 | #endif /* MHD_POSIX_SOCKETS */ | ||
1792 | return MHD_YES; | ||
1793 | } | ||
1794 | |||
1795 | |||
1796 | /** | ||
1797 | * Change socket options to be non-blocking, non-inheritable. | ||
1798 | * | ||
1799 | * @param daemon daemon context | ||
1800 | * @param sock socket to manipulate | ||
1801 | */ | ||
1802 | static void | ||
1803 | make_nonblocking_noninheritable (struct MHD_Daemon *daemon, | ||
1804 | MHD_socket sock) | ||
1805 | { | ||
1806 | (void)MHD_socket_nonblocking_(sock); | ||
1807 | (void)make_noninheritable (daemon, sock); | ||
1808 | } | ||
1809 | |||
1810 | |||
1811 | /** | ||
1812 | * Add another client connection to the set of connections managed by | 1756 | * Add another client connection to the set of connections managed by |
1813 | * MHD. This API is usually not needed (since MHD will accept inbound | 1757 | * MHD. This API is usually not needed (since MHD will accept inbound |
1814 | * connections on the server socket). Use this API in special cases, | 1758 | * connections on the server socket). Use this API in special cases, |
@@ -1846,8 +1790,23 @@ MHD_add_connection (struct MHD_Daemon *daemon, | |||
1846 | /* internal_add_connection() assume that non-blocking is | 1790 | /* internal_add_connection() assume that non-blocking is |
1847 | already set in MHD_USE_EPOLL_TURBO mode */ | 1791 | already set in MHD_USE_EPOLL_TURBO mode */ |
1848 | if (0 != (daemon->options & MHD_USE_EPOLL_TURBO)) | 1792 | if (0 != (daemon->options & MHD_USE_EPOLL_TURBO)) |
1849 | make_nonblocking_noninheritable (daemon, | 1793 | { |
1850 | client_socket); | 1794 | if (!MHD_socket_nonblocking_ (client_socket)) |
1795 | { | ||
1796 | #ifdef HAVE_MESSAGES | ||
1797 | MHD_DLOG (daemon, | ||
1798 | "Failed to set nonblocking mode on new client socket: %s\n", | ||
1799 | MHD_socket_last_strerr_()); | ||
1800 | #endif | ||
1801 | } | ||
1802 | if (!MHD_socket_noninheritable_ (client_socket)) | ||
1803 | { | ||
1804 | #ifdef HAVE_MESSAGES | ||
1805 | MHD_DLOG (daemon, | ||
1806 | "Failed to set noninheritable mode on new client socket.\n"); | ||
1807 | #endif | ||
1808 | } | ||
1809 | } | ||
1851 | return internal_add_connection (daemon, | 1810 | return internal_add_connection (daemon, |
1852 | client_socket, | 1811 | client_socket, |
1853 | addr, addrlen, | 1812 | addr, addrlen, |
@@ -1935,9 +1894,7 @@ MHD_accept_connection (struct MHD_Daemon *daemon) | |||
1935 | } | 1894 | } |
1936 | return MHD_NO; | 1895 | return MHD_NO; |
1937 | } | 1896 | } |
1938 | #if !defined(USE_ACCEPT4) | 1897 | #if !defined(USE_ACCEPT4) || !defined(HAVE_SOCK_NONBLOCK) |
1939 | make_nonblocking_noninheritable (daemon, s); | ||
1940 | #elif !defined(HAVE_SOCK_NONBLOCK) | ||
1941 | if (!MHD_socket_nonblocking_ (s)) | 1898 | if (!MHD_socket_nonblocking_ (s)) |
1942 | { | 1899 | { |
1943 | #ifdef HAVE_MESSAGES | 1900 | #ifdef HAVE_MESSAGES |
@@ -1946,9 +1903,16 @@ MHD_accept_connection (struct MHD_Daemon *daemon) | |||
1946 | MHD_socket_last_strerr_()); | 1903 | MHD_socket_last_strerr_()); |
1947 | #endif | 1904 | #endif |
1948 | } | 1905 | } |
1949 | #elif !defined(SOCK_CLOEXEC) | 1906 | #endif /* !USE_ACCEPT4 || !HAVE_SOCK_NONBLOCK */ |
1950 | make_noninheritable (daemon, s); | 1907 | #if !defined(USE_ACCEPT4) || !defined(SOCK_CLOEXEC) |
1908 | if (!MHD_socket_noninheritable_ (s)) | ||
1909 | { | ||
1910 | #ifdef HAVE_MESSAGES | ||
1911 | MHD_DLOG (daemon, | ||
1912 | "Failed to set noninheritable mode on incoming connection socket.\n"); | ||
1951 | #endif | 1913 | #endif |
1914 | } | ||
1915 | #endif /* !USE_ACCEPT4 || !SOCK_CLOEXEC */ | ||
1952 | #ifdef HAVE_MESSAGES | 1916 | #ifdef HAVE_MESSAGES |
1953 | #if DEBUG_CONNECT | 1917 | #if DEBUG_CONNECT |
1954 | MHD_DLOG (daemon, | 1918 | MHD_DLOG (daemon, |
@@ -3491,7 +3455,7 @@ create_listen_socket (struct MHD_Daemon *daemon, | |||
3491 | setsockopt(fd, SOL_SOCKET, SO_NOSIGPIPE, &on_val, sizeof(on_val)); | 3455 | setsockopt(fd, SOL_SOCKET, SO_NOSIGPIPE, &on_val, sizeof(on_val)); |
3492 | #endif | 3456 | #endif |
3493 | if (MHD_NO == cloexec_set) | 3457 | if (MHD_NO == cloexec_set) |
3494 | make_noninheritable (daemon, fd); | 3458 | MHD_socket_noninheritable_ (fd); |
3495 | return fd; | 3459 | return fd; |
3496 | } | 3460 | } |
3497 | 3461 | ||
@@ -3524,8 +3488,13 @@ setup_epoll_to_listen (struct MHD_Daemon *daemon) | |||
3524 | return MHD_NO; | 3488 | return MHD_NO; |
3525 | } | 3489 | } |
3526 | #if !defined(USE_EPOLL_CREATE1) | 3490 | #if !defined(USE_EPOLL_CREATE1) |
3527 | make_noninheritable (daemon, | 3491 | if (!MHD_socket_noninheritable_ (daemon->epoll_fd)) |
3528 | daemon->epoll_fd); | 3492 | { |
3493 | #ifdef HAVE_MESSAGES | ||
3494 | MHD_DLOG (daemon, | ||
3495 | "Failed to set noninheritable mode on epoll FD.\n"); | ||
3496 | #endif | ||
3497 | } | ||
3529 | #endif /* ! USE_EPOLL_CREATE1 */ | 3498 | #endif /* ! USE_EPOLL_CREATE1 */ |
3530 | if (MHD_INVALID_SOCKET == daemon->socket_fd) | 3499 | if (MHD_INVALID_SOCKET == daemon->socket_fd) |
3531 | return MHD_YES; /* non-listening daemon */ | 3500 | return MHD_YES; /* non-listening daemon */ |