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