libmicrohttpd

HTTP/1.x server C library (MHD 1.x, stable)
Log | Files | Refs | Submodules | README | LICENSE

commit 6cb3cc344ec095a2c3a765d23a283e4496f3d879
parent f5a72d27f36cdcd9958298e77aa85c2d7ee1d714
Author: Evgeny Grin (Karlson2k) <k2k@narod.ru>
Date:   Wed, 15 Nov 2023 17:51:43 +0300

Fixed (again) and improved detection of application-provided socket type

Moved detection part into socket processing from parameters processing
part.

Diffstat:
Msrc/microhttpd/daemon.c | 74++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------
1 file changed, 56 insertions(+), 18 deletions(-)

diff --git a/src/microhttpd/daemon.c b/src/microhttpd/daemon.c @@ -7458,24 +7458,8 @@ process_interim_params (struct MHD_Daemon *d, } else { -#if defined(SO_DOMAIN) && defined(AF_UNIX) - int af; - socklen_t len = sizeof (af); - - if (0 == getsockopt (d->listen_fd, - SOL_SOCKET, - SO_DOMAIN, - &af, - &len)) - { - d->listen_is_unix = (AF_UNIX == af) ? _MHD_YES : _MHD_NO; - } - else - d->listen_is_unix = _MHD_UNKNOWN; -#else /* ! SO_DOMAIN || ! AF_UNIX */ - d->listen_is_unix = _MHD_UNKNOWN; -#endif /* ! SO_DOMAIN || ! AF_UNIX */ d->listen_fd = params->listen_fd; + d->listen_is_unix = _MHD_UNKNOWN; #ifdef MHD_USE_GETSOCKNAME d->port = 0; /* Force use of autodetection */ #endif /* MHD_USE_GETSOCKNAME */ @@ -8081,7 +8065,6 @@ MHD_start_daemon_va (unsigned int flags, #else /* ! PF_UNIX */ domain = AF_UNIX; #endif /* ! PF_UNIX */ - domain = PF_UNIX; } else /* combined with the next 'if' */ #endif /* AF_UNIX */ @@ -8344,7 +8327,62 @@ MHD_start_daemon_va (unsigned int flags, } else { +#if defined(SOL_SOCKET) && (defined(SO_DOMAIN) || defined(SO_PROTOCOL_INFOW)) + int af; + int opt_name; + void *poptval; + socklen_t optval_size; +#ifdef SO_DOMAIN + opt_name = SO_DOMAIN; + poptval = &af; + optval_size = (socklen_t) sizeof (af); +#else /* SO_PROTOCOL_INFOW */ + WSAPROTOCOL_INFOW prot_info; + opt_name = SO_PROTOCOL_INFOW; + poptval = &prot_info; + optval_size = (socklen_t) sizeof (prot_info); +#endif /* SO_PROTOCOL_INFOW */ + + if (0 == getsockopt (daemon->listen_fd, + SOL_SOCKET, + opt_name, + poptval, + &optval_size)) + { +#ifndef SO_DOMAIN + af = prot_info.iAddressFamily; +#endif /* SO_DOMAIN */ + switch (af) + { + case AF_INET: + daemon->listen_is_unix = _MHD_NO; + break; +#ifdef HAVE_INET6 + case AF_INET6: + *pflags |= MHD_USE_IPv6; + daemon->listen_is_unix = _MHD_NO; + break; +#endif /* HAVE_INET6 */ +#ifdef AF_UNIX + case AF_UNIX: + daemon->port = 0; /* special value for UNIX domain sockets */ + daemon->listen_is_unix = _MHD_YES; + break; +#endif /* AF_UNIX */ + default: + daemon->port = 0; /* ugh */ + daemon->listen_is_unix = _MHD_UNKNOWN; + break; + } + } + else +#endif /* SOL_SOCKET && (SO_DOMAIN || SO_PROTOCOL_INFOW)) */ + daemon->listen_is_unix = _MHD_UNKNOWN; + listen_fd = daemon->listen_fd; +#ifdef MHD_USE_GETSOCKNAME + daemon->port = 0; /* Force use of autodetection */ +#endif /* MHD_USE_GETSOCKNAME */ } #ifdef MHD_USE_GETSOCKNAME