aboutsummaryrefslogtreecommitdiff
path: root/src/microhttpd/mhd_sockets.c
diff options
context:
space:
mode:
authorEvgeny Grin (Karlson2k) <k2k@narod.ru>2016-08-23 20:13:32 +0000
committerEvgeny Grin (Karlson2k) <k2k@narod.ru>2016-08-23 20:13:32 +0000
commitf143bdcad91a1141ea6f7f771021724e38691fee (patch)
tree177f880a75eec27c47f0d5937c130639eb791e84 /src/microhttpd/mhd_sockets.c
parent4cf082ba053867a7f9749f785627a1a80b2743a0 (diff)
downloadlibmicrohttpd-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.c56
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 */
336MHD_socket
337MHD_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}