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