diff options
author | Evgeny Grin (Karlson2k) <k2k@narod.ru> | 2016-08-30 15:40:34 +0000 |
---|---|---|
committer | Evgeny Grin (Karlson2k) <k2k@narod.ru> | 2016-08-30 15:40:34 +0000 |
commit | 1f0d846eb045a5f3c778b77c5224df2e23746e25 (patch) | |
tree | ef9458432a8d1443b37b3853bf70ec0f94ee7f24 | |
parent | 7eb3cc5a460ae3025ca58d179ade4f6e51b54e4a (diff) |
Moved implementation of W32 socketpair to mhd_sockets.h/.c
Now MHD_socket_pair_() is abstraction of pair of sockets.
-rw-r--r-- | src/microhttpd/daemon.c | 4 | ||||
-rw-r--r-- | src/microhttpd/mhd_itc.c | 81 | ||||
-rw-r--r-- | src/microhttpd/mhd_itc.h | 17 | ||||
-rw-r--r-- | src/microhttpd/mhd_sockets.c | 80 | ||||
-rw-r--r-- | src/microhttpd/mhd_sockets.h | 15 |
5 files changed, 99 insertions, 98 deletions
diff --git a/src/microhttpd/daemon.c b/src/microhttpd/daemon.c index 2fb87ed4..256fc839 100644 --- a/src/microhttpd/daemon.c +++ b/src/microhttpd/daemon.c @@ -4031,7 +4031,7 @@ MHD_start_daemon_va (unsigned int flags, use_pipe = 0; /* useless if we are using 'external' select */ if (use_pipe) { - if (0 != MHD_pipe_ (daemon->wpipe)) + if (!MHD_pipe_ (daemon->wpipe)) { #ifdef HAVE_MESSAGES MHD_DLOG (daemon, @@ -4561,7 +4561,7 @@ MHD_start_daemon_va (unsigned int flags, /* Always use individual control pipes */ if (1) { - if (0 != MHD_pipe_ (d->wpipe)) + if (!MHD_pipe_ (d->wpipe)) { #ifdef HAVE_MESSAGES MHD_DLOG (daemon, diff --git a/src/microhttpd/mhd_itc.c b/src/microhttpd/mhd_itc.c index 71e54a0d..553bfcf5 100644 --- a/src/microhttpd/mhd_itc.c +++ b/src/microhttpd/mhd_itc.c @@ -31,87 +31,6 @@ #endif /* HAVE_UNISTD_H */ #include <fcntl.h> -#if defined(_WIN32) && !defined(__CYGWIN__) -/** - * Create pair of mutually connected TCP/IP sockets on loopback address - * @param sockets_pair array to receive resulted sockets - * @return zero on success, -1 otherwise - */ -int MHD_W32_pair_of_sockets_(SOCKET sockets_pair[2]) -{ - int i; - if (!sockets_pair) - { - errno = EINVAL; - return -1; - } - -#define PAIRMAXTRYIES 800 - for (i = 0; i < PAIRMAXTRYIES; i++) - { - struct sockaddr_in listen_addr; - SOCKET listen_s; - static const int c_addinlen = sizeof(struct sockaddr_in); /* help compiler to optimize */ - int addr_len = c_addinlen; - int opt = 1; - - listen_s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); - if (INVALID_SOCKET == listen_s) - break; /* can't create even single socket */ - - listen_addr.sin_family = AF_INET; - listen_addr.sin_port = htons(0); - listen_addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK); - if (0 == bind(listen_s, (struct sockaddr*) &listen_addr, c_addinlen) - && 0 == listen(listen_s, 1) - && 0 == getsockname(listen_s, (struct sockaddr*) &listen_addr, - &addr_len)) - { - SOCKET client_s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); - if (INVALID_SOCKET != client_s) - { - if (0 == ioctlsocket(client_s, FIONBIO, (u_long*) &opt) - && (0 == connect(client_s, (struct sockaddr*) &listen_addr, c_addinlen) - || WSAGetLastError() == WSAEWOULDBLOCK)) - { - struct sockaddr_in accepted_from_addr; - SOCKET server_s; - addr_len = c_addinlen; - server_s = accept(listen_s, - (struct sockaddr*) &accepted_from_addr, &addr_len); - if (INVALID_SOCKET != server_s) - { - struct sockaddr_in client_addr; - addr_len = c_addinlen; - opt = 0; - if (0 == getsockname(client_s, (struct sockaddr*) &client_addr, &addr_len) - && accepted_from_addr.sin_family == client_addr.sin_family - && accepted_from_addr.sin_port == client_addr.sin_port - && accepted_from_addr.sin_addr.s_addr == client_addr.sin_addr.s_addr - && 0 == ioctlsocket(client_s, FIONBIO, (u_long*) &opt) - && 0 == ioctlsocket(server_s, FIONBIO, (u_long*) &opt)) - { - closesocket(listen_s); - sockets_pair[0] = client_s; - sockets_pair[1] = server_s; - return 0; - } - closesocket(server_s); - } - } - closesocket(client_s); - } - } - closesocket(listen_s); - } - - sockets_pair[0] = INVALID_SOCKET; - sockets_pair[1] = INVALID_SOCKET; - return -1; -} - -#endif /* _WIN32 && ! __CYGWIN__ */ - #ifndef MHD_DONT_USE_PIPES #if !defined(_WIN32) || defined(__CYGWIN__) diff --git a/src/microhttpd/mhd_itc.h b/src/microhttpd/mhd_itc.h index c7fd3f0d..f42634f6 100644 --- a/src/microhttpd/mhd_itc.h +++ b/src/microhttpd/mhd_itc.h @@ -57,13 +57,9 @@ /* MHD_pipe_ create pipe (!MHD_DONT_USE_PIPES) / * create two connected sockets (MHD_DONT_USE_PIPES) */ #ifndef MHD_DONT_USE_PIPES -# define MHD_pipe_(fdarr) pipe((fdarr)) +# define MHD_pipe_(fdarr) (!pipe((fdarr))) #else /* MHD_DONT_USE_PIPES */ -# if !defined(_WIN32) || defined(__CYGWIN__) -# define MHD_pipe_(fdarr) socketpair(AF_LOCAL, SOCK_STREAM, 0, (fdarr)) -# else /* !defined(_WIN32) || defined(__CYGWIN__) */ -# define MHD_pipe_(fdarr) MHD_W32_pair_of_sockets_((fdarr)) -# endif /* !defined(_WIN32) || defined(__CYGWIN__) */ +# define MHD_pipe_(fdarr) MHD_socket_pair_((fdarr)) #endif /* MHD_DONT_USE_PIPES */ /* MHD_pipe_last_strerror_ is description string of last errno (!MHD_DONT_USE_PIPES) / @@ -105,15 +101,6 @@ # define MHD_INVALID_PIPE_ MHD_INVALID_SOCKET #endif -#if defined(_WIN32) && !defined(__CYGWIN__) -/** - * Create pair of mutually connected TCP/IP sockets on loopback address - * @param sockets_pair array to receive resulted sockets - * @return zero on success, -1 otherwise - */ -int MHD_W32_pair_of_sockets_(SOCKET sockets_pair[2]); -#endif /* _WIN32 && ! __CYGWIN__ */ - #ifndef MHD_DONT_USE_PIPES /** * Change itc FD options to be non-blocking. diff --git a/src/microhttpd/mhd_sockets.c b/src/microhttpd/mhd_sockets.c index 64b45f9c..1023017f 100644 --- a/src/microhttpd/mhd_sockets.c +++ b/src/microhttpd/mhd_sockets.c @@ -238,6 +238,86 @@ const char* MHD_W32_strerror_winsock_(int err) } +/** + * Create pair of mutually connected TCP/IP sockets on loopback address + * @param sockets_pair array to receive resulted sockets + * @return non-zero if succeeded, zero otherwise + */ +int MHD_W32_socket_pair_(SOCKET sockets_pair[2]) +{ + int i; + if (!sockets_pair) + { + WSASetLastError(WSAEFAULT); + return 0; + } + +#define PAIRMAXTRYIES 800 + for (i = 0; i < PAIRMAXTRYIES; i++) + { + struct sockaddr_in listen_addr; + SOCKET listen_s; + static const int c_addinlen = sizeof(struct sockaddr_in); /* help compiler to optimize */ + int addr_len = c_addinlen; + int opt = 1; + + listen_s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); + if (INVALID_SOCKET == listen_s) + break; /* can't create even single socket */ + + listen_addr.sin_family = AF_INET; + listen_addr.sin_port = 0; /* same as htons(0) */ + listen_addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK); + if (0 == bind(listen_s, (struct sockaddr*) &listen_addr, c_addinlen) + && 0 == listen(listen_s, 1) + && 0 == getsockname(listen_s, (struct sockaddr*) &listen_addr, + &addr_len)) + { + SOCKET client_s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); + if (INVALID_SOCKET != client_s) + { + if (0 == ioctlsocket(client_s, FIONBIO, (u_long*) &opt) + && (0 == connect(client_s, (struct sockaddr*) &listen_addr, c_addinlen) + || WSAGetLastError() == WSAEWOULDBLOCK)) + { + struct sockaddr_in accepted_from_addr; + SOCKET server_s; + addr_len = c_addinlen; + server_s = accept(listen_s, + (struct sockaddr*) &accepted_from_addr, &addr_len); + if (INVALID_SOCKET != server_s) + { + struct sockaddr_in client_addr; + addr_len = c_addinlen; + opt = 0; + if (0 == getsockname(client_s, (struct sockaddr*) &client_addr, &addr_len) + && accepted_from_addr.sin_family == client_addr.sin_family + && accepted_from_addr.sin_port == client_addr.sin_port + && accepted_from_addr.sin_addr.s_addr == client_addr.sin_addr.s_addr + && 0 == ioctlsocket(client_s, FIONBIO, (u_long*) &opt) + && 0 == ioctlsocket(server_s, FIONBIO, (u_long*) &opt)) + { + closesocket(listen_s); + sockets_pair[0] = client_s; + sockets_pair[1] = server_s; + return !0; + } + closesocket(server_s); + } + } + closesocket(client_s); + } + } + closesocket(listen_s); + } + + sockets_pair[0] = INVALID_SOCKET; + sockets_pair[1] = INVALID_SOCKET; + WSASetLastError(WSAECONNREFUSED); + + return 0; +} + #endif /* MHD_WINSOCK_SOCKETS */ diff --git a/src/microhttpd/mhd_sockets.h b/src/microhttpd/mhd_sockets.h index c3ca1626..f06da1e5 100644 --- a/src/microhttpd/mhd_sockets.h +++ b/src/microhttpd/mhd_sockets.h @@ -571,6 +571,21 @@ /* Socket functions */ +#if defined(MHD_POSIX_SOCKETS) && defined(AF_LOCAL) +# define MHD_socket_pair_(fdarr) (!socketpair(AF_LOCAL, SOCK_STREAM, 0, (fdarr))) +#elif defined(MHD_POSIX_SOCKETS) && defined(AF_UNIX) +# define MHD_socket_pair_(fdarr) (!socketpair(AF_UNIX, SOCK_STREAM, 0, (fdarr))) +#elif defined(MHD_WINSOCK_SOCKETS) + /** + * Create pair of mutually connected TCP/IP sockets on loopback address + * @param sockets_pair array to receive resulted sockets + * @return non-zero if succeeded, zero otherwise + */ + int MHD_W32_socket_pair_(SOCKET sockets_pair[2]); + +# define MHD_socket_pair_(fdarr) MHD_W32_pair_of_sockets_((fdarr)) +#endif + /** * Add @a fd to the @a set. If @a fd is * greater than @a max_fd, set @a max_fd to @a fd. |