aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEvgeny Grin (Karlson2k) <k2k@narod.ru>2023-11-10 08:57:15 +0300
committerEvgeny Grin (Karlson2k) <k2k@narod.ru>2023-11-10 17:38:24 +0300
commitaec9938235368161152814e0cfcfda24a055eb93 (patch)
tree4ef82e51232ffb125adb5ff1a09b0e77890e4972
parentcfc790488d356a47e2424121cafd64b1fc40bfe4 (diff)
downloadlibmicrohttpd-aec9938235368161152814e0cfcfda24a055eb93.tar.gz
libmicrohttpd-aec9938235368161152814e0cfcfda24a055eb93.zip
daemon.c: moved processing and checking of app-provided listen socket
-rw-r--r--src/microhttpd/daemon.c97
1 files changed, 63 insertions, 34 deletions
diff --git a/src/microhttpd/daemon.c b/src/microhttpd/daemon.c
index a53ba0d5..36942d16 100644
--- a/src/microhttpd/daemon.c
+++ b/src/microhttpd/daemon.c
@@ -1,7 +1,7 @@
1/* 1/*
2 This file is part of libmicrohttpd 2 This file is part of libmicrohttpd
3 Copyright (C) 2007-2018 Daniel Pittman and Christian Grothoff 3 Copyright (C) 2007-2018 Daniel Pittman and Christian Grothoff
4 Copyright (C) 2015-2021 Evgeny Grin (Karlson2k) 4 Copyright (C) 2015-2023 Evgeny Grin (Karlson2k)
5 5
6 This library is free software; you can redistribute it and/or 6 This library is free software; you can redistribute it and/or
7 modify it under the terms of the GNU Lesser General Public 7 modify it under the terms of the GNU Lesser General Public
@@ -6173,6 +6173,15 @@ struct MHD_InterimParams_
6173 * The value for #MHD_OPTION_APP_FD_SETSIZE set by application. 6173 * The value for #MHD_OPTION_APP_FD_SETSIZE set by application.
6174 */ 6174 */
6175 int fdset_size; 6175 int fdset_size;
6176 /**
6177 * Set to 'true' if @a listen_fd is set by application.
6178 */
6179 bool listen_fd_set;
6180 /**
6181 * Application-provided listen socket.
6182 */
6183 MHD_socket listen_fd;
6184
6176}; 6185};
6177 6186
6178/** 6187/**
@@ -6904,39 +6913,9 @@ parse_options_va (struct MHD_Daemon *daemon,
6904 break; 6913 break;
6905#endif 6914#endif
6906 case MHD_OPTION_LISTEN_SOCKET: 6915 case MHD_OPTION_LISTEN_SOCKET:
6907 if (0 != (daemon->options & MHD_USE_NO_LISTEN_SOCKET)) 6916 params->listen_fd = va_arg (ap,
6908 { 6917 MHD_socket);
6909#ifdef HAVE_MESSAGES 6918 params->listen_fd_set = true;
6910 MHD_DLOG (daemon,
6911 _ ("MHD_OPTION_LISTEN_SOCKET specified for daemon "
6912 "with MHD_USE_NO_LISTEN_SOCKET flag set.\n"));
6913#endif
6914 return MHD_NO;
6915 }
6916 else
6917 {
6918 daemon->listen_fd = va_arg (ap,
6919 MHD_socket);
6920#if defined(SO_DOMAIN) && defined(AF_UNIX)
6921 {
6922 int af;
6923 socklen_t len = sizeof (af);
6924
6925 if (0 == getsockopt (daemon->listen_fd,
6926 SOL_SOCKET,
6927 SO_DOMAIN,
6928 &af,
6929 &len))
6930 {
6931 daemon->listen_is_unix = (AF_UNIX == af) ? _MHD_YES : _MHD_NO;
6932 }
6933 else
6934 daemon->listen_is_unix = _MHD_UNKNOWN;
6935 }
6936#else /* ! SO_DOMAIN || ! AF_UNIX */
6937 daemon->listen_is_unix = _MHD_UNKNOWN;
6938#endif /* ! SO_DOMAIN || ! AF_UNIX */
6939 }
6940 break; 6919 break;
6941 case MHD_OPTION_EXTERNAL_LOGGER: 6920 case MHD_OPTION_EXTERNAL_LOGGER:
6942#ifdef HAVE_MESSAGES 6921#ifdef HAVE_MESSAGES
@@ -7404,6 +7383,54 @@ process_interim_params (struct MHD_Daemon *d,
7404#endif /* MHD_POSIX_SOCKETS */ 7383#endif /* MHD_POSIX_SOCKETS */
7405 } 7384 }
7406 } 7385 }
7386
7387 if (params->listen_fd_set)
7388 {
7389 if (MHD_INVALID_SOCKET == params->listen_fd
7390#ifdef MHD_POSIX_SOCKETS
7391 || 0 > params->listen_fd
7392#endif /* MHD_POSIX_SOCKETS */
7393 )
7394 {
7395#ifdef HAVE_MESSAGES
7396 MHD_DLOG (d,
7397 _ ("The value provided for MHD_OPTION_LISTEN_SOCKET " \
7398 "is invalid.\n"));
7399#endif /* HAVE_MESSAGES */
7400 return false;
7401 }
7402 else if (0 != (d->options & MHD_USE_NO_LISTEN_SOCKET))
7403 {
7404#ifdef HAVE_MESSAGES
7405 MHD_DLOG (d,
7406 _ ("MHD_OPTION_LISTEN_SOCKET specified for daemon "
7407 "with MHD_USE_NO_LISTEN_SOCKET flag set.\n"));
7408#endif /* HAVE_MESSAGES */
7409 (void) MHD_socket_close_ (params->listen_fd);
7410 return false;
7411 }
7412 else
7413 {
7414#if defined(SO_DOMAIN) && defined(AF_UNIX)
7415 int af;
7416 socklen_t len = sizeof (af);
7417
7418 if (0 == getsockopt (d->listen_fd,
7419 SOL_SOCKET,
7420 SO_DOMAIN,
7421 &af,
7422 &len))
7423 {
7424 d->listen_is_unix = (AF_UNIX == af) ? _MHD_YES : _MHD_NO;
7425 }
7426 else
7427 d->listen_is_unix = _MHD_UNKNOWN;
7428#else /* ! SO_DOMAIN || ! AF_UNIX */
7429 d->listen_is_unix = _MHD_UNKNOWN;
7430#endif /* ! SO_DOMAIN || ! AF_UNIX */
7431 d->listen_fd = params->listen_fd;
7432 }
7433 }
7407 return true; 7434 return true;
7408} 7435}
7409 7436
@@ -7615,6 +7642,8 @@ MHD_start_daemon_va (unsigned int flags,
7615 7642
7616 interim_params->fdset_size_set = false; 7643 interim_params->fdset_size_set = false;
7617 interim_params->fdset_size = 0; 7644 interim_params->fdset_size = 0;
7645 interim_params->listen_fd_set = false;
7646 interim_params->listen_fd = MHD_INVALID_SOCKET;
7618 7647
7619 if (MHD_NO == parse_options_va (daemon, 7648 if (MHD_NO == parse_options_va (daemon,
7620 &servaddr, 7649 &servaddr,