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