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