exchange

Base system with REST service to issue digital coins, run by the payment service provider
Log | Files | Refs | Submodules | README | LICENSE

commit 47590e7159d5be7b252160ede32a9810f222e9f6
parent c85b01e2649b17d6f189271eedaebfcbb75c26d9
Author: Christian Grothoff <christian@grothoff.org>
Date:   Tue, 17 Jun 2025 14:28:05 +0200

fix systemd socket activation regression

Diffstat:
Msrc/mhd/mhd_config.c | 85++++++++++++++++++++++++++++++++++++++++++-------------------------------------
1 file changed, 45 insertions(+), 40 deletions(-)

diff --git a/src/mhd/mhd_config.c b/src/mhd/mhd_config.c @@ -218,7 +218,10 @@ TALER_MHD_listen_bind (const struct GNUNET_CONFIGURATION_Handle *cfg, (NULL != (listen_fds = getenv ("LISTEN_FDS"))) && (NULL != (listen_fdn = getenv ("LISTEN_FDNAMES"))) ) { + int off = 3; + unsigned int cnt; char *fdns; + char dummy; if (0 != strcmp (serve_type, "systemd")) @@ -230,50 +233,52 @@ TALER_MHD_listen_bind (const struct GNUNET_CONFIGURATION_Handle *cfg, { ret = GNUNET_NO; } - fdns = GNUNET_strdup (listen_fdn); - for (const char *tok = strtok (fdns, - ":"); - NULL != tok; - tok = strtok (NULL, - ":")) + if (1 != sscanf (listen_fds, + "%u%c", + &cnt, + &dummy)) { - char dummy; - int fh; - int flags; - - if ( (1 != sscanf (tok, - "%d%c", - &fh, - &dummy)) || - (fh < 0) ) - { - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - "Bad listen socket `%s' passed, ignored\n", - tok); - continue; - } - flags = fcntl (fh, - F_GETFD); - if ( (-1 == flags) && - (EBADF == errno) ) + GNUNET_log (GNUNET_ERROR_TYPE_WARNING, + "Invalid number `%s' of systemd sockets specified\n", + listen_fds); + } + else + { + fdns = GNUNET_strdup (listen_fdn); + for (const char *tok = strtok (fdns, + ":"); + cnt-- > 0; + tok = strtok (NULL, + ":")) { - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - "Bad listen socket %d passed, ignored\n", + int fh = off++; + int flags; + + flags = fcntl (fh, + F_GETFD); + if ( (-1 == flags) && + (EBADF == errno) ) + { + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, + "Bad listen socket %s (%d) passed, ignored\n", + tok, + fh); + continue; + } + flags |= FD_CLOEXEC; + if (0 != fcntl (fh, + F_SETFD, + flags)) + GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, + "fcntl"); + GNUNET_log (GNUNET_ERROR_TYPE_INFO, + "Successfully obtained listen socket %s (#%d) from hypervisor\n", + tok, fh); - continue; + cb (cb_cls, + fh); + ret = GNUNET_OK; } - flags |= FD_CLOEXEC; - if (0 != fcntl (fh, - F_SETFD, - flags)) - GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, - "fcntl"); - GNUNET_log (GNUNET_ERROR_TYPE_INFO, - "Successfully obtained listen socket %d from hypervisor\n", - fh); - cb (cb_cls, - fh); - ret = GNUNET_OK; } GNUNET_free (fdns); }