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