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