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