From bce295ef005968b194891dd301098a06e33ebb26 Mon Sep 17 00:00:00 2001 From: Mike Yuan Date: Sun, 27 Apr 2025 20:17:08 +0200 Subject: [PATCH 1/6] journald-server: use generic NOTIFY_READY message --- src/journal/journald-server.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/journal/journald-server.c b/src/journal/journald-server.c index 6a8c850540..a267136eb3 100644 --- a/src/journal/journald-server.c +++ b/src/journal/journald-server.c @@ -19,6 +19,7 @@ #include "cgroup-util.h" #include "conf-parser.h" #include "creds-util.h" +#include "daemon-util.h" #include "dirent-util.h" #include "event-util.h" #include "extract-word.h" @@ -2056,10 +2057,7 @@ static int dispatch_notify_event(sd_event_source *es, int fd, uint32_t revents, * there's something to send it will be turned on again. */ if (!s->sent_notify_ready) { - static const char p[] = "READY=1\n" - "STATUS=Processing requests..."; - - if (send(s->notify_fd, p, strlen(p), MSG_DONTWAIT) < 0) { + if (send(s->notify_fd, NOTIFY_READY, strlen(NOTIFY_READY), MSG_DONTWAIT) < 0) { if (errno == EAGAIN) return 0; From 7e672795bec23466839e807f01cde1420aaa4ee6 Mon Sep 17 00:00:00 2001 From: Mike Yuan Date: Sun, 27 Apr 2025 19:52:19 +0200 Subject: [PATCH 2/6] socket-activate: drop arg_args To follow our usual coding style. --- src/socket-activate/socket-activate.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/socket-activate/socket-activate.c b/src/socket-activate/socket-activate.c index ac663d0323..477f9d6656 100644 --- a/src/socket-activate/socket-activate.c +++ b/src/socket-activate/socket-activate.c @@ -29,7 +29,6 @@ static char **arg_listen = NULL; static bool arg_accept = false; static int arg_socket_type = SOCK_STREAM; -static char **arg_args = NULL; static char **arg_setenv = NULL; static char **arg_fdnames = NULL; static bool arg_inetd = false; @@ -436,8 +435,6 @@ static int parse_argv(int argc, char *argv[]) { "Datagram sockets do not accept connections. " "The --datagram and --accept options may not be combined."); - arg_args = argv + optind; - return 1 /* work to do */; } @@ -452,7 +449,7 @@ static int run(int argc, char **argv) { if (r <= 0) return r; - exec_argv = strv_copy(arg_args); + exec_argv = strv_copy(argv + optind); if (!exec_argv) return log_oom(); From 0964b022fa3aea49ea17606fcf7afb4e2b3b46bc Mon Sep 17 00:00:00 2001 From: Mike Yuan Date: Sun, 27 Apr 2025 20:05:40 +0200 Subject: [PATCH 3/6] socket-activate: remove effectively unused 'name' param for exec_process() --- src/socket-activate/socket-activate.c | 29 +++++++++++++++++---------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/src/socket-activate/socket-activate.c b/src/socket-activate/socket-activate.c index 477f9d6656..0a367799f8 100644 --- a/src/socket-activate/socket-activate.c +++ b/src/socket-activate/socket-activate.c @@ -123,10 +123,14 @@ static int open_sockets(int *ret_epoll_fd, bool accept) { return count; } -static int exec_process(const char *name, char **argv, int start_fd, size_t n_fds) { +static int exec_process(char * const *argv, int start_fd, size_t n_fds) { _cleanup_strv_free_ char **envp = NULL; int r; + assert(!strv_isempty(argv)); + assert(start_fd >= 0); + assert(n_fds > 0); + if (arg_inetd && n_fds != 1) return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "--inetd only supported for single file descriptors."); @@ -206,17 +210,20 @@ static int exec_process(const char *name, char **argv, int start_fd, size_t n_fd if (!joined) return log_oom(); - log_info("Execing %s (%s)", name, joined); - execvpe(name, argv, envp); + log_info("Executing: %s", joined); + execvpe(argv[0], argv, envp); - return log_error_errno(errno, "Failed to execp %s (%s): %m", name, joined); + return log_error_errno(errno, "Failed to execute '%s': %m", joined); } -static int fork_and_exec_process(const char *child, char **argv, int fd) { +static int fork_and_exec_process(char * const *argv, int fd) { _cleanup_free_ char *joined = NULL; pid_t child_pid; int r; + assert(!strv_isempty(argv)); + assert(fd >= 0); + joined = strv_join(argv, " "); if (!joined) return log_oom(); @@ -228,15 +235,15 @@ static int fork_and_exec_process(const char *child, char **argv, int fd) { return r; if (r == 0) { /* In the child */ - exec_process(child, argv, fd, 1); + (void) exec_process(argv, fd, 1); _exit(EXIT_FAILURE); } - log_info("Spawned %s (%s) as PID " PID_FMT ".", child, joined, child_pid); + log_info("Spawned '%s' as PID " PID_FMT ".", joined, child_pid); return 0; } -static int do_accept(const char *name, char **argv, int fd) { +static int do_accept(char * const *argv, int fd) { _cleanup_free_ char *local = NULL, *peer = NULL; _cleanup_close_ int fd_accepted = -EBADF; @@ -252,7 +259,7 @@ static int do_accept(const char *name, char **argv, int fd) { (void) getpeername_pretty(fd_accepted, true, &peer); log_info("Connection from %s to %s", strna(peer), strna(local)); - return fork_and_exec_process(name, argv, fd_accepted); + return fork_and_exec_process(argv, fd_accepted); } /* SIGCHLD handler. */ @@ -477,14 +484,14 @@ static int run(int argc, char **argv) { log_info("Communication attempt on fd %i.", event.data.fd); if (arg_accept) { - r = do_accept(exec_argv[0], exec_argv, event.data.fd); + r = do_accept(exec_argv, event.data.fd); if (r < 0) return r; } else break; } - return exec_process(exec_argv[0], exec_argv, SD_LISTEN_FDS_START, (size_t) n); + return exec_process(exec_argv, SD_LISTEN_FDS_START, (size_t) n); } DEFINE_MAIN_FUNCTION(run); From 8a157f78f29d0da7cb39994fa7172b93c392969d Mon Sep 17 00:00:00 2001 From: Mike Yuan Date: Sun, 27 Apr 2025 20:08:31 +0200 Subject: [PATCH 4/6] socket-activate: clean up control flow a bit --- src/socket-activate/socket-activate.c | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/src/socket-activate/socket-activate.c b/src/socket-activate/socket-activate.c index 0a367799f8..2f81316dfc 100644 --- a/src/socket-activate/socket-activate.c +++ b/src/socket-activate/socket-activate.c @@ -483,15 +483,14 @@ static int run(int argc, char **argv) { } log_info("Communication attempt on fd %i.", event.data.fd); - if (arg_accept) { - r = do_accept(exec_argv, event.data.fd); - if (r < 0) - return r; - } else - break; - } - return exec_process(exec_argv, SD_LISTEN_FDS_START, (size_t) n); + if (!arg_accept) + return exec_process(exec_argv, SD_LISTEN_FDS_START, (size_t) n); + + r = do_accept(exec_argv, event.data.fd); + if (r < 0) + return r; + } } DEFINE_MAIN_FUNCTION(run); From 3bff4701d8b1020cde57f9baf9d4d3f8c2cfbbed Mon Sep 17 00:00:00 2001 From: Mike Yuan Date: Sun, 27 Apr 2025 20:20:14 +0200 Subject: [PATCH 5/6] socket-activate: signal READY=1 once sockets are open for --accept mode --- src/socket-activate/socket-activate.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/socket-activate/socket-activate.c b/src/socket-activate/socket-activate.c index 2f81316dfc..1fd07bfa0d 100644 --- a/src/socket-activate/socket-activate.c +++ b/src/socket-activate/socket-activate.c @@ -10,6 +10,7 @@ #include "alloc-util.h" #include "build.h" +#include "daemon-util.h" #include "env-util.h" #include "errno-util.h" #include "escape.h" @@ -472,6 +473,13 @@ static int run(int argc, char **argv) { if (n == 0) return log_error_errno(SYNTHETIC_ERRNO(ENOENT), "No sockets to listen on specified or passed in."); + /* Notify the caller that all sockets are open now. We only do this in --accept mode however, + * since otherwise our process will be replaced and it's better to leave the readiness notify + * to the actual payload. */ + _unused_ _cleanup_(notify_on_cleanup) const char *notify = NULL; + if (arg_accept) + notify = notify_start(NOTIFY_READY, NOTIFY_STOPPING); + for (;;) { struct epoll_event event; From 93fcf15ae499ddca8f8153695be6e1091a9031b9 Mon Sep 17 00:00:00 2001 From: Mike Yuan Date: Sun, 27 Apr 2025 20:28:32 +0200 Subject: [PATCH 6/6] socket-activate: set up SIGCHLD handler only in --accept mode --- src/socket-activate/socket-activate.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/socket-activate/socket-activate.c b/src/socket-activate/socket-activate.c index 1fd07bfa0d..e55f921c87 100644 --- a/src/socket-activate/socket-activate.c +++ b/src/socket-activate/socket-activate.c @@ -265,13 +265,13 @@ static int do_accept(char * const *argv, int fd) { /* SIGCHLD handler. */ static void sigchld_hdl(int sig) { + int r; + PROTECT_ERRNO; for (;;) { - siginfo_t si; - int r; + siginfo_t si = {}; - si.si_pid = 0; r = waitid(P_ALL, 0, &si, WEXITED | WNOHANG); if (r < 0) { if (errno != ECHILD) @@ -463,10 +463,6 @@ static int run(int argc, char **argv) { assert(!strv_isempty(exec_argv)); - r = install_chld_handler(); - if (r < 0) - return r; - n = open_sockets(&epoll_fd, arg_accept); if (n < 0) return n; @@ -477,8 +473,13 @@ static int run(int argc, char **argv) { * since otherwise our process will be replaced and it's better to leave the readiness notify * to the actual payload. */ _unused_ _cleanup_(notify_on_cleanup) const char *notify = NULL; - if (arg_accept) + if (arg_accept) { + r = install_chld_handler(); + if (r < 0) + return r; + notify = notify_start(NOTIFY_READY, NOTIFY_STOPPING); + } for (;;) { struct epoll_event event;