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