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