1 /* SPDX-License-Identifier: LGPL-2.1+ */
3 This file is part of systemd.
5 Copyright 2010 Lennart Poettering
7 systemd is free software; you can redistribute it and/or modify it
8 under the terms of the GNU Lesser General Public License as published by
9 the Free Software Foundation; either version 2.1 of the License, or
10 (at your option) any later version.
12 systemd is distributed in the hope that it will be useful, but
13 WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 Lesser General Public License for more details.
17 You should have received a copy of the GNU Lesser General Public License
18 along with systemd; If not, see <http://www.gnu.org/licenses/>.
24 #include <linux/oom.h>
29 //#include <stdio_ext.h>
33 #include <sys/personality.h>
34 #include <sys/prctl.h>
35 #include <sys/types.h>
39 #if HAVE_VALGRIND_VALGRIND_H
40 #include <valgrind/valgrind.h>
43 #include "alloc-util.h"
44 //#include "architecture.h"
53 #include "process-util.h"
54 //#include "raw-clone.h"
55 #include "signal-util.h"
56 //#include "stat-util.h"
57 #include "string-table.h"
58 #include "string-util.h"
59 //#include "terminal-util.h"
60 #include "user-util.h"
63 int get_process_state(pid_t pid) {
67 _cleanup_free_ char *line = NULL;
71 p = procfs_file_alloca(pid, "stat");
73 r = read_one_line_file(p, &line);
79 p = strrchr(line, ')');
85 if (sscanf(p, " %c", &state) != 1)
88 return (unsigned char) state;
91 int get_process_comm(pid_t pid, char **name) {
98 p = procfs_file_alloca(pid, "comm");
100 r = read_one_line_file(p, name);
107 int get_process_cmdline(pid_t pid, size_t max_length, bool comm_fallback, char **line) {
108 _cleanup_fclose_ FILE *f = NULL;
110 char *k, *ans = NULL;
117 /* Retrieves a process' command line. Replaces unprintable characters while doing so by whitespace (coalescing
118 * multiple sequential ones into one). If max_length is != 0 will return a string of the specified size at most
119 * (the trailing NUL byte does count towards the length here!), abbreviated with a "..." ellipsis. If
120 * comm_fallback is true and the process has no command line set (the case for kernel threads), or has a
121 * command line that resolves to the empty string will return the "comm" name of the process instead.
123 * Returns -ESRCH if the process doesn't exist, and -ENOENT if the process has no command line (and
124 * comm_fallback is false). Returns 0 and sets *line otherwise. */
126 p = procfs_file_alloca(pid, "cmdline");
135 (void) __fsetlocking(f, FSETLOCKING_BYCALLER);
137 if (max_length == 1) {
139 /* If there's only room for one byte, return the empty string */
147 } else if (max_length == 0) {
148 size_t len = 0, allocated = 0;
150 while ((c = getc(f)) != EOF) {
152 if (!GREEDY_REALLOC(ans, allocated, len+3)) {
174 bool dotdotdot = false;
177 ans = new(char, max_length);
183 while ((c = getc(f)) != EOF) {
210 if (max_length <= 4) {
214 k = ans + max_length - 4;
217 /* Eat up final spaces */
218 while (k > ans && isspace(k[-1])) {
224 strncpy(k, "...", left-1);
230 /* Kernel threads have no argv[] */
232 _cleanup_free_ char *t = NULL;
240 h = get_process_comm(pid, &t);
245 ans = strjoin("[", t, "]");
251 if (l + 3 <= max_length)
252 ans = strjoin("[", t, "]");
253 else if (max_length <= 6) {
255 ans = new(char, max_length);
259 memcpy(ans, "[...]", max_length-1);
260 ans[max_length-1] = 0;
264 t[max_length - 6] = 0;
266 /* Chop off final spaces */
268 while (e > t && isspace(e[-1]))
272 ans = strjoin("[", t, "...]");
283 #if 0 /// UNNEEDED by elogind
284 int rename_process(const char name[]) {
285 static size_t mm_size = 0;
286 static char *mm = NULL;
287 bool truncated = false;
290 /* This is a like a poor man's setproctitle(). It changes the comm field, argv[0], and also the glibc's
291 * internally used name of the process. For the first one a limit of 16 chars applies; to the second one in
292 * many cases one of 10 (i.e. length of "/sbin/init") — however if we have CAP_SYS_RESOURCES it is unbounded;
293 * to the third one 7 (i.e. the length of "systemd". If you pass a longer string it will likely be
296 * Returns 0 if a name was set but truncated, > 0 if it was set but not truncated. */
299 return -EINVAL; /* let's not confuse users unnecessarily with an empty name */
301 if (!is_main_thread())
302 return -EPERM; /* Let's not allow setting the process name from other threads than the main one, as we
303 * cache things without locking, and we make assumptions that PR_SET_NAME sets the
304 * process name that isn't correct on any other threads */
308 /* First step, change the comm field. The main thread's comm is identical to the process comm. This means we
309 * can use PR_SET_NAME, which sets the thread name for the calling thread. */
310 if (prctl(PR_SET_NAME, name) < 0)
311 log_debug_errno(errno, "PR_SET_NAME failed: %m");
312 if (l > 15) /* Linux process names can be 15 chars at max */
315 /* Second step, change glibc's ID of the process name. */
316 if (program_invocation_name) {
319 k = strlen(program_invocation_name);
320 strncpy(program_invocation_name, name, k);
325 /* Third step, completely replace the argv[] array the kernel maintains for us. This requires privileges, but
326 * has the advantage that the argv[] array is exactly what we want it to be, and not filled up with zeros at
327 * the end. This is the best option for changing /proc/self/cmdline. */
329 /* Let's not bother with this if we don't have euid == 0. Strictly speaking we should check for the
330 * CAP_SYS_RESOURCE capability which is independent of the euid. In our own code the capability generally is
331 * present only for euid == 0, hence let's use this as quick bypass check, to avoid calling mmap() if
332 * PR_SET_MM_ARG_{START,END} fails with EPERM later on anyway. After all geteuid() is dead cheap to call, but
335 log_debug("Skipping PR_SET_MM, as we don't have privileges.");
336 else if (mm_size < l+1) {
340 nn_size = PAGE_ALIGN(l+1);
341 nn = mmap(NULL, nn_size, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
342 if (nn == MAP_FAILED) {
343 log_debug_errno(errno, "mmap() failed: %m");
347 strncpy(nn, name, nn_size);
349 /* Now, let's tell the kernel about this new memory */
350 if (prctl(PR_SET_MM, PR_SET_MM_ARG_START, (unsigned long) nn, 0, 0) < 0) {
351 log_debug_errno(errno, "PR_SET_MM_ARG_START failed, proceeding without: %m");
352 (void) munmap(nn, nn_size);
356 /* And update the end pointer to the new end, too. If this fails, we don't really know what to do, it's
357 * pretty unlikely that we can rollback, hence we'll just accept the failure, and continue. */
358 if (prctl(PR_SET_MM, PR_SET_MM_ARG_END, (unsigned long) nn + l + 1, 0, 0) < 0)
359 log_debug_errno(errno, "PR_SET_MM_ARG_END failed, proceeding without: %m");
362 (void) munmap(mm, mm_size);
367 strncpy(mm, name, mm_size);
369 /* Update the end pointer, continuing regardless of any failure. */
370 if (prctl(PR_SET_MM, PR_SET_MM_ARG_END, (unsigned long) mm + l + 1, 0, 0) < 0)
371 log_debug_errno(errno, "PR_SET_MM_ARG_END failed, proceeding without: %m");
375 /* Fourth step: in all cases we'll also update the original argv[], so that our own code gets it right too if
376 * it still looks here */
378 if (saved_argc > 0) {
384 k = strlen(saved_argv[0]);
385 strncpy(saved_argv[0], name, k);
390 for (i = 1; i < saved_argc; i++) {
394 memzero(saved_argv[i], strlen(saved_argv[i]));
402 int is_kernel_thread(pid_t pid) {
403 _cleanup_free_ char *line = NULL;
404 unsigned long long flags;
410 if (IN_SET(pid, 0, 1) || pid == getpid_cached()) /* pid 1, and we ourselves certainly aren't a kernel thread */
412 if (!pid_is_valid(pid))
415 p = procfs_file_alloca(pid, "stat");
416 r = read_one_line_file(p, &line);
422 /* Skip past the comm field */
423 q = strrchr(line, ')');
428 /* Skip 6 fields to reach the flags field */
429 for (i = 0; i < 6; i++) {
430 l = strspn(q, WHITESPACE);
435 l = strcspn(q, WHITESPACE);
441 /* Skip preceeding whitespace */
442 l = strspn(q, WHITESPACE);
447 /* Truncate the rest */
448 l = strcspn(q, WHITESPACE);
453 r = safe_atollu(q, &flags);
457 return !!(flags & PF_KTHREAD);
460 #if 0 /// UNNEEDED by elogind
461 int get_process_capeff(pid_t pid, char **capeff) {
468 p = procfs_file_alloca(pid, "status");
470 r = get_proc_field(p, "CapEff", WHITESPACE, capeff);
478 static int get_process_link_contents(const char *proc_file, char **name) {
484 r = readlink_malloc(proc_file, name);
493 int get_process_exe(pid_t pid, char **name) {
500 p = procfs_file_alloca(pid, "exe");
501 r = get_process_link_contents(p, name);
505 d = endswith(*name, " (deleted)");
512 #if 0 /// UNNEEDED by elogind
513 static int get_process_id(pid_t pid, const char *field, uid_t *uid) {
514 _cleanup_fclose_ FILE *f = NULL;
524 p = procfs_file_alloca(pid, "status");
532 (void) __fsetlocking(f, FSETLOCKING_BYCALLER);
534 FOREACH_LINE(line, f, return -errno) {
539 if (startswith(l, field)) {
541 l += strspn(l, WHITESPACE);
543 l[strcspn(l, WHITESPACE)] = 0;
545 return parse_uid(l, uid);
552 int get_process_uid(pid_t pid, uid_t *uid) {
554 if (pid == 0 || pid == getpid_cached()) {
559 return get_process_id(pid, "Uid:", uid);
562 int get_process_gid(pid_t pid, gid_t *gid) {
564 if (pid == 0 || pid == getpid_cached()) {
569 assert_cc(sizeof(uid_t) == sizeof(gid_t));
570 return get_process_id(pid, "Gid:", gid);
573 int get_process_cwd(pid_t pid, char **cwd) {
578 p = procfs_file_alloca(pid, "cwd");
580 return get_process_link_contents(p, cwd);
583 int get_process_root(pid_t pid, char **root) {
588 p = procfs_file_alloca(pid, "root");
590 return get_process_link_contents(p, root);
593 int get_process_environ(pid_t pid, char **env) {
594 _cleanup_fclose_ FILE *f = NULL;
595 _cleanup_free_ char *outcome = NULL;
598 size_t allocated = 0, sz = 0;
603 p = procfs_file_alloca(pid, "environ");
612 (void) __fsetlocking(f, FSETLOCKING_BYCALLER);
614 while ((c = fgetc(f)) != EOF) {
615 if (!GREEDY_REALLOC(outcome, allocated, sz + 5))
619 outcome[sz++] = '\n';
621 sz += cescape_char(c, outcome + sz);
625 outcome = strdup("");
637 int get_process_ppid(pid_t pid, pid_t *_ppid) {
639 _cleanup_free_ char *line = NULL;
646 if (pid == 0 || pid == getpid_cached()) {
651 p = procfs_file_alloca(pid, "stat");
652 r = read_one_line_file(p, &line);
658 /* Let's skip the pid and comm fields. The latter is enclosed
659 * in () but does not escape any () in its value, so let's
660 * skip over it manually */
662 p = strrchr(line, ')');
674 if ((long unsigned) (pid_t) ppid != ppid)
677 *_ppid = (pid_t) ppid;
683 int wait_for_terminate(pid_t pid, siginfo_t *status) {
694 if (waitid(P_PID, pid, status, WEXITED) < 0) {
699 return negative_errno();
708 * < 0 : wait_for_terminate() failed to get the state of the
709 * process, the process was terminated by a signal, or
710 * failed for an unknown reason.
711 * >=0 : The process terminated normally, and its exit code is
714 * That is, success is indicated by a return value of zero, and an
715 * error is indicated by a non-zero value.
717 * A warning is emitted if the process terminates abnormally,
718 * and also if it returns non-zero unless check_exit_code is true.
720 int wait_for_terminate_and_check(const char *name, pid_t pid, WaitFlags flags) {
721 _cleanup_free_ char *buffer = NULL;
728 r = get_process_comm(pid, &buffer);
730 log_debug_errno(r, "Failed to acquire process name of " PID_FMT ", ignoring: %m", pid);
735 prio = flags & WAIT_LOG_ABNORMAL ? LOG_ERR : LOG_DEBUG;
737 r = wait_for_terminate(pid, &status);
739 return log_full_errno(prio, r, "Failed to wait for %s: %m", strna(name));
741 if (status.si_code == CLD_EXITED) {
742 if (status.si_status != EXIT_SUCCESS)
743 log_full(flags & WAIT_LOG_NON_ZERO_EXIT_STATUS ? LOG_ERR : LOG_DEBUG,
744 "%s failed with exit status %i.", strna(name), status.si_status);
746 log_debug("%s succeeded.", name);
748 return status.si_status;
750 } else if (IN_SET(status.si_code, CLD_KILLED, CLD_DUMPED)) {
752 log_full(prio, "%s terminated by signal %s.", strna(name), signal_to_string(status.si_status));
756 log_full(prio, "%s failed due to unknown reason.", strna(name));
762 * < 0 : wait_for_terminate_with_timeout() failed to get the state of the
763 * process, the process timed out, the process was terminated by a
764 * signal, or failed for an unknown reason.
765 * >=0 : The process terminated normally with no failures.
767 * Success is indicated by a return value of zero, a timeout is indicated
768 * by ETIMEDOUT, and all other child failure states are indicated by error
769 * is indicated by a non-zero value.
771 int wait_for_terminate_with_timeout(pid_t pid, usec_t timeout) {
776 assert_se(sigemptyset(&mask) == 0);
777 assert_se(sigaddset(&mask, SIGCHLD) == 0);
779 /* Drop into a sigtimewait-based timeout. Waiting for the
781 until = now(CLOCK_MONOTONIC) + timeout;
784 siginfo_t status = {};
787 n = now(CLOCK_MONOTONIC);
791 r = sigtimedwait(&mask, NULL, timespec_store(&ts, until - n)) < 0 ? -errno : 0;
792 /* Assuming we woke due to the child exiting. */
793 if (waitid(P_PID, pid, &status, WEXITED|WNOHANG) == 0) {
794 if (status.si_pid == pid) {
795 /* This is the correct child.*/
796 if (status.si_code == CLD_EXITED)
797 return (status.si_status == 0) ? 0 : -EPROTO;
802 /* Not the child, check for errors and proceed appropriately */
806 /* Timed out, child is likely hung. */
809 /* Received a different signal and should retry */
812 /* Return any unexpected errors */
821 #if 0 /// UNNEEDED by elogind
822 void sigkill_wait(pid_t pid) {
825 if (kill(pid, SIGKILL) > 0)
826 (void) wait_for_terminate(pid, NULL);
829 void sigkill_waitp(pid_t *pid) {
840 void sigterm_wait(pid_t pid) {
843 if (kill_and_sigcont(pid, SIGTERM) > 0)
844 (void) wait_for_terminate(pid, NULL);
847 int kill_and_sigcont(pid_t pid, int sig) {
850 r = kill(pid, sig) < 0 ? -errno : 0;
852 /* If this worked, also send SIGCONT, unless we already just sent a SIGCONT, or SIGKILL was sent which isn't
853 * affected by a process being suspended anyway. */
854 if (r >= 0 && !IN_SET(sig, SIGCONT, SIGKILL))
855 (void) kill(pid, SIGCONT);
861 int getenv_for_pid(pid_t pid, const char *field, char **ret) {
862 _cleanup_fclose_ FILE *f = NULL;
872 if (pid == 0 || pid == getpid_cached()) {
889 path = procfs_file_alloca(pid, "environ");
891 f = fopen(path, "re");
899 (void) __fsetlocking(f, FSETLOCKING_BYCALLER);
907 for (i = 0; i < sizeof(line)-1; i++) {
911 if (_unlikely_(c == EOF)) {
921 if (strneq(line, field, l) && line[l] == '=') {
922 value = strdup(line + l + 1);
936 bool pid_is_unwaited(pid_t pid) {
937 /* Checks whether a PID is still valid at all, including a zombie */
942 if (pid <= 1) /* If we or PID 1 would be dead and have been waited for, this code would not be running */
945 if (pid == getpid_cached())
948 if (kill(pid, 0) >= 0)
951 return errno != ESRCH;
954 bool pid_is_alive(pid_t pid) {
957 /* Checks whether a PID is still valid and not a zombie */
962 if (pid <= 1) /* If we or PID 1 would be a zombie, this code would not be running */
965 if (pid == getpid_cached())
968 r = get_process_state(pid);
969 if (IN_SET(r, -ESRCH, 'Z'))
975 #if 0 /// UNNEEDED by elogind
976 int pid_from_same_root_fs(pid_t pid) {
982 if (pid == 0 || pid == getpid_cached())
985 root = procfs_file_alloca(pid, "root");
987 return files_same(root, "/proc/1/root", 0);
991 bool is_main_thread(void) {
992 static thread_local int cached = 0;
994 if (_unlikely_(cached == 0))
995 cached = getpid_cached() == gettid() ? 1 : -1;
1000 #if 0 /// UNNEEDED by elogind
1001 noreturn void freeze(void) {
1005 /* Make sure nobody waits for us on a socket anymore */
1006 close_all_fds(NULL, 0);
1010 /* Let's not freeze right away, but keep reaping zombies. */
1015 r = waitid(P_ALL, 0, &si, WEXITED);
1016 if (r < 0 && errno != EINTR)
1020 /* waitid() failed with an unexpected error, things are really borked. Freeze now! */
1025 bool oom_score_adjust_is_valid(int oa) {
1026 return oa >= OOM_SCORE_ADJ_MIN && oa <= OOM_SCORE_ADJ_MAX;
1029 unsigned long personality_from_string(const char *p) {
1033 return PERSONALITY_INVALID;
1035 /* Parse a personality specifier. We use our own identifiers that indicate specific ABIs, rather than just
1036 * hints regarding the register size, since we want to keep things open for multiple locally supported ABIs for
1037 * the same register size. */
1039 architecture = architecture_from_string(p);
1040 if (architecture < 0)
1041 return PERSONALITY_INVALID;
1043 if (architecture == native_architecture())
1045 #ifdef SECONDARY_ARCHITECTURE
1046 if (architecture == SECONDARY_ARCHITECTURE)
1050 return PERSONALITY_INVALID;
1053 const char* personality_to_string(unsigned long p) {
1054 int architecture = _ARCHITECTURE_INVALID;
1057 architecture = native_architecture();
1058 #ifdef SECONDARY_ARCHITECTURE
1059 else if (p == PER_LINUX32)
1060 architecture = SECONDARY_ARCHITECTURE;
1063 if (architecture < 0)
1066 return architecture_to_string(architecture);
1069 int safe_personality(unsigned long p) {
1072 /* So here's the deal, personality() is weirdly defined by glibc. In some cases it returns a failure via errno,
1073 * and in others as negative return value containing an errno-like value. Let's work around this: this is a
1074 * wrapper that uses errno if it is set, and uses the return value otherwise. And then it sets both errno and
1075 * the return value indicating the same issue, so that we are definitely on the safe side.
1077 * See https://github.com/systemd/systemd/issues/6737 */
1080 ret = personality(p);
1091 int opinionated_personality(unsigned long *ret) {
1094 /* Returns the current personality, or PERSONALITY_INVALID if we can't determine it. This function is a bit
1095 * opinionated though, and ignores all the finer-grained bits and exotic personalities, only distinguishing the
1096 * two most relevant personalities: PER_LINUX and PER_LINUX32. */
1098 current = safe_personality(PERSONALITY_INVALID);
1102 if (((unsigned long) current & 0xffff) == PER_LINUX32)
1110 void valgrind_summary_hack(void) {
1111 #if HAVE_VALGRIND_VALGRIND_H
1112 if (getpid_cached() == 1 && RUNNING_ON_VALGRIND) {
1114 pid = raw_clone(SIGCHLD);
1116 log_emergency_errno(errno, "Failed to fork off valgrind helper: %m");
1120 log_info("Spawned valgrind helper as PID "PID_FMT".", pid);
1121 (void) wait_for_terminate(pid, NULL);
1127 int pid_compare_func(const void *a, const void *b) {
1128 const pid_t *p = a, *q = b;
1130 /* Suitable for usage in qsort() */
1139 int ioprio_parse_priority(const char *s, int *ret) {
1145 r = safe_atoi(s, &i);
1149 if (!ioprio_priority_is_valid(i))
1157 /* The cached PID, possible values:
1159 * == UNSET [0] → cache not initialized yet
1160 * == BUSY [-1] → some thread is initializing it at the moment
1161 * any other → the cached PID
1164 #define CACHED_PID_UNSET ((pid_t) 0)
1165 #define CACHED_PID_BUSY ((pid_t) -1)
1167 static pid_t cached_pid = CACHED_PID_UNSET;
1169 void reset_cached_pid(void) {
1170 /* Invoked in the child after a fork(), i.e. at the first moment the PID changed */
1171 cached_pid = CACHED_PID_UNSET;
1174 /* We use glibc __register_atfork() + __dso_handle directly here, as they are not included in the glibc
1175 * headers. __register_atfork() is mostly equivalent to pthread_atfork(), but doesn't require us to link against
1176 * libpthread, as it is part of glibc anyway. */
1178 extern int __register_atfork(void (*prepare) (void), void (*parent) (void), void (*child) (void), void * __dso_handle);
1179 extern void* __dso_handle __attribute__ ((__weak__));
1180 #endif // ifdef __GLIBC__
1182 pid_t getpid_cached(void) {
1183 pid_t current_value;
1185 /* getpid_cached() is much like getpid(), but caches the value in local memory, to avoid having to invoke a
1186 * system call each time. This restores glibc behaviour from before 2.24, when getpid() was unconditionally
1187 * cached. Starting with 2.24 getpid() started to become prohibitively expensive when used for detecting when
1188 * objects were used across fork()s. With this caching the old behaviour is somewhat restored.
1190 * https://bugzilla.redhat.com/show_bug.cgi?id=1443976
1191 * https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=c579f48edba88380635ab98cb612030e3ed8691e
1194 current_value = __sync_val_compare_and_swap(&cached_pid, CACHED_PID_UNSET, CACHED_PID_BUSY);
1196 switch (current_value) {
1198 case CACHED_PID_UNSET: { /* Not initialized yet, then do so now */
1201 new_pid = raw_getpid();
1203 if (__register_atfork(NULL, NULL, reset_cached_pid, __dso_handle) != 0) {
1204 /* OOM? Let's try again later */
1205 cached_pid = CACHED_PID_UNSET;
1209 cached_pid = new_pid;
1213 case CACHED_PID_BUSY: /* Somebody else is currently initializing */
1214 return raw_getpid();
1216 default: /* Properly initialized */
1217 return current_value;
1221 int must_be_root(void) {
1226 log_error("Need to be root.");
1232 const int except_fds[],
1233 size_t n_except_fds,
1237 pid_t original_pid, pid;
1238 sigset_t saved_ss, ss;
1239 bool block_signals = false;
1242 /* A wrapper around fork(), that does a couple of important initializations in addition to mere forking. Always
1243 * returns the child's PID in *ret_pid. Returns == 0 in the child, and > 0 in the parent. */
1245 prio = flags & FORK_LOG ? LOG_ERR : LOG_DEBUG;
1247 original_pid = getpid_cached();
1249 if (flags & (FORK_RESET_SIGNALS|FORK_DEATHSIG)) {
1251 /* We temporarily block all signals, so that the new child has them blocked initially. This way, we can
1252 * be sure that SIGTERMs are not lost we might send to the child. */
1254 if (sigfillset(&ss) < 0)
1255 return log_full_errno(prio, errno, "Failed to reset signal set: %m");
1257 block_signals = true;
1259 } else if (flags & FORK_WAIT) {
1261 /* Let's block SIGCHLD at least, so that we can safely watch for the child process */
1263 if (sigemptyset(&ss) < 0)
1264 return log_full_errno(prio, errno, "Failed to clear signal set: %m");
1266 if (sigaddset(&ss, SIGCHLD) < 0)
1267 return log_full_errno(prio, errno, "Failed to add SIGCHLD to signal set: %m");
1269 block_signals = true;
1273 if (sigprocmask(SIG_SETMASK, &ss, &saved_ss) < 0)
1274 return log_full_errno(prio, errno, "Failed to set signal mask: %m");
1276 if (flags & FORK_NEW_MOUNTNS)
1277 pid = raw_clone(SIGCHLD|CLONE_NEWNS);
1283 if (block_signals) /* undo what we did above */
1284 (void) sigprocmask(SIG_SETMASK, &saved_ss, NULL);
1286 return log_full_errno(prio, r, "Failed to fork: %m");
1289 /* We are in the parent process */
1291 log_debug("Successfully forked off '%s' as PID " PID_FMT ".", strna(name), pid);
1293 if (flags & FORK_WAIT) {
1294 r = wait_for_terminate_and_check(name, pid, (flags & FORK_LOG ? WAIT_LOG : 0));
1297 if (r != EXIT_SUCCESS) /* exit status > 0 should be treated as failure, too */
1301 if (block_signals) /* undo what we did above */
1302 (void) sigprocmask(SIG_SETMASK, &saved_ss, NULL);
1310 /* We are in the child process */
1312 if (flags & FORK_REOPEN_LOG) {
1313 /* Close the logs if requested, before we log anything. And make sure we reopen it if needed. */
1315 log_set_open_when_needed(true);
1319 r = rename_process(name);
1321 log_full_errno(flags & FORK_LOG ? LOG_WARNING : LOG_DEBUG,
1322 r, "Failed to rename process, ignoring: %m");
1325 if (flags & FORK_DEATHSIG)
1326 if (prctl(PR_SET_PDEATHSIG, SIGTERM) < 0) {
1327 log_full_errno(prio, errno, "Failed to set death signal: %m");
1328 _exit(EXIT_FAILURE);
1331 if (flags & FORK_RESET_SIGNALS) {
1332 r = reset_all_signal_handlers();
1334 log_full_errno(prio, r, "Failed to reset signal handlers: %m");
1335 _exit(EXIT_FAILURE);
1338 /* This implicitly undoes the signal mask stuff we did before the fork()ing above */
1339 r = reset_signal_mask();
1341 log_full_errno(prio, r, "Failed to reset signal mask: %m");
1342 _exit(EXIT_FAILURE);
1344 } else if (block_signals) { /* undo what we did above */
1345 if (sigprocmask(SIG_SETMASK, &saved_ss, NULL) < 0) {
1346 log_full_errno(prio, errno, "Failed to restore signal mask: %m");
1347 _exit(EXIT_FAILURE);
1351 if (flags & FORK_DEATHSIG) {
1353 /* Let's see if the parent PID is still the one we started from? If not, then the parent
1354 * already died by the time we set PR_SET_PDEATHSIG, hence let's emulate the effect */
1358 /* Parent is in a differn't PID namespace. */;
1359 else if (ppid != original_pid) {
1360 log_debug("Parent died early, raising SIGTERM.");
1361 (void) raise(SIGTERM);
1362 _exit(EXIT_FAILURE);
1366 if (flags & FORK_CLOSE_ALL_FDS) {
1367 /* Close the logs here in case it got reopened above, as close_all_fds() would close them for us */
1370 r = close_all_fds(except_fds, n_except_fds);
1372 log_full_errno(prio, r, "Failed to close all file descriptors: %m");
1373 _exit(EXIT_FAILURE);
1377 /* When we were asked to reopen the logs, do so again now */
1378 if (flags & FORK_REOPEN_LOG) {
1380 log_set_open_when_needed(false);
1383 if (flags & FORK_NULL_STDIO) {
1384 r = make_null_stdio();
1386 log_full_errno(prio, r, "Failed to connect stdin/stdout to /dev/null: %m");
1387 _exit(EXIT_FAILURE);
1392 *ret_pid = getpid_cached();
1397 int fork_agent(const char *name, const int except[], unsigned n_except, pid_t *ret_pid, const char *path, ...) {
1398 bool stdout_is_tty, stderr_is_tty;
1406 /* Spawns a temporary TTY agent, making sure it goes away when we go away */
1408 r = safe_fork_full(name, except, n_except, FORK_RESET_SIGNALS|FORK_DEATHSIG|FORK_CLOSE_ALL_FDS, ret_pid);
1416 stdout_is_tty = isatty(STDOUT_FILENO);
1417 stderr_is_tty = isatty(STDERR_FILENO);
1419 if (!stdout_is_tty || !stderr_is_tty) {
1422 /* Detach from stdout/stderr. and reopen
1423 * /dev/tty for them. This is important to
1424 * ensure that when systemctl is started via
1425 * popen() or a similar call that expects to
1426 * read EOF we actually do generate EOF and
1427 * not delay this indefinitely by because we
1428 * keep an unused copy of stdin around. */
1429 fd = open("/dev/tty", O_WRONLY);
1431 log_error_errno(errno, "Failed to open /dev/tty: %m");
1432 _exit(EXIT_FAILURE);
1435 if (!stdout_is_tty && dup2(fd, STDOUT_FILENO) < 0) {
1436 log_error_errno(errno, "Failed to dup2 /dev/tty: %m");
1437 _exit(EXIT_FAILURE);
1440 if (!stderr_is_tty && dup2(fd, STDERR_FILENO) < 0) {
1441 log_error_errno(errno, "Failed to dup2 /dev/tty: %m");
1442 _exit(EXIT_FAILURE);
1445 safe_close_above_stdio(fd);
1448 /* Count arguments */
1450 for (n = 0; va_arg(ap, char*); n++)
1455 l = alloca(sizeof(char *) * (n + 1));
1457 /* Fill in arguments */
1459 for (i = 0; i <= n; i++)
1460 l[i] = va_arg(ap, char*);
1464 _exit(EXIT_FAILURE);
1467 #if 0 /// UNNEEDED by elogind
1468 static const char *const ioprio_class_table[] = {
1469 [IOPRIO_CLASS_NONE] = "none",
1470 [IOPRIO_CLASS_RT] = "realtime",
1471 [IOPRIO_CLASS_BE] = "best-effort",
1472 [IOPRIO_CLASS_IDLE] = "idle"
1475 DEFINE_STRING_TABLE_LOOKUP_WITH_FALLBACK(ioprio_class, int, INT_MAX);
1477 static const char *const sigchld_code_table[] = {
1478 [CLD_EXITED] = "exited",
1479 [CLD_KILLED] = "killed",
1480 [CLD_DUMPED] = "dumped",
1481 [CLD_TRAPPED] = "trapped",
1482 [CLD_STOPPED] = "stopped",
1483 [CLD_CONTINUED] = "continued",
1486 DEFINE_STRING_TABLE_LOOKUP(sigchld_code, int);
1488 static const char* const sched_policy_table[] = {
1489 [SCHED_OTHER] = "other",
1490 [SCHED_BATCH] = "batch",
1491 [SCHED_IDLE] = "idle",
1492 [SCHED_FIFO] = "fifo",
1496 DEFINE_STRING_TABLE_LOOKUP_WITH_FALLBACK(sched_policy, int, INT_MAX);