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