]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/core/manager.c
core: don't send duplicate SIGCONT when killing units
[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;
e5723c89 108 return sd_event_add_monotonic(m->event, next, 0, manager_dispatch_jobs_in_progress, m, &m->jobs_in_progress_event_source);
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
718db961
LP
212 r = sd_event_add_io(m->event, m->idle_pipe[2], EPOLLIN, manager_dispatch_idle_pipe_fd, m, &m->idle_pipe_event_source);
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
718db961
LP
256 r = sd_event_add_io(m->event, m->time_change_fd, EPOLLIN, manager_dispatch_time_change_fd, m, &m->time_change_event_source);
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
718db961
LP
343 r = sd_event_add_io(m->event, m->signal_fd, EPOLLIN, manager_dispatch_signal_fd, m, &m->signal_event_source);
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_pids, trivial_hash_func, trivial_compare_func);
451 if (r < 0)
8e274523
LP
452 goto fail;
453
718db961
LP
454 r = hashmap_ensure_allocated(&m->watch_bus, string_hash_func, string_compare_func);
455 if (r < 0)
05e343b7
LP
456 goto fail;
457
718db961
LP
458 r = sd_event_default(&m->event);
459 if (r < 0)
8742514c
LP
460 goto fail;
461
752b5905
LP
462 r = sd_event_add_defer(m->event, manager_dispatch_run_queue, m, &m->run_queue_event_source);
463 if (r < 0)
464 goto fail;
465
466 r = sd_event_source_set_priority(m->run_queue_event_source, SD_EVENT_PRIORITY_IDLE);
467 if (r < 0)
468 goto fail;
469
470 r = sd_event_source_set_enabled(m->run_queue_event_source, SD_EVENT_OFF);
471 if (r < 0)
472 goto fail;
473
8742514c
LP
474 r = manager_setup_signals(m);
475 if (r < 0)
9152c765
LP
476 goto fail;
477
8742514c
LP
478 r = manager_setup_cgroup(m);
479 if (r < 0)
8e274523
LP
480 goto fail;
481
8742514c
LP
482 r = manager_setup_time_change(m);
483 if (r < 0)
8c47c732
LP
484 goto fail;
485
9670d583
LP
486 m->udev = udev_new();
487 if (!m->udev) {
488 r = -ENOMEM;
489 goto fail;
490 }
491
d86f9d52
LP
492 /* Note that we set up neither kdbus, nor the notify fd
493 * here. We do that after deserialization, since they might
494 * have gotten serialized across the reexec. */
495
72bc8d00
LP
496 m->taint_usr = dir_is_empty("/usr") > 0;
497
8e274523
LP
498 *_m = m;
499 return 0;
60918275
LP
500
501fail:
502 manager_free(m);
8e274523 503 return r;
60918275
LP
504}
505
d86f9d52
LP
506static int manager_setup_notify(Manager *m) {
507 union {
508 struct sockaddr sa;
509 struct sockaddr_un un;
510 } sa = {
511 .sa.sa_family = AF_UNIX,
512 };
513 int one = 1, r;
514
515 if (m->notify_fd < 0) {
516 _cleanup_close_ int fd = -1;
517
518 /* First free all secondary fields */
519 free(m->notify_socket);
520 m->notify_socket = NULL;
521 m->notify_event_source = sd_event_source_unref(m->notify_event_source);
522
523 fd = socket(AF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
524 if (fd < 0) {
525 log_error("Failed to allocate notification socket: %m");
526 return -errno;
527 }
528
529 if (getpid() != 1 || detect_container(NULL) > 0)
9bf3b535 530 snprintf(sa.un.sun_path, sizeof(sa.un.sun_path), NOTIFY_SOCKET "/%" PRIx64, random_u64());
d86f9d52
LP
531 else
532 strncpy(sa.un.sun_path, NOTIFY_SOCKET, sizeof(sa.un.sun_path));
533 sa.un.sun_path[0] = 0;
534
535 r = bind(fd, &sa.sa, offsetof(struct sockaddr_un, sun_path) + 1 + strlen(sa.un.sun_path+1));
536 if (r < 0) {
537 log_error("bind() failed: %m");
538 return -errno;
539 }
540
541 r = setsockopt(fd, SOL_SOCKET, SO_PASSCRED, &one, sizeof(one));
542 if (r < 0) {
543 log_error("SO_PASSCRED failed: %m");
544 return -errno;
545 }
546
547 sa.un.sun_path[0] = '@';
548 m->notify_socket = strdup(sa.un.sun_path);
549 if (!m->notify_socket)
550 return log_oom();
551
552 m->notify_fd = fd;
553 fd = -1;
554
555 log_debug("Using notification socket %s", m->notify_socket);
556 }
557
558 if (!m->notify_event_source) {
559 r = sd_event_add_io(m->event, m->notify_fd, EPOLLIN, manager_dispatch_notify_fd, m, &m->notify_event_source);
560 if (r < 0) {
561 log_error("Failed to allocate notify event source: %s", strerror(-r));
562 return -errno;
563 }
564
565 /* Process signals a bit earlier than SIGCHLD, so that we can
566 * still identify to which service an exit message belongs */
567 r = sd_event_source_set_priority(m->notify_event_source, -7);
568 if (r < 0) {
569 log_error("Failed to set priority of notify event source: %s", strerror(-r));
570 return r;
571 }
572 }
573
574 return 0;
575}
576
577static int manager_setup_kdbus(Manager *m) {
5bf348d7 578#ifdef ENABLE_KDBUS
d86f9d52 579 _cleanup_free_ char *p = NULL;
5bf348d7 580#endif
d86f9d52 581
5bf348d7 582#ifdef ENABLE_KDBUS
d86f9d52
LP
583 assert(m);
584
d86f9d52
LP
585 if (m->kdbus_fd >= 0)
586 return 0;
587
f2769777 588 m->kdbus_fd = bus_kernel_create_bus(m->running_as == SYSTEMD_SYSTEM ? "system" : "user", m->running_as == SYSTEMD_SYSTEM, &p);
d86f9d52
LP
589 if (m->kdbus_fd < 0) {
590 log_debug("Failed to set up kdbus: %s", strerror(-m->kdbus_fd));
591 return m->kdbus_fd;
592 }
593
594 log_debug("Successfully set up kdbus on %s", p);
595
596 /* Create the namespace directory here, so that the contents
597 * of that directory is not visible to non-root users. This is
598 * necessary to ensure that users cannot get access to busses
599 * of virtualized users when no UID namespacing is used. */
88c59cb3 600 if (m->running_as == SYSTEMD_SYSTEM)
486e99a3 601 mkdir_p_label("/dev/kdbus/domain", 0700);
d86f9d52
LP
602#endif
603
604 return 0;
605}
606
607static int manager_connect_bus(Manager *m, bool reexecuting) {
608 bool try_bus_connect;
609
610 assert(m);
611
612 try_bus_connect =
613 m->kdbus_fd >= 0 ||
614 reexecuting ||
615 (m->running_as == SYSTEMD_USER && getenv("DBUS_SESSION_BUS_ADDRESS"));
616
617 /* Try to connect to the busses, if possible. */
618 return bus_init(m, try_bus_connect);
619}
620
23a177ef 621static unsigned manager_dispatch_cleanup_queue(Manager *m) {
595ed347 622 Unit *u;
23a177ef
LP
623 unsigned n = 0;
624
625 assert(m);
626
595ed347
MS
627 while ((u = m->cleanup_queue)) {
628 assert(u->in_cleanup_queue);
23a177ef 629
595ed347 630 unit_free(u);
23a177ef
LP
631 n++;
632 }
633
634 return n;
635}
636
eced69b3 637enum {
35b8ca3a 638 GC_OFFSET_IN_PATH, /* This one is on the path we were traveling */
eced69b3
LP
639 GC_OFFSET_UNSURE, /* No clue */
640 GC_OFFSET_GOOD, /* We still need this unit */
641 GC_OFFSET_BAD, /* We don't need this unit anymore */
642 _GC_OFFSET_MAX
643};
644
645static void unit_gc_sweep(Unit *u, unsigned gc_marker) {
701cc384
LP
646 Iterator i;
647 Unit *other;
eced69b3 648 bool is_bad;
701cc384
LP
649
650 assert(u);
651
ac155bb8
MS
652 if (u->gc_marker == gc_marker + GC_OFFSET_GOOD ||
653 u->gc_marker == gc_marker + GC_OFFSET_BAD ||
654 u->gc_marker == gc_marker + GC_OFFSET_IN_PATH)
701cc384
LP
655 return;
656
ac155bb8 657 if (u->in_cleanup_queue)
701cc384
LP
658 goto bad;
659
660 if (unit_check_gc(u))
661 goto good;
662
ac155bb8 663 u->gc_marker = gc_marker + GC_OFFSET_IN_PATH;
eced69b3
LP
664
665 is_bad = true;
666
ac155bb8 667 SET_FOREACH(other, u->dependencies[UNIT_REFERENCED_BY], i) {
701cc384
LP
668 unit_gc_sweep(other, gc_marker);
669
ac155bb8 670 if (other->gc_marker == gc_marker + GC_OFFSET_GOOD)
701cc384 671 goto good;
eced69b3 672
ac155bb8 673 if (other->gc_marker != gc_marker + GC_OFFSET_BAD)
eced69b3 674 is_bad = false;
701cc384
LP
675 }
676
eced69b3
LP
677 if (is_bad)
678 goto bad;
679
680 /* We were unable to find anything out about this entry, so
681 * let's investigate it later */
ac155bb8 682 u->gc_marker = gc_marker + GC_OFFSET_UNSURE;
eced69b3
LP
683 unit_add_to_gc_queue(u);
684 return;
685
701cc384 686bad:
eced69b3
LP
687 /* We definitely know that this one is not useful anymore, so
688 * let's mark it for deletion */
ac155bb8 689 u->gc_marker = gc_marker + GC_OFFSET_BAD;
eced69b3 690 unit_add_to_cleanup_queue(u);
701cc384
LP
691 return;
692
693good:
ac155bb8 694 u->gc_marker = gc_marker + GC_OFFSET_GOOD;
701cc384
LP
695}
696
697static unsigned manager_dispatch_gc_queue(Manager *m) {
595ed347 698 Unit *u;
701cc384 699 unsigned n = 0;
eced69b3 700 unsigned gc_marker;
701cc384
LP
701
702 assert(m);
703
cf1265e1 704 /* log_debug("Running GC..."); */
701cc384 705
eced69b3
LP
706 m->gc_marker += _GC_OFFSET_MAX;
707 if (m->gc_marker + _GC_OFFSET_MAX <= _GC_OFFSET_MAX)
c9c0cadb 708 m->gc_marker = 1;
701cc384 709
eced69b3
LP
710 gc_marker = m->gc_marker;
711
595ed347
MS
712 while ((u = m->gc_queue)) {
713 assert(u->in_gc_queue);
701cc384 714
595ed347 715 unit_gc_sweep(u, gc_marker);
eced69b3 716
71fda00f 717 LIST_REMOVE(gc_queue, m->gc_queue, u);
595ed347 718 u->in_gc_queue = false;
701cc384
LP
719
720 n++;
721
595ed347
MS
722 if (u->gc_marker == gc_marker + GC_OFFSET_BAD ||
723 u->gc_marker == gc_marker + GC_OFFSET_UNSURE) {
66870f90 724 log_debug_unit(u->id, "Collecting %s", u->id);
595ed347
MS
725 u->gc_marker = gc_marker + GC_OFFSET_BAD;
726 unit_add_to_cleanup_queue(u);
701cc384
LP
727 }
728 }
729
730 m->n_in_gc_queue = 0;
701cc384
LP
731
732 return n;
733}
734
a16e1123 735static void manager_clear_jobs_and_units(Manager *m) {
a16e1123 736 Unit *u;
60918275
LP
737
738 assert(m);
739
87f0e418
LP
740 while ((u = hashmap_first(m->units)))
741 unit_free(u);
964e0949
LP
742
743 manager_dispatch_cleanup_queue(m);
744
745 assert(!m->load_queue);
746 assert(!m->run_queue);
747 assert(!m->dbus_unit_queue);
748 assert(!m->dbus_job_queue);
749 assert(!m->cleanup_queue);
750 assert(!m->gc_queue);
751
964e0949
LP
752 assert(hashmap_isempty(m->jobs));
753 assert(hashmap_isempty(m->units));
9e9e2b72
MS
754
755 m->n_on_console = 0;
756 m->n_running_jobs = 0;
a16e1123
LP
757}
758
759void manager_free(Manager *m) {
760 UnitType c;
c93ff2e9 761 int i;
87f0e418 762
a16e1123
LP
763 assert(m);
764
765 manager_clear_jobs_and_units(m);
23a177ef 766
7824bbeb
LP
767 for (c = 0; c < _UNIT_TYPE_MAX; c++)
768 if (unit_vtable[c]->shutdown)
769 unit_vtable[c]->shutdown(m);
770
a16e1123
LP
771 /* If we reexecute ourselves, we keep the root cgroup
772 * around */
c6c18be3 773 manager_shutdown_cgroup(m, m->exit_code != MANAGER_REEXECUTE);
8e274523 774
5a1e9937
LP
775 manager_undo_generators(m);
776
5e8d1c9a 777 bus_done(m);
ea430986 778
87f0e418 779 hashmap_free(m->units);
60918275 780 hashmap_free(m->jobs);
9152c765 781 hashmap_free(m->watch_pids);
05e343b7 782 hashmap_free(m->watch_bus);
9152c765 783
718db961
LP
784 sd_event_source_unref(m->signal_event_source);
785 sd_event_source_unref(m->notify_event_source);
786 sd_event_source_unref(m->time_change_event_source);
787 sd_event_source_unref(m->jobs_in_progress_event_source);
788 sd_event_source_unref(m->idle_pipe_event_source);
752b5905 789 sd_event_source_unref(m->run_queue_event_source);
718db961
LP
790
791 if (m->signal_fd >= 0)
792 close_nointr_nofail(m->signal_fd);
793 if (m->notify_fd >= 0)
794 close_nointr_nofail(m->notify_fd);
795 if (m->time_change_fd >= 0)
796 close_nointr_nofail(m->time_change_fd);
e3dd987c
LP
797 if (m->kdbus_fd >= 0)
798 close_nointr_nofail(m->kdbus_fd);
718db961
LP
799
800 manager_close_idle_pipe(m);
801
9670d583 802 udev_unref(m->udev);
718db961 803 sd_event_unref(m->event);
60918275 804
c952c6ec
LP
805 free(m->notify_socket);
806
84e3543e 807 lookup_paths_free(&m->lookup_paths);
1137a57c 808 strv_free(m->environment);
036643a2 809
4ad49000 810 hashmap_free(m->cgroup_unit);
c6c18be3 811 set_free_free(m->unit_path_cache);
33be102a 812
664f88a7
LP
813 free(m->switch_root);
814 free(m->switch_root_init);
815
c93ff2e9
FC
816 for (i = 0; i < RLIMIT_NLIMITS; i++)
817 free(m->rlimit[i]);
818
a57f7e2c
LP
819 assert(hashmap_isempty(m->units_requiring_mounts_for));
820 hashmap_free(m->units_requiring_mounts_for);
821
60918275
LP
822 free(m);
823}
824
a16e1123
LP
825int manager_enumerate(Manager *m) {
826 int r = 0, q;
f50e0a01 827 UnitType c;
f50e0a01
LP
828
829 assert(m);
830
a16e1123
LP
831 /* Let's ask every type to load all units from disk/kernel
832 * that it might know */
f50e0a01 833 for (c = 0; c < _UNIT_TYPE_MAX; c++)
a57f7e2c
LP
834 if (unit_vtable[c]->enumerate) {
835 q = unit_vtable[c]->enumerate(m);
836 if (q < 0)
a16e1123 837 r = q;
a57f7e2c 838 }
f50e0a01
LP
839
840 manager_dispatch_load_queue(m);
a16e1123
LP
841 return r;
842}
843
9588bc32 844static int manager_coldplug(Manager *m) {
a16e1123
LP
845 int r = 0, q;
846 Iterator i;
847 Unit *u;
848 char *k;
849
850 assert(m);
f50e0a01
LP
851
852 /* Then, let's set up their initial state. */
853 HASHMAP_FOREACH_KEY(u, k, m->units, i) {
854
855 /* ignore aliases */
ac155bb8 856 if (u->id != k)
f50e0a01
LP
857 continue;
858
cca098b0
LP
859 if ((q = unit_coldplug(u)) < 0)
860 r = q;
f50e0a01
LP
861 }
862
a16e1123
LP
863 return r;
864}
865
fe51822e
LP
866static void manager_build_unit_path_cache(Manager *m) {
867 char **i;
7fd1b19b 868 _cleanup_free_ DIR *d = NULL;
fe51822e
LP
869 int r;
870
871 assert(m);
872
873 set_free_free(m->unit_path_cache);
874
874310b7
ZJS
875 m->unit_path_cache = set_new(string_hash_func, string_compare_func);
876 if (!m->unit_path_cache) {
fe51822e
LP
877 log_error("Failed to allocate unit path cache.");
878 return;
879 }
880
881 /* This simply builds a list of files we know exist, so that
882 * we don't always have to go to disk */
883
884 STRV_FOREACH(i, m->lookup_paths.unit_path) {
885 struct dirent *de;
886
bd0af849
ZJS
887 d = opendir(*i);
888 if (!d) {
874310b7
ZJS
889 if (errno != ENOENT)
890 log_error("Failed to open directory %s: %m", *i);
fe51822e
LP
891 continue;
892 }
893
894 while ((de = readdir(d))) {
895 char *p;
896
897 if (ignore_file(de->d_name))
898 continue;
899
b7def684 900 p = strjoin(streq(*i, "/") ? "" : *i, "/", de->d_name, NULL);
44d91056 901 if (!p) {
fe51822e
LP
902 r = -ENOMEM;
903 goto fail;
904 }
905
ef42202a
ZJS
906 r = set_consume(m->unit_path_cache, p);
907 if (r < 0)
fe51822e 908 goto fail;
fe51822e
LP
909 }
910
911 closedir(d);
912 d = NULL;
913 }
914
915 return;
916
917fail:
918 log_error("Failed to build unit path cache: %s", strerror(-r));
919
920 set_free_free(m->unit_path_cache);
921 m->unit_path_cache = NULL;
fe51822e
LP
922}
923
9588bc32
LP
924
925static int manager_distribute_fds(Manager *m, FDSet *fds) {
926 Unit *u;
927 Iterator i;
928 int r;
929
930 assert(m);
931
932 HASHMAP_FOREACH(u, m->units, i) {
933
934 if (fdset_size(fds) <= 0)
935 break;
936
937 if (UNIT_VTABLE(u)->distribute_fds) {
938 r = UNIT_VTABLE(u)->distribute_fds(u, fds);
939 if (r < 0)
940 return r;
941 }
942 }
943
944 return 0;
945}
946
a16e1123
LP
947int manager_startup(Manager *m, FILE *serialization, FDSet *fds) {
948 int r, q;
949
950 assert(m);
951
518d10e9 952 dual_timestamp_get(&m->generators_start_timestamp);
5a1e9937 953 manager_run_generators(m);
518d10e9 954 dual_timestamp_get(&m->generators_finish_timestamp);
5a1e9937 955
07719a21
LP
956 r = lookup_paths_init(
957 &m->lookup_paths, m->running_as, true,
958 m->generator_unit_path,
959 m->generator_unit_path_early,
960 m->generator_unit_path_late);
961 if (r < 0)
962 return r;
963
fe51822e
LP
964 manager_build_unit_path_cache(m);
965
9f611ad8
LP
966 /* If we will deserialize make sure that during enumeration
967 * this is already known, so we increase the counter here
968 * already */
969 if (serialization)
a7556052 970 m->n_reloading ++;
9f611ad8 971
a16e1123 972 /* First, enumerate what we can from all config files */
718db961 973 dual_timestamp_get(&m->units_load_start_timestamp);
a16e1123 974 r = manager_enumerate(m);
718db961 975 dual_timestamp_get(&m->units_load_finish_timestamp);
a16e1123
LP
976
977 /* Second, deserialize if there is something to deserialize */
07719a21
LP
978 if (serialization) {
979 q = manager_deserialize(m, serialization, fds);
980 if (q < 0)
a16e1123 981 r = q;
07719a21 982 }
a16e1123 983
01e10de3
LP
984 /* Any fds left? Find some unit which wants them. This is
985 * useful to allow container managers to pass some file
986 * descriptors to us pre-initialized. This enables
987 * socket-based activation of entire containers. */
988 if (fdset_size(fds) > 0) {
989 q = manager_distribute_fds(m, fds);
990 if (q < 0)
991 r = q;
992 }
993
d86f9d52
LP
994 /* We might have deserialized the notify fd, but if we didn't
995 * then let's create the bus now */
996 manager_setup_notify(m);
997
e3dd987c
LP
998 /* We might have deserialized the kdbus control fd, but if we
999 * didn't, then let's create the bus now. */
1000 manager_setup_kdbus(m);
1001 manager_connect_bus(m, !!serialization);
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
718db961
LP
1322static int manager_dispatch_notify_fd(sd_event_source *source, int fd, uint32_t revents, void *userdata) {
1323 Manager *m = userdata;
8c47c732
LP
1324 ssize_t n;
1325
1326 assert(m);
718db961
LP
1327 assert(m->notify_fd == fd);
1328
1329 if (revents != EPOLLIN) {
1330 log_warning("Got unexpected poll event for notify fd.");
1331 return 0;
1332 }
8c47c732
LP
1333
1334 for (;;) {
1335 char buf[4096];
b92bea5d
ZJS
1336 struct iovec iovec = {
1337 .iov_base = buf,
1338 .iov_len = sizeof(buf)-1,
1339 };
1340
8c47c732
LP
1341 union {
1342 struct cmsghdr cmsghdr;
1343 uint8_t buf[CMSG_SPACE(sizeof(struct ucred))];
b92bea5d
ZJS
1344 } control = {};
1345
1346 struct msghdr msghdr = {
1347 .msg_iov = &iovec,
1348 .msg_iovlen = 1,
1349 .msg_control = &control,
1350 .msg_controllen = sizeof(control),
1351 };
1352 struct ucred *ucred;
8c47c732 1353 Unit *u;
7fd1b19b 1354 _cleanup_strv_free_ char **tags = NULL;
8c47c732 1355
718db961 1356 n = recvmsg(m->notify_fd, &msghdr, MSG_DONTWAIT);
bd0af849 1357 if (n <= 0) {
b92bea5d 1358 if (n == 0)
8c47c732
LP
1359 return -EIO;
1360
f6144808 1361 if (errno == EAGAIN || errno == EINTR)
8c47c732
LP
1362 break;
1363
1364 return -errno;
1365 }
1366
1367 if (msghdr.msg_controllen < CMSG_LEN(sizeof(struct ucred)) ||
1368 control.cmsghdr.cmsg_level != SOL_SOCKET ||
1369 control.cmsghdr.cmsg_type != SCM_CREDENTIALS ||
1370 control.cmsghdr.cmsg_len != CMSG_LEN(sizeof(struct ucred))) {
1371 log_warning("Received notify message without credentials. Ignoring.");
1372 continue;
1373 }
1374
1375 ucred = (struct ucred*) CMSG_DATA(&control.cmsghdr);
1376
bd0af849
ZJS
1377 u = hashmap_get(m->watch_pids, LONG_TO_PTR(ucred->pid));
1378 if (!u) {
4ad49000 1379 u = manager_get_unit_by_pid(m, ucred->pid);
bd0af849 1380 if (!u) {
ccd06097 1381 log_warning("Cannot find unit for notify message of PID "PID_FMT".", ucred->pid);
8c47c732
LP
1382 continue;
1383 }
bd0af849 1384 }
8c47c732 1385
8c40acf7
LP
1386 assert((size_t) n < sizeof(buf));
1387 buf[n] = 0;
bd0af849
ZJS
1388 tags = strv_split(buf, "\n\r");
1389 if (!tags)
1390 return log_oom();
8c47c732 1391
66870f90 1392 log_debug_unit(u->id, "Got notification message for unit %s", u->id);
8c47c732
LP
1393
1394 if (UNIT_VTABLE(u)->notify_message)
c952c6ec 1395 UNIT_VTABLE(u)->notify_message(u, ucred->pid, tags);
8c47c732
LP
1396 }
1397
1398 return 0;
1399}
1400
034c6ed7 1401static int manager_dispatch_sigchld(Manager *m) {
9152c765
LP
1402 assert(m);
1403
1404 for (;;) {
b92bea5d 1405 siginfo_t si = {};
87f0e418 1406 Unit *u;
9152c765 1407
4112df16
LP
1408 /* First we call waitd() for a PID and do not reap the
1409 * zombie. That way we can still access /proc/$PID for
1410 * it while it is a zombie. */
1411 if (waitid(P_ALL, 0, &si, WEXITED|WNOHANG|WNOWAIT) < 0) {
acbb0225
LP
1412
1413 if (errno == ECHILD)
1414 break;
1415
4112df16
LP
1416 if (errno == EINTR)
1417 continue;
1418
9152c765 1419 return -errno;
acbb0225 1420 }
9152c765 1421
4112df16 1422 if (si.si_pid <= 0)
9152c765
LP
1423 break;
1424
15d5d9d9 1425 if (si.si_code == CLD_EXITED || si.si_code == CLD_KILLED || si.si_code == CLD_DUMPED) {
7fd1b19b 1426 _cleanup_free_ char *name = NULL;
4112df16 1427
87d2c1ff 1428 get_process_comm(si.si_pid, &name);
ccd06097 1429 log_debug("Got SIGCHLD for process "PID_FMT" (%s)", si.si_pid, strna(name));
4112df16
LP
1430 }
1431
8c47c732 1432 /* And now figure out the unit this belongs to */
bd0af849
ZJS
1433 u = hashmap_get(m->watch_pids, LONG_TO_PTR(si.si_pid));
1434 if (!u)
4ad49000 1435 u = manager_get_unit_by_pid(m, si.si_pid);
8c47c732 1436
4112df16
LP
1437 /* And now, we actually reap the zombie. */
1438 if (waitid(P_PID, si.si_pid, &si, WEXITED) < 0) {
1439 if (errno == EINTR)
1440 continue;
1441
1442 return -errno;
1443 }
1444
034c6ed7
LP
1445 if (si.si_code != CLD_EXITED && si.si_code != CLD_KILLED && si.si_code != CLD_DUMPED)
1446 continue;
1447
bb00e604
LP
1448 log_debug("Child %lu died (code=%s, status=%i/%s)",
1449 (long unsigned) si.si_pid,
4112df16
LP
1450 sigchld_code_to_string(si.si_code),
1451 si.si_status,
d06dacd0
LP
1452 strna(si.si_code == CLD_EXITED
1453 ? exit_status_to_string(si.si_status, EXIT_STATUS_FULL)
1454 : signal_to_string(si.si_status)));
acbb0225 1455
8c47c732 1456 if (!u)
9152c765
LP
1457 continue;
1458
66870f90
ZJS
1459 log_debug_unit(u->id,
1460 "Child %lu belongs to %s", (long unsigned) si.si_pid, u->id);
6c1a0478 1461
a911bb9a 1462 unit_unwatch_pid(u, si.si_pid);
87f0e418 1463 UNIT_VTABLE(u)->sigchld_event(u, si.si_pid, si.si_code, si.si_status);
9152c765
LP
1464 }
1465
1466 return 0;
1467}
1468
7d793605 1469static int manager_start_target(Manager *m, const char *name, JobMode mode) {
718db961 1470 _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL;
28247076 1471 int r;
398ef8ba 1472
66870f90 1473 log_debug_unit(name, "Activating special unit %s", name);
1e001f52 1474
bd0af849
ZJS
1475 r = manager_add_job_by_name(m, JOB_START, name, mode, true, &error, NULL);
1476 if (r < 0)
718db961 1477 log_error_unit(name, "Failed to enqueue %s job: %s", name, bus_error_message(&error, r));
a1b256b0
LP
1478
1479 return r;
28247076
LP
1480}
1481
718db961
LP
1482static int manager_dispatch_signal_fd(sd_event_source *source, int fd, uint32_t revents, void *userdata) {
1483 Manager *m = userdata;
9152c765
LP
1484 ssize_t n;
1485 struct signalfd_siginfo sfsi;
1486 bool sigchld = false;
1487
1488 assert(m);
718db961
LP
1489 assert(m->signal_fd == fd);
1490
1491 if (revents != EPOLLIN) {
1492 log_warning("Got unexpected events from signal file descriptor.");
1493 return 0;
1494 }
9152c765
LP
1495
1496 for (;;) {
718db961 1497 n = read(m->signal_fd, &sfsi, sizeof(sfsi));
57cb4adf 1498 if (n != sizeof(sfsi)) {
9152c765
LP
1499
1500 if (n >= 0)
1501 return -EIO;
1502
63090775 1503 if (errno == EINTR || errno == EAGAIN)
acbb0225 1504 break;
9152c765
LP
1505
1506 return -errno;
1507 }
1508
67370238 1509 if (sfsi.ssi_pid > 0) {
a9244623 1510 _cleanup_free_ char *p = NULL;
67370238 1511
87d2c1ff 1512 get_process_comm(sfsi.ssi_pid, &p);
dfa7f7e1 1513
a9244623
ZJS
1514 log_full(sfsi.ssi_signo == SIGCHLD ||
1515 (sfsi.ssi_signo == SIGTERM && m->running_as == SYSTEMD_USER)
1516 ? LOG_DEBUG : LOG_INFO,
ccd06097 1517 "Received SIG%s from PID "PID_FMT" (%s).",
a9244623 1518 signal_to_string(sfsi.ssi_signo),
ccd06097 1519 sfsi.ssi_pid, strna(p));
67370238 1520 } else
a9244623
ZJS
1521 log_full(sfsi.ssi_signo == SIGCHLD ||
1522 (sfsi.ssi_signo == SIGTERM && m->running_as == SYSTEMD_USER)
1523 ? LOG_DEBUG : LOG_INFO,
1524 "Received SIG%s.",
1525 signal_to_string(sfsi.ssi_signo));
1e001f52 1526
b9cd2ec1
LP
1527 switch (sfsi.ssi_signo) {
1528
4112df16 1529 case SIGCHLD:
9152c765 1530 sigchld = true;
b9cd2ec1
LP
1531 break;
1532
6632c602 1533 case SIGTERM:
67445f4e 1534 if (m->running_as == SYSTEMD_SYSTEM) {
db06e3b6
LP
1535 /* This is for compatibility with the
1536 * original sysvinit */
e11dc4a2 1537 m->exit_code = MANAGER_REEXECUTE;
a1b256b0
LP
1538 break;
1539 }
84e9af1e 1540
a1b256b0 1541 /* Fall through */
e11dc4a2
LP
1542
1543 case SIGINT:
67445f4e 1544 if (m->running_as == SYSTEMD_SYSTEM) {
f49fd1d5 1545 manager_start_target(m, SPECIAL_CTRL_ALT_DEL_TARGET, JOB_REPLACE_IRREVERSIBLY);
84e9af1e
LP
1546 break;
1547 }
1548
a1b256b0 1549 /* Run the exit target if there is one, if not, just exit. */
0003d1ab 1550 if (manager_start_target(m, SPECIAL_EXIT_TARGET, JOB_REPLACE) < 0) {
a1b256b0
LP
1551 m->exit_code = MANAGER_EXIT;
1552 return 0;
1553 }
1554
1555 break;
84e9af1e 1556
28247076 1557 case SIGWINCH:
67445f4e 1558 if (m->running_as == SYSTEMD_SYSTEM)
7d793605 1559 manager_start_target(m, SPECIAL_KBREQUEST_TARGET, JOB_REPLACE);
84e9af1e 1560
28247076
LP
1561 /* This is a nop on non-init */
1562 break;
84e9af1e 1563
28247076 1564 case SIGPWR:
67445f4e 1565 if (m->running_as == SYSTEMD_SYSTEM)
7d793605 1566 manager_start_target(m, SPECIAL_SIGPWR_TARGET, JOB_REPLACE);
84e9af1e 1567
28247076 1568 /* This is a nop on non-init */
84e9af1e 1569 break;
6632c602 1570
1005d14f 1571 case SIGUSR1: {
57ee42ce
LP
1572 Unit *u;
1573
1574 u = manager_get_unit(m, SPECIAL_DBUS_SERVICE);
1575
1576 if (!u || UNIT_IS_ACTIVE_OR_RELOADING(unit_active_state(u))) {
1577 log_info("Trying to reconnect to bus...");
3996fbe2 1578 bus_init(m, true);
57ee42ce
LP
1579 }
1580
1581 if (!u || !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u))) {
1582 log_info("Loading D-Bus service...");
7d793605 1583 manager_start_target(m, SPECIAL_DBUS_SERVICE, JOB_REPLACE);
57ee42ce
LP
1584 }
1585
1586 break;
1587 }
1588
2149e37c 1589 case SIGUSR2: {
718db961
LP
1590 _cleanup_free_ char *dump = NULL;
1591 _cleanup_fclose_ FILE *f = NULL;
2149e37c
LP
1592 size_t size;
1593
718db961
LP
1594 f = open_memstream(&dump, &size);
1595 if (!f) {
2149e37c
LP
1596 log_warning("Failed to allocate memory stream.");
1597 break;
1598 }
1599
1600 manager_dump_units(m, f, "\t");
1601 manager_dump_jobs(m, f, "\t");
1602
1603 if (ferror(f)) {
2149e37c
LP
1604 log_warning("Failed to write status stream");
1605 break;
1606 }
1607
2149e37c 1608 log_dump(LOG_INFO, dump);
1005d14f 1609 break;
2149e37c 1610 }
1005d14f 1611
a16e1123
LP
1612 case SIGHUP:
1613 m->exit_code = MANAGER_RELOAD;
1614 break;
1615
7d793605 1616 default: {
253ee27a 1617
0003d1ab
LP
1618 /* Starting SIGRTMIN+0 */
1619 static const char * const target_table[] = {
7d793605
LP
1620 [0] = SPECIAL_DEFAULT_TARGET,
1621 [1] = SPECIAL_RESCUE_TARGET,
f057408c 1622 [2] = SPECIAL_EMERGENCY_TARGET,
7d793605
LP
1623 [3] = SPECIAL_HALT_TARGET,
1624 [4] = SPECIAL_POWEROFF_TARGET,
0003d1ab
LP
1625 [5] = SPECIAL_REBOOT_TARGET,
1626 [6] = SPECIAL_KEXEC_TARGET
1627 };
1628
1629 /* Starting SIGRTMIN+13, so that target halt and system halt are 10 apart */
1630 static const ManagerExitCode code_table[] = {
1631 [0] = MANAGER_HALT,
1632 [1] = MANAGER_POWEROFF,
1633 [2] = MANAGER_REBOOT,
1634 [3] = MANAGER_KEXEC
7d793605
LP
1635 };
1636
1637 if ((int) sfsi.ssi_signo >= SIGRTMIN+0 &&
0003d1ab 1638 (int) sfsi.ssi_signo < SIGRTMIN+(int) ELEMENTSOF(target_table)) {
764e9b5f
MS
1639 int idx = (int) sfsi.ssi_signo - SIGRTMIN;
1640 manager_start_target(m, target_table[idx],
1641 (idx == 1 || idx == 2) ? JOB_ISOLATE : JOB_REPLACE);
7d793605
LP
1642 break;
1643 }
1644
0003d1ab
LP
1645 if ((int) sfsi.ssi_signo >= SIGRTMIN+13 &&
1646 (int) sfsi.ssi_signo < SIGRTMIN+13+(int) ELEMENTSOF(code_table)) {
1647 m->exit_code = code_table[sfsi.ssi_signo - SIGRTMIN - 13];
1648 break;
1649 }
1650
0658666b
LP
1651 switch (sfsi.ssi_signo - SIGRTMIN) {
1652
1653 case 20:
1654 log_debug("Enabling showing of status.");
d450b6f2 1655 manager_set_show_status(m, SHOW_STATUS_YES);
0658666b
LP
1656 break;
1657
1658 case 21:
1659 log_debug("Disabling showing of status.");
d450b6f2 1660 manager_set_show_status(m, SHOW_STATUS_NO);
0658666b
LP
1661 break;
1662
253ee27a
LP
1663 case 22:
1664 log_set_max_level(LOG_DEBUG);
1665 log_notice("Setting log level to debug.");
1666 break;
1667
1668 case 23:
1669 log_set_max_level(LOG_INFO);
1670 log_notice("Setting log level to info.");
1671 break;
1672
600b704e
LP
1673 case 24:
1674 if (m->running_as == SYSTEMD_USER) {
1675 m->exit_code = MANAGER_EXIT;
1676 return 0;
1677 }
1678
1679 /* This is a nop on init */
1680 break;
1681
4cfa2c99
LP
1682 case 26:
1683 log_set_target(LOG_TARGET_JOURNAL_OR_KMSG);
1684 log_notice("Setting log target to journal-or-kmsg.");
1685 break;
1686
253ee27a
LP
1687 case 27:
1688 log_set_target(LOG_TARGET_CONSOLE);
1689 log_notice("Setting log target to console.");
1690 break;
1691
1692 case 28:
1693 log_set_target(LOG_TARGET_KMSG);
1694 log_notice("Setting log target to kmsg.");
1695 break;
1696
1697 case 29:
1698 log_set_target(LOG_TARGET_SYSLOG_OR_KMSG);
1699 log_notice("Setting log target to syslog-or-kmsg.");
1700 break;
1701
0658666b 1702 default:
4e240ab0 1703 log_warning("Got unhandled signal <%s>.", signal_to_string(sfsi.ssi_signo));
0658666b 1704 }
b9cd2ec1 1705 }
7d793605 1706 }
9152c765
LP
1707 }
1708
1709 if (sigchld)
7b77ed8c 1710 manager_dispatch_sigchld(m);
034c6ed7
LP
1711
1712 return 0;
1713}
1714
718db961
LP
1715static int manager_dispatch_time_change_fd(sd_event_source *source, int fd, uint32_t revents, void *userdata) {
1716 Manager *m = userdata;
1717 Iterator i;
1718 Unit *u;
034c6ed7
LP
1719
1720 assert(m);
718db961 1721 assert(m->time_change_fd == fd);
034c6ed7 1722
718db961
LP
1723 log_struct(LOG_INFO,
1724 MESSAGE_ID(SD_MESSAGE_TIME_CHANGE),
1725 "MESSAGE=Time has been changed",
1726 NULL);
034c6ed7 1727
718db961
LP
1728 /* Restart the watch */
1729 m->time_change_event_source = sd_event_source_unref(m->time_change_event_source);
acbb0225 1730
718db961
LP
1731 close_nointr_nofail(m->time_change_fd);
1732 m->time_change_fd = -1;
ef734fd6 1733
718db961 1734 manager_setup_time_change(m);
4e434314 1735
718db961
LP
1736 HASHMAP_FOREACH(u, m->units, i)
1737 if (UNIT_VTABLE(u)->time_change)
1738 UNIT_VTABLE(u)->time_change(u);
ea430986 1739
718db961
LP
1740 return 0;
1741}
ea430986 1742
718db961
LP
1743static int manager_dispatch_idle_pipe_fd(sd_event_source *source, int fd, uint32_t revents, void *userdata) {
1744 Manager *m = userdata;
8742514c 1745
718db961
LP
1746 assert(m);
1747 assert(m->idle_pipe[2] == fd);
8742514c 1748
718db961 1749 m->no_console_output = m->n_on_console > 0;
03b717a3 1750
718db961
LP
1751 m->idle_pipe_event_source = sd_event_source_unref(m->idle_pipe_event_source);
1752 manager_close_idle_pipe(m);
03b717a3 1753
718db961
LP
1754 return 0;
1755}
31a7eb86 1756
718db961
LP
1757static int manager_dispatch_jobs_in_progress(sd_event_source *source, usec_t usec, void *userdata) {
1758 Manager *m = userdata;
fd08a840
ZJS
1759 int r;
1760 uint64_t next;
31a7eb86 1761
718db961 1762 assert(m);
fd08a840 1763 assert(source);
9152c765 1764
718db961 1765 manager_print_jobs_in_progress(m);
fd08a840
ZJS
1766
1767 next = now(CLOCK_MONOTONIC) + JOBS_IN_PROGRESS_PERIOD_USEC;
1768 r = sd_event_source_set_time(source, next);
1769 if (r < 0)
1770 return r;
1771
1772 return sd_event_source_set_enabled(source, SD_EVENT_ONESHOT);
9152c765
LP
1773}
1774
1775int manager_loop(Manager *m) {
1776 int r;
9152c765 1777
fac9f8df 1778 RATELIMIT_DEFINE(rl, 1*USEC_PER_SEC, 50000);
ea430986 1779
9152c765 1780 assert(m);
a16e1123 1781 m->exit_code = MANAGER_RUNNING;
9152c765 1782
fe51822e
LP
1783 /* Release the path cache */
1784 set_free_free(m->unit_path_cache);
1785 m->unit_path_cache = NULL;
1786
b0c918b9
LP
1787 manager_check_finished(m);
1788
a4312405 1789 /* There might still be some zombies hanging around from
f3669545 1790 * before we were exec()'ed. Let's reap them. */
e96d6be7
LP
1791 r = manager_dispatch_sigchld(m);
1792 if (r < 0)
a4312405
LP
1793 return r;
1794
a16e1123 1795 while (m->exit_code == MANAGER_RUNNING) {
718db961 1796 usec_t wait_usec;
9152c765 1797
67445f4e 1798 if (m->runtime_watchdog > 0 && m->running_as == SYSTEMD_SYSTEM)
e96d6be7
LP
1799 watchdog_ping();
1800
ea430986
LP
1801 if (!ratelimit_test(&rl)) {
1802 /* Yay, something is going seriously wrong, pause a little */
1803 log_warning("Looping too fast. Throttling execution a little.");
1804 sleep(1);
e96d6be7 1805 continue;
ea430986
LP
1806 }
1807
37a8e683 1808 if (manager_dispatch_load_queue(m) > 0)
23a177ef
LP
1809 continue;
1810
cf1265e1 1811 if (manager_dispatch_gc_queue(m) > 0)
701cc384
LP
1812 continue;
1813
cf1265e1 1814 if (manager_dispatch_cleanup_queue(m) > 0)
c1e1601e 1815 continue;
034c6ed7 1816
cf1265e1 1817 if (manager_dispatch_cgroup_queue(m) > 0)
c1e1601e
LP
1818 continue;
1819
c1e1601e 1820 if (manager_dispatch_dbus_queue(m) > 0)
ea430986 1821 continue;
ea430986 1822
c757a65b 1823 /* Sleep for half the watchdog time */
67445f4e 1824 if (m->runtime_watchdog > 0 && m->running_as == SYSTEMD_SYSTEM) {
718db961
LP
1825 wait_usec = m->runtime_watchdog / 2;
1826 if (wait_usec <= 0)
1827 wait_usec = 1;
c757a65b 1828 } else
718db961 1829 wait_usec = (usec_t) -1;
9152c765 1830
718db961
LP
1831 r = sd_event_run(m->event, wait_usec);
1832 if (r < 0) {
1833 log_error("Failed to run event loop: %s", strerror(-r));
957ca890 1834 return r;
718db961 1835 }
a16e1123 1836 }
957ca890 1837
a16e1123 1838 return m->exit_code;
83c60c9f 1839}
ea430986 1840
718db961 1841int manager_load_unit_from_dbus_path(Manager *m, const char *s, sd_bus_error *e, Unit **_u) {
ede3a796 1842 _cleanup_free_ char *n = NULL;
ea430986 1843 Unit *u;
80fbf05e 1844 int r;
ea430986
LP
1845
1846 assert(m);
1847 assert(s);
1848 assert(_u);
1849
ede3a796
LP
1850 r = unit_name_from_dbus_path(s, &n);
1851 if (r < 0)
1852 return r;
ea430986 1853
80fbf05e 1854 r = manager_load_unit(m, n, NULL, e, &u);
80fbf05e
MS
1855 if (r < 0)
1856 return r;
ea430986
LP
1857
1858 *_u = u;
1859
1860 return 0;
1861}
86fbf370
LP
1862
1863int manager_get_job_from_dbus_path(Manager *m, const char *s, Job **_j) {
718db961 1864 const char *p;
86fbf370 1865 unsigned id;
718db961 1866 Job *j;
86fbf370
LP
1867 int r;
1868
1869 assert(m);
1870 assert(s);
1871 assert(_j);
1872
718db961
LP
1873 p = startswith(s, "/org/freedesktop/systemd1/job/");
1874 if (!p)
86fbf370
LP
1875 return -EINVAL;
1876
718db961 1877 r = safe_atou(p, &id);
8742514c 1878 if (r < 0)
86fbf370
LP
1879 return r;
1880
8742514c
LP
1881 j = manager_get_job(m, id);
1882 if (!j)
86fbf370
LP
1883 return -ENOENT;
1884
1885 *_j = j;
1886
1887 return 0;
1888}
dfcd764e 1889
4927fcae 1890void manager_send_unit_audit(Manager *m, Unit *u, int type, bool success) {
e537352b 1891
4927fcae
LP
1892#ifdef HAVE_AUDIT
1893 char *p;
c1165f82 1894 int audit_fd;
e537352b 1895
c1165f82
LP
1896 audit_fd = get_audit_fd();
1897 if (audit_fd < 0)
e537352b
LP
1898 return;
1899
bbd3a7ba
LP
1900 /* Don't generate audit events if the service was already
1901 * started and we're just deserializing */
a7556052 1902 if (m->n_reloading > 0)
bbd3a7ba
LP
1903 return;
1904
67445f4e 1905 if (m->running_as != SYSTEMD_SYSTEM)
f1dd0c3f
LP
1906 return;
1907
ac155bb8 1908 if (u->type != UNIT_SERVICE)
f1dd0c3f
LP
1909 return;
1910
bd0af849
ZJS
1911 p = unit_name_to_prefix_and_instance(u->id);
1912 if (!p) {
66870f90
ZJS
1913 log_error_unit(u->id,
1914 "Failed to allocate unit name for audit message: %s", strerror(ENOMEM));
e537352b
LP
1915 return;
1916 }
1917
c1165f82 1918 if (audit_log_user_comm_message(audit_fd, type, "", p, NULL, NULL, NULL, success) < 0) {
391ade86
LP
1919 if (errno == EPERM) {
1920 /* We aren't allowed to send audit messages?
44785992 1921 * Then let's not retry again. */
c1165f82 1922 close_audit_fd();
44785992
LP
1923 } else
1924 log_warning("Failed to send audit message: %m");
391ade86 1925 }
e537352b 1926
4927fcae
LP
1927 free(p);
1928#endif
e537352b 1929
e537352b
LP
1930}
1931
e983b760
LP
1932void manager_send_unit_plymouth(Manager *m, Unit *u) {
1933 int fd = -1;
1934 union sockaddr_union sa;
1935 int n = 0;
1936 char *message = NULL;
e983b760
LP
1937
1938 /* Don't generate plymouth events if the service was already
1939 * started and we're just deserializing */
a7556052 1940 if (m->n_reloading > 0)
e983b760
LP
1941 return;
1942
67445f4e 1943 if (m->running_as != SYSTEMD_SYSTEM)
e983b760
LP
1944 return;
1945
3772995a
LP
1946 if (detect_container(NULL) > 0)
1947 return;
1948
ac155bb8
MS
1949 if (u->type != UNIT_SERVICE &&
1950 u->type != UNIT_MOUNT &&
1951 u->type != UNIT_SWAP)
e983b760
LP
1952 return;
1953
1954 /* We set SOCK_NONBLOCK here so that we rather drop the
1955 * message then wait for plymouth */
e62d8c39
ZJS
1956 fd = socket(AF_UNIX, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
1957 if (fd < 0) {
e983b760
LP
1958 log_error("socket() failed: %m");
1959 return;
1960 }
1961
1962 zero(sa);
1963 sa.sa.sa_family = AF_UNIX;
96707269
LP
1964 strncpy(sa.un.sun_path+1, "/org/freedesktop/plymouthd", sizeof(sa.un.sun_path)-1);
1965 if (connect(fd, &sa.sa, offsetof(struct sockaddr_un, sun_path) + 1 + strlen(sa.un.sun_path+1)) < 0) {
e983b760
LP
1966
1967 if (errno != EPIPE &&
1968 errno != EAGAIN &&
1969 errno != ENOENT &&
1970 errno != ECONNREFUSED &&
1971 errno != ECONNRESET &&
1972 errno != ECONNABORTED)
1973 log_error("connect() failed: %m");
1974
1975 goto finish;
1976 }
1977
ac155bb8 1978 if (asprintf(&message, "U\002%c%s%n", (int) (strlen(u->id) + 1), u->id, &n) < 0) {
0d0f0c50 1979 log_oom();
e983b760
LP
1980 goto finish;
1981 }
1982
1983 errno = 0;
bd40a2d8 1984 if (write(fd, message, n + 1) != n + 1) {
e983b760
LP
1985
1986 if (errno != EPIPE &&
1987 errno != EAGAIN &&
1988 errno != ENOENT &&
1989 errno != ECONNREFUSED &&
1990 errno != ECONNRESET &&
1991 errno != ECONNABORTED)
1992 log_error("Failed to write Plymouth message: %m");
1993
1994 goto finish;
1995 }
1996
1997finish:
1998 if (fd >= 0)
1999 close_nointr_nofail(fd);
2000
2001 free(message);
2002}
2003
05e343b7
LP
2004void manager_dispatch_bus_name_owner_changed(
2005 Manager *m,
2006 const char *name,
2007 const char* old_owner,
2008 const char *new_owner) {
2009
2010 Unit *u;
2011
2012 assert(m);
2013 assert(name);
2014
718db961
LP
2015 u = hashmap_get(m->watch_bus, name);
2016 if (!u)
05e343b7
LP
2017 return;
2018
2019 UNIT_VTABLE(u)->bus_name_owner_change(u, name, old_owner, new_owner);
2020}
2021
d8d5ab98 2022int manager_open_serialization(Manager *m, FILE **_f) {
8e33886e 2023 const char *path;
df28bc08 2024 int fd = -1;
a16e1123
LP
2025 FILE *f;
2026
2027 assert(_f);
2028
8e33886e
ZJS
2029 path = m->running_as == SYSTEMD_SYSTEM ? "/run/systemd" : "/tmp";
2030 fd = open_tmpfile(path, O_RDWR|O_CLOEXEC);
d86f9d52 2031 if (fd < 0)
a16e1123 2032 return -errno;
a16e1123 2033
a16e1123 2034 log_debug("Serializing state to %s", path);
a16e1123 2035
01e10de3 2036 f = fdopen(fd, "w+");
d86f9d52
LP
2037 if (!f) {
2038 close_nointr_nofail(fd);
a16e1123 2039 return -errno;
d86f9d52 2040 }
a16e1123
LP
2041
2042 *_f = f;
2043
2044 return 0;
2045}
2046
b3680f49 2047int manager_serialize(Manager *m, FILE *f, FDSet *fds, bool switching_root) {
a16e1123
LP
2048 Iterator i;
2049 Unit *u;
2050 const char *t;
4a9fd066 2051 char **e;
a16e1123
LP
2052 int r;
2053
2054 assert(m);
2055 assert(f);
2056 assert(fds);
2057
a7556052 2058 m->n_reloading ++;
38c52d46 2059
01d67b43
LP
2060 fprintf(f, "current-job-id=%i\n", m->current_job_id);
2061 fprintf(f, "taint-usr=%s\n", yes_no(m->taint_usr));
33c5fae9
LP
2062 fprintf(f, "n-installed-jobs=%u\n", m->n_installed_jobs);
2063 fprintf(f, "n-failed-jobs=%u\n", m->n_failed_jobs);
01d67b43 2064
915b3753 2065 dual_timestamp_serialize(f, "firmware-timestamp", &m->firmware_timestamp);
915b3753 2066 dual_timestamp_serialize(f, "loader-timestamp", &m->loader_timestamp);
718db961 2067 dual_timestamp_serialize(f, "kernel-timestamp", &m->kernel_timestamp);
e9ddabc2 2068 dual_timestamp_serialize(f, "initrd-timestamp", &m->initrd_timestamp);
f38ed060 2069
26a1efdf 2070 if (!in_initrd()) {
915b3753 2071 dual_timestamp_serialize(f, "userspace-timestamp", &m->userspace_timestamp);
f38ed060 2072 dual_timestamp_serialize(f, "finish-timestamp", &m->finish_timestamp);
718db961
LP
2073 dual_timestamp_serialize(f, "security-start-timestamp", &m->security_start_timestamp);
2074 dual_timestamp_serialize(f, "security-finish-timestamp", &m->security_finish_timestamp);
2075 dual_timestamp_serialize(f, "generators-start-timestamp", &m->generators_start_timestamp);
2076 dual_timestamp_serialize(f, "generators-finish-timestamp", &m->generators_finish_timestamp);
2077 dual_timestamp_serialize(f, "units-load-start-timestamp", &m->units_load_start_timestamp);
2078 dual_timestamp_serialize(f, "units-load-finish-timestamp", &m->units_load_finish_timestamp);
f38ed060 2079 }
47a483a1 2080
b3680f49
HH
2081 if (!switching_root) {
2082 STRV_FOREACH(e, m->environment) {
2083 _cleanup_free_ char *ce;
4a9fd066 2084
b3680f49 2085 ce = cescape(*e);
e3dd987c
LP
2086 if (!ce)
2087 return -ENOMEM;
2088
2089 fprintf(f, "env=%s\n", *e);
b3680f49 2090 }
4a9fd066
OS
2091 }
2092
d86f9d52
LP
2093 if (m->notify_fd >= 0) {
2094 int copy;
2095
2096 copy = fdset_put_dup(fds, m->notify_fd);
2097 if (copy < 0)
2098 return copy;
2099
2100 fprintf(f, "notify-fd=%i\n", copy);
2101 fprintf(f, "notify-socket=%s\n", m->notify_socket);
2102 }
2103
e3dd987c
LP
2104 if (m->kdbus_fd >= 0) {
2105 int copy;
2106
2107 copy = fdset_put_dup(fds, m->kdbus_fd);
2108 if (copy < 0)
2109 return copy;
2110
2111 fprintf(f, "kdbus-fd=%i\n", copy);
2112 }
2113
6fa48533
LP
2114 bus_serialize(m, f);
2115
f2382a94
LP
2116 fputc('\n', f);
2117
a16e1123 2118 HASHMAP_FOREACH_KEY(u, t, m->units, i) {
ac155bb8 2119 if (u->id != t)
a16e1123
LP
2120 continue;
2121
2122 if (!unit_can_serialize(u))
2123 continue;
2124
2125 /* Start marker */
ac155bb8 2126 fputs(u->id, f);
a16e1123
LP
2127 fputc('\n', f);
2128
6fa48533
LP
2129 r = unit_serialize(u, f, fds, !switching_root);
2130 if (r < 0) {
a7556052 2131 m->n_reloading --;
a16e1123 2132 return r;
38c52d46 2133 }
a16e1123
LP
2134 }
2135
a7556052
LP
2136 assert(m->n_reloading > 0);
2137 m->n_reloading --;
38c52d46 2138
a16e1123
LP
2139 if (ferror(f))
2140 return -EIO;
2141
b23de6af
LP
2142 r = bus_fdset_add_all(m, fds);
2143 if (r < 0)
2144 return r;
2145
a16e1123
LP
2146 return 0;
2147}
2148
2149int manager_deserialize(Manager *m, FILE *f, FDSet *fds) {
2150 int r = 0;
2151
2152 assert(m);
2153 assert(f);
2154
2155 log_debug("Deserializing state...");
2156
a7556052 2157 m->n_reloading ++;
82c64bf5 2158
10f8e83c 2159 for (;;) {
20c03b7b 2160 char line[LINE_MAX], *l;
10f8e83c
LP
2161
2162 if (!fgets(line, sizeof(line), f)) {
2163 if (feof(f))
2164 r = 0;
2165 else
2166 r = -errno;
2167
2168 goto finish;
2169 }
2170
2171 char_array_0(line);
2172 l = strstrip(line);
2173
2174 if (l[0] == 0)
2175 break;
2176
01d67b43
LP
2177 if (startswith(l, "current-job-id=")) {
2178 uint32_t id;
2179
2180 if (safe_atou32(l+15, &id) < 0)
2181 log_debug("Failed to parse current job id value %s", l+15);
2182 else
2183 m->current_job_id = MAX(m->current_job_id, id);
718db961 2184
33c5fae9
LP
2185 } else if (startswith(l, "n-installed-jobs=")) {
2186 uint32_t n;
2187
2188 if (safe_atou32(l+17, &n) < 0)
2189 log_debug("Failed to parse installed jobs counter %s", l+17);
2190 else
2191 m->n_installed_jobs += n;
718db961 2192
33c5fae9
LP
2193 } else if (startswith(l, "n-failed-jobs=")) {
2194 uint32_t n;
2195
2196 if (safe_atou32(l+14, &n) < 0)
2197 log_debug("Failed to parse failed jobs counter %s", l+14);
2198 else
2199 m->n_failed_jobs += n;
718db961 2200
01d67b43
LP
2201 } else if (startswith(l, "taint-usr=")) {
2202 int b;
2203
e3dd987c
LP
2204 b = parse_boolean(l+10);
2205 if (b < 0)
01d67b43
LP
2206 log_debug("Failed to parse taint /usr flag %s", l+10);
2207 else
2208 m->taint_usr = m->taint_usr || b;
718db961 2209
915b3753
LP
2210 } else if (startswith(l, "firmware-timestamp="))
2211 dual_timestamp_deserialize(l+19, &m->firmware_timestamp);
2212 else if (startswith(l, "loader-timestamp="))
2213 dual_timestamp_deserialize(l+17, &m->loader_timestamp);
2214 else if (startswith(l, "kernel-timestamp="))
2215 dual_timestamp_deserialize(l+17, &m->kernel_timestamp);
2216 else if (startswith(l, "initrd-timestamp="))
e9ddabc2 2217 dual_timestamp_deserialize(l+17, &m->initrd_timestamp);
915b3753
LP
2218 else if (startswith(l, "userspace-timestamp="))
2219 dual_timestamp_deserialize(l+20, &m->userspace_timestamp);
10717a1a 2220 else if (startswith(l, "finish-timestamp="))
799fd0fd 2221 dual_timestamp_deserialize(l+17, &m->finish_timestamp);
718db961
LP
2222 else if (startswith(l, "security-start-timestamp="))
2223 dual_timestamp_deserialize(l+25, &m->security_start_timestamp);
2224 else if (startswith(l, "security-finish-timestamp="))
2225 dual_timestamp_deserialize(l+26, &m->security_finish_timestamp);
2226 else if (startswith(l, "generators-start-timestamp="))
2227 dual_timestamp_deserialize(l+27, &m->generators_start_timestamp);
2228 else if (startswith(l, "generators-finish-timestamp="))
2229 dual_timestamp_deserialize(l+28, &m->generators_finish_timestamp);
2230 else if (startswith(l, "units-load-start-timestamp="))
2231 dual_timestamp_deserialize(l+27, &m->units_load_start_timestamp);
2232 else if (startswith(l, "units-load-finish-timestamp="))
2233 dual_timestamp_deserialize(l+28, &m->units_load_finish_timestamp);
4a9fd066
OS
2234 else if (startswith(l, "env=")) {
2235 _cleanup_free_ char *uce = NULL;
2236 char **e;
2237
2238 uce = cunescape(l+4);
2239 if (!uce) {
2240 r = -ENOMEM;
2241 goto finish;
2242 }
2243
2244 e = strv_env_set(m->environment, uce);
2245 if (!e) {
2246 r = -ENOMEM;
2247 goto finish;
2248 }
2249
2250 strv_free(m->environment);
2251 m->environment = e;
e3dd987c 2252
d86f9d52
LP
2253 } else if (startswith(l, "notify-fd=")) {
2254 int fd;
2255
2256 if (safe_atoi(l + 10, &fd) < 0 || fd < 0 || !fdset_contains(fds, fd))
2257 log_debug("Failed to parse notify fd: %s", l + 10);
2258 else {
be04cbca
LP
2259 if (m->notify_fd >= 0) {
2260 m->notify_event_source = sd_event_source_unref(m->notify_event_source);
d86f9d52 2261 close_nointr_nofail(m->notify_fd);
be04cbca 2262 }
d86f9d52
LP
2263
2264 m->notify_fd = fdset_remove(fds, fd);
2265 }
2266
2267 } else if (startswith(l, "notify-socket=")) {
2268 char *n;
2269
2270 n = strdup(l+14);
2271 if (!n) {
2272 r = -ENOMEM;
2273 goto finish;
2274 }
2275
2276 free(m->notify_socket);
2277 m->notify_socket = n;
2278
e3dd987c
LP
2279 } else if (startswith(l, "kdbus-fd=")) {
2280 int fd;
2281
8bf9fcf4 2282 if (safe_atoi(l + 9, &fd) < 0 || fd < 0 || !fdset_contains(fds, fd))
e3dd987c
LP
2283 log_debug("Failed to parse kdbus fd: %s", l + 9);
2284 else {
2285 if (m->kdbus_fd >= 0)
2286 close_nointr_nofail(m->kdbus_fd);
2287
2288 m->kdbus_fd = fdset_remove(fds, fd);
2289 }
2290
6fa48533 2291 } else if (bus_deserialize_item(m, l) == 0)
10f8e83c
LP
2292 log_debug("Unknown serialization item '%s'", l);
2293 }
2294
a16e1123
LP
2295 for (;;) {
2296 Unit *u;
2297 char name[UNIT_NAME_MAX+2];
2298
2299 /* Start marker */
2300 if (!fgets(name, sizeof(name), f)) {
2301 if (feof(f))
10f8e83c
LP
2302 r = 0;
2303 else
2304 r = -errno;
a16e1123 2305
82c64bf5 2306 goto finish;
a16e1123
LP
2307 }
2308
2309 char_array_0(name);
2310
bd0af849
ZJS
2311 r = manager_load_unit(m, strstrip(name), NULL, NULL, &u);
2312 if (r < 0)
82c64bf5 2313 goto finish;
a16e1123 2314
01e10de3
LP
2315 r = unit_deserialize(u, f, fds);
2316 if (r < 0)
82c64bf5 2317 goto finish;
a16e1123
LP
2318 }
2319
10f8e83c 2320finish:
145b1f79 2321 if (ferror(f))
82c64bf5 2322 r = -EIO;
a16e1123 2323
a7556052
LP
2324 assert(m->n_reloading > 0);
2325 m->n_reloading --;
82c64bf5
LP
2326
2327 return r;
a16e1123
LP
2328}
2329
2330int manager_reload(Manager *m) {
2331 int r, q;
51d122af
ZJS
2332 _cleanup_fclose_ FILE *f = NULL;
2333 _cleanup_fdset_free_ FDSet *fds = NULL;
a16e1123
LP
2334
2335 assert(m);
2336
07719a21
LP
2337 r = manager_open_serialization(m, &f);
2338 if (r < 0)
a16e1123
LP
2339 return r;
2340
a7556052 2341 m->n_reloading ++;
718db961 2342 bus_manager_send_reloading(m, true);
38c52d46 2343
07719a21
LP
2344 fds = fdset_new();
2345 if (!fds) {
a7556052 2346 m->n_reloading --;
51d122af 2347 return -ENOMEM;
a16e1123
LP
2348 }
2349
b3680f49 2350 r = manager_serialize(m, f, fds, false);
07719a21 2351 if (r < 0) {
a7556052 2352 m->n_reloading --;
51d122af 2353 return r;
38c52d46 2354 }
a16e1123
LP
2355
2356 if (fseeko(f, 0, SEEK_SET) < 0) {
a7556052 2357 m->n_reloading --;
51d122af 2358 return -errno;
a16e1123
LP
2359 }
2360
2361 /* From here on there is no way back. */
2362 manager_clear_jobs_and_units(m);
5a1e9937 2363 manager_undo_generators(m);
84e3543e 2364 lookup_paths_free(&m->lookup_paths);
2ded0c04 2365
07719a21 2366 /* Find new unit paths */
5a1e9937
LP
2367 manager_run_generators(m);
2368
07719a21
LP
2369 q = lookup_paths_init(
2370 &m->lookup_paths, m->running_as, true,
2371 m->generator_unit_path,
2372 m->generator_unit_path_early,
2373 m->generator_unit_path_late);
2374 if (q < 0)
2375 r = q;
2376
5a1e9937
LP
2377 manager_build_unit_path_cache(m);
2378
a16e1123 2379 /* First, enumerate what we can from all config files */
07719a21
LP
2380 q = manager_enumerate(m);
2381 if (q < 0)
a16e1123
LP
2382 r = q;
2383
2384 /* Second, deserialize our stored data */
07719a21
LP
2385 q = manager_deserialize(m, f, fds);
2386 if (q < 0)
a16e1123
LP
2387 r = q;
2388
2389 fclose(f);
2390 f = NULL;
2391
a2cc4a6c
ZJS
2392 /* Re-register notify_fd as event source */
2393 q = manager_setup_notify(m);
2394 if (q < 0)
2395 r = q;
2396
a16e1123 2397 /* Third, fire things up! */
07719a21
LP
2398 q = manager_coldplug(m);
2399 if (q < 0)
a16e1123
LP
2400 r = q;
2401
a7556052
LP
2402 assert(m->n_reloading > 0);
2403 m->n_reloading--;
9f611ad8 2404
71445ae7
LP
2405 m->send_reloading_done = true;
2406
a16e1123
LP
2407 return r;
2408}
2409
6084e22e 2410static bool manager_is_booting_or_shutting_down(Manager *m) {
9e58ff9c
LP
2411 Unit *u;
2412
2413 assert(m);
2414
2415 /* Is the initial job still around? */
bacbccb7 2416 if (manager_get_job(m, m->default_unit_job_id))
9e58ff9c
LP
2417 return true;
2418
2419 /* Is there a job for the shutdown target? */
27d340c7
LP
2420 u = manager_get_unit(m, SPECIAL_SHUTDOWN_TARGET);
2421 if (u)
ac155bb8 2422 return !!u->job;
9e58ff9c
LP
2423
2424 return false;
2425}
2426
c17ec25e
MS
2427bool manager_is_reloading_or_reexecuting(Manager *m) {
2428 assert(m);
2429
2430 return m->n_reloading != 0;
2431}
2432
fdf20a31 2433void manager_reset_failed(Manager *m) {
5632e374
LP
2434 Unit *u;
2435 Iterator i;
2436
2437 assert(m);
2438
2439 HASHMAP_FOREACH(u, m->units, i)
fdf20a31 2440 unit_reset_failed(u);
5632e374
LP
2441}
2442
31afa0a4 2443bool manager_unit_inactive_or_pending(Manager *m, const char *name) {
8f6df3fa
LP
2444 Unit *u;
2445
2446 assert(m);
2447 assert(name);
2448
2449 /* Returns true if the unit is inactive or going down */
bd0af849
ZJS
2450 u = manager_get_unit(m, name);
2451 if (!u)
8f6df3fa
LP
2452 return true;
2453
31afa0a4 2454 return unit_inactive_or_pending(u);
8f6df3fa
LP
2455}
2456
b0c918b9 2457void manager_check_finished(Manager *m) {
7ceba241 2458 char userspace[FORMAT_TIMESPAN_MAX], initrd[FORMAT_TIMESPAN_MAX], kernel[FORMAT_TIMESPAN_MAX], sum[FORMAT_TIMESPAN_MAX];
915b3753 2459 usec_t firmware_usec, loader_usec, kernel_usec, initrd_usec, userspace_usec, total_usec;
b0c918b9
LP
2460
2461 assert(m);
2462
a0b64226 2463 if (m->n_running_jobs == 0)
718db961 2464 m->jobs_in_progress_event_source = sd_event_source_unref(m->jobs_in_progress_event_source);
a0b64226 2465
828db5d8 2466 if (hashmap_size(m->jobs) > 0) {
fd08a840 2467 if (m->jobs_in_progress_event_source) {
e5723c89 2468 uint64_t next = now(CLOCK_MONOTONIC) + JOBS_IN_PROGRESS_WAIT_USEC;
fd08a840
ZJS
2469 sd_event_source_set_time(m->jobs_in_progress_event_source, next);
2470 }
b0c918b9 2471 return;
5b176ee0 2472 }
b0c918b9 2473
cb8ccb22 2474 manager_flip_auto_status(m, false);
d450b6f2 2475
f2b68789 2476 /* Notify Type=idle units that we are done now */
718db961
LP
2477 m->idle_pipe_event_source = sd_event_source_unref(m->idle_pipe_event_source);
2478 manager_close_idle_pipe(m);
f2b68789 2479
af6da548
LP
2480 /* Turn off confirm spawn now */
2481 m->confirm_spawn = false;
2482
f2b68789 2483 if (dual_timestamp_is_set(&m->finish_timestamp))
b0c918b9
LP
2484 return;
2485
2486 dual_timestamp_get(&m->finish_timestamp);
2487
67445f4e 2488 if (m->running_as == SYSTEMD_SYSTEM && detect_container(NULL) <= 0) {
e03ae661 2489
915b3753
LP
2490 /* Note that m->kernel_usec.monotonic is always at 0,
2491 * and m->firmware_usec.monotonic and
2492 * m->loader_usec.monotonic should be considered
2493 * negative values. */
2494
7ceba241
LP
2495 firmware_usec = m->firmware_timestamp.monotonic - m->loader_timestamp.monotonic;
2496 loader_usec = m->loader_timestamp.monotonic - m->kernel_timestamp.monotonic;
915b3753 2497 userspace_usec = m->finish_timestamp.monotonic - m->userspace_timestamp.monotonic;
7ceba241 2498 total_usec = m->firmware_timestamp.monotonic + m->finish_timestamp.monotonic;
18fa6b27 2499
e9ddabc2 2500 if (dual_timestamp_is_set(&m->initrd_timestamp)) {
18fa6b27 2501
915b3753
LP
2502 kernel_usec = m->initrd_timestamp.monotonic - m->kernel_timestamp.monotonic;
2503 initrd_usec = m->userspace_timestamp.monotonic - m->initrd_timestamp.monotonic;
18fa6b27 2504
81270860
LP
2505 if (!log_on_console())
2506 log_struct(LOG_INFO,
1ca6783f 2507 MESSAGE_ID(SD_MESSAGE_STARTUP_FINISHED),
ccd06097
ZJS
2508 "KERNEL_USEC="USEC_FMT, kernel_usec,
2509 "INITRD_USEC="USEC_FMT, initrd_usec,
2510 "USERSPACE_USEC="USEC_FMT, userspace_usec,
81270860 2511 "MESSAGE=Startup finished in %s (kernel) + %s (initrd) + %s (userspace) = %s.",
2fa4092c
LP
2512 format_timespan(kernel, sizeof(kernel), kernel_usec, USEC_PER_MSEC),
2513 format_timespan(initrd, sizeof(initrd), initrd_usec, USEC_PER_MSEC),
2514 format_timespan(userspace, sizeof(userspace), userspace_usec, USEC_PER_MSEC),
2515 format_timespan(sum, sizeof(sum), total_usec, USEC_PER_MSEC),
81270860 2516 NULL);
18fa6b27 2517 } else {
915b3753 2518 kernel_usec = m->userspace_timestamp.monotonic - m->kernel_timestamp.monotonic;
18fa6b27
LP
2519 initrd_usec = 0;
2520
81270860
LP
2521 if (!log_on_console())
2522 log_struct(LOG_INFO,
1ca6783f 2523 MESSAGE_ID(SD_MESSAGE_STARTUP_FINISHED),
ccd06097
ZJS
2524 "KERNEL_USEC="USEC_FMT, kernel_usec,
2525 "USERSPACE_USEC="USEC_FMT, userspace_usec,
81270860 2526 "MESSAGE=Startup finished in %s (kernel) + %s (userspace) = %s.",
2fa4092c
LP
2527 format_timespan(kernel, sizeof(kernel), kernel_usec, USEC_PER_MSEC),
2528 format_timespan(userspace, sizeof(userspace), userspace_usec, USEC_PER_MSEC),
2529 format_timespan(sum, sizeof(sum), total_usec, USEC_PER_MSEC),
81270860 2530 NULL);
18fa6b27
LP
2531 }
2532 } else {
915b3753
LP
2533 firmware_usec = loader_usec = initrd_usec = kernel_usec = 0;
2534 total_usec = userspace_usec = m->finish_timestamp.monotonic - m->userspace_timestamp.monotonic;
877d54e9 2535
81270860
LP
2536 if (!log_on_console())
2537 log_struct(LOG_INFO,
1ca6783f 2538 MESSAGE_ID(SD_MESSAGE_STARTUP_FINISHED),
ccd06097 2539 "USERSPACE_USEC="USEC_FMT, userspace_usec,
81270860 2540 "MESSAGE=Startup finished in %s.",
2fa4092c 2541 format_timespan(sum, sizeof(sum), total_usec, USEC_PER_MSEC),
81270860 2542 NULL);
18fa6b27 2543 }
b0c918b9 2544
718db961 2545 bus_manager_send_finished(m, firmware_usec, loader_usec, kernel_usec, initrd_usec, userspace_usec, total_usec);
530345e7
LP
2546
2547 sd_notifyf(false,
2548 "READY=1\nSTATUS=Startup finished in %s.",
2fa4092c 2549 format_timespan(sum, sizeof(sum), total_usec, USEC_PER_MSEC));
b0c918b9
LP
2550}
2551
07719a21
LP
2552static int create_generator_dir(Manager *m, char **generator, const char *name) {
2553 char *p;
2554 int r;
2555
2556 assert(m);
2557 assert(generator);
2558 assert(name);
2559
2560 if (*generator)
2561 return 0;
2562
67445f4e 2563 if (m->running_as == SYSTEMD_SYSTEM && getpid() == 1) {
fcc81ea3 2564 /* systemd --system, not running --test */
07719a21
LP
2565
2566 p = strappend("/run/systemd/", name);
0d0f0c50
SL
2567 if (!p)
2568 return log_oom();
07719a21 2569
fcc81ea3
KS
2570 r = mkdir_p_label(p, 0755);
2571 if (r < 0) {
2572 log_error("Failed to create generator directory %s: %s",
2573 p, strerror(-r));
2574 free(p);
2575 return r;
2576 }
2577 } else if (m->running_as == SYSTEMD_USER) {
2578 const char *s = NULL;
2579
2580 s = getenv("XDG_RUNTIME_DIR");
2581 if (!s)
2582 return -EINVAL;
2583 p = strjoin(s, "/systemd/", name, NULL);
2584 if (!p)
2585 return log_oom();
2586
d2e54fae 2587 r = mkdir_p_label(p, 0755);
07719a21 2588 if (r < 0) {
7ad94c71
ZJS
2589 log_error("Failed to create generator directory %s: %s",
2590 p, strerror(-r));
07719a21
LP
2591 free(p);
2592 return r;
2593 }
2594 } else {
fcc81ea3
KS
2595 /* systemd --system --test */
2596
b7def684 2597 p = strjoin("/tmp/systemd-", name, ".XXXXXX", NULL);
0d0f0c50
SL
2598 if (!p)
2599 return log_oom();
07719a21
LP
2600
2601 if (!mkdtemp(p)) {
7ad94c71
ZJS
2602 log_error("Failed to create generator directory %s: %m",
2603 p);
34bf0281 2604 free(p);
07719a21
LP
2605 return -errno;
2606 }
2607 }
2608
2609 *generator = p;
2610 return 0;
2611}
2612
2613static void trim_generator_dir(Manager *m, char **generator) {
2614 assert(m);
2615 assert(generator);
2616
2617 if (!*generator)
2618 return;
2619
2620 if (rmdir(*generator) >= 0) {
2621 free(*generator);
2622 *generator = NULL;
2623 }
2624
2625 return;
2626}
2627
5a1e9937 2628void manager_run_generators(Manager *m) {
718db961 2629 _cleanup_closedir_ DIR *d = NULL;
5a1e9937 2630 const char *generator_path;
07719a21 2631 const char *argv[5];
07719a21 2632 int r;
5a1e9937
LP
2633
2634 assert(m);
2635
67445f4e 2636 generator_path = m->running_as == SYSTEMD_SYSTEM ? SYSTEM_GENERATOR_PATH : USER_GENERATOR_PATH;
07719a21
LP
2637 d = opendir(generator_path);
2638 if (!d) {
5a1e9937
LP
2639 if (errno == ENOENT)
2640 return;
2641
7ad94c71
ZJS
2642 log_error("Failed to enumerate generator directory %s: %m",
2643 generator_path);
5a1e9937
LP
2644 return;
2645 }
2646
07719a21
LP
2647 r = create_generator_dir(m, &m->generator_unit_path, "generator");
2648 if (r < 0)
2649 goto finish;
f1d19aa4 2650
07719a21
LP
2651 r = create_generator_dir(m, &m->generator_unit_path_early, "generator.early");
2652 if (r < 0)
2653 goto finish;
5a1e9937 2654
07719a21
LP
2655 r = create_generator_dir(m, &m->generator_unit_path_late, "generator.late");
2656 if (r < 0)
2657 goto finish;
5a1e9937 2658
83cc030f
LP
2659 argv[0] = NULL; /* Leave this empty, execute_directory() will fill something in */
2660 argv[1] = m->generator_unit_path;
07719a21
LP
2661 argv[2] = m->generator_unit_path_early;
2662 argv[3] = m->generator_unit_path_late;
2663 argv[4] = NULL;
5a1e9937 2664
718db961 2665 RUN_WITH_UMASK(0022)
5c0d398d 2666 execute_directory(generator_path, d, (char**) argv);
5a1e9937 2667
718db961 2668finish:
07719a21
LP
2669 trim_generator_dir(m, &m->generator_unit_path);
2670 trim_generator_dir(m, &m->generator_unit_path_early);
2671 trim_generator_dir(m, &m->generator_unit_path_late);
5a1e9937
LP
2672}
2673
07719a21 2674static void remove_generator_dir(Manager *m, char **generator) {
5a1e9937 2675 assert(m);
07719a21 2676 assert(generator);
5a1e9937 2677
07719a21 2678 if (!*generator)
5a1e9937
LP
2679 return;
2680
07719a21
LP
2681 strv_remove(m->lookup_paths.unit_path, *generator);
2682 rm_rf(*generator, false, true, false);
5a1e9937 2683
07719a21
LP
2684 free(*generator);
2685 *generator = NULL;
2686}
2687
2688void manager_undo_generators(Manager *m) {
2689 assert(m);
2690
2691 remove_generator_dir(m, &m->generator_unit_path);
2692 remove_generator_dir(m, &m->generator_unit_path_early);
2693 remove_generator_dir(m, &m->generator_unit_path_late);
5a1e9937
LP
2694}
2695
718db961
LP
2696int manager_environment_add(Manager *m, char **minus, char **plus) {
2697 char **a = NULL, **b = NULL, **l;
97d0e5f8 2698 assert(m);
bcd8e6d1 2699
718db961 2700 l = m->environment;
bcd8e6d1 2701
718db961
LP
2702 if (!strv_isempty(minus)) {
2703 a = strv_env_delete(l, 1, minus);
2704 if (!a)
2705 return -ENOMEM;
2706
2707 l = a;
2708 }
2709
2710 if (!strv_isempty(plus)) {
2711 b = strv_env_merge(2, l, plus);
2712 if (!b)
2713 return -ENOMEM;
bcd8e6d1 2714
718db961
LP
2715 l = b;
2716 }
2717
2718 if (m->environment != l)
2719 strv_free(m->environment);
2720 if (a != l)
2721 strv_free(a);
2722 if (b != l)
2723 strv_free(b);
2724
f069efb4
LP
2725 m->environment = l;
2726 manager_clean_environment(m);
2727 strv_sort(m->environment);
2728
97d0e5f8
UTL
2729 return 0;
2730}
2731
c93ff2e9
FC
2732int manager_set_default_rlimits(Manager *m, struct rlimit **default_rlimit) {
2733 int i;
2734
2735 assert(m);
2736
2737 for (i = 0; i < RLIMIT_NLIMITS; i++) {
07719a21
LP
2738 if (!default_rlimit[i])
2739 continue;
c93ff2e9 2740
07719a21
LP
2741 m->rlimit[i] = newdup(struct rlimit, default_rlimit[i], 1);
2742 if (!m->rlimit[i])
2743 return -ENOMEM;
c93ff2e9
FC
2744 }
2745
2746 return 0;
2747}
2748
4cfa2c99 2749void manager_recheck_journal(Manager *m) {
f1dd0c3f
LP
2750 Unit *u;
2751
2752 assert(m);
2753
67445f4e 2754 if (m->running_as != SYSTEMD_SYSTEM)
f1dd0c3f
LP
2755 return;
2756
731a676c
LP
2757 u = manager_get_unit(m, SPECIAL_JOURNALD_SOCKET);
2758 if (u && SOCKET(u)->state != SOCKET_RUNNING) {
4cfa2c99 2759 log_close_journal();
731a676c 2760 return;
f1dd0c3f
LP
2761 }
2762
731a676c
LP
2763 u = manager_get_unit(m, SPECIAL_JOURNALD_SERVICE);
2764 if (u && SERVICE(u)->state != SERVICE_RUNNING) {
4cfa2c99 2765 log_close_journal();
731a676c
LP
2766 return;
2767 }
f1dd0c3f 2768
731a676c
LP
2769 /* Hmm, OK, so the socket is fully up and the service is up
2770 * too, then let's make use of the thing. */
f1dd0c3f
LP
2771 log_open();
2772}
2773
d450b6f2 2774void manager_set_show_status(Manager *m, ShowStatus mode) {
27d340c7 2775 assert(m);
d450b6f2 2776 assert(IN_SET(mode, SHOW_STATUS_AUTO, SHOW_STATUS_NO, SHOW_STATUS_YES, SHOW_STATUS_TEMPORARY));
27d340c7 2777
67445f4e 2778 if (m->running_as != SYSTEMD_SYSTEM)
27d340c7
LP
2779 return;
2780
d450b6f2 2781 m->show_status = mode;
27d340c7 2782
d450b6f2 2783 if (mode > 0)
27d340c7
LP
2784 touch("/run/systemd/show-status");
2785 else
2786 unlink("/run/systemd/show-status");
2787}
2788
6084e22e 2789static bool manager_get_show_status(Manager *m) {
27d340c7
LP
2790 assert(m);
2791
67445f4e 2792 if (m->running_as != SYSTEMD_SYSTEM)
27d340c7
LP
2793 return false;
2794
31a7eb86
ZJS
2795 if (m->no_console_output)
2796 return false;
2797
d450b6f2 2798 if (m->show_status > 0)
27d340c7
LP
2799 return true;
2800
2801 /* If Plymouth is running make sure we show the status, so
2802 * that there's something nice to see when people press Esc */
2803
2804 return plymouth_running();
2805}
68b29a9f 2806
984a2be4 2807void manager_status_printf(Manager *m, bool ephemeral, const char *status, const char *format, ...) {
25cee550
MS
2808 va_list ap;
2809
2810 if (!manager_get_show_status(m))
2811 return;
2812
03b717a3
MS
2813 /* XXX We should totally drop the check for ephemeral here
2814 * and thus effectively make 'Type=idle' pointless. */
2815 if (ephemeral && m->n_on_console > 0)
2816 return;
2817
25cee550
MS
2818 if (!manager_is_booting_or_shutting_down(m))
2819 return;
2820
2821 va_start(ap, format);
984a2be4 2822 status_vprintf(status, true, ephemeral, format, ap);
25cee550
MS
2823 va_end(ap);
2824}
2825
a57f7e2c
LP
2826int manager_get_unit_by_path(Manager *m, const char *path, const char *suffix, Unit **_found) {
2827 _cleanup_free_ char *p = NULL;
2828 Unit *found;
2829
2830 assert(m);
2831 assert(path);
2832 assert(suffix);
2833 assert(_found);
2834
2835 p = unit_name_from_path(path, suffix);
2836 if (!p)
2837 return -ENOMEM;
2838
2839 found = manager_get_unit(m, p);
2840 if (!found) {
2841 *_found = NULL;
2842 return 0;
2843 }
2844
2845 *_found = found;
2846 return 1;
2847}
2848
2849Set *manager_get_units_requiring_mounts_for(Manager *m, const char *path) {
2850 char p[strlen(path)+1];
2851
2852 assert(m);
2853 assert(path);
2854
2855 strcpy(p, path);
2856 path_kill_slashes(p);
2857
2858 return hashmap_get(m->units_requiring_mounts_for, streq(p, "/") ? "" : p);
2859}