diff --git a/man/systemd.exec.xml b/man/systemd.exec.xml index 203fc0355d7..5b5590a2336 100644 --- a/man/systemd.exec.xml +++ b/man/systemd.exec.xml @@ -3043,6 +3043,17 @@ StandardInputData=SWNrIHNpdHplIGRhIHVuJyBlc3NlIEtsb3BzLAp1ZmYgZWVtYWwga2xvcHAncy + + $SYSTEMD_EXEC_PID + + The PID of the unit process (e.g. process invoked by + ExecStart=). The child process can use this information to determine + whether the process is directly invoked by the service manager or indirectly as a child of + another process by comparing this value with the current PID (as similar to the scheme used in + sd_listen_fds3 + with $LISTEN_PID and $LISTEN_FDS). + + $TERM diff --git a/src/analyze/analyze.c b/src/analyze/analyze.c index 31718afebda..3b953ac4720 100644 --- a/src/analyze/analyze.c +++ b/src/analyze/analyze.c @@ -2446,7 +2446,7 @@ static int run(int argc, char *argv[]) { setlocale(LC_ALL, ""); setlocale(LC_NUMERIC, "C"); /* we want to format/parse floats in C style */ - log_setup_cli(); + log_setup(); r = parse_argv(argc, argv); if (r <= 0) diff --git a/src/backlight/backlight.c b/src/backlight/backlight.c index 717f0475cac..f3d53d64625 100644 --- a/src/backlight/backlight.c +++ b/src/backlight/backlight.c @@ -380,7 +380,7 @@ static int run(int argc, char *argv[]) { unsigned max_brightness, brightness; int r; - log_setup_service(); + log_setup(); if (strv_contains(strv_skip(argv, 1), "--help")) return help(); diff --git a/src/basic/env-util.c b/src/basic/env-util.c index 96c024afd77..a75186015e3 100644 --- a/src/basic/env-util.c +++ b/src/basic/env-util.c @@ -12,6 +12,8 @@ #include "extract-word.h" #include "macro.h" #include "parse-util.h" +#include "process-util.h" +#include "stdio-util.h" #include "string-util.h" #include "strv.h" #include "utf8.h" @@ -749,3 +751,24 @@ int set_unset_env(const char *name, const char *value, bool overwrite) { return -errno; return 0; } + +int setenv_systemd_exec_pid(bool update_only) { + char str[DECIMAL_STR_MAX(pid_t)]; + const char *e; + + /* Update $SYSTEMD_EXEC_PID=pid except when '*' is set for the variable. */ + + e = secure_getenv("SYSTEMD_EXEC_PID"); + if (!e && update_only) + return 0; + + if (streq_ptr(e, "*")) + return 0; + + xsprintf(str, PID_FMT, getpid_cached()); + + if (setenv("SYSTEMD_EXEC_PID", str, 1) < 0) + return -errno; + + return 1; +} diff --git a/src/basic/env-util.h b/src/basic/env-util.h index 6684b3350f0..5d8afec0289 100644 --- a/src/basic/env-util.h +++ b/src/basic/env-util.h @@ -55,3 +55,5 @@ int getenv_bool_secure(const char *p); /* Like setenv, but calls unsetenv if value == NULL. */ int set_unset_env(const char *name, const char *value, bool overwrite); + +int setenv_systemd_exec_pid(bool update_only); diff --git a/src/basic/log.c b/src/basic/log.c index 59181910ebc..6a86fab3986 100644 --- a/src/basic/log.c +++ b/src/basic/log.c @@ -1157,20 +1157,38 @@ static int parse_proc_cmdline_item(const char *key, const char *value, void *dat return 0; } -void log_parse_environment(void) { - if (getpid_cached() == 1 || get_ctty_devnr(0, NULL) < 0) - /* Only try to read the command line in daemons. We assume that anything that has a - * controlling tty is user stuff. For PID1 we do a special check in case it hasn't - * closed the console yet. */ - (void) proc_cmdline_parse(parse_proc_cmdline_item, NULL, PROC_CMDLINE_STRIP_RD_PREFIX); +static bool should_parse_proc_cmdline(void) { + const char *e; + pid_t p; - log_parse_environment_cli(); + /* PID1 always reads the kernel command line. */ + if (getpid_cached() == 1) + return true; + + /* If the process is directly executed by PID1 (e.g. ExecStart= or generator), systemd-importd, + * or systemd-homed, then $SYSTEMD_EXEC_PID= is set, and read the command line. */ + e = getenv("SYSTEMD_EXEC_PID"); + if (!e) + return false; + + if (streq(e, "*")) + /* For testing. */ + return true; + + if (parse_pid(e, &p) < 0) + /* We know that systemd sets the variable correctly. Something else must have set it. */ + log_debug("Failed to parse \"$SYSTEMD_EXEC_PID=%s\". Ignoring.", e); + + return getpid_cached() == p; } -void log_parse_environment_cli(void) { +void log_parse_environment(void) { + const char *e; + /* Do not call from library code. */ - const char *e; + if (should_parse_proc_cmdline()) + (void) proc_cmdline_parse(parse_proc_cmdline_item, NULL, PROC_CMDLINE_STRIP_RD_PREFIX); e = getenv("SYSTEMD_LOG_TARGET"); if (e && log_set_target_from_string(e) < 0) @@ -1460,22 +1478,10 @@ int log_dup_console(void) { return 0; } -void log_setup_service(void) { - /* Sets up logging the way it is most appropriate for running a program as a service. Note that using this - * doesn't make the binary unsuitable for invocation on the command line, as log output will still go to the - * terminal if invoked interactively. */ - +void log_setup(void) { log_set_target(LOG_TARGET_AUTO); log_parse_environment(); (void) log_open(); -} - -void log_setup_cli(void) { - /* Sets up logging the way it is most appropriate for running a program as a CLI utility. */ - - log_set_target(LOG_TARGET_AUTO); - log_parse_environment_cli(); - (void) log_open(); if (log_on_console() && show_color < 0) log_show_color(true); } diff --git a/src/basic/log.h b/src/basic/log.h index 9b106c57d8a..60e67270dbd 100644 --- a/src/basic/log.h +++ b/src/basic/log.h @@ -69,7 +69,6 @@ void log_close(void); void log_forget_fds(void); void log_parse_environment(void); -void log_parse_environment_cli(void); int log_dispatch_internal( int level, @@ -301,5 +300,4 @@ int log_syntax_invalid_utf8_internal( #define DEBUG_LOGGING _unlikely_(log_get_max_level() >= LOG_DEBUG) -void log_setup_service(void); -void log_setup_cli(void); +void log_setup(void); diff --git a/src/binfmt/binfmt.c b/src/binfmt/binfmt.c index ecb9d90a781..f6b72e0bae8 100644 --- a/src/binfmt/binfmt.c +++ b/src/binfmt/binfmt.c @@ -190,7 +190,7 @@ static int run(int argc, char *argv[]) { if (r <= 0) return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS; - log_setup_service(); + log_setup(); umask(0022); diff --git a/src/busctl/busctl.c b/src/busctl/busctl.c index 02648957db1..7774aeac7c2 100644 --- a/src/busctl/busctl.c +++ b/src/busctl/busctl.c @@ -2565,7 +2565,7 @@ static int busctl_main(int argc, char *argv[]) { static int run(int argc, char *argv[]) { int r; - log_setup_cli(); + log_setup(); r = parse_argv(argc, argv); if (r <= 0) diff --git a/src/cgls/cgls.c b/src/cgls/cgls.c index 30fd743d11c..6868049c18f 100644 --- a/src/cgls/cgls.c +++ b/src/cgls/cgls.c @@ -163,7 +163,7 @@ static void show_cg_info(const char *controller, const char *path) { static int run(int argc, char *argv[]) { int r, output_flags; - log_setup_cli(); + log_setup(); r = parse_argv(argc, argv); if (r <= 0) diff --git a/src/cgroups-agent/cgroups-agent.c b/src/cgroups-agent/cgroups-agent.c index eeb4ba80f5f..071cba30996 100644 --- a/src/cgroups-agent/cgroups-agent.c +++ b/src/cgroups-agent/cgroups-agent.c @@ -22,7 +22,7 @@ int main(int argc, char *argv[]) { return EXIT_FAILURE; } - log_setup_service(); + log_setup(); fd = socket(AF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC, 0); if (fd < 0) { diff --git a/src/cgtop/cgtop.c b/src/cgtop/cgtop.c index f63a7173e66..d0fa69ff88d 100644 --- a/src/cgtop/cgtop.c +++ b/src/cgtop/cgtop.c @@ -915,7 +915,7 @@ static int run(int argc, char *argv[]) { CGroupMask mask; int r; - log_setup_cli(); + log_setup(); r = parse_argv(argc, argv); if (r <= 0) diff --git a/src/core/execute.c b/src/core/execute.c index b7d78f2197e..29fe9f05b12 100644 --- a/src/core/execute.c +++ b/src/core/execute.c @@ -1794,7 +1794,7 @@ static int build_environment( assert(p); assert(ret); -#define N_ENV_VARS 16 +#define N_ENV_VARS 17 our_env = new0(char*, N_ENV_VARS + _EXEC_DIRECTORY_TYPE_MAX); if (!our_env) return -ENOMEM; @@ -1950,6 +1950,11 @@ static int build_environment( our_env[n_env++] = x; } + if (asprintf(&x, "SYSTEMD_EXEC_PID=" PID_FMT, getpid_cached()) < 0) + return -ENOMEM; + + our_env[n_env++] = x; + our_env[n_env++] = NULL; assert(n_env <= N_ENV_VARS + _EXEC_DIRECTORY_TYPE_MAX); #undef N_ENV_VARS diff --git a/src/core/manager.c b/src/core/manager.c index 68589501079..1881cde0366 100644 --- a/src/core/manager.c +++ b/src/core/manager.c @@ -4108,7 +4108,8 @@ static int manager_run_environment_generators(Manager *m) { RUN_WITH_UMASK(0022) r = execute_directories((const char* const*) paths, DEFAULT_TIMEOUT_USEC, gather_environment, - args, NULL, m->transient_environment, EXEC_DIR_PARALLEL | EXEC_DIR_IGNORE_ERRORS); + args, NULL, m->transient_environment, + EXEC_DIR_PARALLEL | EXEC_DIR_IGNORE_ERRORS | EXEC_DIR_SET_SYSTEMD_EXEC_PID); return r; } @@ -4143,7 +4144,8 @@ static int manager_run_generators(Manager *m) { RUN_WITH_UMASK(0022) (void) execute_directories((const char* const*) paths, DEFAULT_TIMEOUT_USEC, NULL, NULL, - (char**) argv, m->transient_environment, EXEC_DIR_PARALLEL | EXEC_DIR_IGNORE_ERRORS); + (char**) argv, m->transient_environment, + EXEC_DIR_PARALLEL | EXEC_DIR_IGNORE_ERRORS | EXEC_DIR_SET_SYSTEMD_EXEC_PID); r = 0; diff --git a/src/coredump/coredump.c b/src/coredump/coredump.c index d546e1b8f66..bc8d34952be 100644 --- a/src/coredump/coredump.c +++ b/src/coredump/coredump.c @@ -861,7 +861,7 @@ static int process_socket(int fd) { assert(fd >= 0); - log_setup_service(); + log_setup(); log_debug("Processing coredump received on stdin..."); diff --git a/src/coredump/coredumpctl.c b/src/coredump/coredumpctl.c index 20bd97c1fce..55283a93ae2 100644 --- a/src/coredump/coredumpctl.c +++ b/src/coredump/coredumpctl.c @@ -1108,7 +1108,7 @@ static int run(int argc, char *argv[]) { int r, units_active; setlocale(LC_ALL, ""); - log_setup_cli(); + log_setup(); /* The journal merging logic potentially needs a lot of fds. */ (void) rlimit_nofile_bump(HIGH_RLIMIT_NOFILE); diff --git a/src/cryptsetup/cryptsetup.c b/src/cryptsetup/cryptsetup.c index 9cef31398f1..2df7633dac7 100644 --- a/src/cryptsetup/cryptsetup.c +++ b/src/cryptsetup/cryptsetup.c @@ -1395,7 +1395,7 @@ static int run(int argc, char *argv[]) { return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "This program requires at least two arguments."); - log_setup_service(); + log_setup(); cryptsetup_enable_logging(cd); diff --git a/src/delta/delta.c b/src/delta/delta.c index a50cb36ee39..21be1b8f549 100644 --- a/src/delta/delta.c +++ b/src/delta/delta.c @@ -643,7 +643,7 @@ static int parse_argv(int argc, char *argv[]) { static int run(int argc, char *argv[]) { int r, k, n_found = 0; - log_setup_cli(); + log_setup(); r = parse_argv(argc, argv); if (r <= 0) diff --git a/src/detect-virt/detect-virt.c b/src/detect-virt/detect-virt.c index be0db85d7ce..bfdede6ce7a 100644 --- a/src/detect-virt/detect-virt.c +++ b/src/detect-virt/detect-virt.c @@ -127,7 +127,7 @@ static int run(int argc, char *argv[]) { * to detect whether we are being run in a virtualized * environment or not */ - log_setup_cli(); + log_setup(); r = parse_argv(argc, argv); if (r <= 0) diff --git a/src/escape/escape.c b/src/escape/escape.c index 24c53bf14b3..a2fdce790ee 100644 --- a/src/escape/escape.c +++ b/src/escape/escape.c @@ -158,7 +158,7 @@ static int run(int argc, char *argv[]) { char **i; int r; - log_setup_cli(); + log_setup(); r = parse_argv(argc, argv); if (r <= 0) diff --git a/src/firstboot/firstboot.c b/src/firstboot/firstboot.c index 6982cf2eed6..904612ab4a6 100644 --- a/src/firstboot/firstboot.c +++ b/src/firstboot/firstboot.c @@ -1271,7 +1271,7 @@ static int run(int argc, char *argv[]) { if (r <= 0) return r; - log_setup_service(); + log_setup(); umask(0022); diff --git a/src/fsck/fsck.c b/src/fsck/fsck.c index 04752fe9dc6..cd012f0f3ae 100644 --- a/src/fsck/fsck.c +++ b/src/fsck/fsck.c @@ -256,7 +256,7 @@ static int run(int argc, char *argv[]) { int r, exit_status; pid_t pid; - log_setup_service(); + log_setup(); if (argc > 2) return log_error_errno(SYNTHETIC_ERRNO(EINVAL), diff --git a/src/hibernate-resume/hibernate-resume.c b/src/hibernate-resume/hibernate-resume.c index d8f91f4e663..58e35e403eb 100644 --- a/src/hibernate-resume/hibernate-resume.c +++ b/src/hibernate-resume/hibernate-resume.c @@ -20,7 +20,7 @@ int main(int argc, char *argv[]) { return EXIT_FAILURE; } - log_setup_service(); + log_setup(); umask(0022); diff --git a/src/home/homectl.c b/src/home/homectl.c index 0b414898978..176f041114c 100644 --- a/src/home/homectl.c +++ b/src/home/homectl.c @@ -3346,7 +3346,7 @@ static int run(int argc, char *argv[]) { int r; - log_setup_cli(); + log_setup(); r = redirect_bus_mgr(); if (r < 0) diff --git a/src/home/homed-home.c b/src/home/homed-home.c index 38b7e20ca61..2ea0f7c81d9 100644 --- a/src/home/homed-home.c +++ b/src/home/homed-home.c @@ -1038,6 +1038,10 @@ static int home_start_work(Home *h, const char *verb, UserRecord *hr, UserRecord _exit(EXIT_FAILURE); } + r = setenv_systemd_exec_pid(true); + if (r < 0) + log_warning_errno(r, "Failed to update $SYSTEMD_EXEC_PID, ignoring: %m"); + r = rearrange_stdio(stdin_fd, stdout_fd, STDERR_FILENO); if (r < 0) { log_error_errno(r, "Failed to rearrange stdin/stdout/stderr: %m"); diff --git a/src/home/homed.c b/src/home/homed.c index e4d64bdfda1..807d25e2735 100644 --- a/src/home/homed.c +++ b/src/home/homed.c @@ -17,7 +17,7 @@ static int run(int argc, char *argv[]) { _cleanup_(notify_on_cleanup) const char *notify_stop = NULL; int r; - log_setup_service(); + log_setup(); r = service_parse_argv("systemd-homed.service", "A service to create, remove, change or inspect home areas.", diff --git a/src/home/homework.c b/src/home/homework.c index 35f3206bb0a..bb5a774f81c 100644 --- a/src/home/homework.c +++ b/src/home/homework.c @@ -1633,7 +1633,7 @@ static int run(int argc, char *argv[]) { start = now(CLOCK_MONOTONIC); - log_setup_service(); + log_setup(); umask(0022); diff --git a/src/hostname/hostnamectl.c b/src/hostname/hostnamectl.c index 4482608b285..62da90b1212 100644 --- a/src/hostname/hostnamectl.c +++ b/src/hostname/hostnamectl.c @@ -443,7 +443,7 @@ static int run(int argc, char *argv[]) { int r; setlocale(LC_ALL, ""); - log_setup_cli(); + log_setup(); r = parse_argv(argc, argv); if (r <= 0) diff --git a/src/hostname/hostnamed.c b/src/hostname/hostnamed.c index 35c2c37f924..0e4dd02b49f 100644 --- a/src/hostname/hostnamed.c +++ b/src/hostname/hostnamed.c @@ -1064,7 +1064,7 @@ static int run(int argc, char *argv[]) { _cleanup_(sd_bus_flush_close_unrefp) sd_bus *bus = NULL; int r; - log_setup_service(); + log_setup(); r = service_parse_argv("systemd-hostnamed.service", "Manage the system hostname and related metadata.", diff --git a/src/id128/id128.c b/src/id128/id128.c index 70ea4d0a690..435a56d4f34 100644 --- a/src/id128/id128.c +++ b/src/id128/id128.c @@ -249,7 +249,7 @@ static int id128_main(int argc, char *argv[]) { static int run(int argc, char *argv[]) { int r; - log_setup_cli(); + log_setup(); r = parse_argv(argc, argv); if (r <= 0) diff --git a/src/import/importd.c b/src/import/importd.c index 15914cc8853..65fe3701c62 100644 --- a/src/import/importd.c +++ b/src/import/importd.c @@ -11,6 +11,7 @@ #include "bus-log-control-api.h" #include "bus-polkit.h" #include "def.h" +#include "env-util.h" #include "fd-util.h" #include "float.h" #include "hostname-util.h" @@ -403,6 +404,10 @@ static int transfer_start(Transfer *t) { _exit(EXIT_FAILURE); } + r = setenv_systemd_exec_pid(true); + if (r < 0) + log_warning_errno(r, "Failed to update $SYSTEMD_EXEC_PID, ignoring: %m"); + switch (t->type) { case TRANSFER_IMPORT_TAR: @@ -1361,7 +1366,7 @@ static int run(int argc, char *argv[]) { _cleanup_(manager_unrefp) Manager *m = NULL; int r; - log_setup_service(); + log_setup(); r = service_parse_argv("systemd-importd.service", "VM and container image import and export service.", diff --git a/src/initctl/initctl.c b/src/initctl/initctl.c index e0b78334f5d..d818f452f7f 100644 --- a/src/initctl/initctl.c +++ b/src/initctl/initctl.c @@ -317,7 +317,7 @@ static int run(int argc, char *argv[]) { return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "This program does not take arguments."); - log_setup_service(); + log_setup(); umask(0022); diff --git a/src/journal-remote/journal-gatewayd.c b/src/journal-remote/journal-gatewayd.c index 17216c8e20c..4ece66b51bb 100644 --- a/src/journal-remote/journal-gatewayd.c +++ b/src/journal-remote/journal-gatewayd.c @@ -995,7 +995,7 @@ static int run(int argc, char *argv[]) { MHD_USE_THREAD_PER_CONNECTION; int r, n; - log_setup_service(); + log_setup(); r = parse_argv(argc, argv); if (r <= 0) diff --git a/src/journal-remote/journal-remote-main.c b/src/journal-remote/journal-remote-main.c index 685ce5a16b8..972c13566f6 100644 --- a/src/journal-remote/journal-remote-main.c +++ b/src/journal-remote/journal-remote-main.c @@ -1121,7 +1121,7 @@ static int run(int argc, char **argv) { int r; log_show_color(true); - log_parse_environment_cli(); + log_parse_environment(); /* The journal merging logic potentially needs a lot of fds. */ (void) rlimit_nofile_bump(HIGH_RLIMIT_NOFILE); diff --git a/src/journal-remote/journal-upload.c b/src/journal-remote/journal-upload.c index 2d84bdcae5e..455a6c942ef 100644 --- a/src/journal-remote/journal-upload.c +++ b/src/journal-remote/journal-upload.c @@ -820,7 +820,7 @@ static int run(int argc, char **argv) { int r; log_show_color(true); - log_parse_environment_cli(); + log_parse_environment(); /* The journal merging logic potentially needs a lot of fds. */ (void) rlimit_nofile_bump(HIGH_RLIMIT_NOFILE); diff --git a/src/journal/cat.c b/src/journal/cat.c index 223af8da1ed..6599e64296a 100644 --- a/src/journal/cat.c +++ b/src/journal/cat.c @@ -129,7 +129,7 @@ static int run(int argc, char *argv[]) { _cleanup_close_ int outfd = -1, errfd = -1, saved_stderr = -1; int r; - log_setup_cli(); + log_setup(); r = parse_argv(argc, argv); if (r <= 0) diff --git a/src/journal/journalctl.c b/src/journal/journalctl.c index dee0a0835b1..94fc3472bec 100644 --- a/src/journal/journalctl.c +++ b/src/journal/journalctl.c @@ -2145,7 +2145,7 @@ int main(int argc, char *argv[]) { int n_shown = 0, r, poll_fd = -1; setlocale(LC_ALL, ""); - log_setup_cli(); + log_setup(); /* Increase max number of open files if we can, we might needs this when browsing journal files, which might be * split up into many files. */ diff --git a/src/locale/localectl.c b/src/locale/localectl.c index 692a259275d..c267db9edd9 100644 --- a/src/locale/localectl.c +++ b/src/locale/localectl.c @@ -506,7 +506,7 @@ static int run(int argc, char *argv[]) { int r; setlocale(LC_ALL, ""); - log_setup_cli(); + log_setup(); r = parse_argv(argc, argv); if (r <= 0) diff --git a/src/locale/localed.c b/src/locale/localed.c index 12073bd6f38..97d6592cb81 100644 --- a/src/locale/localed.c +++ b/src/locale/localed.c @@ -830,7 +830,7 @@ static int run(int argc, char *argv[]) { _cleanup_(sd_bus_flush_close_unrefp) sd_bus *bus = NULL; int r; - log_setup_service(); + log_setup(); r = service_parse_argv("systemd-localed.service", "Manage system locale settings and key mappings.", diff --git a/src/login/loginctl.c b/src/login/loginctl.c index 995bcbff760..f61f9eca04e 100644 --- a/src/login/loginctl.c +++ b/src/login/loginctl.c @@ -1464,7 +1464,7 @@ static int run(int argc, char *argv[]) { int r; setlocale(LC_ALL, ""); - log_setup_cli(); + log_setup(); /* The journal merging logic potentially needs a lot of fds. */ (void) rlimit_nofile_bump(HIGH_RLIMIT_NOFILE); diff --git a/src/login/logind.c b/src/login/logind.c index 3ddc7a074af..3dae6955548 100644 --- a/src/login/logind.c +++ b/src/login/logind.c @@ -1160,7 +1160,7 @@ static int run(int argc, char *argv[]) { int r; log_set_facility(LOG_AUTH); - log_setup_service(); + log_setup(); r = service_parse_argv("systemd-logind.service", "Manager for user logins and devices and privileged operations.", diff --git a/src/machine/machinectl.c b/src/machine/machinectl.c index e254e255599..1771abc0775 100644 --- a/src/machine/machinectl.c +++ b/src/machine/machinectl.c @@ -2876,7 +2876,7 @@ static int run(int argc, char *argv[]) { int r; setlocale(LC_ALL, ""); - log_setup_cli(); + log_setup(); /* The journal merging logic potentially needs a lot of fds. */ (void) rlimit_nofile_bump(HIGH_RLIMIT_NOFILE); diff --git a/src/machine/machined.c b/src/machine/machined.c index 1d820599858..241be42c913 100644 --- a/src/machine/machined.c +++ b/src/machine/machined.c @@ -324,7 +324,7 @@ static int run(int argc, char *argv[]) { int r; log_set_facility(LOG_AUTH); - log_setup_service(); + log_setup(); r = service_parse_argv("systemd-machined.service", "Manage registrations of local VMs and containers.", diff --git a/src/modules-load/modules-load.c b/src/modules-load/modules-load.c index ba690f52cab..9cfd2920116 100644 --- a/src/modules-load/modules-load.c +++ b/src/modules-load/modules-load.c @@ -165,7 +165,7 @@ static int run(int argc, char *argv[]) { if (r <= 0) return r; - log_setup_service(); + log_setup(); umask(0022); diff --git a/src/network/networkctl.c b/src/network/networkctl.c index 3b9a7d6485e..4381f63a2d0 100644 --- a/src/network/networkctl.c +++ b/src/network/networkctl.c @@ -2822,7 +2822,7 @@ static void warn_networkd_missing(void) { static int run(int argc, char* argv[]) { int r; - log_setup_cli(); + log_setup(); r = parse_argv(argc, argv); if (r <= 0) diff --git a/src/network/networkd.c b/src/network/networkd.c index ac2bc90d974..24b3cb57af9 100644 --- a/src/network/networkd.c +++ b/src/network/networkd.c @@ -22,7 +22,7 @@ static int run(int argc, char *argv[]) { _cleanup_(notify_on_cleanup) const char *notify_message = NULL; int r; - log_setup_service(); + log_setup(); umask(0022); diff --git a/src/network/wait-online/wait-online.c b/src/network/wait-online/wait-online.c index 2de3e79c3c7..ca0116e7f30 100644 --- a/src/network/wait-online/wait-online.c +++ b/src/network/wait-online/wait-online.c @@ -184,7 +184,7 @@ static int run(int argc, char *argv[]) { _cleanup_(notify_on_cleanup) const char *notify_message = NULL; int r; - log_setup_service(); + log_setup(); umask(0022); diff --git a/src/oom/oomd.c b/src/oom/oomd.c index a5b44519136..2e331e267f7 100644 --- a/src/oom/oomd.c +++ b/src/oom/oomd.c @@ -122,7 +122,7 @@ static int run(int argc, char *argv[]) { unsigned long long s = 0; int r; - log_setup_service(); + log_setup(); r = parse_argv(argc, argv); if (r <= 0) diff --git a/src/partition/growfs.c b/src/partition/growfs.c index 367644e3c9e..15c56d05843 100644 --- a/src/partition/growfs.c +++ b/src/partition/growfs.c @@ -201,7 +201,7 @@ static int run(int argc, char *argv[]) { dev_t devno; int r; - log_setup_service(); + log_setup(); r = parse_argv(argc, argv); if (r <= 0) diff --git a/src/partition/makefs.c b/src/partition/makefs.c index fd924d2231c..7c94fbfedb1 100644 --- a/src/partition/makefs.c +++ b/src/partition/makefs.c @@ -24,7 +24,7 @@ static int run(int argc, char *argv[]) { struct stat st; int r; - log_setup_service(); + log_setup(); if (argc != 3) return log_error_errno(SYNTHETIC_ERRNO(EINVAL), diff --git a/src/portable/portablectl.c b/src/portable/portablectl.c index ee1c7b69651..edfd74d540d 100644 --- a/src/portable/portablectl.c +++ b/src/portable/portablectl.c @@ -1113,7 +1113,7 @@ static int run(int argc, char *argv[]) { int r; - log_setup_cli(); + log_setup(); r = parse_argv(argc, argv); if (r <= 0) diff --git a/src/portable/portabled.c b/src/portable/portabled.c index f008f84e53c..8a17f09365a 100644 --- a/src/portable/portabled.c +++ b/src/portable/portabled.c @@ -135,7 +135,7 @@ static int run(int argc, char *argv[]) { _cleanup_(manager_unrefp) Manager *m = NULL; int r; - log_setup_service(); + log_setup(); umask(0022); diff --git a/src/pstore/pstore.c b/src/pstore/pstore.c index db8a71fbab2..c642a3252cb 100644 --- a/src/pstore/pstore.c +++ b/src/pstore/pstore.c @@ -367,7 +367,7 @@ static int run(int argc, char *argv[]) { _cleanup_(pstore_entries_reset) PStoreList list = {}; int r; - log_setup_service(); + log_setup(); if (argc == 3) { arg_sourcedir = argv[1]; diff --git a/src/quotacheck/quotacheck.c b/src/quotacheck/quotacheck.c index d617b0bf3d6..575965c470e 100644 --- a/src/quotacheck/quotacheck.c +++ b/src/quotacheck/quotacheck.c @@ -58,7 +58,7 @@ static void test_files(void) { static int run(int argc, char *argv[]) { int r; - log_setup_service(); + log_setup(); if (argc > 1) return log_error_errno(SYNTHETIC_ERRNO(EINVAL), diff --git a/src/random-seed/random-seed.c b/src/random-seed/random-seed.c index 8f8766cdd70..4caf9678071 100644 --- a/src/random-seed/random-seed.c +++ b/src/random-seed/random-seed.c @@ -110,7 +110,7 @@ static int run(int argc, char *argv[]) { ssize_t k; int r; - log_setup_service(); + log_setup(); if (argc != 2) return log_error_errno(SYNTHETIC_ERRNO(EINVAL), diff --git a/src/remount-fs/remount-fs.c b/src/remount-fs/remount-fs.c index 9668a49dc46..d747d60d5db 100644 --- a/src/remount-fs/remount-fs.c +++ b/src/remount-fs/remount-fs.c @@ -77,7 +77,7 @@ static int run(int argc, char *argv[]) { struct mntent* me; int r; - log_setup_service(); + log_setup(); if (argc > 1) return log_error_errno(SYNTHETIC_ERRNO(EINVAL), diff --git a/src/reply-password/reply-password.c b/src/reply-password/reply-password.c index a73334e2b88..a9aa4b832a9 100644 --- a/src/reply-password/reply-password.c +++ b/src/reply-password/reply-password.c @@ -39,7 +39,7 @@ static int run(int argc, char *argv[]) { size_t length = 0; int r; - log_setup_service(); + log_setup(); if (argc != 3) return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Wrong number of arguments."); diff --git a/src/resolve/resolvectl.c b/src/resolve/resolvectl.c index b1779a6418a..318528b419c 100644 --- a/src/resolve/resolvectl.c +++ b/src/resolve/resolvectl.c @@ -3296,7 +3296,7 @@ static int run(int argc, char **argv) { int r; setlocale(LC_ALL, ""); - log_setup_cli(); + log_setup(); if (streq(program_invocation_short_name, "resolvconf")) r = resolvconf_parse_argv(argc, argv); diff --git a/src/resolve/resolved.c b/src/resolve/resolved.c index 4c42b6591d0..aabaa266e99 100644 --- a/src/resolve/resolved.c +++ b/src/resolve/resolved.c @@ -26,7 +26,7 @@ static int run(int argc, char *argv[]) { _cleanup_(notify_on_cleanup) const char *notify_stop = NULL; int r; - log_setup_service(); + log_setup(); r = service_parse_argv("systemd-resolved.service", "Provide name resolution with caching using DNS, mDNS, LLMNR.", diff --git a/src/rfkill/rfkill.c b/src/rfkill/rfkill.c index c38716842b2..91dc72f425f 100644 --- a/src/rfkill/rfkill.c +++ b/src/rfkill/rfkill.c @@ -276,7 +276,7 @@ static int run(int argc, char *argv[]) { if (argc > 1) return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "This program requires no arguments."); - log_setup_service(); + log_setup(); umask(0022); diff --git a/src/shared/exec-util.c b/src/shared/exec-util.c index bdea60ca02c..6355ce8ce42 100644 --- a/src/shared/exec-util.c +++ b/src/shared/exec-util.c @@ -34,7 +34,7 @@ /* Put this test here for a lack of better place */ assert_cc(EAGAIN == EWOULDBLOCK); -static int do_spawn(const char *path, char *argv[], int stdout_fd, pid_t *pid) { +static int do_spawn(const char *path, char *argv[], int stdout_fd, pid_t *pid, bool set_systemd_exec_pid) { pid_t _pid; int r; @@ -57,6 +57,12 @@ static int do_spawn(const char *path, char *argv[], int stdout_fd, pid_t *pid) { (void) rlimit_nofile_safe(); + if (set_systemd_exec_pid) { + r = setenv_systemd_exec_pid(false); + if (r < 0) + log_warning_errno(r, "Failed to set $SYSTEMD_EXEC_PID, ignoring: %m"); + } + if (!argv) { _argv[0] = (char*) path; _argv[1] = NULL; @@ -132,7 +138,7 @@ static int do_execute( return log_error_errno(fd, "Failed to open serialization file: %m"); } - r = do_spawn(t, argv, fd, &pid); + r = do_spawn(t, argv, fd, &pid, FLAGS_SET(flags, EXEC_DIR_SET_SYSTEMD_EXEC_PID)); if (r <= 0) continue; diff --git a/src/shared/exec-util.h b/src/shared/exec-util.h index df6214e4c3f..5bd4a3785f8 100644 --- a/src/shared/exec-util.h +++ b/src/shared/exec-util.h @@ -15,9 +15,10 @@ enum { }; typedef enum { - EXEC_DIR_NONE = 0, /* No execdir flags */ - EXEC_DIR_PARALLEL = 1 << 0, /* Execute scripts in parallel, if possible */ - EXEC_DIR_IGNORE_ERRORS = 1 << 1, /* Ignore non-zero exit status of scripts */ + EXEC_DIR_NONE = 0, /* No execdir flags */ + EXEC_DIR_PARALLEL = 1 << 0, /* Execute scripts in parallel, if possible */ + EXEC_DIR_IGNORE_ERRORS = 1 << 1, /* Ignore non-zero exit status of scripts */ + EXEC_DIR_SET_SYSTEMD_EXEC_PID = 1 << 2, /* Set $SYSTEMD_EXEC_PID environment variable */ } ExecDirFlags; typedef enum ExecCommandFlags { diff --git a/src/sleep/sleep.c b/src/sleep/sleep.c index 297cc1fec69..262d4cea66a 100644 --- a/src/sleep/sleep.c +++ b/src/sleep/sleep.c @@ -368,7 +368,7 @@ static int run(int argc, char *argv[]) { _cleanup_(free_sleep_configp) SleepConfig *sleep_config = NULL; int r; - log_setup_service(); + log_setup(); r = parse_argv(argc, argv); if (r <= 0) diff --git a/src/sulogin-shell/sulogin-shell.c b/src/sulogin-shell/sulogin-shell.c index b0d71ff580c..0207e85b7ef 100644 --- a/src/sulogin-shell/sulogin-shell.c +++ b/src/sulogin-shell/sulogin-shell.c @@ -100,7 +100,7 @@ int main(int argc, char *argv[]) { _cleanup_(sd_bus_flush_close_unrefp) sd_bus *bus = NULL; int r; - log_setup_service(); + log_setup(); print_mode(argc > 1 ? argv[1] : ""); diff --git a/src/sysctl/sysctl.c b/src/sysctl/sysctl.c index 6d20ee1a84b..1b433f70450 100644 --- a/src/sysctl/sysctl.c +++ b/src/sysctl/sysctl.c @@ -386,7 +386,7 @@ static int run(int argc, char *argv[]) { if (r <= 0) return r; - log_setup_service(); + log_setup(); umask(0022); diff --git a/src/sysext/sysext.c b/src/sysext/sysext.c index ee38e49ec92..a17f4e2c02b 100644 --- a/src/sysext/sysext.c +++ b/src/sysext/sysext.c @@ -1027,7 +1027,7 @@ static int sysext_main(int argc, char *argv[]) { static int run(int argc, char *argv[]) { int r; - log_setup_cli(); + log_setup(); r = parse_argv(argc, argv); if (r <= 0) diff --git a/src/systemctl/systemctl.c b/src/systemctl/systemctl.c index c53ed41cc32..e8e3d2438a3 100644 --- a/src/systemctl/systemctl.c +++ b/src/systemctl/systemctl.c @@ -1085,7 +1085,7 @@ static int run(int argc, char *argv[]) { int r; setlocale(LC_ALL, ""); - log_parse_environment_cli(); + log_parse_environment(); log_open(); /* The journal merging logic potentially needs a lot of fds. */ diff --git a/src/sysusers/sysusers.c b/src/sysusers/sysusers.c index 25a1871bd4c..969896c0b5d 100644 --- a/src/sysusers/sysusers.c +++ b/src/sysusers/sysusers.c @@ -1928,7 +1928,7 @@ static int run(int argc, char *argv[]) { if (r <= 0) return r; - log_setup_service(); + log_setup(); if (arg_cat_config) return cat_config(); diff --git a/src/test/test-chase-symlinks.c b/src/test/test-chase-symlinks.c index d9b9b62dc5a..892f8a073ff 100644 --- a/src/test/test-chase-symlinks.c +++ b/src/test/test-chase-symlinks.c @@ -84,7 +84,7 @@ static int parse_argv(int argc, char *argv[]) { static int run(int argc, char **argv) { int r; - log_setup_cli(); + log_setup(); r = parse_argv(argc, argv); if (r <= 0) diff --git a/src/test/test-env-util.c b/src/test/test-env-util.c index f77b1cdbcbd..ce215fdd364 100644 --- a/src/test/test-env-util.c +++ b/src/test/test-env-util.c @@ -4,9 +4,12 @@ #include "fd-util.h" #include "fileio.h" #include "fs-util.h" +#include "parse-util.h" +#include "process-util.h" #include "serialize.h" #include "string-util.h" #include "strv.h" +#include "tests.h" #include "util.h" static void test_strv_env_delete(void) { @@ -334,7 +337,44 @@ static void test_env_assignment_is_valid(void) { assert_se(!env_assignment_is_valid("głąb=printf \"\x1b]0;\x07\"")); } +static void test_setenv_systemd_exec_pid(void) { + _cleanup_free_ char *saved = NULL; + const char *e; + pid_t p; + + log_info("/* %s */", __func__); + + e = getenv("SYSTEMD_EXEC_PID"); + if (e) + assert_se(saved = strdup(e)); + + assert_se(unsetenv("SYSTEMD_EXEC_PID") >= 0); + assert_se(setenv_systemd_exec_pid(true) == 0); + assert_se(!getenv("SYSTEMD_EXEC_PID")); + + assert_se(setenv("SYSTEMD_EXEC_PID", "*", 1) >= 0); + assert_se(setenv_systemd_exec_pid(true) == 0); + assert_se(e = getenv("SYSTEMD_EXEC_PID")); + assert_se(streq(e, "*")); + + assert_se(setenv("SYSTEMD_EXEC_PID", "123abc", 1) >= 0); + assert_se(setenv_systemd_exec_pid(true) == 1); + assert_se(e = getenv("SYSTEMD_EXEC_PID")); + assert_se(parse_pid(e, &p) >= 0); + assert_se(p == getpid_cached()); + + assert_se(unsetenv("SYSTEMD_EXEC_PID") >= 0); + assert_se(setenv_systemd_exec_pid(false) == 1); + assert_se(e = getenv("SYSTEMD_EXEC_PID")); + assert_se(parse_pid(e, &p) >= 0); + assert_se(p == getpid_cached()); + + assert_se(set_unset_env("SYSTEMD_EXEC_PID", saved, 1) >= 0); +} + int main(int argc, char *argv[]) { + test_setup_logging(LOG_DEBUG); + test_strv_env_delete(); test_strv_env_get(); test_strv_env_unset(); @@ -350,6 +390,7 @@ int main(int argc, char *argv[]) { test_env_name_is_valid(); test_env_value_is_valid(); test_env_assignment_is_valid(); + test_setenv_systemd_exec_pid(); return 0; } diff --git a/src/timedate/timedatectl.c b/src/timedate/timedatectl.c index 7088a771a65..fb08f9ad260 100644 --- a/src/timedate/timedatectl.c +++ b/src/timedate/timedatectl.c @@ -1051,7 +1051,7 @@ static int run(int argc, char *argv[]) { int r; setlocale(LC_ALL, ""); - log_setup_cli(); + log_setup(); r = parse_argv(argc, argv); if (r <= 0) diff --git a/src/timedate/timedated.c b/src/timedate/timedated.c index 8149facb346..563f470f54e 100644 --- a/src/timedate/timedated.c +++ b/src/timedate/timedated.c @@ -1109,7 +1109,7 @@ static int run(int argc, char *argv[]) { _cleanup_(sd_bus_flush_close_unrefp) sd_bus *bus = NULL; int r; - log_setup_service(); + log_setup(); r = service_parse_argv("systemd-timedated.service", "Manage the system clock and timezone and NTP enablement.", diff --git a/src/timesync/timesyncd.c b/src/timesync/timesyncd.c index 1f59bf14e1a..e6a2b066873 100644 --- a/src/timesync/timesyncd.c +++ b/src/timesync/timesyncd.c @@ -97,7 +97,7 @@ static int run(int argc, char *argv[]) { int r; log_set_facility(LOG_CRON); - log_setup_service(); + log_setup(); umask(0022); diff --git a/src/tmpfiles/tmpfiles.c b/src/tmpfiles/tmpfiles.c index b033def9dff..8ad886236d2 100644 --- a/src/tmpfiles/tmpfiles.c +++ b/src/tmpfiles/tmpfiles.c @@ -3363,7 +3363,7 @@ static int run(int argc, char *argv[]) { if (r <= 0) return r; - log_setup_service(); + log_setup(); /* Descending down file system trees might take a lot of fds */ (void) rlimit_nofile_bump(HIGH_RLIMIT_NOFILE); diff --git a/src/tty-ask-password-agent/tty-ask-password-agent.c b/src/tty-ask-password-agent/tty-ask-password-agent.c index 5695327024a..ee66a3c312a 100644 --- a/src/tty-ask-password-agent/tty-ask-password-agent.c +++ b/src/tty-ask-password-agent/tty-ask-password-agent.c @@ -684,7 +684,7 @@ static int ask_on_consoles(char *argv[]) { static int run(int argc, char *argv[]) { int r; - log_setup_service(); + log_setup(); umask(0022); diff --git a/src/update-done/update-done.c b/src/update-done/update-done.c index 212892527e6..6518830717e 100644 --- a/src/update-done/update-done.c +++ b/src/update-done/update-done.c @@ -41,7 +41,7 @@ int main(int argc, char *argv[]) { struct stat st; int r, q = 0; - log_setup_service(); + log_setup(); if (stat("/usr", &st) < 0) { log_error_errno(errno, "Failed to stat /usr: %m"); diff --git a/src/update-utmp/update-utmp.c b/src/update-utmp/update-utmp.c index 59c49f2a801..1ec9066d345 100644 --- a/src/update-utmp/update-utmp.c +++ b/src/update-utmp/update-utmp.c @@ -224,7 +224,7 @@ static int run(int argc, char *argv[]) { return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "This program requires one argument."); - log_setup_service(); + log_setup(); umask(0022); diff --git a/src/user-sessions/user-sessions.c b/src/user-sessions/user-sessions.c index d1b8176714e..6b7493fd885 100644 --- a/src/user-sessions/user-sessions.c +++ b/src/user-sessions/user-sessions.c @@ -21,7 +21,7 @@ static int run(int argc, char *argv[]) { return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "This program requires one argument."); - log_setup_service(); + log_setup(); umask(0022); diff --git a/src/userdb/userdbctl.c b/src/userdb/userdbctl.c index ecaead39d76..5dc1cf8140b 100644 --- a/src/userdb/userdbctl.c +++ b/src/userdb/userdbctl.c @@ -763,7 +763,7 @@ static int run(int argc, char *argv[]) { int r; - log_setup_cli(); + log_setup(); r = parse_argv(argc, argv); if (r <= 0) diff --git a/src/userdb/userdbd.c b/src/userdb/userdbd.c index 6f2c8078432..6b28dd0a084 100644 --- a/src/userdb/userdbd.c +++ b/src/userdb/userdbd.c @@ -24,7 +24,7 @@ static int run(int argc, char *argv[]) { _cleanup_(notify_on_cleanup) const char *notify_stop = NULL; int r; - log_setup_service(); + log_setup(); umask(0022); diff --git a/src/userdb/userwork.c b/src/userdb/userwork.c index d525a6e05af..c62a21974a1 100644 --- a/src/userdb/userwork.c +++ b/src/userdb/userwork.c @@ -662,7 +662,7 @@ static int run(int argc, char *argv[]) { unsigned n_iterations = 0; int m, listen_fd, r; - log_setup_service(); + log_setup(); m = sd_listen_fds(false); if (m < 0) diff --git a/src/vconsole/vconsole-setup.c b/src/vconsole/vconsole-setup.c index b28e2853e10..45915ef853b 100644 --- a/src/vconsole/vconsole-setup.c +++ b/src/vconsole/vconsole-setup.c @@ -430,7 +430,7 @@ int main(int argc, char **argv) { unsigned idx = 0; int r; - log_setup_service(); + log_setup(); umask(0022); diff --git a/src/veritysetup/veritysetup.c b/src/veritysetup/veritysetup.c index 9ecfbc5217f..2b54065437f 100644 --- a/src/veritysetup/veritysetup.c +++ b/src/veritysetup/veritysetup.c @@ -136,7 +136,7 @@ static int run(int argc, char *argv[]) { if (argc < 3) return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "This program requires at least two arguments."); - log_setup_service(); + log_setup(); umask(0022); diff --git a/src/volatile-root/volatile-root.c b/src/volatile-root/volatile-root.c index ee3532cc02a..242ef81ecf7 100644 --- a/src/volatile-root/volatile-root.c +++ b/src/volatile-root/volatile-root.c @@ -119,7 +119,7 @@ static int run(int argc, char *argv[]) { dev_t devt; int r; - log_setup_service(); + log_setup(); if (argc > 3) return log_error_errno(SYNTHETIC_ERRNO(EINVAL),