aboutsummaryrefslogtreecommitdiff
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)
downloadlibmicrohttpd-1f0d846eb045a5f3c778b77c5224df2e23746e25.tar.gz
libmicrohttpd-1f0d846eb045a5f3c778b77c5224df2e23746e25.zip
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,
4031 use_pipe = 0; /* useless if we are using 'external' select */ 4031 use_pipe = 0; /* useless if we are using 'external' select */
4032 if (use_pipe) 4032 if (use_pipe)
4033 { 4033 {
4034 if (0 != MHD_pipe_ (daemon->wpipe)) 4034 if (!MHD_pipe_ (daemon->wpipe))
4035 { 4035 {
4036#ifdef HAVE_MESSAGES 4036#ifdef HAVE_MESSAGES
4037 MHD_DLOG (daemon, 4037 MHD_DLOG (daemon,
@@ -4561,7 +4561,7 @@ MHD_start_daemon_va (unsigned int flags,
4561 /* Always use individual control pipes */ 4561 /* Always use individual control pipes */
4562 if (1) 4562 if (1)
4563 { 4563 {
4564 if (0 != MHD_pipe_ (d->wpipe)) 4564 if (!MHD_pipe_ (d->wpipe))
4565 { 4565 {
4566#ifdef HAVE_MESSAGES 4566#ifdef HAVE_MESSAGES
4567 MHD_DLOG (daemon, 4567 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 @@
31#endif /* HAVE_UNISTD_H */ 31#endif /* HAVE_UNISTD_H */
32#include <fcntl.h> 32#include <fcntl.h>
33 33
34#if defined(_WIN32) && !defined(__CYGWIN__)
35/**
36 * Create pair of mutually connected TCP/IP sockets on loopback address
37 * @param sockets_pair array to receive resulted sockets
38 * @return zero on success, -1 otherwise
39 */
40int MHD_W32_pair_of_sockets_(SOCKET sockets_pair[2])
41{
42 int i;
43 if (!sockets_pair)
44 {
45 errno = EINVAL;
46 return -1;
47 }
48
49#define PAIRMAXTRYIES 800
50 for (i = 0; i < PAIRMAXTRYIES; i++)
51 {
52 struct sockaddr_in listen_addr;
53 SOCKET listen_s;
54 static const int c_addinlen = sizeof(struct sockaddr_in); /* help compiler to optimize */
55 int addr_len = c_addinlen;
56 int opt = 1;
57
58 listen_s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
59 if (INVALID_SOCKET == listen_s)
60 break; /* can't create even single socket */
61
62 listen_addr.sin_family = AF_INET;
63 listen_addr.sin_port = htons(0);
64 listen_addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
65 if (0 == bind(listen_s, (struct sockaddr*) &listen_addr, c_addinlen)
66 && 0 == listen(listen_s, 1)
67 && 0 == getsockname(listen_s, (struct sockaddr*) &listen_addr,
68 &addr_len))
69 {
70 SOCKET client_s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
71 if (INVALID_SOCKET != client_s)
72 {
73 if (0 == ioctlsocket(client_s, FIONBIO, (u_long*) &opt)
74 && (0 == connect(client_s, (struct sockaddr*) &listen_addr, c_addinlen)
75 || WSAGetLastError() == WSAEWOULDBLOCK))
76 {
77 struct sockaddr_in accepted_from_addr;
78 SOCKET server_s;
79 addr_len = c_addinlen;
80 server_s = accept(listen_s,
81 (struct sockaddr*) &accepted_from_addr, &addr_len);
82 if (INVALID_SOCKET != server_s)
83 {
84 struct sockaddr_in client_addr;
85 addr_len = c_addinlen;
86 opt = 0;
87 if (0 == getsockname(client_s, (struct sockaddr*) &client_addr, &addr_len)
88 && accepted_from_addr.sin_family == client_addr.sin_family
89 && accepted_from_addr.sin_port == client_addr.sin_port
90 && accepted_from_addr.sin_addr.s_addr == client_addr.sin_addr.s_addr
91 && 0 == ioctlsocket(client_s, FIONBIO, (u_long*) &opt)
92 && 0 == ioctlsocket(server_s, FIONBIO, (u_long*) &opt))
93 {
94 closesocket(listen_s);
95 sockets_pair[0] = client_s;
96 sockets_pair[1] = server_s;
97 return 0;
98 }
99 closesocket(server_s);
100 }
101 }
102 closesocket(client_s);
103 }
104 }
105 closesocket(listen_s);
106 }
107
108 sockets_pair[0] = INVALID_SOCKET;
109 sockets_pair[1] = INVALID_SOCKET;
110 return -1;
111}
112
113#endif /* _WIN32 && ! __CYGWIN__ */
114
115#ifndef MHD_DONT_USE_PIPES 34#ifndef MHD_DONT_USE_PIPES
116#if !defined(_WIN32) || defined(__CYGWIN__) 35#if !defined(_WIN32) || defined(__CYGWIN__)
117 36
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 @@
57/* MHD_pipe_ create pipe (!MHD_DONT_USE_PIPES) / 57/* MHD_pipe_ create pipe (!MHD_DONT_USE_PIPES) /
58 * create two connected sockets (MHD_DONT_USE_PIPES) */ 58 * create two connected sockets (MHD_DONT_USE_PIPES) */
59#ifndef MHD_DONT_USE_PIPES 59#ifndef MHD_DONT_USE_PIPES
60# define MHD_pipe_(fdarr) pipe((fdarr)) 60# define MHD_pipe_(fdarr) (!pipe((fdarr)))
61#else /* MHD_DONT_USE_PIPES */ 61#else /* MHD_DONT_USE_PIPES */
62# if !defined(_WIN32) || defined(__CYGWIN__) 62# define MHD_pipe_(fdarr) MHD_socket_pair_((fdarr))
63# define MHD_pipe_(fdarr) socketpair(AF_LOCAL, SOCK_STREAM, 0, (fdarr))
64# else /* !defined(_WIN32) || defined(__CYGWIN__) */
65# define MHD_pipe_(fdarr) MHD_W32_pair_of_sockets_((fdarr))
66# endif /* !defined(_WIN32) || defined(__CYGWIN__) */
67#endif /* MHD_DONT_USE_PIPES */ 63#endif /* MHD_DONT_USE_PIPES */
68 64
69/* MHD_pipe_last_strerror_ is description string of last errno (!MHD_DONT_USE_PIPES) / 65/* MHD_pipe_last_strerror_ is description string of last errno (!MHD_DONT_USE_PIPES) /
@@ -105,15 +101,6 @@
105# define MHD_INVALID_PIPE_ MHD_INVALID_SOCKET 101# define MHD_INVALID_PIPE_ MHD_INVALID_SOCKET
106#endif 102#endif
107 103
108#if defined(_WIN32) && !defined(__CYGWIN__)
109/**
110 * Create pair of mutually connected TCP/IP sockets on loopback address
111 * @param sockets_pair array to receive resulted sockets
112 * @return zero on success, -1 otherwise
113 */
114int MHD_W32_pair_of_sockets_(SOCKET sockets_pair[2]);
115#endif /* _WIN32 && ! __CYGWIN__ */
116
117#ifndef MHD_DONT_USE_PIPES 104#ifndef MHD_DONT_USE_PIPES
118/** 105/**
119 * Change itc FD options to be non-blocking. 106 * 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)
238} 238}
239 239
240 240
241/**
242 * Create pair of mutually connected TCP/IP sockets on loopback address
243 * @param sockets_pair array to receive resulted sockets
244 * @return non-zero if succeeded, zero otherwise
245 */
246int MHD_W32_socket_pair_(SOCKET sockets_pair[2])
247{
248 int i;
249 if (!sockets_pair)
250 {
251 WSASetLastError(WSAEFAULT);
252 return 0;
253 }
254
255#define PAIRMAXTRYIES 800
256 for (i = 0; i < PAIRMAXTRYIES; i++)
257 {
258 struct sockaddr_in listen_addr;
259 SOCKET listen_s;
260 static const int c_addinlen = sizeof(struct sockaddr_in); /* help compiler to optimize */
261 int addr_len = c_addinlen;
262 int opt = 1;
263
264 listen_s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
265 if (INVALID_SOCKET == listen_s)
266 break; /* can't create even single socket */
267
268 listen_addr.sin_family = AF_INET;
269 listen_addr.sin_port = 0; /* same as htons(0) */
270 listen_addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
271 if (0 == bind(listen_s, (struct sockaddr*) &listen_addr, c_addinlen)
272 && 0 == listen(listen_s, 1)
273 && 0 == getsockname(listen_s, (struct sockaddr*) &listen_addr,
274 &addr_len))
275 {
276 SOCKET client_s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
277 if (INVALID_SOCKET != client_s)
278 {
279 if (0 == ioctlsocket(client_s, FIONBIO, (u_long*) &opt)
280 && (0 == connect(client_s, (struct sockaddr*) &listen_addr, c_addinlen)
281 || WSAGetLastError() == WSAEWOULDBLOCK))
282 {
283 struct sockaddr_in accepted_from_addr;
284 SOCKET server_s;
285 addr_len = c_addinlen;
286 server_s = accept(listen_s,
287 (struct sockaddr*) &accepted_from_addr, &addr_len);
288 if (INVALID_SOCKET != server_s)
289 {
290 struct sockaddr_in client_addr;
291 addr_len = c_addinlen;
292 opt = 0;
293 if (0 == getsockname(client_s, (struct sockaddr*) &client_addr, &addr_len)
294 && accepted_from_addr.sin_family == client_addr.sin_family
295 && accepted_from_addr.sin_port == client_addr.sin_port
296 && accepted_from_addr.sin_addr.s_addr == client_addr.sin_addr.s_addr
297 && 0 == ioctlsocket(client_s, FIONBIO, (u_long*) &opt)
298 && 0 == ioctlsocket(server_s, FIONBIO, (u_long*) &opt))
299 {
300 closesocket(listen_s);
301 sockets_pair[0] = client_s;
302 sockets_pair[1] = server_s;
303 return !0;
304 }
305 closesocket(server_s);
306 }
307 }
308 closesocket(client_s);
309 }
310 }
311 closesocket(listen_s);
312 }
313
314 sockets_pair[0] = INVALID_SOCKET;
315 sockets_pair[1] = INVALID_SOCKET;
316 WSASetLastError(WSAECONNREFUSED);
317
318 return 0;
319}
320
241#endif /* MHD_WINSOCK_SOCKETS */ 321#endif /* MHD_WINSOCK_SOCKETS */
242 322
243 323
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 @@
571 571
572/* Socket functions */ 572/* Socket functions */
573 573
574#if defined(MHD_POSIX_SOCKETS) && defined(AF_LOCAL)
575# define MHD_socket_pair_(fdarr) (!socketpair(AF_LOCAL, SOCK_STREAM, 0, (fdarr)))
576#elif defined(MHD_POSIX_SOCKETS) && defined(AF_UNIX)
577# define MHD_socket_pair_(fdarr) (!socketpair(AF_UNIX, SOCK_STREAM, 0, (fdarr)))
578#elif defined(MHD_WINSOCK_SOCKETS)
579 /**
580 * Create pair of mutually connected TCP/IP sockets on loopback address
581 * @param sockets_pair array to receive resulted sockets
582 * @return non-zero if succeeded, zero otherwise
583 */
584 int MHD_W32_socket_pair_(SOCKET sockets_pair[2]);
585
586# define MHD_socket_pair_(fdarr) MHD_W32_pair_of_sockets_((fdarr))
587#endif
588
574/** 589/**
575 * Add @a fd to the @a set. If @a fd is 590 * Add @a fd to the @a set. If @a fd is
576 * greater than @a max_fd, set @a max_fd to @a fd. 591 * greater than @a max_fd, set @a max_fd to @a fd.