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:
| M | src/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);
}