summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEvgeny Grin (Karlson2k) <k2k@narod.ru>2016-08-30 15:40:34 +0000
committerEvgeny Grin (Karlson2k) <k2k@narod.ru>2016-08-30 15:40:34 +0000
commit1f0d846eb045a5f3c778b77c5224df2e23746e25 (patch)
treeef9458432a8d1443b37b3853bf70ec0f94ee7f24
parent7eb3cc5a460ae3025ca58d179ade4f6e51b54e4a (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.c4
-rw-r--r--src/microhttpd/mhd_itc.c81
-rw-r--r--src/microhttpd/mhd_itc.h17
-rw-r--r--src/microhttpd/mhd_sockets.c80
-rw-r--r--src/microhttpd/mhd_sockets.h15
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.