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