diff options
author | Evgeny Grin (Karlson2k) <k2k@narod.ru> | 2023-11-10 08:57:15 +0300 |
---|---|---|
committer | Evgeny Grin (Karlson2k) <k2k@narod.ru> | 2023-11-10 17:38:24 +0300 |
commit | aec9938235368161152814e0cfcfda24a055eb93 (patch) | |
tree | 4ef82e51232ffb125adb5ff1a09b0e77890e4972 | |
parent | cfc790488d356a47e2424121cafd64b1fc40bfe4 (diff) | |
download | libmicrohttpd-aec9938235368161152814e0cfcfda24a055eb93.tar.gz libmicrohttpd-aec9938235368161152814e0cfcfda24a055eb93.zip |
daemon.c: moved processing and checking of app-provided listen socket
-rw-r--r-- | src/microhttpd/daemon.c | 97 |
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, |