libmicrohttpd

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

commit c7998d3af303dab6cca664c361ea5706ee38bed9
parent 75dbfbc71634af3dae9b5af1bc1e82fec32062e1
Author: Evgeny Grin (Karlson2k) <k2k@narod.ru>
Date:   Sun, 12 Nov 2023 11:38:57 +0300

Fixed ignored daemon port when MHD_OPTION_LISTEN_SOCKET or MHD_OPTION_SOCK_ADDR are used as documented

Diffstat:
Msrc/microhttpd/daemon.c | 40++++++++++++++++++++++++++++++++++++++++
1 file changed, 40 insertions(+), 0 deletions(-)

diff --git a/src/microhttpd/daemon.c b/src/microhttpd/daemon.c @@ -7450,6 +7450,9 @@ process_interim_params (struct MHD_Daemon *d, d->listen_is_unix = _MHD_UNKNOWN; #endif /* ! SO_DOMAIN || ! AF_UNIX */ d->listen_fd = params->listen_fd; +#ifdef MHD_USE_GETSOCKNAME + d->port = 0; /* Force use of autodetection */ +#endif /* MHD_USE_GETSOCKNAME */ } } return true; @@ -8032,6 +8035,43 @@ MHD_start_daemon_va (unsigned int flags, servaddr = (struct sockaddr *) &servaddr4; } } + else + { +#ifdef MHD_USE_GETSOCKNAME + daemon->port = 0; /* Force use of autodetection */ +#else /* ! MHD_USE_GETSOCKNAME */ + switch (servaddr->sa_family) + { + case AF_INET: + { + struct sockaddr_in sa4; + memcpy (&sa4, servaddr, sizeof(sa4)); /* Required due to stronger alignment */ + daemon->port = ntohs (sa4.sin_port); + break; + } +#ifdef HAVE_INET6 + case AF_INET6: + { + struct sockaddr_in6 sa6; + memcpy (&sa6, servaddr, sizeof(sa6)); /* Required due to stronger alignment */ + daemon->port = ntohs (sa6.sin6_port); + mhd_assert (0 != (*pflags & MHD_USE_IPv6)); + 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 + default: + daemon->port = 0; /* ugh */ + daemon->listen_is_unix = _MHD_UNKNOWN; + break; + } +#endif /* ! MHD_USE_GETSOCKNAME */ + } daemon->listen_fd = listen_fd; if (0 != (*pflags & MHD_USE_IPv6)) {