diff options
author | Evgeny Grin (Karlson2k) <k2k@narod.ru> | 2016-08-23 20:13:32 +0000 |
---|---|---|
committer | Evgeny Grin (Karlson2k) <k2k@narod.ru> | 2016-08-23 20:13:32 +0000 |
commit | f143bdcad91a1141ea6f7f771021724e38691fee (patch) | |
tree | 177f880a75eec27c47f0d5937c130639eb791e84 /src/microhttpd/mhd_sockets.c | |
parent | 4cf082ba053867a7f9749f785627a1a80b2743a0 (diff) | |
download | libmicrohttpd-f143bdcad91a1141ea6f7f771021724e38691fee.tar.gz libmicrohttpd-f143bdcad91a1141ea6f7f771021724e38691fee.zip |
Moved create_listen_socket() to mhd_sockets.c, better error handling and checking on Darwin.
Diffstat (limited to 'src/microhttpd/mhd_sockets.c')
-rw-r--r-- | src/microhttpd/mhd_sockets.c | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/src/microhttpd/mhd_sockets.c b/src/microhttpd/mhd_sockets.c index 3fda6138..64b45f9c 100644 --- a/src/microhttpd/mhd_sockets.c +++ b/src/microhttpd/mhd_sockets.c | |||
@@ -325,3 +325,59 @@ MHD_socket_noninheritable_ (MHD_socket sock) | |||
325 | #endif /* MHD_WINSOCK_SOCKETS */ | 325 | #endif /* MHD_WINSOCK_SOCKETS */ |
326 | return !0; | 326 | return !0; |
327 | } | 327 | } |
328 | |||
329 | |||
330 | /** | ||
331 | * Create a listen socket, with noninheritable flag if possible. | ||
332 | * | ||
333 | * @param use_ipv6 if set to non-zero IPv6 is used | ||
334 | * @return created socket or MHD_INVALID_SOCKET in case of errors | ||
335 | */ | ||
336 | MHD_socket | ||
337 | MHD_socket_create_listen_ (int use_ipv6) | ||
338 | { | ||
339 | int domain; | ||
340 | MHD_socket fd; | ||
341 | int cloexec_set; | ||
342 | #if defined(OSX) && defined(SOL_SOCKET) && defined(SO_NOSIGPIPE) | ||
343 | static const int on_val = 1; | ||
344 | #endif | ||
345 | |||
346 | #ifdef HAVE_INET6 | ||
347 | domain = (use_ipv6) ? PF_INET6 : PF_INET; | ||
348 | #else /* ! HAVE_INET6 */ | ||
349 | if (use_ipv6) | ||
350 | return MHD_INVALID_SOCKET; | ||
351 | domain = PF_INET; | ||
352 | #endif /* ! HAVE_INET6 */ | ||
353 | |||
354 | #if defined(MHD_POSIX_SOCKETS) && defined(SOCK_CLOEXEC) | ||
355 | fd = socket (domain, SOCK_STREAM | SOCK_CLOEXEC, 0); | ||
356 | cloexec_set = !0; | ||
357 | #elif defined(MHD_WINSOCK_SOCKETS) && defined (WSA_FLAG_NO_HANDLE_INHERIT) | ||
358 | fd = WSASocketW (domain, SOCK_STREAM, 0, NULL, 0, WSA_FLAG_NO_HANDLE_INHERIT); | ||
359 | cloexec_set = !0; | ||
360 | #else /* !SOCK_CLOEXEC */ | ||
361 | fd = MHD_INVALID_SOCKET; | ||
362 | #endif /* !SOCK_CLOEXEC */ | ||
363 | if (MHD_INVALID_SOCKET == fd) | ||
364 | { | ||
365 | fd = socket (domain, SOCK_STREAM, 0); | ||
366 | cloexec_set = 0; | ||
367 | } | ||
368 | if (MHD_INVALID_SOCKET == fd) | ||
369 | return MHD_INVALID_SOCKET; | ||
370 | #if defined(OSX) && defined(SOL_SOCKET) && defined(SO_NOSIGPIPE) | ||
371 | if(0 != setsockopt(fd, SOL_SOCKET, SO_NOSIGPIPE, &on_val, sizeof(on_val))) | ||
372 | { | ||
373 | int err = MHD_socket_get_error_(); | ||
374 | MHD_socket_close_(fd); | ||
375 | MHD_socket_fset_error_(err); | ||
376 | return MHD_INVALID_SOCKET; | ||
377 | } | ||
378 | #endif | ||
379 | if (!cloexec_set) | ||
380 | (void)MHD_socket_noninheritable_(fd); | ||
381 | |||
382 | return fd; | ||
383 | } | ||