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