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