• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

systemd / systemd / 15263807472

26 May 2025 08:53PM UTC coverage: 72.046% (-0.002%) from 72.048%
15263807472

push

github

yuwata
src/core/manager.c: log preset activity on first boot

This gives us a little more information about what units were enabled
or disabled on that first boot and will be useful for OS developers
tracking down the source of unit state.

An example with this enabled looks like:

```
NET: Registered PF_VSOCK protocol family
systemd[1]: Applying preset policy.
systemd[1]: Unit /etc/systemd/system/dnsmasq.service is masked, ignoring.
systemd[1]: Unit /etc/systemd/system/systemd-repart.service is masked, ignoring.
systemd[1]: Removed '/etc/systemd/system/sockets.target.wants/systemd-resolved-monitor.socket'.
systemd[1]: Removed '/etc/systemd/system/sockets.target.wants/systemd-resolved-varlink.socket'.
systemd[1]: Created symlink '/etc/systemd/system/multi-user.target.wants/var-mnt-workdir.mount' → '/etc/systemd/system/var-mnt-workdir.mount'.
systemd[1]: Created symlink '/etc/systemd/system/multi-user.target.wants/var-mnt-workdir\x2dtmp.mount' → '/etc/systemd/system/var-mnt-workdir\x2dtmp.mount'.
systemd[1]: Created symlink '/etc/systemd/system/afterburn-sshkeys.target.requires/afterburn-sshkeys@core.service' → '/usr/lib/systemd/system/afterburn-sshkeys@.service'.
systemd[1]: Created symlink '/etc/systemd/system/sockets.target.wants/systemd-resolved-varlink.socket' → '/usr/lib/systemd/system/systemd-resolved-varlink.socket'.
systemd[1]: Created symlink '/etc/systemd/system/sockets.target.wants/systemd-resolved-monitor.socket' → '/usr/lib/systemd/system/systemd-resolved-monitor.socket'.
systemd[1]: Populated /etc with preset unit settings.
```

Considering it only happens on first boot and not on every boot I think
the extra information is worth the extra verbosity in the logs just for
that boot.

5 of 6 new or added lines in 1 file covered. (83.33%)

5463 existing lines in 165 files now uncovered.

299151 of 415222 relevant lines covered (72.05%)

702386.45 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

88.76
/src/basic/process-util.h
1
/* SPDX-License-Identifier: LGPL-2.1-or-later */
2
#pragma once
3

4
#include <signal.h>
5

6
#include "fileio.h"
7
#include "format-util.h"
8
#include "forward.h"
9
#include "string-util.h"
10

11
#define procfs_file_alloca(pid, field)                                  \
12
        ({                                                              \
13
                pid_t _pid_ = (pid);                                    \
14
                const char *_field_ = (field);                          \
15
                char *_r_;                                              \
16
                if (_pid_ == 0)                                         \
17
                        _r_ = strjoina("/proc/self/", _field_);         \
18
                else {                                                  \
19
                        assert(_pid_ > 0);                              \
20
                        _r_ = newa(char, STRLEN("/proc/") + DECIMAL_STR_MAX(pid_t) + 1 + strlen(_field_) + 1); \
21
                        sprintf(_r_, "/proc/" PID_FMT "/%s", _pid_, _field_); \
22
                }                                                       \
23
                (const char*) _r_;                                      \
24
        })
25

26
static inline int procfs_file_get_field(pid_t pid, const char *name, const char *key, char **ret) {
26,329✔
27
        return get_proc_field(procfs_file_alloca(pid, name), key, ret);
101,089✔
28
}
29

30
typedef enum ProcessCmdlineFlags {
31
        PROCESS_CMDLINE_COMM_FALLBACK = 1 << 0,
32
        PROCESS_CMDLINE_USE_LOCALE    = 1 << 1,
33
        PROCESS_CMDLINE_QUOTE         = 1 << 2,
34
        PROCESS_CMDLINE_QUOTE_POSIX   = 1 << 3,
35
} ProcessCmdlineFlags;
36

37
int pid_get_comm(pid_t pid, char **ret);
47,112✔
38
int pidref_get_comm(const PidRef *pid, char **ret);
30✔
39
int pid_get_cmdline(pid_t pid, size_t max_columns, ProcessCmdlineFlags flags, char **ret);
13,932✔
40
int pidref_get_cmdline(const PidRef *pid, size_t max_columns, ProcessCmdlineFlags flags, char **ret);
119✔
41
int pid_get_cmdline_strv(pid_t pid, ProcessCmdlineFlags flags, char ***ret);
4,865✔
UNCOV
42
int pidref_get_cmdline_strv(const PidRef *pid, ProcessCmdlineFlags flags, char ***ret);
×
43
int get_process_exe(pid_t pid, char **ret);
13,244✔
44
int pid_get_uid(pid_t pid, uid_t *ret);
3,826✔
45
int pidref_get_uid(const PidRef *pid, uid_t *ret);
54✔
46
int get_process_gid(pid_t pid, gid_t *ret);
3,817✔
47
int get_process_cwd(pid_t pid, char **ret);
14✔
48
int get_process_root(pid_t pid, char **ret);
14✔
49
int get_process_environ(pid_t pid, char **ret);
16✔
50
int pid_get_ppid(pid_t pid, pid_t *ret);
1,399✔
51
int pidref_get_ppid(const PidRef *pidref, pid_t *ret);
2,414✔
52
int pidref_get_ppid_as_pidref(const PidRef *pidref, PidRef *ret);
17✔
53
int pid_get_start_time(pid_t pid, usec_t *ret);
659✔
54
int pidref_get_start_time(const PidRef *pid, usec_t *ret);
659✔
55
int get_process_umask(pid_t pid, mode_t *ret);
18,684✔
56

57
int container_get_leader(const char *machine, pid_t *pid);
11✔
58

59
static inline bool SIGINFO_CODE_IS_DEAD(int code) {
33,407✔
60
        return IN_SET(code, CLD_EXITED, CLD_KILLED, CLD_DUMPED);
33,407✔
61
}
62

63
int wait_for_terminate(pid_t pid, siginfo_t *ret);
800✔
64

65
typedef enum WaitFlags {
66
        WAIT_LOG_ABNORMAL             = 1 << 0,
67
        WAIT_LOG_NON_ZERO_EXIT_STATUS = 1 << 1,
68

69
        /* A shortcut for requesting the most complete logging */
70
        WAIT_LOG = WAIT_LOG_ABNORMAL|WAIT_LOG_NON_ZERO_EXIT_STATUS,
71
} WaitFlags;
72

73
int pidref_wait_for_terminate_and_check(const char *name, PidRef *pidref, WaitFlags flags);
9,137✔
74
int wait_for_terminate_and_check(const char *name, pid_t pid, WaitFlags flags);
8,016✔
75

UNCOV
76
int wait_for_terminate_with_timeout(pid_t pid, usec_t timeout);
×
77

78
void sigkill_wait(pid_t pid);
50✔
79
void sigkill_waitp(pid_t *pid);
11,763✔
80
void sigterm_wait(pid_t pid);
69✔
UNCOV
81
void sigkill_nowait(pid_t pid);
×
UNCOV
82
void sigkill_nowaitp(pid_t *pid);
×
83

84
int kill_and_sigcont(pid_t pid, int sig);
69✔
85

86
int pid_is_kernel_thread(pid_t pid);
3,516✔
87
int pidref_is_kernel_thread(const PidRef *pid);
1,461✔
88

89
int getenv_for_pid(pid_t pid, const char *field, char **_value);
4,701✔
90

91
int pid_is_alive(pid_t pid);
10,309✔
92
int pidref_is_alive(const PidRef *pidref);
10,304✔
93
int pid_is_unwaited(pid_t pid);
8,408✔
94
int pidref_is_unwaited(PidRef *pidref);
9,063✔
UNCOV
95
int pid_is_my_child(pid_t pid);
×
96
int pidref_is_my_child(PidRef *pidref);
2,380✔
97
int pidref_from_same_root_fs(PidRef *a, PidRef *b);
13,656✔
98

99
bool is_main_thread(void);
6,952,732✔
100

101
bool oom_score_adjust_is_valid(int oa);
5,757✔
102

103
#ifndef PERSONALITY_INVALID
104
/* personality(2) documents that 0xFFFFFFFFUL is used for querying the
105
 * current personality, hence let's use that here as error
106
 * indicator. */
107
#define PERSONALITY_INVALID 0xFFFFFFFFUL
108
#endif
109

110
/* The personality() syscall returns a 32-bit value where the top three bytes are reserved for flags that
111
 * emulate historical or architectural quirks, and only the least significant byte reflects the actual
112
 * personality we're interested in. */
113
#define OPINIONATED_PERSONALITY_MASK 0xFFUL
114

115
unsigned long personality_from_string(const char *p);
9✔
116
const char* personality_to_string(unsigned long);
1,309✔
117

118
int safe_personality(unsigned long p);
1,508✔
119
int opinionated_personality(unsigned long *ret);
1,493✔
120

121
const char* sigchld_code_to_string(int i) _const_;
7,647✔
UNCOV
122
int sigchld_code_from_string(const char *s) _pure_;
×
123

UNCOV
124
int sched_policy_to_string_alloc(int i, char **s);
×
125
int sched_policy_from_string(const char *s);
3✔
126

127
static inline pid_t PTR_TO_PID(const void *p) {
1,215✔
128
        return (pid_t) ((uintptr_t) p);
1,215✔
129
}
130

131
static inline void* PID_TO_PTR(pid_t pid) {
417,910✔
132
        return (void*) ((uintptr_t) pid);
417,871✔
133
}
134

135
void valgrind_summary_hack(void);
47✔
136

137
int pid_compare_func(const pid_t *a, const pid_t *b);
1,677✔
138

139
bool nice_is_valid(int n);
748✔
140

UNCOV
141
bool sched_policy_is_valid(int i) _const_;
×
UNCOV
142
bool sched_priority_is_valid(int i) _const_;
×
143

144
#define PID_AUTOMATIC ((pid_t) INT_MIN) /* special value indicating "acquire pid from connection peer" */
145

146
static inline bool pid_is_valid(pid_t p) {
147
        return p > 0;
148
}
149

150
static inline bool pid_is_automatic(pid_t p) {
1✔
151
        return p == PID_AUTOMATIC;
1✔
152
}
153

154
pid_t getpid_cached(void);
88,764,532✔
155
void reset_cached_pid(void);
3,227✔
156

157
int must_be_root(void);
59✔
158

159
pid_t clone_with_nested_stack(int (*fn)(void *), int flags, void *userdata);
2,953✔
160

161
/* 💣 Note that FORK_NEW_USERNS, FORK_NEW_MOUNTNS, FORK_NEW_NETNS or FORK_NEW_PIDNS should not be called in threaded
162
 * programs, because they cause us to use raw_clone() which does not synchronize the glibc malloc() locks,
163
 * and thus will cause deadlocks if the parent uses threads and the child does memory allocations. Hence: if
164
 * the parent is threaded these flags may not be used. These flags cannot be used if the parent uses threads
165
 * or the child uses malloc(). 💣 */
166
typedef enum ForkFlags {
167
        FORK_RESET_SIGNALS      = 1 <<  0, /* Reset all signal handlers and signal mask */
168
        FORK_CLOSE_ALL_FDS      = 1 <<  1, /* Close all open file descriptors in the child, except for 0,1,2 */
169
        FORK_DEATHSIG_SIGTERM   = 1 <<  2, /* Set PR_DEATHSIG in the child to SIGTERM */
170
        FORK_DEATHSIG_SIGINT    = 1 <<  3, /* Set PR_DEATHSIG in the child to SIGINT */
171
        FORK_DEATHSIG_SIGKILL   = 1 <<  4, /* Set PR_DEATHSIG in the child to SIGKILL */
172
        FORK_REARRANGE_STDIO    = 1 <<  5, /* Connect 0,1,2 to specified fds or /dev/null */
173
        FORK_REOPEN_LOG         = 1 <<  6, /* Reopen log connection */
174
        FORK_LOG                = 1 <<  7, /* Log above LOG_DEBUG log level about failures */
175
        FORK_WAIT               = 1 <<  8, /* Wait until child exited */
176
        FORK_MOUNTNS_SLAVE      = 1 <<  9, /* Make child's mount namespace MS_SLAVE */
177
        FORK_PRIVATE_TMP        = 1 << 10, /* Mount new /tmp/ in the child (combine with FORK_NEW_MOUNTNS!) */
178
        FORK_RLIMIT_NOFILE_SAFE = 1 << 11, /* Set RLIMIT_NOFILE soft limit to 1K for select() compat */
179
        FORK_STDOUT_TO_STDERR   = 1 << 12, /* Make stdout a copy of stderr */
180
        FORK_FLUSH_STDIO        = 1 << 13, /* fflush() stdout (and stderr) before forking */
181
        FORK_CLOEXEC_OFF        = 1 << 14, /* In the child: turn off O_CLOEXEC on all fds in except_fds[] */
182
        FORK_KEEP_NOTIFY_SOCKET = 1 << 15, /* Unless this specified, $NOTIFY_SOCKET will be unset. */
183
        FORK_DETACH             = 1 << 16, /* Double fork if needed to ensure PID1/subreaper is parent */
184
        FORK_PACK_FDS           = 1 << 17, /* Rearrange the passed FDs to be FD 3,4,5,etc. Updates the array in place (combine with FORK_CLOSE_ALL_FDS!) */
185
        FORK_NEW_MOUNTNS        = 1 << 18, /* Run child in its own mount namespace                               💣 DO NOT USE IN THREADED PROGRAMS! 💣 */
186
        FORK_NEW_USERNS         = 1 << 19, /* Run child in its own user namespace                                💣 DO NOT USE IN THREADED PROGRAMS! 💣 */
187
        FORK_NEW_NETNS          = 1 << 20, /* Run child in its own network namespace                             💣 DO NOT USE IN THREADED PROGRAMS! 💣 */
188
        FORK_NEW_PIDNS          = 1 << 21, /* Run child in its own PID namespace                                 💣 DO NOT USE IN THREADED PROGRAMS! 💣 */
189
        FORK_FREEZE             = 1 << 22, /* Don't return in child, just call freeze() instead */
190
        FORK_PID_ONLY           = 1 << 23, /* Don't open a pidfd referencing the child process */
191
} ForkFlags;
192

193
int pidref_safe_fork_full(
31,836✔
194
                const char *name,
195
                const int stdio_fds[3],
196
                int except_fds[],
197
                size_t n_except_fds,
198
                ForkFlags flags,
199
                PidRef *ret_pid);
200

201
static inline int pidref_safe_fork(const char *name, ForkFlags flags, PidRef *ret_pid) {
6,391✔
202
        return pidref_safe_fork_full(name, NULL, NULL, 0, flags, ret_pid);
6,391✔
203
}
204

205
int safe_fork_full(
13,233✔
206
                const char *name,
207
                const int stdio_fds[3],
208
                int except_fds[],
209
                size_t n_except_fds,
210
                ForkFlags flags,
211
                pid_t *ret_pid);
212

213
static inline int safe_fork(const char *name, ForkFlags flags, pid_t *ret_pid) {
9,094✔
214
        return safe_fork_full(name, NULL, NULL, 0, flags, ret_pid);
9,094✔
215
}
216

217
int namespace_fork(
166✔
218
                const char *outer_name,
219
                const char *inner_name,
220
                int except_fds[],
221
                size_t n_except_fds,
222
                ForkFlags flags,
223
                int pidns_fd,
224
                int mntns_fd,
225
                int netns_fd,
226
                int userns_fd,
227
                int root_fd,
228
                pid_t *ret_pid);
229

230
int set_oom_score_adjust(int value);
3,995✔
231
int get_oom_score_adjust(int *ret);
1,070✔
232

233
/* The highest possibly (theoretic) pid_t value on this architecture. */
234
#define PID_T_MAX ((pid_t) INT32_MAX)
235
/* The maximum number of concurrent processes Linux allows on this architecture, as well as the highest valid PID value
236
 * the kernel will potentially assign. This reflects a value compiled into the kernel (PID_MAX_LIMIT), and sets the
237
 * upper boundary on what may be written to the /proc/sys/kernel/pid_max sysctl (but do note that the sysctl is off by
238
 * 1, since PID 0 can never exist and there can hence only be one process less than the limit would suggest). Since
239
 * these values are documented in proc(5) we feel quite confident that they are stable enough for the near future at
240
 * least to define them here too. */
241
#define TASKS_MAX 4194303U
242

243
assert_cc(TASKS_MAX <= (unsigned long) PID_T_MAX);
244

245
/* Like TAKE_PTR() but for pid_t, resetting them to 0 */
246
#define TAKE_PID(pid) TAKE_GENERIC(pid, pid_t, 0)
247

248
int setpriority_closest(int priority);
23✔
249

UNCOV
250
_noreturn_ void freeze(void);
×
251

252
int get_process_threads(pid_t pid);
7✔
253

254
int is_reaper_process(void);
3,056✔
255
int make_reaper_process(bool b);
600✔
256

257
int posix_spawn_wrapper(
2,213✔
258
                const char *path,
259
                char * const *argv,
260
                char * const *envp,
261
                const char *cgroup,
262
                PidRef *ret_pidref);
263

264
int proc_dir_open(DIR **ret);
11✔
265
int proc_dir_read(DIR *d, pid_t *ret);
1,017✔
266
int proc_dir_read_pidref(DIR *d, PidRef *ret);
973✔
267

268
_noreturn_ void report_errno_and_exit(int errno_fd, int error);
48✔
269
int read_errno(int errno_fd);
1✔
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc