]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/core/manager.c
cgroups-agent: down-grade log level
[thirdparty/systemd.git] / src / core / manager.c
CommitLineData
d6c9574f 1/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
60918275 2
a7334b09
LP
3/***
4 This file is part of systemd.
5
6 Copyright 2010 Lennart Poettering
7
8 systemd is free software; you can redistribute it and/or modify it
5430f7f2
LP
9 under the terms of the GNU Lesser General Public License as published by
10 the Free Software Foundation; either version 2.1 of the License, or
a7334b09
LP
11 (at your option) any later version.
12
13 systemd is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
5430f7f2 16 Lesser General Public License for more details.
a7334b09 17
5430f7f2 18 You should have received a copy of the GNU Lesser General Public License
a7334b09
LP
19 along with systemd; If not, see <http://www.gnu.org/licenses/>.
20***/
21
60918275
LP
22#include <assert.h>
23#include <errno.h>
87d1515d 24#include <string.h>
9152c765
LP
25#include <sys/epoll.h>
26#include <signal.h>
27#include <sys/signalfd.h>
28#include <sys/wait.h>
29#include <unistd.h>
30#include <sys/poll.h>
e1414003
LP
31#include <sys/reboot.h>
32#include <sys/ioctl.h>
33#include <linux/kd.h>
80876c20
LP
34#include <termios.h>
35#include <fcntl.h>
a16e1123
LP
36#include <sys/types.h>
37#include <sys/stat.h>
fe51822e 38#include <dirent.h>
8742514c 39#include <sys/timerfd.h>
830f6caa
LP
40
41#ifdef HAVE_AUDIT
4927fcae 42#include <libaudit.h>
830f6caa 43#endif
60918275 44
718db961
LP
45#include "sd-daemon.h"
46#include "sd-id128.h"
47#include "sd-messages.h"
81527be1 48
60918275 49#include "manager.h"
75778e21 50#include "transaction.h"
60918275
LP
51#include "hashmap.h"
52#include "macro.h"
53#include "strv.h"
16354eff 54#include "log.h"
2a987ee8 55#include "util.h"
49e942b2 56#include "mkdir.h"
ea430986 57#include "ratelimit.h"
e21fea24 58#include "locale-setup.h"
8e274523 59#include "mount-setup.h"
9e2f7c11 60#include "unit-name.h"
1137a57c 61#include "missing.h"
84e3543e 62#include "path-lookup.h"
514f4ef5 63#include "special.h"
d06dacd0 64#include "exit-status.h"
5dc4c17f 65#include "virt.h"
e96d6be7 66#include "watchdog.h"
b59e2465 67#include "cgroup-util.h"
9eb977db 68#include "path-util.h"
c1165f82 69#include "audit-fd.h"
c51d84dc 70#include "boot-timestamps.h"
8b55b8c4 71#include "env-util.h"
718db961
LP
72#include "bus-errors.h"
73#include "bus-error.h"
74#include "bus-util.h"
75#include "dbus.h"
76#include "dbus-unit.h"
77#include "dbus-job.h"
78#include "dbus-manager.h"
60918275 79
701cc384 80/* As soon as 5s passed since a unit was added to our GC queue, make sure to run a gc sweep */
94b6dfa2 81#define GC_QUEUE_USEC_MAX (10*USEC_PER_SEC)
701cc384 82
03b717a3
MS
83/* Initial delay and the interval for printing status messages about running jobs */
84#define JOBS_IN_PROGRESS_WAIT_SEC 5
85#define JOBS_IN_PROGRESS_PERIOD_SEC 1
86#define JOBS_IN_PROGRESS_PERIOD_DIVISOR 3
87
8c47c732 88/* Where clients shall send notification messages to */
29252e9e 89#define NOTIFY_SOCKET "@/org/freedesktop/systemd1/notify"
8c47c732 90
c3e31c7b
ZJS
91#define TIME_T_MAX (time_t)((1UL << ((sizeof(time_t) << 3) - 1)) - 1)
92
718db961
LP
93static int manager_dispatch_notify_fd(sd_event_source *source, int fd, uint32_t revents, void *userdata);
94static int manager_dispatch_signal_fd(sd_event_source *source, int fd, uint32_t revents, void *userdata);
95static int manager_dispatch_time_change_fd(sd_event_source *source, int fd, uint32_t revents, void *userdata);
96static int manager_dispatch_idle_pipe_fd(sd_event_source *source, int fd, uint32_t revents, void *userdata);
97static int manager_dispatch_jobs_in_progress(sd_event_source *source, usec_t usec, void *userdata);
98
8c47c732
LP
99static int manager_setup_notify(Manager *m) {
100 union {
101 struct sockaddr sa;
102 struct sockaddr_un un;
b92bea5d
ZJS
103 } sa = {
104 .sa.sa_family = AF_UNIX,
105 };
e62d8c39 106 int one = 1, r;
8c47c732 107
718db961
LP
108 m->notify_fd = socket(AF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
109 if (m->notify_fd < 0) {
8c47c732
LP
110 log_error("Failed to allocate notification socket: %m");
111 return -errno;
112 }
113
31f92a7d 114 if (getpid() != 1 || detect_container(NULL) > 0)
29252e9e
LP
115 snprintf(sa.un.sun_path, sizeof(sa.un.sun_path), NOTIFY_SOCKET "/%llu", random_ull());
116 else
117 strncpy(sa.un.sun_path, NOTIFY_SOCKET, sizeof(sa.un.sun_path));
29252e9e 118 sa.un.sun_path[0] = 0;
1d6702e8 119
718db961 120 r = bind(m->notify_fd, &sa.sa, offsetof(struct sockaddr_un, sun_path) + 1 + strlen(sa.un.sun_path+1));
e62d8c39 121 if (r < 0) {
8c47c732
LP
122 log_error("bind() failed: %m");
123 return -errno;
124 }
125
718db961 126 r = setsockopt(m->notify_fd, SOL_SOCKET, SO_PASSCRED, &one, sizeof(one));
e62d8c39 127 if (r < 0) {
8c47c732
LP
128 log_error("SO_PASSCRED failed: %m");
129 return -errno;
130 }
131
718db961 132 r = sd_event_add_io(m->event, m->notify_fd, EPOLLIN, manager_dispatch_notify_fd, m, &m->notify_event_source);
e62d8c39 133 if (r < 0) {
718db961 134 log_error("Failed to allocate notify event source: %s", strerror(-r));
8c47c732 135 return -errno;
8742514c 136 }
8c47c732 137
29252e9e
LP
138 sa.un.sun_path[0] = '@';
139 m->notify_socket = strdup(sa.un.sun_path);
140 if (!m->notify_socket)
8742514c 141 return log_oom();
8c47c732 142
b2bb3dbe
LP
143 log_debug("Using notification socket %s", m->notify_socket);
144
8c47c732
LP
145 return 0;
146}
147
03b717a3 148static int manager_watch_jobs_in_progress(Manager *m) {
718db961 149 assert(m);
03b717a3 150
718db961 151 if (m->jobs_in_progress_event_source)
03b717a3
MS
152 return 0;
153
718db961 154 return sd_event_add_monotonic(m->event, JOBS_IN_PROGRESS_WAIT_SEC, 0, manager_dispatch_jobs_in_progress, m, &m->jobs_in_progress_event_source);
03b717a3
MS
155}
156
718db961 157#define CYLON_BUFFER_EXTRA (2*(sizeof(ANSI_RED_ON)-1) + sizeof(ANSI_HIGHLIGHT_RED_ON)-1 + 2*(sizeof(ANSI_HIGHLIGHT_OFF)-1))
03b717a3 158
03b717a3
MS
159static void draw_cylon(char buffer[], size_t buflen, unsigned width, unsigned pos) {
160 char *p = buffer;
161
162 assert(buflen >= CYLON_BUFFER_EXTRA + width + 1);
163 assert(pos <= width+1); /* 0 or width+1 mean that the center light is behind the corner */
164
165 if (pos > 1) {
6282c859
MS
166 if (pos > 2)
167 p = mempset(p, ' ', pos-2);
5052495b 168 p = stpcpy(p, ANSI_RED_ON);
03b717a3
MS
169 *p++ = '*';
170 }
171
172 if (pos > 0 && pos <= width) {
5052495b 173 p = stpcpy(p, ANSI_HIGHLIGHT_RED_ON);
03b717a3
MS
174 *p++ = '*';
175 }
176
5052495b 177 p = stpcpy(p, ANSI_HIGHLIGHT_OFF);
03b717a3
MS
178
179 if (pos < width) {
5052495b 180 p = stpcpy(p, ANSI_RED_ON);
03b717a3 181 *p++ = '*';
6282c859
MS
182 if (pos < width-1)
183 p = mempset(p, ' ', width-1-pos);
51d122af 184 strcpy(p, ANSI_HIGHLIGHT_OFF);
03b717a3 185 }
03b717a3
MS
186}
187
188static void manager_print_jobs_in_progress(Manager *m) {
718db961 189 _cleanup_free_ char *job_of_n = NULL;
03b717a3
MS
190 Iterator i;
191 Job *j;
03b717a3
MS
192 unsigned counter = 0, print_nr;
193 char cylon[6 + CYLON_BUFFER_EXTRA + 1];
194 unsigned cylon_pos;
195
718db961
LP
196 assert(m);
197
03b717a3
MS
198 print_nr = (m->jobs_in_progress_iteration / JOBS_IN_PROGRESS_PERIOD_DIVISOR) % m->n_running_jobs;
199
200 HASHMAP_FOREACH(j, m->jobs, i)
201 if (j->state == JOB_RUNNING && counter++ == print_nr)
202 break;
203
e970a72e
MS
204 /* m->n_running_jobs must be consistent with the contents of m->jobs,
205 * so the above loop must have succeeded in finding j. */
206 assert(counter == print_nr + 1);
51d122af 207 assert(j);
5a82a91a 208
03b717a3
MS
209 cylon_pos = m->jobs_in_progress_iteration % 14;
210 if (cylon_pos >= 8)
211 cylon_pos = 14 - cylon_pos;
212 draw_cylon(cylon, sizeof(cylon), 6, cylon_pos);
213
214 if (m->n_running_jobs > 1)
215 if (asprintf(&job_of_n, "(%u of %u) ", counter, m->n_running_jobs) < 0)
216 job_of_n = NULL;
217
218 manager_status_printf(m, true, cylon, "%sA %s job is running for %s",
219 strempty(job_of_n), job_type_to_string(j->type), unit_description(j->unit));
03b717a3
MS
220
221 m->jobs_in_progress_iteration++;
222}
223
31a7eb86 224static int manager_watch_idle_pipe(Manager *m) {
31a7eb86
ZJS
225 int r;
226
718db961
LP
227 assert(m);
228
229 if (m->idle_pipe_event_source)
31a7eb86
ZJS
230 return 0;
231
232 if (m->idle_pipe[2] < 0)
233 return 0;
234
718db961
LP
235 r = sd_event_add_io(m->event, m->idle_pipe[2], EPOLLIN, manager_dispatch_idle_pipe_fd, m, &m->idle_pipe_event_source);
236 if (r < 0) {
237 log_error("Failed to watch idle pipe: %s", strerror(-r));
238 return r;
31a7eb86
ZJS
239 }
240
31a7eb86 241 return 0;
31a7eb86
ZJS
242}
243
718db961
LP
244static void manager_close_idle_pipe(Manager *m) {
245 assert(m);
31a7eb86 246
718db961
LP
247 close_pipe(m->idle_pipe);
248 close_pipe(m->idle_pipe + 2);
31a7eb86
ZJS
249}
250
8742514c 251static int manager_setup_time_change(Manager *m) {
718db961 252 int r;
b92bea5d
ZJS
253
254 /* We only care for the cancellation event, hence we set the
255 * timeout to the latest possible value. */
256 struct itimerspec its = {
257 .it_value.tv_sec = TIME_T_MAX,
258 };
8742514c 259
718db961
LP
260 assert(m);
261 assert_cc(sizeof(time_t) == sizeof(TIME_T_MAX));
8742514c
LP
262
263 /* Uses TFD_TIMER_CANCEL_ON_SET to get notifications whenever
264 * CLOCK_REALTIME makes a jump relative to CLOCK_MONOTONIC */
265
718db961
LP
266 m->time_change_fd = timerfd_create(CLOCK_REALTIME, TFD_NONBLOCK|TFD_CLOEXEC);
267 if (m->time_change_fd < 0) {
8742514c
LP
268 log_error("Failed to create timerfd: %m");
269 return -errno;
270 }
271
718db961 272 if (timerfd_settime(m->time_change_fd, TFD_TIMER_ABSTIME|TFD_TIMER_CANCEL_ON_SET, &its, NULL) < 0) {
8742514c 273 log_debug("Failed to set up TFD_TIMER_CANCEL_ON_SET, ignoring: %m");
718db961
LP
274 close_nointr_nofail(m->time_change_fd);
275 m->time_change_fd = -1;
8742514c
LP
276 return 0;
277 }
278
718db961
LP
279 r = sd_event_add_io(m->event, m->time_change_fd, EPOLLIN, manager_dispatch_time_change_fd, m, &m->time_change_event_source);
280 if (r < 0) {
281 log_error("Failed to create time change event source: %s", strerror(-r));
282 return r;
8742514c
LP
283 }
284
285 log_debug("Set up TFD_TIMER_CANCEL_ON_SET timerfd.");
286
287 return 0;
288}
289
80876c20 290static int enable_special_signals(Manager *m) {
718db961 291 _cleanup_close_ int fd = -1;
80876c20
LP
292
293 assert(m);
294
a41b539e 295 /* Enable that we get SIGINT on control-alt-del. In containers
c9999773
LP
296 * this will fail with EPERM (older) or EINVAL (newer), so
297 * ignore that. */
298 if (reboot(RB_DISABLE_CAD) < 0 && errno != EPERM && errno != EINVAL)
80876c20
LP
299 log_warning("Failed to enable ctrl-alt-del handling: %m");
300
a41b539e
LP
301 fd = open_terminal("/dev/tty0", O_RDWR|O_NOCTTY|O_CLOEXEC);
302 if (fd < 0) {
303 /* Support systems without virtual console */
304 if (fd != -ENOENT)
305 log_warning("Failed to open /dev/tty0: %m");
306 } else {
80876c20
LP
307 /* Enable that we get SIGWINCH on kbrequest */
308 if (ioctl(fd, KDSIGACCEPT, SIGWINCH) < 0)
309 log_warning("Failed to enable kbrequest handling: %s", strerror(errno));
80876c20
LP
310 }
311
312 return 0;
313}
314
ce578209 315static int manager_setup_signals(Manager *m) {
b92bea5d
ZJS
316 struct sigaction sa = {
317 .sa_handler = SIG_DFL,
318 .sa_flags = SA_NOCLDSTOP|SA_RESTART,
319 };
718db961
LP
320 sigset_t mask;
321 int r;
60918275 322
ce578209
LP
323 assert(m);
324
57c0c30e 325 /* We are not interested in SIGSTOP and friends. */
57c0c30e
LP
326 assert_se(sigaction(SIGCHLD, &sa, NULL) == 0);
327
ce578209 328 assert_se(sigemptyset(&mask) == 0);
7d793605
LP
329
330 sigset_add_many(&mask,
331 SIGCHLD, /* Child died */
332 SIGTERM, /* Reexecute daemon */
333 SIGHUP, /* Reload configuration */
334 SIGUSR1, /* systemd/upstart: reconnect to D-Bus */
335 SIGUSR2, /* systemd: dump status */
336 SIGINT, /* Kernel sends us this on control-alt-del */
337 SIGWINCH, /* Kernel sends us this on kbrequest (alt-arrowup) */
338 SIGPWR, /* Some kernel drivers and upsd send us this on power failure */
339 SIGRTMIN+0, /* systemd: start default.target */
0003d1ab 340 SIGRTMIN+1, /* systemd: isolate rescue.target */
7d793605
LP
341 SIGRTMIN+2, /* systemd: isolate emergency.target */
342 SIGRTMIN+3, /* systemd: start halt.target */
343 SIGRTMIN+4, /* systemd: start poweroff.target */
344 SIGRTMIN+5, /* systemd: start reboot.target */
0003d1ab
LP
345 SIGRTMIN+6, /* systemd: start kexec.target */
346 SIGRTMIN+13, /* systemd: Immediate halt */
347 SIGRTMIN+14, /* systemd: Immediate poweroff */
348 SIGRTMIN+15, /* systemd: Immediate reboot */
349 SIGRTMIN+16, /* systemd: Immediate kexec */
0658666b
LP
350 SIGRTMIN+20, /* systemd: enable status messages */
351 SIGRTMIN+21, /* systemd: disable status messages */
253ee27a
LP
352 SIGRTMIN+22, /* systemd: set log level to LOG_DEBUG */
353 SIGRTMIN+23, /* systemd: set log level to LOG_INFO */
600b704e 354 SIGRTMIN+24, /* systemd: Immediate exit (--user only) */
4cfa2c99 355 SIGRTMIN+26, /* systemd: set log target to journal-or-kmsg */
253ee27a
LP
356 SIGRTMIN+27, /* systemd: set log target to console */
357 SIGRTMIN+28, /* systemd: set log target to kmsg */
358 SIGRTMIN+29, /* systemd: set log target to syslog-or-kmsg */
7d793605 359 -1);
ce578209
LP
360 assert_se(sigprocmask(SIG_SETMASK, &mask, NULL) == 0);
361
718db961
LP
362 m->signal_fd = signalfd(-1, &mask, SFD_NONBLOCK|SFD_CLOEXEC);
363 if (m->signal_fd < 0)
ce578209
LP
364 return -errno;
365
718db961
LP
366 r = sd_event_add_io(m->event, m->signal_fd, EPOLLIN, manager_dispatch_signal_fd, m, &m->signal_event_source);
367 if (r < 0)
368 return r;
ce578209 369
67445f4e 370 if (m->running_as == SYSTEMD_SYSTEM)
80876c20 371 return enable_special_signals(m);
e1414003 372
ce578209
LP
373 return 0;
374}
375
e21fea24 376static int manager_default_environment(Manager *m) {
71ecc858
LP
377 assert(m);
378
e21fea24
KS
379 if (m->running_as == SYSTEMD_SYSTEM) {
380 /* The system manager always starts with a clean
381 * environment for its children. It does not import
382 * the kernel or the parents exported variables.
383 *
384 * The initial passed environ is untouched to keep
385 * /proc/self/environ valid; it is used for tagging
386 * the init process inside containers. */
43638332
ZJS
387 m->environment = strv_new("PATH=" DEFAULT_PATH,
388 NULL);
e21fea24
KS
389
390 /* Import locale variables LC_*= from configuration */
391 locale_setup(&m->environment);
392 } else
393 /* The user manager passes its own environment
394 * along to its children. */
395 m->environment = strv_copy(environ);
71ecc858 396
e21fea24
KS
397 if (!m->environment)
398 return -ENOMEM;
8b55b8c4 399
9d5a3757
LP
400 strv_sort(m->environment);
401
e21fea24 402 return 0;
71ecc858
LP
403}
404
6fa48533 405int manager_new(SystemdRunningAs running_as, bool reexecuting, Manager **_m) {
ce578209 406 Manager *m;
8e274523 407 int r = -ENOMEM;
a0a6408e 408 bool try_bus_connect = false;
8e274523
LP
409
410 assert(_m);
a5dab5ce 411 assert(running_as >= 0);
67445f4e 412 assert(running_as < _SYSTEMD_RUNNING_AS_MAX);
ce578209 413
915b3753
LP
414 m = new0(Manager, 1);
415 if (!m)
8e274523 416 return -ENOMEM;
60918275 417
4f8d551f
ZC
418#ifdef ENABLE_EFI
419 if (detect_container(NULL) <= 0)
c51d84dc 420 boot_timestamps(&m->userspace_timestamp, &m->firmware_timestamp, &m->loader_timestamp);
4f8d551f
ZC
421#endif
422
a5dab5ce 423 m->running_as = running_as;
a16e1123 424 m->exit_code = _MANAGER_EXIT_CODE_INVALID;
80876c20 425
718db961 426 m->idle_pipe[0] = m->idle_pipe[1] = m->idle_pipe[2] = m->idle_pipe[3] = -1;
8742514c 427
718db961 428 m->pin_cgroupfs_fd = m->notify_fd = m->signal_fd = m->time_change_fd = m->dev_autofs_fd = m->private_listen_fd = -1;
ea430986 429 m->current_job_id = 1; /* start as id #1, so that we can leave #0 around as "null-like" value */
9152c765 430
e21fea24
KS
431 r = manager_default_environment(m);
432 if (r < 0)
1137a57c
LP
433 goto fail;
434
718db961
LP
435 r = hashmap_ensure_allocated(&m->units, string_hash_func, string_compare_func);
436 if (r < 0)
60918275
LP
437 goto fail;
438
718db961
LP
439 r = hashmap_ensure_allocated(&m->jobs, trivial_hash_func, trivial_compare_func);
440 if (r < 0)
60918275
LP
441 goto fail;
442
718db961
LP
443 r = hashmap_ensure_allocated(&m->cgroup_unit, string_hash_func, string_compare_func);
444 if (r < 0)
9152c765
LP
445 goto fail;
446
718db961
LP
447 r = hashmap_ensure_allocated(&m->watch_pids, trivial_hash_func, trivial_compare_func);
448 if (r < 0)
8e274523
LP
449 goto fail;
450
718db961
LP
451 r = hashmap_ensure_allocated(&m->watch_bus, string_hash_func, string_compare_func);
452 if (r < 0)
05e343b7
LP
453 goto fail;
454
718db961
LP
455 r = sd_event_default(&m->event);
456 if (r < 0)
8742514c
LP
457 goto fail;
458
459 r = manager_setup_signals(m);
460 if (r < 0)
9152c765
LP
461 goto fail;
462
8742514c
LP
463 r = manager_setup_cgroup(m);
464 if (r < 0)
8e274523
LP
465 goto fail;
466
8742514c
LP
467 r = manager_setup_notify(m);
468 if (r < 0)
9152c765
LP
469 goto fail;
470
8742514c
LP
471 r = manager_setup_time_change(m);
472 if (r < 0)
8c47c732
LP
473 goto fail;
474
a0a6408e
MM
475 if (running_as == SYSTEMD_SYSTEM)
476 try_bus_connect = reexecuting;
477 else if (getenv("DBUS_SESSION_BUS_ADDRESS"))
478 try_bus_connect = true;
479 else
ed002560 480 log_debug("Skipping DBus session bus connection attempt - no DBUS_SESSION_BUS_ADDRESS set...");
ea430986 481
a0a6408e
MM
482 /* Try to connect to the busses, if possible. */
483 r = bus_init(m, try_bus_connect);
484 if (r < 0)
485 goto fail;
486
72bc8d00
LP
487 m->taint_usr = dir_is_empty("/usr") > 0;
488
8e274523
LP
489 *_m = m;
490 return 0;
60918275
LP
491
492fail:
493 manager_free(m);
8e274523 494 return r;
60918275
LP
495}
496
23a177ef 497static unsigned manager_dispatch_cleanup_queue(Manager *m) {
595ed347 498 Unit *u;
23a177ef
LP
499 unsigned n = 0;
500
501 assert(m);
502
595ed347
MS
503 while ((u = m->cleanup_queue)) {
504 assert(u->in_cleanup_queue);
23a177ef 505
595ed347 506 unit_free(u);
23a177ef
LP
507 n++;
508 }
509
510 return n;
511}
512
eced69b3 513enum {
35b8ca3a 514 GC_OFFSET_IN_PATH, /* This one is on the path we were traveling */
eced69b3
LP
515 GC_OFFSET_UNSURE, /* No clue */
516 GC_OFFSET_GOOD, /* We still need this unit */
517 GC_OFFSET_BAD, /* We don't need this unit anymore */
518 _GC_OFFSET_MAX
519};
520
521static void unit_gc_sweep(Unit *u, unsigned gc_marker) {
701cc384
LP
522 Iterator i;
523 Unit *other;
eced69b3 524 bool is_bad;
701cc384
LP
525
526 assert(u);
527
ac155bb8
MS
528 if (u->gc_marker == gc_marker + GC_OFFSET_GOOD ||
529 u->gc_marker == gc_marker + GC_OFFSET_BAD ||
530 u->gc_marker == gc_marker + GC_OFFSET_IN_PATH)
701cc384
LP
531 return;
532
ac155bb8 533 if (u->in_cleanup_queue)
701cc384
LP
534 goto bad;
535
536 if (unit_check_gc(u))
537 goto good;
538
ac155bb8 539 u->gc_marker = gc_marker + GC_OFFSET_IN_PATH;
eced69b3
LP
540
541 is_bad = true;
542
ac155bb8 543 SET_FOREACH(other, u->dependencies[UNIT_REFERENCED_BY], i) {
701cc384
LP
544 unit_gc_sweep(other, gc_marker);
545
ac155bb8 546 if (other->gc_marker == gc_marker + GC_OFFSET_GOOD)
701cc384 547 goto good;
eced69b3 548
ac155bb8 549 if (other->gc_marker != gc_marker + GC_OFFSET_BAD)
eced69b3 550 is_bad = false;
701cc384
LP
551 }
552
eced69b3
LP
553 if (is_bad)
554 goto bad;
555
556 /* We were unable to find anything out about this entry, so
557 * let's investigate it later */
ac155bb8 558 u->gc_marker = gc_marker + GC_OFFSET_UNSURE;
eced69b3
LP
559 unit_add_to_gc_queue(u);
560 return;
561
701cc384 562bad:
eced69b3
LP
563 /* We definitely know that this one is not useful anymore, so
564 * let's mark it for deletion */
ac155bb8 565 u->gc_marker = gc_marker + GC_OFFSET_BAD;
eced69b3 566 unit_add_to_cleanup_queue(u);
701cc384
LP
567 return;
568
569good:
ac155bb8 570 u->gc_marker = gc_marker + GC_OFFSET_GOOD;
701cc384
LP
571}
572
573static unsigned manager_dispatch_gc_queue(Manager *m) {
595ed347 574 Unit *u;
701cc384 575 unsigned n = 0;
eced69b3 576 unsigned gc_marker;
701cc384
LP
577
578 assert(m);
579
cf1265e1 580 /* log_debug("Running GC..."); */
701cc384 581
eced69b3
LP
582 m->gc_marker += _GC_OFFSET_MAX;
583 if (m->gc_marker + _GC_OFFSET_MAX <= _GC_OFFSET_MAX)
c9c0cadb 584 m->gc_marker = 1;
701cc384 585
eced69b3
LP
586 gc_marker = m->gc_marker;
587
595ed347
MS
588 while ((u = m->gc_queue)) {
589 assert(u->in_gc_queue);
701cc384 590
595ed347 591 unit_gc_sweep(u, gc_marker);
eced69b3 592
71fda00f 593 LIST_REMOVE(gc_queue, m->gc_queue, u);
595ed347 594 u->in_gc_queue = false;
701cc384
LP
595
596 n++;
597
595ed347
MS
598 if (u->gc_marker == gc_marker + GC_OFFSET_BAD ||
599 u->gc_marker == gc_marker + GC_OFFSET_UNSURE) {
66870f90 600 log_debug_unit(u->id, "Collecting %s", u->id);
595ed347
MS
601 u->gc_marker = gc_marker + GC_OFFSET_BAD;
602 unit_add_to_cleanup_queue(u);
701cc384
LP
603 }
604 }
605
606 m->n_in_gc_queue = 0;
701cc384
LP
607
608 return n;
609}
610
a16e1123 611static void manager_clear_jobs_and_units(Manager *m) {
a16e1123 612 Unit *u;
60918275
LP
613
614 assert(m);
615
87f0e418
LP
616 while ((u = hashmap_first(m->units)))
617 unit_free(u);
964e0949
LP
618
619 manager_dispatch_cleanup_queue(m);
620
621 assert(!m->load_queue);
622 assert(!m->run_queue);
623 assert(!m->dbus_unit_queue);
624 assert(!m->dbus_job_queue);
625 assert(!m->cleanup_queue);
626 assert(!m->gc_queue);
627
964e0949
LP
628 assert(hashmap_isempty(m->jobs));
629 assert(hashmap_isempty(m->units));
9e9e2b72
MS
630
631 m->n_on_console = 0;
632 m->n_running_jobs = 0;
a16e1123
LP
633}
634
635void manager_free(Manager *m) {
636 UnitType c;
c93ff2e9 637 int i;
87f0e418 638
a16e1123
LP
639 assert(m);
640
641 manager_clear_jobs_and_units(m);
23a177ef 642
7824bbeb
LP
643 for (c = 0; c < _UNIT_TYPE_MAX; c++)
644 if (unit_vtable[c]->shutdown)
645 unit_vtable[c]->shutdown(m);
646
a16e1123
LP
647 /* If we reexecute ourselves, we keep the root cgroup
648 * around */
c6c18be3 649 manager_shutdown_cgroup(m, m->exit_code != MANAGER_REEXECUTE);
8e274523 650
5a1e9937
LP
651 manager_undo_generators(m);
652
5e8d1c9a 653 bus_done(m);
ea430986 654
87f0e418 655 hashmap_free(m->units);
60918275 656 hashmap_free(m->jobs);
9152c765 657 hashmap_free(m->watch_pids);
05e343b7 658 hashmap_free(m->watch_bus);
9152c765 659
718db961
LP
660 sd_event_source_unref(m->signal_event_source);
661 sd_event_source_unref(m->notify_event_source);
662 sd_event_source_unref(m->time_change_event_source);
663 sd_event_source_unref(m->jobs_in_progress_event_source);
664 sd_event_source_unref(m->idle_pipe_event_source);
665
666 if (m->signal_fd >= 0)
667 close_nointr_nofail(m->signal_fd);
668 if (m->notify_fd >= 0)
669 close_nointr_nofail(m->notify_fd);
670 if (m->time_change_fd >= 0)
671 close_nointr_nofail(m->time_change_fd);
672
673 manager_close_idle_pipe(m);
674
675 sd_event_unref(m->event);
60918275 676
c952c6ec
LP
677 free(m->notify_socket);
678
84e3543e 679 lookup_paths_free(&m->lookup_paths);
1137a57c 680 strv_free(m->environment);
036643a2 681
4ad49000 682 hashmap_free(m->cgroup_unit);
c6c18be3 683 set_free_free(m->unit_path_cache);
33be102a 684
664f88a7
LP
685 free(m->switch_root);
686 free(m->switch_root_init);
687
c93ff2e9
FC
688 for (i = 0; i < RLIMIT_NLIMITS; i++)
689 free(m->rlimit[i]);
690
a57f7e2c
LP
691 assert(hashmap_isempty(m->units_requiring_mounts_for));
692 hashmap_free(m->units_requiring_mounts_for);
693
60918275
LP
694 free(m);
695}
696
a16e1123
LP
697int manager_enumerate(Manager *m) {
698 int r = 0, q;
f50e0a01 699 UnitType c;
f50e0a01
LP
700
701 assert(m);
702
a16e1123
LP
703 /* Let's ask every type to load all units from disk/kernel
704 * that it might know */
f50e0a01 705 for (c = 0; c < _UNIT_TYPE_MAX; c++)
a57f7e2c
LP
706 if (unit_vtable[c]->enumerate) {
707 q = unit_vtable[c]->enumerate(m);
708 if (q < 0)
a16e1123 709 r = q;
a57f7e2c 710 }
f50e0a01
LP
711
712 manager_dispatch_load_queue(m);
a16e1123
LP
713 return r;
714}
715
9588bc32 716static int manager_coldplug(Manager *m) {
a16e1123
LP
717 int r = 0, q;
718 Iterator i;
719 Unit *u;
720 char *k;
721
722 assert(m);
f50e0a01
LP
723
724 /* Then, let's set up their initial state. */
725 HASHMAP_FOREACH_KEY(u, k, m->units, i) {
726
727 /* ignore aliases */
ac155bb8 728 if (u->id != k)
f50e0a01
LP
729 continue;
730
cca098b0
LP
731 if ((q = unit_coldplug(u)) < 0)
732 r = q;
f50e0a01
LP
733 }
734
a16e1123
LP
735 return r;
736}
737
fe51822e
LP
738static void manager_build_unit_path_cache(Manager *m) {
739 char **i;
7fd1b19b 740 _cleanup_free_ DIR *d = NULL;
fe51822e
LP
741 int r;
742
743 assert(m);
744
745 set_free_free(m->unit_path_cache);
746
874310b7
ZJS
747 m->unit_path_cache = set_new(string_hash_func, string_compare_func);
748 if (!m->unit_path_cache) {
fe51822e
LP
749 log_error("Failed to allocate unit path cache.");
750 return;
751 }
752
753 /* This simply builds a list of files we know exist, so that
754 * we don't always have to go to disk */
755
756 STRV_FOREACH(i, m->lookup_paths.unit_path) {
757 struct dirent *de;
758
bd0af849
ZJS
759 d = opendir(*i);
760 if (!d) {
874310b7
ZJS
761 if (errno != ENOENT)
762 log_error("Failed to open directory %s: %m", *i);
fe51822e
LP
763 continue;
764 }
765
766 while ((de = readdir(d))) {
767 char *p;
768
769 if (ignore_file(de->d_name))
770 continue;
771
b7def684 772 p = strjoin(streq(*i, "/") ? "" : *i, "/", de->d_name, NULL);
44d91056 773 if (!p) {
fe51822e
LP
774 r = -ENOMEM;
775 goto fail;
776 }
777
ef42202a
ZJS
778 r = set_consume(m->unit_path_cache, p);
779 if (r < 0)
fe51822e 780 goto fail;
fe51822e
LP
781 }
782
783 closedir(d);
784 d = NULL;
785 }
786
787 return;
788
789fail:
790 log_error("Failed to build unit path cache: %s", strerror(-r));
791
792 set_free_free(m->unit_path_cache);
793 m->unit_path_cache = NULL;
fe51822e
LP
794}
795
9588bc32
LP
796
797static int manager_distribute_fds(Manager *m, FDSet *fds) {
798 Unit *u;
799 Iterator i;
800 int r;
801
802 assert(m);
803
804 HASHMAP_FOREACH(u, m->units, i) {
805
806 if (fdset_size(fds) <= 0)
807 break;
808
809 if (UNIT_VTABLE(u)->distribute_fds) {
810 r = UNIT_VTABLE(u)->distribute_fds(u, fds);
811 if (r < 0)
812 return r;
813 }
814 }
815
816 return 0;
817}
818
a16e1123
LP
819int manager_startup(Manager *m, FILE *serialization, FDSet *fds) {
820 int r, q;
821
822 assert(m);
823
518d10e9 824 dual_timestamp_get(&m->generators_start_timestamp);
5a1e9937 825 manager_run_generators(m);
518d10e9 826 dual_timestamp_get(&m->generators_finish_timestamp);
5a1e9937 827
07719a21
LP
828 r = lookup_paths_init(
829 &m->lookup_paths, m->running_as, true,
830 m->generator_unit_path,
831 m->generator_unit_path_early,
832 m->generator_unit_path_late);
833 if (r < 0)
834 return r;
835
fe51822e
LP
836 manager_build_unit_path_cache(m);
837
9f611ad8
LP
838 /* If we will deserialize make sure that during enumeration
839 * this is already known, so we increase the counter here
840 * already */
841 if (serialization)
a7556052 842 m->n_reloading ++;
9f611ad8 843
a16e1123 844 /* First, enumerate what we can from all config files */
718db961 845 dual_timestamp_get(&m->units_load_start_timestamp);
a16e1123 846 r = manager_enumerate(m);
718db961 847 dual_timestamp_get(&m->units_load_finish_timestamp);
a16e1123
LP
848
849 /* Second, deserialize if there is something to deserialize */
07719a21
LP
850 if (serialization) {
851 q = manager_deserialize(m, serialization, fds);
852 if (q < 0)
a16e1123 853 r = q;
07719a21 854 }
a16e1123 855
01e10de3
LP
856 /* Any fds left? Find some unit which wants them. This is
857 * useful to allow container managers to pass some file
858 * descriptors to us pre-initialized. This enables
859 * socket-based activation of entire containers. */
860 if (fdset_size(fds) > 0) {
861 q = manager_distribute_fds(m, fds);
862 if (q < 0)
863 r = q;
864 }
865
a16e1123 866 /* Third, fire things up! */
07719a21
LP
867 q = manager_coldplug(m);
868 if (q < 0)
a16e1123
LP
869 r = q;
870
9f611ad8 871 if (serialization) {
a7556052
LP
872 assert(m->n_reloading > 0);
873 m->n_reloading --;
71445ae7
LP
874
875 /* Let's wait for the UnitNew/JobNew messages being
876 * sent, before we notify that the reload is
877 * finished */
878 m->send_reloading_done = true;
9f611ad8
LP
879 }
880
a16e1123 881 return r;
f50e0a01
LP
882}
883
718db961 884int manager_add_job(Manager *m, JobType type, Unit *unit, JobMode mode, bool override, sd_bus_error *e, Job **_ret) {
e5b5ae50 885 int r;
7527cb52 886 Transaction *tr;
e5b5ae50
LP
887
888 assert(m);
889 assert(type < _JOB_TYPE_MAX);
87f0e418 890 assert(unit);
e5b5ae50 891 assert(mode < _JOB_MODE_MAX);
60918275 892
398ef8ba 893 if (mode == JOB_ISOLATE && type != JOB_START) {
718db961 894 sd_bus_error_setf(e, SD_BUS_ERROR_INVALID_ARGS, "Isolate is only valid for start.");
c497c7a9 895 return -EINVAL;
398ef8ba 896 }
c497c7a9 897
ac155bb8 898 if (mode == JOB_ISOLATE && !unit->allow_isolate) {
718db961 899 sd_bus_error_setf(e, BUS_ERROR_NO_ISOLATION, "Operation refused, unit may not be isolated.");
2528a7a6
LP
900 return -EPERM;
901 }
902
66870f90
ZJS
903 log_debug_unit(unit->id,
904 "Trying to enqueue job %s/%s/%s", unit->id,
905 job_type_to_string(type), job_mode_to_string(mode));
9f04bd52 906
e0209d83
MS
907 job_type_collapse(&type, unit);
908
23ade460 909 tr = transaction_new(mode == JOB_REPLACE_IRREVERSIBLY);
7527cb52
MS
910 if (!tr)
911 return -ENOMEM;
11dd41ce 912
7527cb52
MS
913 r = transaction_add_job_and_dependencies(tr, type, unit, NULL, true, override, false,
914 mode == JOB_IGNORE_DEPENDENCIES || mode == JOB_IGNORE_REQUIREMENTS,
b94fbd30 915 mode == JOB_IGNORE_DEPENDENCIES, e);
7527cb52
MS
916 if (r < 0)
917 goto tr_abort;
c497c7a9 918
7527cb52
MS
919 if (mode == JOB_ISOLATE) {
920 r = transaction_add_isolate_jobs(tr, m);
921 if (r < 0)
922 goto tr_abort;
923 }
924
925 r = transaction_activate(tr, m, mode, e);
926 if (r < 0)
927 goto tr_abort;
e5b5ae50 928
66870f90
ZJS
929 log_debug_unit(unit->id,
930 "Enqueued job %s/%s as %u", unit->id,
931 job_type_to_string(type), (unsigned) tr->anchor_job->id);
f50e0a01 932
e5b5ae50 933 if (_ret)
b94fbd30 934 *_ret = tr->anchor_job;
60918275 935
7527cb52 936 transaction_free(tr);
e5b5ae50 937 return 0;
7527cb52
MS
938
939tr_abort:
940 transaction_abort(tr);
941 transaction_free(tr);
942 return r;
e5b5ae50 943}
60918275 944
718db961 945int manager_add_job_by_name(Manager *m, JobType type, const char *name, JobMode mode, bool override, sd_bus_error *e, Job **_ret) {
28247076
LP
946 Unit *unit;
947 int r;
948
949 assert(m);
950 assert(type < _JOB_TYPE_MAX);
951 assert(name);
952 assert(mode < _JOB_MODE_MAX);
953
c3090674
LP
954 r = manager_load_unit(m, name, NULL, NULL, &unit);
955 if (r < 0)
28247076
LP
956 return r;
957
398ef8ba 958 return manager_add_job(m, type, unit, mode, override, e, _ret);
28247076
LP
959}
960
60918275
LP
961Job *manager_get_job(Manager *m, uint32_t id) {
962 assert(m);
963
964 return hashmap_get(m->jobs, UINT32_TO_PTR(id));
965}
966
87f0e418 967Unit *manager_get_unit(Manager *m, const char *name) {
60918275
LP
968 assert(m);
969 assert(name);
970
87f0e418 971 return hashmap_get(m->units, name);
60918275
LP
972}
973
c1e1601e 974unsigned manager_dispatch_load_queue(Manager *m) {
595ed347 975 Unit *u;
c1e1601e 976 unsigned n = 0;
60918275
LP
977
978 assert(m);
979
223dabab
LP
980 /* Make sure we are not run recursively */
981 if (m->dispatching_load_queue)
c1e1601e 982 return 0;
223dabab
LP
983
984 m->dispatching_load_queue = true;
985
87f0e418 986 /* Dispatches the load queue. Takes a unit from the queue and
60918275
LP
987 * tries to load its data until the queue is empty */
988
595ed347
MS
989 while ((u = m->load_queue)) {
990 assert(u->in_load_queue);
034c6ed7 991
595ed347 992 unit_load(u);
c1e1601e 993 n++;
60918275
LP
994 }
995
223dabab 996 m->dispatching_load_queue = false;
c1e1601e 997 return n;
60918275
LP
998}
999
c2756a68
LP
1000int manager_load_unit_prepare(
1001 Manager *m,
1002 const char *name,
1003 const char *path,
718db961 1004 sd_bus_error *e,
c2756a68
LP
1005 Unit **_ret) {
1006
87f0e418 1007 Unit *ret;
7d17cfbc 1008 UnitType t;
60918275
LP
1009 int r;
1010
1011 assert(m);
9e2f7c11 1012 assert(name || path);
60918275 1013
db06e3b6
LP
1014 /* This will prepare the unit for loading, but not actually
1015 * load anything from disk. */
0301abf4 1016
718db961
LP
1017 if (path && !is_path(path))
1018 return sd_bus_error_setf(e, SD_BUS_ERROR_INVALID_ARGS, "Path %s is not absolute.", path);
9e2f7c11
LP
1019
1020 if (!name)
9eb977db 1021 name = path_get_file_name(path);
9e2f7c11 1022
7d17cfbc
MS
1023 t = unit_name_to_type(name);
1024
718db961
LP
1025 if (t == _UNIT_TYPE_INVALID || !unit_name_is_valid(name, false))
1026 return sd_bus_error_setf(e, SD_BUS_ERROR_INVALID_ARGS, "Unit name %s is not valid.", name);
60918275 1027
7d17cfbc
MS
1028 ret = manager_get_unit(m, name);
1029 if (ret) {
034c6ed7 1030 *_ret = ret;
413d6313 1031 return 1;
034c6ed7 1032 }
60918275 1033
7d17cfbc
MS
1034 ret = unit_new(m, unit_vtable[t]->object_size);
1035 if (!ret)
60918275
LP
1036 return -ENOMEM;
1037
7d17cfbc 1038 if (path) {
ac155bb8
MS
1039 ret->fragment_path = strdup(path);
1040 if (!ret->fragment_path) {
0301abf4
LP
1041 unit_free(ret);
1042 return -ENOMEM;
1043 }
7d17cfbc 1044 }
0301abf4 1045
1058cbf2
ZJS
1046 r = unit_add_name(ret, name);
1047 if (r < 0) {
87f0e418 1048 unit_free(ret);
1ffba6fe 1049 return r;
60918275
LP
1050 }
1051
87f0e418 1052 unit_add_to_load_queue(ret);
c1e1601e 1053 unit_add_to_dbus_queue(ret);
949061f0 1054 unit_add_to_gc_queue(ret);
c1e1601e 1055
db06e3b6
LP
1056 if (_ret)
1057 *_ret = ret;
1058
1059 return 0;
1060}
1061
c2756a68
LP
1062int manager_load_unit(
1063 Manager *m,
1064 const char *name,
1065 const char *path,
718db961 1066 sd_bus_error *e,
c2756a68
LP
1067 Unit **_ret) {
1068
db06e3b6
LP
1069 int r;
1070
1071 assert(m);
1072
1073 /* This will load the service information files, but not actually
1074 * start any services or anything. */
1075
c3090674
LP
1076 r = manager_load_unit_prepare(m, name, path, e, _ret);
1077 if (r != 0)
db06e3b6
LP
1078 return r;
1079
f50e0a01 1080 manager_dispatch_load_queue(m);
60918275 1081
9e2f7c11 1082 if (_ret)
413d6313 1083 *_ret = unit_follow_merge(*_ret);
9e2f7c11 1084
60918275
LP
1085 return 0;
1086}
a66d02c3 1087
cea8e32e 1088void manager_dump_jobs(Manager *s, FILE *f, const char *prefix) {
034c6ed7 1089 Iterator i;
a66d02c3
LP
1090 Job *j;
1091
1092 assert(s);
1093 assert(f);
1094
034c6ed7 1095 HASHMAP_FOREACH(j, s->jobs, i)
cea8e32e 1096 job_dump(j, f, prefix);
a66d02c3
LP
1097}
1098
87f0e418 1099void manager_dump_units(Manager *s, FILE *f, const char *prefix) {
034c6ed7 1100 Iterator i;
87f0e418 1101 Unit *u;
11dd41ce 1102 const char *t;
a66d02c3
LP
1103
1104 assert(s);
1105 assert(f);
1106
87f0e418 1107 HASHMAP_FOREACH_KEY(u, t, s->units, i)
ac155bb8 1108 if (u->id == t)
87f0e418 1109 unit_dump(u, f, prefix);
a66d02c3 1110}
7fad411c
LP
1111
1112void manager_clear_jobs(Manager *m) {
1113 Job *j;
1114
1115 assert(m);
1116
7fad411c 1117 while ((j = hashmap_first(m->jobs)))
5273510e
MS
1118 /* No need to recurse. We're cancelling all jobs. */
1119 job_finish_and_invalidate(j, JOB_CANCELED, false);
7fad411c 1120}
83c60c9f 1121
9588bc32 1122static unsigned manager_dispatch_run_queue(Manager *m) {
83c60c9f 1123 Job *j;
c1e1601e 1124 unsigned n = 0;
83c60c9f 1125
034c6ed7 1126 if (m->dispatching_run_queue)
c1e1601e 1127 return 0;
034c6ed7
LP
1128
1129 m->dispatching_run_queue = true;
9152c765 1130
034c6ed7 1131 while ((j = m->run_queue)) {
ac1135be 1132 assert(j->installed);
034c6ed7
LP
1133 assert(j->in_run_queue);
1134
1135 job_run_and_invalidate(j);
c1e1601e 1136 n++;
9152c765 1137 }
034c6ed7
LP
1138
1139 m->dispatching_run_queue = false;
03b717a3 1140
a0b64226 1141 if (m->n_running_jobs > 0)
03b717a3
MS
1142 manager_watch_jobs_in_progress(m);
1143
31a7eb86
ZJS
1144 if (m->n_on_console > 0)
1145 manager_watch_idle_pipe(m);
1146
c1e1601e
LP
1147 return n;
1148}
1149
9588bc32 1150static unsigned manager_dispatch_dbus_queue(Manager *m) {
c1e1601e 1151 Job *j;
595ed347 1152 Unit *u;
c1e1601e
LP
1153 unsigned n = 0;
1154
1155 assert(m);
1156
1157 if (m->dispatching_dbus_queue)
1158 return 0;
1159
1160 m->dispatching_dbus_queue = true;
1161
595ed347
MS
1162 while ((u = m->dbus_unit_queue)) {
1163 assert(u->in_dbus_queue);
c1e1601e 1164
595ed347 1165 bus_unit_send_change_signal(u);
c1e1601e
LP
1166 n++;
1167 }
1168
1169 while ((j = m->dbus_job_queue)) {
1170 assert(j->in_dbus_queue);
1171
1172 bus_job_send_change_signal(j);
1173 n++;
1174 }
1175
1176 m->dispatching_dbus_queue = false;
71445ae7
LP
1177
1178 if (m->send_reloading_done) {
1179 m->send_reloading_done = false;
1180
718db961 1181 bus_manager_send_reloading(m, false);
71445ae7
LP
1182 }
1183
718db961
LP
1184 if (m->queued_message)
1185 bus_send_queued_message(m);
1186
c1e1601e 1187 return n;
9152c765
LP
1188}
1189
718db961
LP
1190static int manager_dispatch_notify_fd(sd_event_source *source, int fd, uint32_t revents, void *userdata) {
1191 Manager *m = userdata;
8c47c732
LP
1192 ssize_t n;
1193
1194 assert(m);
718db961
LP
1195 assert(m->notify_fd == fd);
1196
1197 if (revents != EPOLLIN) {
1198 log_warning("Got unexpected poll event for notify fd.");
1199 return 0;
1200 }
8c47c732
LP
1201
1202 for (;;) {
1203 char buf[4096];
b92bea5d
ZJS
1204 struct iovec iovec = {
1205 .iov_base = buf,
1206 .iov_len = sizeof(buf)-1,
1207 };
1208
8c47c732
LP
1209 union {
1210 struct cmsghdr cmsghdr;
1211 uint8_t buf[CMSG_SPACE(sizeof(struct ucred))];
b92bea5d
ZJS
1212 } control = {};
1213
1214 struct msghdr msghdr = {
1215 .msg_iov = &iovec,
1216 .msg_iovlen = 1,
1217 .msg_control = &control,
1218 .msg_controllen = sizeof(control),
1219 };
1220 struct ucred *ucred;
8c47c732 1221 Unit *u;
7fd1b19b 1222 _cleanup_strv_free_ char **tags = NULL;
8c47c732 1223
718db961 1224 n = recvmsg(m->notify_fd, &msghdr, MSG_DONTWAIT);
bd0af849 1225 if (n <= 0) {
b92bea5d 1226 if (n == 0)
8c47c732
LP
1227 return -EIO;
1228
f6144808 1229 if (errno == EAGAIN || errno == EINTR)
8c47c732
LP
1230 break;
1231
1232 return -errno;
1233 }
1234
1235 if (msghdr.msg_controllen < CMSG_LEN(sizeof(struct ucred)) ||
1236 control.cmsghdr.cmsg_level != SOL_SOCKET ||
1237 control.cmsghdr.cmsg_type != SCM_CREDENTIALS ||
1238 control.cmsghdr.cmsg_len != CMSG_LEN(sizeof(struct ucred))) {
1239 log_warning("Received notify message without credentials. Ignoring.");
1240 continue;
1241 }
1242
1243 ucred = (struct ucred*) CMSG_DATA(&control.cmsghdr);
1244
bd0af849
ZJS
1245 u = hashmap_get(m->watch_pids, LONG_TO_PTR(ucred->pid));
1246 if (!u) {
4ad49000 1247 u = manager_get_unit_by_pid(m, ucred->pid);
bd0af849 1248 if (!u) {
7989e1f2 1249 log_warning("Cannot find unit for notify message of PID %lu.", (unsigned long) ucred->pid);
8c47c732
LP
1250 continue;
1251 }
bd0af849 1252 }
8c47c732 1253
8c40acf7
LP
1254 assert((size_t) n < sizeof(buf));
1255 buf[n] = 0;
bd0af849
ZJS
1256 tags = strv_split(buf, "\n\r");
1257 if (!tags)
1258 return log_oom();
8c47c732 1259
66870f90 1260 log_debug_unit(u->id, "Got notification message for unit %s", u->id);
8c47c732
LP
1261
1262 if (UNIT_VTABLE(u)->notify_message)
c952c6ec 1263 UNIT_VTABLE(u)->notify_message(u, ucred->pid, tags);
8c47c732
LP
1264 }
1265
1266 return 0;
1267}
1268
034c6ed7 1269static int manager_dispatch_sigchld(Manager *m) {
9152c765
LP
1270 assert(m);
1271
1272 for (;;) {
b92bea5d 1273 siginfo_t si = {};
87f0e418 1274 Unit *u;
8c47c732 1275 int r;
9152c765 1276
4112df16
LP
1277 /* First we call waitd() for a PID and do not reap the
1278 * zombie. That way we can still access /proc/$PID for
1279 * it while it is a zombie. */
1280 if (waitid(P_ALL, 0, &si, WEXITED|WNOHANG|WNOWAIT) < 0) {
acbb0225
LP
1281
1282 if (errno == ECHILD)
1283 break;
1284
4112df16
LP
1285 if (errno == EINTR)
1286 continue;
1287
9152c765 1288 return -errno;
acbb0225 1289 }
9152c765 1290
4112df16 1291 if (si.si_pid <= 0)
9152c765
LP
1292 break;
1293
15d5d9d9 1294 if (si.si_code == CLD_EXITED || si.si_code == CLD_KILLED || si.si_code == CLD_DUMPED) {
7fd1b19b 1295 _cleanup_free_ char *name = NULL;
4112df16 1296
87d2c1ff 1297 get_process_comm(si.si_pid, &name);
bb00e604 1298 log_debug("Got SIGCHLD for process %lu (%s)", (unsigned long) si.si_pid, strna(name));
4112df16
LP
1299 }
1300
8c47c732
LP
1301 /* Let's flush any message the dying child might still
1302 * have queued for us. This ensures that the process
1303 * still exists in /proc so that we can figure out
1304 * which cgroup and hence unit it belongs to. */
718db961 1305 r = manager_dispatch_notify_fd(m->notify_event_source, m->notify_fd, EPOLLIN, m);
bd0af849 1306 if (r < 0)
8c47c732
LP
1307 return r;
1308
1309 /* And now figure out the unit this belongs to */
bd0af849
ZJS
1310 u = hashmap_get(m->watch_pids, LONG_TO_PTR(si.si_pid));
1311 if (!u)
4ad49000 1312 u = manager_get_unit_by_pid(m, si.si_pid);
8c47c732 1313
4112df16
LP
1314 /* And now, we actually reap the zombie. */
1315 if (waitid(P_PID, si.si_pid, &si, WEXITED) < 0) {
1316 if (errno == EINTR)
1317 continue;
1318
1319 return -errno;
1320 }
1321
034c6ed7
LP
1322 if (si.si_code != CLD_EXITED && si.si_code != CLD_KILLED && si.si_code != CLD_DUMPED)
1323 continue;
1324
bb00e604
LP
1325 log_debug("Child %lu died (code=%s, status=%i/%s)",
1326 (long unsigned) si.si_pid,
4112df16
LP
1327 sigchld_code_to_string(si.si_code),
1328 si.si_status,
d06dacd0
LP
1329 strna(si.si_code == CLD_EXITED
1330 ? exit_status_to_string(si.si_status, EXIT_STATUS_FULL)
1331 : signal_to_string(si.si_status)));
acbb0225 1332
8c47c732 1333 if (!u)
9152c765
LP
1334 continue;
1335
66870f90
ZJS
1336 log_debug_unit(u->id,
1337 "Child %lu belongs to %s", (long unsigned) si.si_pid, u->id);
6c1a0478 1338
c6c18be3 1339 hashmap_remove(m->watch_pids, LONG_TO_PTR(si.si_pid));
87f0e418 1340 UNIT_VTABLE(u)->sigchld_event(u, si.si_pid, si.si_code, si.si_status);
9152c765
LP
1341 }
1342
1343 return 0;
1344}
1345
7d793605 1346static int manager_start_target(Manager *m, const char *name, JobMode mode) {
718db961 1347 _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL;
28247076 1348 int r;
398ef8ba 1349
66870f90 1350 log_debug_unit(name, "Activating special unit %s", name);
1e001f52 1351
bd0af849
ZJS
1352 r = manager_add_job_by_name(m, JOB_START, name, mode, true, &error, NULL);
1353 if (r < 0)
718db961 1354 log_error_unit(name, "Failed to enqueue %s job: %s", name, bus_error_message(&error, r));
a1b256b0
LP
1355
1356 return r;
28247076
LP
1357}
1358
718db961
LP
1359static int manager_dispatch_signal_fd(sd_event_source *source, int fd, uint32_t revents, void *userdata) {
1360 Manager *m = userdata;
9152c765
LP
1361 ssize_t n;
1362 struct signalfd_siginfo sfsi;
1363 bool sigchld = false;
1364
1365 assert(m);
718db961
LP
1366 assert(m->signal_fd == fd);
1367
1368 if (revents != EPOLLIN) {
1369 log_warning("Got unexpected events from signal file descriptor.");
1370 return 0;
1371 }
9152c765
LP
1372
1373 for (;;) {
718db961 1374 n = read(m->signal_fd, &sfsi, sizeof(sfsi));
57cb4adf 1375 if (n != sizeof(sfsi)) {
9152c765
LP
1376
1377 if (n >= 0)
1378 return -EIO;
1379
63090775 1380 if (errno == EINTR || errno == EAGAIN)
acbb0225 1381 break;
9152c765
LP
1382
1383 return -errno;
1384 }
1385
67370238
LP
1386 if (sfsi.ssi_pid > 0) {
1387 char *p = NULL;
1388
87d2c1ff 1389 get_process_comm(sfsi.ssi_pid, &p);
dfa7f7e1 1390
67370238 1391 log_debug("Received SIG%s from PID %lu (%s).",
4e240ab0 1392 signal_to_string(sfsi.ssi_signo),
67370238
LP
1393 (unsigned long) sfsi.ssi_pid, strna(p));
1394 free(p);
1395 } else
4e240ab0 1396 log_debug("Received SIG%s.", signal_to_string(sfsi.ssi_signo));
1e001f52 1397
b9cd2ec1
LP
1398 switch (sfsi.ssi_signo) {
1399
4112df16 1400 case SIGCHLD:
9152c765 1401 sigchld = true;
b9cd2ec1
LP
1402 break;
1403
6632c602 1404 case SIGTERM:
67445f4e 1405 if (m->running_as == SYSTEMD_SYSTEM) {
db06e3b6
LP
1406 /* This is for compatibility with the
1407 * original sysvinit */
e11dc4a2 1408 m->exit_code = MANAGER_REEXECUTE;
a1b256b0
LP
1409 break;
1410 }
84e9af1e 1411
a1b256b0 1412 /* Fall through */
e11dc4a2
LP
1413
1414 case SIGINT:
67445f4e 1415 if (m->running_as == SYSTEMD_SYSTEM) {
f49fd1d5 1416 manager_start_target(m, SPECIAL_CTRL_ALT_DEL_TARGET, JOB_REPLACE_IRREVERSIBLY);
84e9af1e
LP
1417 break;
1418 }
1419
a1b256b0 1420 /* Run the exit target if there is one, if not, just exit. */
0003d1ab 1421 if (manager_start_target(m, SPECIAL_EXIT_TARGET, JOB_REPLACE) < 0) {
a1b256b0
LP
1422 m->exit_code = MANAGER_EXIT;
1423 return 0;
1424 }
1425
1426 break;
84e9af1e 1427
28247076 1428 case SIGWINCH:
67445f4e 1429 if (m->running_as == SYSTEMD_SYSTEM)
7d793605 1430 manager_start_target(m, SPECIAL_KBREQUEST_TARGET, JOB_REPLACE);
84e9af1e 1431
28247076
LP
1432 /* This is a nop on non-init */
1433 break;
84e9af1e 1434
28247076 1435 case SIGPWR:
67445f4e 1436 if (m->running_as == SYSTEMD_SYSTEM)
7d793605 1437 manager_start_target(m, SPECIAL_SIGPWR_TARGET, JOB_REPLACE);
84e9af1e 1438
28247076 1439 /* This is a nop on non-init */
84e9af1e 1440 break;
6632c602 1441
1005d14f 1442 case SIGUSR1: {
57ee42ce
LP
1443 Unit *u;
1444
1445 u = manager_get_unit(m, SPECIAL_DBUS_SERVICE);
1446
1447 if (!u || UNIT_IS_ACTIVE_OR_RELOADING(unit_active_state(u))) {
1448 log_info("Trying to reconnect to bus...");
3996fbe2 1449 bus_init(m, true);
57ee42ce
LP
1450 }
1451
1452 if (!u || !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u))) {
1453 log_info("Loading D-Bus service...");
7d793605 1454 manager_start_target(m, SPECIAL_DBUS_SERVICE, JOB_REPLACE);
57ee42ce
LP
1455 }
1456
1457 break;
1458 }
1459
2149e37c 1460 case SIGUSR2: {
718db961
LP
1461 _cleanup_free_ char *dump = NULL;
1462 _cleanup_fclose_ FILE *f = NULL;
2149e37c
LP
1463 size_t size;
1464
718db961
LP
1465 f = open_memstream(&dump, &size);
1466 if (!f) {
2149e37c
LP
1467 log_warning("Failed to allocate memory stream.");
1468 break;
1469 }
1470
1471 manager_dump_units(m, f, "\t");
1472 manager_dump_jobs(m, f, "\t");
1473
1474 if (ferror(f)) {
2149e37c
LP
1475 log_warning("Failed to write status stream");
1476 break;
1477 }
1478
2149e37c 1479 log_dump(LOG_INFO, dump);
1005d14f 1480 break;
2149e37c 1481 }
1005d14f 1482
a16e1123
LP
1483 case SIGHUP:
1484 m->exit_code = MANAGER_RELOAD;
1485 break;
1486
7d793605 1487 default: {
253ee27a 1488
0003d1ab
LP
1489 /* Starting SIGRTMIN+0 */
1490 static const char * const target_table[] = {
7d793605
LP
1491 [0] = SPECIAL_DEFAULT_TARGET,
1492 [1] = SPECIAL_RESCUE_TARGET,
f057408c 1493 [2] = SPECIAL_EMERGENCY_TARGET,
7d793605
LP
1494 [3] = SPECIAL_HALT_TARGET,
1495 [4] = SPECIAL_POWEROFF_TARGET,
0003d1ab
LP
1496 [5] = SPECIAL_REBOOT_TARGET,
1497 [6] = SPECIAL_KEXEC_TARGET
1498 };
1499
1500 /* Starting SIGRTMIN+13, so that target halt and system halt are 10 apart */
1501 static const ManagerExitCode code_table[] = {
1502 [0] = MANAGER_HALT,
1503 [1] = MANAGER_POWEROFF,
1504 [2] = MANAGER_REBOOT,
1505 [3] = MANAGER_KEXEC
7d793605
LP
1506 };
1507
1508 if ((int) sfsi.ssi_signo >= SIGRTMIN+0 &&
0003d1ab 1509 (int) sfsi.ssi_signo < SIGRTMIN+(int) ELEMENTSOF(target_table)) {
764e9b5f
MS
1510 int idx = (int) sfsi.ssi_signo - SIGRTMIN;
1511 manager_start_target(m, target_table[idx],
1512 (idx == 1 || idx == 2) ? JOB_ISOLATE : JOB_REPLACE);
7d793605
LP
1513 break;
1514 }
1515
0003d1ab
LP
1516 if ((int) sfsi.ssi_signo >= SIGRTMIN+13 &&
1517 (int) sfsi.ssi_signo < SIGRTMIN+13+(int) ELEMENTSOF(code_table)) {
1518 m->exit_code = code_table[sfsi.ssi_signo - SIGRTMIN - 13];
1519 break;
1520 }
1521
0658666b
LP
1522 switch (sfsi.ssi_signo - SIGRTMIN) {
1523
1524 case 20:
1525 log_debug("Enabling showing of status.");
27d340c7 1526 manager_set_show_status(m, true);
0658666b
LP
1527 break;
1528
1529 case 21:
1530 log_debug("Disabling showing of status.");
27d340c7 1531 manager_set_show_status(m, false);
0658666b
LP
1532 break;
1533
253ee27a
LP
1534 case 22:
1535 log_set_max_level(LOG_DEBUG);
1536 log_notice("Setting log level to debug.");
1537 break;
1538
1539 case 23:
1540 log_set_max_level(LOG_INFO);
1541 log_notice("Setting log level to info.");
1542 break;
1543
600b704e
LP
1544 case 24:
1545 if (m->running_as == SYSTEMD_USER) {
1546 m->exit_code = MANAGER_EXIT;
1547 return 0;
1548 }
1549
1550 /* This is a nop on init */
1551 break;
1552
4cfa2c99
LP
1553 case 26:
1554 log_set_target(LOG_TARGET_JOURNAL_OR_KMSG);
1555 log_notice("Setting log target to journal-or-kmsg.");
1556 break;
1557
253ee27a
LP
1558 case 27:
1559 log_set_target(LOG_TARGET_CONSOLE);
1560 log_notice("Setting log target to console.");
1561 break;
1562
1563 case 28:
1564 log_set_target(LOG_TARGET_KMSG);
1565 log_notice("Setting log target to kmsg.");
1566 break;
1567
1568 case 29:
1569 log_set_target(LOG_TARGET_SYSLOG_OR_KMSG);
1570 log_notice("Setting log target to syslog-or-kmsg.");
1571 break;
1572
0658666b 1573 default:
4e240ab0 1574 log_warning("Got unhandled signal <%s>.", signal_to_string(sfsi.ssi_signo));
0658666b 1575 }
b9cd2ec1 1576 }
7d793605 1577 }
9152c765
LP
1578 }
1579
1580 if (sigchld)
034c6ed7
LP
1581 return manager_dispatch_sigchld(m);
1582
1583 return 0;
1584}
1585
718db961
LP
1586static int manager_dispatch_time_change_fd(sd_event_source *source, int fd, uint32_t revents, void *userdata) {
1587 Manager *m = userdata;
1588 Iterator i;
1589 Unit *u;
034c6ed7
LP
1590
1591 assert(m);
718db961 1592 assert(m->time_change_fd == fd);
034c6ed7 1593
718db961
LP
1594 log_struct(LOG_INFO,
1595 MESSAGE_ID(SD_MESSAGE_TIME_CHANGE),
1596 "MESSAGE=Time has been changed",
1597 NULL);
034c6ed7 1598
718db961
LP
1599 /* Restart the watch */
1600 m->time_change_event_source = sd_event_source_unref(m->time_change_event_source);
acbb0225 1601
718db961
LP
1602 close_nointr_nofail(m->time_change_fd);
1603 m->time_change_fd = -1;
ef734fd6 1604
718db961 1605 manager_setup_time_change(m);
4e434314 1606
718db961
LP
1607 HASHMAP_FOREACH(u, m->units, i)
1608 if (UNIT_VTABLE(u)->time_change)
1609 UNIT_VTABLE(u)->time_change(u);
ea430986 1610
718db961
LP
1611 return 0;
1612}
ea430986 1613
718db961
LP
1614static int manager_dispatch_idle_pipe_fd(sd_event_source *source, int fd, uint32_t revents, void *userdata) {
1615 Manager *m = userdata;
8742514c 1616
718db961
LP
1617 assert(m);
1618 assert(m->idle_pipe[2] == fd);
8742514c 1619
718db961 1620 m->no_console_output = m->n_on_console > 0;
03b717a3 1621
718db961
LP
1622 m->idle_pipe_event_source = sd_event_source_unref(m->idle_pipe_event_source);
1623 manager_close_idle_pipe(m);
03b717a3 1624
718db961
LP
1625 return 0;
1626}
31a7eb86 1627
718db961
LP
1628static int manager_dispatch_jobs_in_progress(sd_event_source *source, usec_t usec, void *userdata) {
1629 Manager *m = userdata;
31a7eb86 1630
718db961 1631 assert(m);
9152c765 1632
718db961 1633 manager_print_jobs_in_progress(m);
9152c765
LP
1634 return 0;
1635}
1636
1637int manager_loop(Manager *m) {
1638 int r;
9152c765 1639
fac9f8df 1640 RATELIMIT_DEFINE(rl, 1*USEC_PER_SEC, 50000);
ea430986 1641
9152c765 1642 assert(m);
a16e1123 1643 m->exit_code = MANAGER_RUNNING;
9152c765 1644
fe51822e
LP
1645 /* Release the path cache */
1646 set_free_free(m->unit_path_cache);
1647 m->unit_path_cache = NULL;
1648
b0c918b9
LP
1649 manager_check_finished(m);
1650
a4312405 1651 /* There might still be some zombies hanging around from
f3669545 1652 * before we were exec()'ed. Let's reap them. */
e96d6be7
LP
1653 r = manager_dispatch_sigchld(m);
1654 if (r < 0)
a4312405
LP
1655 return r;
1656
a16e1123 1657 while (m->exit_code == MANAGER_RUNNING) {
718db961 1658 usec_t wait_usec;
9152c765 1659
67445f4e 1660 if (m->runtime_watchdog > 0 && m->running_as == SYSTEMD_SYSTEM)
e96d6be7
LP
1661 watchdog_ping();
1662
ea430986
LP
1663 if (!ratelimit_test(&rl)) {
1664 /* Yay, something is going seriously wrong, pause a little */
1665 log_warning("Looping too fast. Throttling execution a little.");
1666 sleep(1);
e96d6be7 1667 continue;
ea430986
LP
1668 }
1669
37a8e683 1670 if (manager_dispatch_load_queue(m) > 0)
23a177ef
LP
1671 continue;
1672
cf1265e1 1673 if (manager_dispatch_gc_queue(m) > 0)
701cc384
LP
1674 continue;
1675
cf1265e1 1676 if (manager_dispatch_cleanup_queue(m) > 0)
c1e1601e 1677 continue;
034c6ed7 1678
cf1265e1 1679 if (manager_dispatch_cgroup_queue(m) > 0)
c1e1601e
LP
1680 continue;
1681
cf1265e1 1682 if (manager_dispatch_run_queue(m) > 0)
c1e1601e
LP
1683 continue;
1684
1685 if (manager_dispatch_dbus_queue(m) > 0)
ea430986 1686 continue;
ea430986 1687
c757a65b 1688 /* Sleep for half the watchdog time */
67445f4e 1689 if (m->runtime_watchdog > 0 && m->running_as == SYSTEMD_SYSTEM) {
718db961
LP
1690 wait_usec = m->runtime_watchdog / 2;
1691 if (wait_usec <= 0)
1692 wait_usec = 1;
c757a65b 1693 } else
718db961 1694 wait_usec = (usec_t) -1;
9152c765 1695
718db961
LP
1696 r = sd_event_run(m->event, wait_usec);
1697 if (r < 0) {
1698 log_error("Failed to run event loop: %s", strerror(-r));
957ca890 1699 return r;
718db961 1700 }
a16e1123 1701 }
957ca890 1702
a16e1123 1703 return m->exit_code;
83c60c9f 1704}
ea430986 1705
718db961 1706int manager_load_unit_from_dbus_path(Manager *m, const char *s, sd_bus_error *e, Unit **_u) {
ede3a796 1707 _cleanup_free_ char *n = NULL;
ea430986 1708 Unit *u;
80fbf05e 1709 int r;
ea430986
LP
1710
1711 assert(m);
1712 assert(s);
1713 assert(_u);
1714
ede3a796
LP
1715 r = unit_name_from_dbus_path(s, &n);
1716 if (r < 0)
1717 return r;
ea430986 1718
80fbf05e 1719 r = manager_load_unit(m, n, NULL, e, &u);
80fbf05e
MS
1720 if (r < 0)
1721 return r;
ea430986
LP
1722
1723 *_u = u;
1724
1725 return 0;
1726}
86fbf370
LP
1727
1728int manager_get_job_from_dbus_path(Manager *m, const char *s, Job **_j) {
718db961 1729 const char *p;
86fbf370 1730 unsigned id;
718db961 1731 Job *j;
86fbf370
LP
1732 int r;
1733
1734 assert(m);
1735 assert(s);
1736 assert(_j);
1737
718db961
LP
1738 p = startswith(s, "/org/freedesktop/systemd1/job/");
1739 if (!p)
86fbf370
LP
1740 return -EINVAL;
1741
718db961 1742 r = safe_atou(p, &id);
8742514c 1743 if (r < 0)
86fbf370
LP
1744 return r;
1745
8742514c
LP
1746 j = manager_get_job(m, id);
1747 if (!j)
86fbf370
LP
1748 return -ENOENT;
1749
1750 *_j = j;
1751
1752 return 0;
1753}
dfcd764e 1754
4927fcae 1755void manager_send_unit_audit(Manager *m, Unit *u, int type, bool success) {
e537352b 1756
4927fcae
LP
1757#ifdef HAVE_AUDIT
1758 char *p;
c1165f82 1759 int audit_fd;
e537352b 1760
c1165f82
LP
1761 audit_fd = get_audit_fd();
1762 if (audit_fd < 0)
e537352b
LP
1763 return;
1764
bbd3a7ba
LP
1765 /* Don't generate audit events if the service was already
1766 * started and we're just deserializing */
a7556052 1767 if (m->n_reloading > 0)
bbd3a7ba
LP
1768 return;
1769
67445f4e 1770 if (m->running_as != SYSTEMD_SYSTEM)
f1dd0c3f
LP
1771 return;
1772
ac155bb8 1773 if (u->type != UNIT_SERVICE)
f1dd0c3f
LP
1774 return;
1775
bd0af849
ZJS
1776 p = unit_name_to_prefix_and_instance(u->id);
1777 if (!p) {
66870f90
ZJS
1778 log_error_unit(u->id,
1779 "Failed to allocate unit name for audit message: %s", strerror(ENOMEM));
e537352b
LP
1780 return;
1781 }
1782
c1165f82 1783 if (audit_log_user_comm_message(audit_fd, type, "", p, NULL, NULL, NULL, success) < 0) {
391ade86
LP
1784 if (errno == EPERM) {
1785 /* We aren't allowed to send audit messages?
44785992 1786 * Then let's not retry again. */
c1165f82 1787 close_audit_fd();
44785992
LP
1788 } else
1789 log_warning("Failed to send audit message: %m");
391ade86 1790 }
e537352b 1791
4927fcae
LP
1792 free(p);
1793#endif
e537352b 1794
e537352b
LP
1795}
1796
e983b760
LP
1797void manager_send_unit_plymouth(Manager *m, Unit *u) {
1798 int fd = -1;
1799 union sockaddr_union sa;
1800 int n = 0;
1801 char *message = NULL;
e983b760
LP
1802
1803 /* Don't generate plymouth events if the service was already
1804 * started and we're just deserializing */
a7556052 1805 if (m->n_reloading > 0)
e983b760
LP
1806 return;
1807
67445f4e 1808 if (m->running_as != SYSTEMD_SYSTEM)
e983b760
LP
1809 return;
1810
3772995a
LP
1811 if (detect_container(NULL) > 0)
1812 return;
1813
ac155bb8
MS
1814 if (u->type != UNIT_SERVICE &&
1815 u->type != UNIT_MOUNT &&
1816 u->type != UNIT_SWAP)
e983b760
LP
1817 return;
1818
1819 /* We set SOCK_NONBLOCK here so that we rather drop the
1820 * message then wait for plymouth */
e62d8c39
ZJS
1821 fd = socket(AF_UNIX, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
1822 if (fd < 0) {
e983b760
LP
1823 log_error("socket() failed: %m");
1824 return;
1825 }
1826
1827 zero(sa);
1828 sa.sa.sa_family = AF_UNIX;
96707269
LP
1829 strncpy(sa.un.sun_path+1, "/org/freedesktop/plymouthd", sizeof(sa.un.sun_path)-1);
1830 if (connect(fd, &sa.sa, offsetof(struct sockaddr_un, sun_path) + 1 + strlen(sa.un.sun_path+1)) < 0) {
e983b760
LP
1831
1832 if (errno != EPIPE &&
1833 errno != EAGAIN &&
1834 errno != ENOENT &&
1835 errno != ECONNREFUSED &&
1836 errno != ECONNRESET &&
1837 errno != ECONNABORTED)
1838 log_error("connect() failed: %m");
1839
1840 goto finish;
1841 }
1842
ac155bb8 1843 if (asprintf(&message, "U\002%c%s%n", (int) (strlen(u->id) + 1), u->id, &n) < 0) {
0d0f0c50 1844 log_oom();
e983b760
LP
1845 goto finish;
1846 }
1847
1848 errno = 0;
bd40a2d8 1849 if (write(fd, message, n + 1) != n + 1) {
e983b760
LP
1850
1851 if (errno != EPIPE &&
1852 errno != EAGAIN &&
1853 errno != ENOENT &&
1854 errno != ECONNREFUSED &&
1855 errno != ECONNRESET &&
1856 errno != ECONNABORTED)
1857 log_error("Failed to write Plymouth message: %m");
1858
1859 goto finish;
1860 }
1861
1862finish:
1863 if (fd >= 0)
1864 close_nointr_nofail(fd);
1865
1866 free(message);
1867}
1868
05e343b7
LP
1869void manager_dispatch_bus_name_owner_changed(
1870 Manager *m,
1871 const char *name,
1872 const char* old_owner,
1873 const char *new_owner) {
1874
1875 Unit *u;
1876
1877 assert(m);
1878 assert(name);
1879
718db961
LP
1880 u = hashmap_get(m->watch_bus, name);
1881 if (!u)
05e343b7
LP
1882 return;
1883
1884 UNIT_VTABLE(u)->bus_name_owner_change(u, name, old_owner, new_owner);
1885}
1886
d8d5ab98 1887int manager_open_serialization(Manager *m, FILE **_f) {
b925e726 1888 char *path = NULL;
df28bc08 1889 int fd = -1;
a16e1123
LP
1890 FILE *f;
1891
1892 assert(_f);
1893
67445f4e 1894 if (m->running_as == SYSTEMD_SYSTEM)
2b583ce6 1895 asprintf(&path, "/run/systemd/dump-%lu-XXXXXX", (unsigned long) getpid());
b925e726
LP
1896 else
1897 asprintf(&path, "/tmp/systemd-dump-%lu-XXXXXX", (unsigned long) getpid());
d8d5ab98 1898
b925e726
LP
1899 if (!path)
1900 return -ENOMEM;
a16e1123 1901
5c0d398d
LP
1902 RUN_WITH_UMASK(0077) {
1903 fd = mkostemp(path, O_RDWR|O_CLOEXEC);
1904 }
a16e1123
LP
1905
1906 if (fd < 0) {
1907 free(path);
1908 return -errno;
1909 }
1910
1911 unlink(path);
1912
1913 log_debug("Serializing state to %s", path);
1914 free(path);
1915
01e10de3
LP
1916 f = fdopen(fd, "w+");
1917 if (!f)
a16e1123
LP
1918 return -errno;
1919
1920 *_f = f;
1921
1922 return 0;
1923}
1924
b3680f49 1925int manager_serialize(Manager *m, FILE *f, FDSet *fds, bool switching_root) {
a16e1123
LP
1926 Iterator i;
1927 Unit *u;
1928 const char *t;
4a9fd066 1929 char **e;
a16e1123
LP
1930 int r;
1931
1932 assert(m);
1933 assert(f);
1934 assert(fds);
1935
a7556052 1936 m->n_reloading ++;
38c52d46 1937
01d67b43
LP
1938 fprintf(f, "current-job-id=%i\n", m->current_job_id);
1939 fprintf(f, "taint-usr=%s\n", yes_no(m->taint_usr));
33c5fae9
LP
1940 fprintf(f, "n-installed-jobs=%u\n", m->n_installed_jobs);
1941 fprintf(f, "n-failed-jobs=%u\n", m->n_failed_jobs);
01d67b43 1942
915b3753 1943 dual_timestamp_serialize(f, "firmware-timestamp", &m->firmware_timestamp);
915b3753 1944 dual_timestamp_serialize(f, "loader-timestamp", &m->loader_timestamp);
718db961 1945 dual_timestamp_serialize(f, "kernel-timestamp", &m->kernel_timestamp);
e9ddabc2 1946 dual_timestamp_serialize(f, "initrd-timestamp", &m->initrd_timestamp);
f38ed060 1947
26a1efdf 1948 if (!in_initrd()) {
915b3753 1949 dual_timestamp_serialize(f, "userspace-timestamp", &m->userspace_timestamp);
f38ed060 1950 dual_timestamp_serialize(f, "finish-timestamp", &m->finish_timestamp);
718db961
LP
1951 dual_timestamp_serialize(f, "security-start-timestamp", &m->security_start_timestamp);
1952 dual_timestamp_serialize(f, "security-finish-timestamp", &m->security_finish_timestamp);
1953 dual_timestamp_serialize(f, "generators-start-timestamp", &m->generators_start_timestamp);
1954 dual_timestamp_serialize(f, "generators-finish-timestamp", &m->generators_finish_timestamp);
1955 dual_timestamp_serialize(f, "units-load-start-timestamp", &m->units_load_start_timestamp);
1956 dual_timestamp_serialize(f, "units-load-finish-timestamp", &m->units_load_finish_timestamp);
f38ed060 1957 }
47a483a1 1958
b3680f49
HH
1959 if (!switching_root) {
1960 STRV_FOREACH(e, m->environment) {
1961 _cleanup_free_ char *ce;
4a9fd066 1962
b3680f49
HH
1963 ce = cescape(*e);
1964 if (ce)
1965 fprintf(f, "env=%s\n", *e);
1966 }
4a9fd066
OS
1967 }
1968
6fa48533
LP
1969 bus_serialize(m, f);
1970
f2382a94
LP
1971 fputc('\n', f);
1972
a16e1123 1973 HASHMAP_FOREACH_KEY(u, t, m->units, i) {
ac155bb8 1974 if (u->id != t)
a16e1123
LP
1975 continue;
1976
1977 if (!unit_can_serialize(u))
1978 continue;
1979
1980 /* Start marker */
ac155bb8 1981 fputs(u->id, f);
a16e1123
LP
1982 fputc('\n', f);
1983
6fa48533
LP
1984 r = unit_serialize(u, f, fds, !switching_root);
1985 if (r < 0) {
a7556052 1986 m->n_reloading --;
a16e1123 1987 return r;
38c52d46 1988 }
a16e1123
LP
1989 }
1990
a7556052
LP
1991 assert(m->n_reloading > 0);
1992 m->n_reloading --;
38c52d46 1993
a16e1123
LP
1994 if (ferror(f))
1995 return -EIO;
1996
b23de6af
LP
1997 r = bus_fdset_add_all(m, fds);
1998 if (r < 0)
1999 return r;
2000
a16e1123
LP
2001 return 0;
2002}
2003
2004int manager_deserialize(Manager *m, FILE *f, FDSet *fds) {
2005 int r = 0;
2006
2007 assert(m);
2008 assert(f);
2009
2010 log_debug("Deserializing state...");
2011
a7556052 2012 m->n_reloading ++;
82c64bf5 2013
10f8e83c 2014 for (;;) {
20c03b7b 2015 char line[LINE_MAX], *l;
10f8e83c
LP
2016
2017 if (!fgets(line, sizeof(line), f)) {
2018 if (feof(f))
2019 r = 0;
2020 else
2021 r = -errno;
2022
2023 goto finish;
2024 }
2025
2026 char_array_0(line);
2027 l = strstrip(line);
2028
2029 if (l[0] == 0)
2030 break;
2031
01d67b43
LP
2032 if (startswith(l, "current-job-id=")) {
2033 uint32_t id;
2034
2035 if (safe_atou32(l+15, &id) < 0)
2036 log_debug("Failed to parse current job id value %s", l+15);
2037 else
2038 m->current_job_id = MAX(m->current_job_id, id);
718db961 2039
33c5fae9
LP
2040 } else if (startswith(l, "n-installed-jobs=")) {
2041 uint32_t n;
2042
2043 if (safe_atou32(l+17, &n) < 0)
2044 log_debug("Failed to parse installed jobs counter %s", l+17);
2045 else
2046 m->n_installed_jobs += n;
718db961 2047
33c5fae9
LP
2048 } else if (startswith(l, "n-failed-jobs=")) {
2049 uint32_t n;
2050
2051 if (safe_atou32(l+14, &n) < 0)
2052 log_debug("Failed to parse failed jobs counter %s", l+14);
2053 else
2054 m->n_failed_jobs += n;
718db961 2055
01d67b43
LP
2056 } else if (startswith(l, "taint-usr=")) {
2057 int b;
2058
2059 if ((b = parse_boolean(l+10)) < 0)
2060 log_debug("Failed to parse taint /usr flag %s", l+10);
2061 else
2062 m->taint_usr = m->taint_usr || b;
718db961 2063
915b3753
LP
2064 } else if (startswith(l, "firmware-timestamp="))
2065 dual_timestamp_deserialize(l+19, &m->firmware_timestamp);
2066 else if (startswith(l, "loader-timestamp="))
2067 dual_timestamp_deserialize(l+17, &m->loader_timestamp);
2068 else if (startswith(l, "kernel-timestamp="))
2069 dual_timestamp_deserialize(l+17, &m->kernel_timestamp);
2070 else if (startswith(l, "initrd-timestamp="))
e9ddabc2 2071 dual_timestamp_deserialize(l+17, &m->initrd_timestamp);
915b3753
LP
2072 else if (startswith(l, "userspace-timestamp="))
2073 dual_timestamp_deserialize(l+20, &m->userspace_timestamp);
10717a1a 2074 else if (startswith(l, "finish-timestamp="))
799fd0fd 2075 dual_timestamp_deserialize(l+17, &m->finish_timestamp);
718db961
LP
2076 else if (startswith(l, "security-start-timestamp="))
2077 dual_timestamp_deserialize(l+25, &m->security_start_timestamp);
2078 else if (startswith(l, "security-finish-timestamp="))
2079 dual_timestamp_deserialize(l+26, &m->security_finish_timestamp);
2080 else if (startswith(l, "generators-start-timestamp="))
2081 dual_timestamp_deserialize(l+27, &m->generators_start_timestamp);
2082 else if (startswith(l, "generators-finish-timestamp="))
2083 dual_timestamp_deserialize(l+28, &m->generators_finish_timestamp);
2084 else if (startswith(l, "units-load-start-timestamp="))
2085 dual_timestamp_deserialize(l+27, &m->units_load_start_timestamp);
2086 else if (startswith(l, "units-load-finish-timestamp="))
2087 dual_timestamp_deserialize(l+28, &m->units_load_finish_timestamp);
4a9fd066
OS
2088 else if (startswith(l, "env=")) {
2089 _cleanup_free_ char *uce = NULL;
2090 char **e;
2091
2092 uce = cunescape(l+4);
2093 if (!uce) {
2094 r = -ENOMEM;
2095 goto finish;
2096 }
2097
2098 e = strv_env_set(m->environment, uce);
2099 if (!e) {
2100 r = -ENOMEM;
2101 goto finish;
2102 }
2103
2104 strv_free(m->environment);
2105 m->environment = e;
6fa48533 2106 } else if (bus_deserialize_item(m, l) == 0)
10f8e83c
LP
2107 log_debug("Unknown serialization item '%s'", l);
2108 }
2109
a16e1123
LP
2110 for (;;) {
2111 Unit *u;
2112 char name[UNIT_NAME_MAX+2];
2113
2114 /* Start marker */
2115 if (!fgets(name, sizeof(name), f)) {
2116 if (feof(f))
10f8e83c
LP
2117 r = 0;
2118 else
2119 r = -errno;
a16e1123 2120
82c64bf5 2121 goto finish;
a16e1123
LP
2122 }
2123
2124 char_array_0(name);
2125
bd0af849
ZJS
2126 r = manager_load_unit(m, strstrip(name), NULL, NULL, &u);
2127 if (r < 0)
82c64bf5 2128 goto finish;
a16e1123 2129
01e10de3
LP
2130 r = unit_deserialize(u, f, fds);
2131 if (r < 0)
82c64bf5 2132 goto finish;
a16e1123
LP
2133 }
2134
10f8e83c 2135finish:
82c64bf5
LP
2136 if (ferror(f)) {
2137 r = -EIO;
2138 goto finish;
2139 }
a16e1123 2140
a7556052
LP
2141 assert(m->n_reloading > 0);
2142 m->n_reloading --;
82c64bf5
LP
2143
2144 return r;
a16e1123
LP
2145}
2146
2147int manager_reload(Manager *m) {
2148 int r, q;
51d122af
ZJS
2149 _cleanup_fclose_ FILE *f = NULL;
2150 _cleanup_fdset_free_ FDSet *fds = NULL;
a16e1123
LP
2151
2152 assert(m);
2153
07719a21
LP
2154 r = manager_open_serialization(m, &f);
2155 if (r < 0)
a16e1123
LP
2156 return r;
2157
a7556052 2158 m->n_reloading ++;
718db961 2159 bus_manager_send_reloading(m, true);
38c52d46 2160
07719a21
LP
2161 fds = fdset_new();
2162 if (!fds) {
a7556052 2163 m->n_reloading --;
51d122af 2164 return -ENOMEM;
a16e1123
LP
2165 }
2166
b3680f49 2167 r = manager_serialize(m, f, fds, false);
07719a21 2168 if (r < 0) {
a7556052 2169 m->n_reloading --;
51d122af 2170 return r;
38c52d46 2171 }
a16e1123
LP
2172
2173 if (fseeko(f, 0, SEEK_SET) < 0) {
a7556052 2174 m->n_reloading --;
51d122af 2175 return -errno;
a16e1123
LP
2176 }
2177
2178 /* From here on there is no way back. */
2179 manager_clear_jobs_and_units(m);
5a1e9937 2180 manager_undo_generators(m);
84e3543e 2181 lookup_paths_free(&m->lookup_paths);
2ded0c04 2182
07719a21 2183 /* Find new unit paths */
5a1e9937
LP
2184 manager_run_generators(m);
2185
07719a21
LP
2186 q = lookup_paths_init(
2187 &m->lookup_paths, m->running_as, true,
2188 m->generator_unit_path,
2189 m->generator_unit_path_early,
2190 m->generator_unit_path_late);
2191 if (q < 0)
2192 r = q;
2193
5a1e9937
LP
2194 manager_build_unit_path_cache(m);
2195
a16e1123 2196 /* First, enumerate what we can from all config files */
07719a21
LP
2197 q = manager_enumerate(m);
2198 if (q < 0)
a16e1123
LP
2199 r = q;
2200
2201 /* Second, deserialize our stored data */
07719a21
LP
2202 q = manager_deserialize(m, f, fds);
2203 if (q < 0)
a16e1123
LP
2204 r = q;
2205
2206 fclose(f);
2207 f = NULL;
2208
2209 /* Third, fire things up! */
07719a21
LP
2210 q = manager_coldplug(m);
2211 if (q < 0)
a16e1123
LP
2212 r = q;
2213
a7556052
LP
2214 assert(m->n_reloading > 0);
2215 m->n_reloading--;
9f611ad8 2216
71445ae7
LP
2217 m->send_reloading_done = true;
2218
a16e1123
LP
2219 return r;
2220}
2221
6084e22e 2222static bool manager_is_booting_or_shutting_down(Manager *m) {
9e58ff9c
LP
2223 Unit *u;
2224
2225 assert(m);
2226
2227 /* Is the initial job still around? */
bacbccb7 2228 if (manager_get_job(m, m->default_unit_job_id))
9e58ff9c
LP
2229 return true;
2230
2231 /* Is there a job for the shutdown target? */
27d340c7
LP
2232 u = manager_get_unit(m, SPECIAL_SHUTDOWN_TARGET);
2233 if (u)
ac155bb8 2234 return !!u->job;
9e58ff9c
LP
2235
2236 return false;
2237}
2238
c17ec25e
MS
2239bool manager_is_reloading_or_reexecuting(Manager *m) {
2240 assert(m);
2241
2242 return m->n_reloading != 0;
2243}
2244
fdf20a31 2245void manager_reset_failed(Manager *m) {
5632e374
LP
2246 Unit *u;
2247 Iterator i;
2248
2249 assert(m);
2250
2251 HASHMAP_FOREACH(u, m->units, i)
fdf20a31 2252 unit_reset_failed(u);
5632e374
LP
2253}
2254
31afa0a4 2255bool manager_unit_inactive_or_pending(Manager *m, const char *name) {
8f6df3fa
LP
2256 Unit *u;
2257
2258 assert(m);
2259 assert(name);
2260
2261 /* Returns true if the unit is inactive or going down */
bd0af849
ZJS
2262 u = manager_get_unit(m, name);
2263 if (!u)
8f6df3fa
LP
2264 return true;
2265
31afa0a4 2266 return unit_inactive_or_pending(u);
8f6df3fa
LP
2267}
2268
b0c918b9 2269void manager_check_finished(Manager *m) {
7ceba241 2270 char userspace[FORMAT_TIMESPAN_MAX], initrd[FORMAT_TIMESPAN_MAX], kernel[FORMAT_TIMESPAN_MAX], sum[FORMAT_TIMESPAN_MAX];
915b3753 2271 usec_t firmware_usec, loader_usec, kernel_usec, initrd_usec, userspace_usec, total_usec;
b0c918b9
LP
2272
2273 assert(m);
2274
a0b64226 2275 if (m->n_running_jobs == 0)
718db961 2276 m->jobs_in_progress_event_source = sd_event_source_unref(m->jobs_in_progress_event_source);
a0b64226 2277
828db5d8
KS
2278 if (hashmap_size(m->jobs) > 0) {
2279 if (m->jobs_in_progress_event_source)
2280 sd_event_source_set_time(m->jobs_in_progress_event_source, JOBS_IN_PROGRESS_PERIOD_SEC);
b0c918b9 2281 return;
5b176ee0 2282 }
b0c918b9 2283
f2b68789 2284 /* Notify Type=idle units that we are done now */
718db961
LP
2285 m->idle_pipe_event_source = sd_event_source_unref(m->idle_pipe_event_source);
2286 manager_close_idle_pipe(m);
f2b68789 2287
af6da548
LP
2288 /* Turn off confirm spawn now */
2289 m->confirm_spawn = false;
2290
f2b68789 2291 if (dual_timestamp_is_set(&m->finish_timestamp))
b0c918b9
LP
2292 return;
2293
2294 dual_timestamp_get(&m->finish_timestamp);
2295
67445f4e 2296 if (m->running_as == SYSTEMD_SYSTEM && detect_container(NULL) <= 0) {
e03ae661 2297
915b3753
LP
2298 /* Note that m->kernel_usec.monotonic is always at 0,
2299 * and m->firmware_usec.monotonic and
2300 * m->loader_usec.monotonic should be considered
2301 * negative values. */
2302
7ceba241
LP
2303 firmware_usec = m->firmware_timestamp.monotonic - m->loader_timestamp.monotonic;
2304 loader_usec = m->loader_timestamp.monotonic - m->kernel_timestamp.monotonic;
915b3753 2305 userspace_usec = m->finish_timestamp.monotonic - m->userspace_timestamp.monotonic;
7ceba241 2306 total_usec = m->firmware_timestamp.monotonic + m->finish_timestamp.monotonic;
18fa6b27 2307
e9ddabc2 2308 if (dual_timestamp_is_set(&m->initrd_timestamp)) {
18fa6b27 2309
915b3753
LP
2310 kernel_usec = m->initrd_timestamp.monotonic - m->kernel_timestamp.monotonic;
2311 initrd_usec = m->userspace_timestamp.monotonic - m->initrd_timestamp.monotonic;
18fa6b27 2312
81270860
LP
2313 if (!log_on_console())
2314 log_struct(LOG_INFO,
1ca6783f 2315 MESSAGE_ID(SD_MESSAGE_STARTUP_FINISHED),
81270860
LP
2316 "KERNEL_USEC=%llu", (unsigned long long) kernel_usec,
2317 "INITRD_USEC=%llu", (unsigned long long) initrd_usec,
2318 "USERSPACE_USEC=%llu", (unsigned long long) userspace_usec,
2319 "MESSAGE=Startup finished in %s (kernel) + %s (initrd) + %s (userspace) = %s.",
2fa4092c
LP
2320 format_timespan(kernel, sizeof(kernel), kernel_usec, USEC_PER_MSEC),
2321 format_timespan(initrd, sizeof(initrd), initrd_usec, USEC_PER_MSEC),
2322 format_timespan(userspace, sizeof(userspace), userspace_usec, USEC_PER_MSEC),
2323 format_timespan(sum, sizeof(sum), total_usec, USEC_PER_MSEC),
81270860 2324 NULL);
18fa6b27 2325 } else {
915b3753 2326 kernel_usec = m->userspace_timestamp.monotonic - m->kernel_timestamp.monotonic;
18fa6b27
LP
2327 initrd_usec = 0;
2328
81270860
LP
2329 if (!log_on_console())
2330 log_struct(LOG_INFO,
1ca6783f 2331 MESSAGE_ID(SD_MESSAGE_STARTUP_FINISHED),
81270860
LP
2332 "KERNEL_USEC=%llu", (unsigned long long) kernel_usec,
2333 "USERSPACE_USEC=%llu", (unsigned long long) userspace_usec,
2334 "MESSAGE=Startup finished in %s (kernel) + %s (userspace) = %s.",
2fa4092c
LP
2335 format_timespan(kernel, sizeof(kernel), kernel_usec, USEC_PER_MSEC),
2336 format_timespan(userspace, sizeof(userspace), userspace_usec, USEC_PER_MSEC),
2337 format_timespan(sum, sizeof(sum), total_usec, USEC_PER_MSEC),
81270860 2338 NULL);
18fa6b27
LP
2339 }
2340 } else {
915b3753
LP
2341 firmware_usec = loader_usec = initrd_usec = kernel_usec = 0;
2342 total_usec = userspace_usec = m->finish_timestamp.monotonic - m->userspace_timestamp.monotonic;
877d54e9 2343
81270860
LP
2344 if (!log_on_console())
2345 log_struct(LOG_INFO,
1ca6783f 2346 MESSAGE_ID(SD_MESSAGE_STARTUP_FINISHED),
81270860
LP
2347 "USERSPACE_USEC=%llu", (unsigned long long) userspace_usec,
2348 "MESSAGE=Startup finished in %s.",
2fa4092c 2349 format_timespan(sum, sizeof(sum), total_usec, USEC_PER_MSEC),
81270860 2350 NULL);
18fa6b27 2351 }
b0c918b9 2352
718db961 2353 bus_manager_send_finished(m, firmware_usec, loader_usec, kernel_usec, initrd_usec, userspace_usec, total_usec);
530345e7
LP
2354
2355 sd_notifyf(false,
2356 "READY=1\nSTATUS=Startup finished in %s.",
2fa4092c 2357 format_timespan(sum, sizeof(sum), total_usec, USEC_PER_MSEC));
b0c918b9
LP
2358}
2359
07719a21
LP
2360static int create_generator_dir(Manager *m, char **generator, const char *name) {
2361 char *p;
2362 int r;
2363
2364 assert(m);
2365 assert(generator);
2366 assert(name);
2367
2368 if (*generator)
2369 return 0;
2370
67445f4e 2371 if (m->running_as == SYSTEMD_SYSTEM && getpid() == 1) {
07719a21
LP
2372
2373 p = strappend("/run/systemd/", name);
0d0f0c50
SL
2374 if (!p)
2375 return log_oom();
07719a21 2376
d2e54fae 2377 r = mkdir_p_label(p, 0755);
07719a21 2378 if (r < 0) {
7ad94c71
ZJS
2379 log_error("Failed to create generator directory %s: %s",
2380 p, strerror(-r));
07719a21
LP
2381 free(p);
2382 return r;
2383 }
2384 } else {
b7def684 2385 p = strjoin("/tmp/systemd-", name, ".XXXXXX", NULL);
0d0f0c50
SL
2386 if (!p)
2387 return log_oom();
07719a21
LP
2388
2389 if (!mkdtemp(p)) {
7ad94c71
ZJS
2390 log_error("Failed to create generator directory %s: %m",
2391 p);
34bf0281 2392 free(p);
07719a21
LP
2393 return -errno;
2394 }
2395 }
2396
2397 *generator = p;
2398 return 0;
2399}
2400
2401static void trim_generator_dir(Manager *m, char **generator) {
2402 assert(m);
2403 assert(generator);
2404
2405 if (!*generator)
2406 return;
2407
2408 if (rmdir(*generator) >= 0) {
2409 free(*generator);
2410 *generator = NULL;
2411 }
2412
2413 return;
2414}
2415
5a1e9937 2416void manager_run_generators(Manager *m) {
718db961 2417 _cleanup_closedir_ DIR *d = NULL;
5a1e9937 2418 const char *generator_path;
07719a21 2419 const char *argv[5];
07719a21 2420 int r;
5a1e9937
LP
2421
2422 assert(m);
2423
67445f4e 2424 generator_path = m->running_as == SYSTEMD_SYSTEM ? SYSTEM_GENERATOR_PATH : USER_GENERATOR_PATH;
07719a21
LP
2425 d = opendir(generator_path);
2426 if (!d) {
5a1e9937
LP
2427 if (errno == ENOENT)
2428 return;
2429
7ad94c71
ZJS
2430 log_error("Failed to enumerate generator directory %s: %m",
2431 generator_path);
5a1e9937
LP
2432 return;
2433 }
2434
07719a21
LP
2435 r = create_generator_dir(m, &m->generator_unit_path, "generator");
2436 if (r < 0)
2437 goto finish;
f1d19aa4 2438
07719a21
LP
2439 r = create_generator_dir(m, &m->generator_unit_path_early, "generator.early");
2440 if (r < 0)
2441 goto finish;
5a1e9937 2442
07719a21
LP
2443 r = create_generator_dir(m, &m->generator_unit_path_late, "generator.late");
2444 if (r < 0)
2445 goto finish;
5a1e9937 2446
83cc030f
LP
2447 argv[0] = NULL; /* Leave this empty, execute_directory() will fill something in */
2448 argv[1] = m->generator_unit_path;
07719a21
LP
2449 argv[2] = m->generator_unit_path_early;
2450 argv[3] = m->generator_unit_path_late;
2451 argv[4] = NULL;
5a1e9937 2452
718db961 2453 RUN_WITH_UMASK(0022)
5c0d398d 2454 execute_directory(generator_path, d, (char**) argv);
5a1e9937 2455
718db961 2456finish:
07719a21
LP
2457 trim_generator_dir(m, &m->generator_unit_path);
2458 trim_generator_dir(m, &m->generator_unit_path_early);
2459 trim_generator_dir(m, &m->generator_unit_path_late);
5a1e9937
LP
2460}
2461
07719a21 2462static void remove_generator_dir(Manager *m, char **generator) {
5a1e9937 2463 assert(m);
07719a21 2464 assert(generator);
5a1e9937 2465
07719a21 2466 if (!*generator)
5a1e9937
LP
2467 return;
2468
07719a21
LP
2469 strv_remove(m->lookup_paths.unit_path, *generator);
2470 rm_rf(*generator, false, true, false);
5a1e9937 2471
07719a21
LP
2472 free(*generator);
2473 *generator = NULL;
2474}
2475
2476void manager_undo_generators(Manager *m) {
2477 assert(m);
2478
2479 remove_generator_dir(m, &m->generator_unit_path);
2480 remove_generator_dir(m, &m->generator_unit_path_early);
2481 remove_generator_dir(m, &m->generator_unit_path_late);
5a1e9937
LP
2482}
2483
718db961
LP
2484int manager_environment_add(Manager *m, char **minus, char **plus) {
2485 char **a = NULL, **b = NULL, **l;
97d0e5f8 2486 assert(m);
bcd8e6d1 2487
718db961 2488 l = m->environment;
bcd8e6d1 2489
718db961
LP
2490 if (!strv_isempty(minus)) {
2491 a = strv_env_delete(l, 1, minus);
2492 if (!a)
2493 return -ENOMEM;
2494
2495 l = a;
2496 }
2497
2498 if (!strv_isempty(plus)) {
2499 b = strv_env_merge(2, l, plus);
2500 if (!b)
2501 return -ENOMEM;
bcd8e6d1 2502
718db961
LP
2503 l = b;
2504 }
2505
2506 if (m->environment != l)
2507 strv_free(m->environment);
2508 if (a != l)
2509 strv_free(a);
2510 if (b != l)
2511 strv_free(b);
2512
9d5a3757 2513 m->environment = strv_sort(l);
97d0e5f8
UTL
2514 return 0;
2515}
2516
c93ff2e9
FC
2517int manager_set_default_rlimits(Manager *m, struct rlimit **default_rlimit) {
2518 int i;
2519
2520 assert(m);
2521
2522 for (i = 0; i < RLIMIT_NLIMITS; i++) {
07719a21
LP
2523 if (!default_rlimit[i])
2524 continue;
c93ff2e9 2525
07719a21
LP
2526 m->rlimit[i] = newdup(struct rlimit, default_rlimit[i], 1);
2527 if (!m->rlimit[i])
2528 return -ENOMEM;
c93ff2e9
FC
2529 }
2530
2531 return 0;
2532}
2533
4cfa2c99 2534void manager_recheck_journal(Manager *m) {
f1dd0c3f
LP
2535 Unit *u;
2536
2537 assert(m);
2538
67445f4e 2539 if (m->running_as != SYSTEMD_SYSTEM)
f1dd0c3f
LP
2540 return;
2541
731a676c
LP
2542 u = manager_get_unit(m, SPECIAL_JOURNALD_SOCKET);
2543 if (u && SOCKET(u)->state != SOCKET_RUNNING) {
4cfa2c99 2544 log_close_journal();
731a676c 2545 return;
f1dd0c3f
LP
2546 }
2547
731a676c
LP
2548 u = manager_get_unit(m, SPECIAL_JOURNALD_SERVICE);
2549 if (u && SERVICE(u)->state != SERVICE_RUNNING) {
4cfa2c99 2550 log_close_journal();
731a676c
LP
2551 return;
2552 }
f1dd0c3f 2553
731a676c
LP
2554 /* Hmm, OK, so the socket is fully up and the service is up
2555 * too, then let's make use of the thing. */
f1dd0c3f
LP
2556 log_open();
2557}
2558
27d340c7
LP
2559void manager_set_show_status(Manager *m, bool b) {
2560 assert(m);
2561
67445f4e 2562 if (m->running_as != SYSTEMD_SYSTEM)
27d340c7
LP
2563 return;
2564
2565 m->show_status = b;
2566
2567 if (b)
2568 touch("/run/systemd/show-status");
2569 else
2570 unlink("/run/systemd/show-status");
2571}
2572
6084e22e 2573static bool manager_get_show_status(Manager *m) {
27d340c7
LP
2574 assert(m);
2575
67445f4e 2576 if (m->running_as != SYSTEMD_SYSTEM)
27d340c7
LP
2577 return false;
2578
31a7eb86
ZJS
2579 if (m->no_console_output)
2580 return false;
2581
27d340c7
LP
2582 if (m->show_status)
2583 return true;
2584
2585 /* If Plymouth is running make sure we show the status, so
2586 * that there's something nice to see when people press Esc */
2587
2588 return plymouth_running();
2589}
68b29a9f 2590
984a2be4 2591void manager_status_printf(Manager *m, bool ephemeral, const char *status, const char *format, ...) {
25cee550
MS
2592 va_list ap;
2593
2594 if (!manager_get_show_status(m))
2595 return;
2596
03b717a3
MS
2597 /* XXX We should totally drop the check for ephemeral here
2598 * and thus effectively make 'Type=idle' pointless. */
2599 if (ephemeral && m->n_on_console > 0)
2600 return;
2601
25cee550
MS
2602 if (!manager_is_booting_or_shutting_down(m))
2603 return;
2604
2605 va_start(ap, format);
984a2be4 2606 status_vprintf(status, true, ephemeral, format, ap);
25cee550
MS
2607 va_end(ap);
2608}
2609
a57f7e2c
LP
2610int manager_get_unit_by_path(Manager *m, const char *path, const char *suffix, Unit **_found) {
2611 _cleanup_free_ char *p = NULL;
2612 Unit *found;
2613
2614 assert(m);
2615 assert(path);
2616 assert(suffix);
2617 assert(_found);
2618
2619 p = unit_name_from_path(path, suffix);
2620 if (!p)
2621 return -ENOMEM;
2622
2623 found = manager_get_unit(m, p);
2624 if (!found) {
2625 *_found = NULL;
2626 return 0;
2627 }
2628
2629 *_found = found;
2630 return 1;
2631}
2632
2633Set *manager_get_units_requiring_mounts_for(Manager *m, const char *path) {
2634 char p[strlen(path)+1];
2635
2636 assert(m);
2637 assert(path);
2638
2639 strcpy(p, path);
2640 path_kill_slashes(p);
2641
2642 return hashmap_get(m->units_requiring_mounts_for, streq(p, "/") ? "" : p);
2643}