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