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