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