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