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) | |
download | libmicrohttpd-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.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, | |||
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 | */ | ||
40 | int 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 | */ | ||
114 | int 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 | */ | ||
246 | int 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. |