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