]> git.ipfire.org Git - thirdparty/systemd.git/blob - src/core/manager.c
relicense to LGPLv2.1 (with exceptions)
[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 "hashmap.h"
48 #include "macro.h"
49 #include "strv.h"
50 #include "log.h"
51 #include "util.h"
52 #include "mkdir.h"
53 #include "ratelimit.h"
54 #include "cgroup.h"
55 #include "mount-setup.h"
56 #include "unit-name.h"
57 #include "dbus-unit.h"
58 #include "dbus-job.h"
59 #include "missing.h"
60 #include "path-lookup.h"
61 #include "special.h"
62 #include "bus-errors.h"
63 #include "exit-status.h"
64 #include "virt.h"
65 #include "watchdog.h"
66
67 /* As soon as 16 units are in our GC queue, make sure to run a gc sweep */
68 #define GC_QUEUE_ENTRIES_MAX 16
69
70 /* As soon as 5s passed since a unit was added to our GC queue, make sure to run a gc sweep */
71 #define GC_QUEUE_USEC_MAX (10*USEC_PER_SEC)
72
73 /* Where clients shall send notification messages to */
74 #define NOTIFY_SOCKET_SYSTEM "/run/systemd/notify"
75 #define NOTIFY_SOCKET_USER "@/org/freedesktop/systemd1/notify"
76
77 static int manager_setup_notify(Manager *m) {
78 union {
79 struct sockaddr sa;
80 struct sockaddr_un un;
81 } sa;
82 struct epoll_event ev;
83 int one = 1, r;
84 mode_t u;
85
86 assert(m);
87
88 m->notify_watch.type = WATCH_NOTIFY;
89 if ((m->notify_watch.fd = socket(AF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0)) < 0) {
90 log_error("Failed to allocate notification socket: %m");
91 return -errno;
92 }
93
94 zero(sa);
95 sa.sa.sa_family = AF_UNIX;
96
97 if (getpid() != 1)
98 snprintf(sa.un.sun_path, sizeof(sa.un.sun_path), NOTIFY_SOCKET_USER "/%llu", random_ull());
99 else {
100 unlink(NOTIFY_SOCKET_SYSTEM);
101 strncpy(sa.un.sun_path, NOTIFY_SOCKET_SYSTEM, sizeof(sa.un.sun_path));
102 }
103
104 if (sa.un.sun_path[0] == '@')
105 sa.un.sun_path[0] = 0;
106
107 u = umask(0111);
108 r = bind(m->notify_watch.fd, &sa.sa, offsetof(struct sockaddr_un, sun_path) + 1 + strlen(sa.un.sun_path+1));
109 umask(u);
110
111 if (r < 0) {
112 log_error("bind() failed: %m");
113 return -errno;
114 }
115
116 if (setsockopt(m->notify_watch.fd, SOL_SOCKET, SO_PASSCRED, &one, sizeof(one)) < 0) {
117 log_error("SO_PASSCRED failed: %m");
118 return -errno;
119 }
120
121 zero(ev);
122 ev.events = EPOLLIN;
123 ev.data.ptr = &m->notify_watch;
124
125 if (epoll_ctl(m->epoll_fd, EPOLL_CTL_ADD, m->notify_watch.fd, &ev) < 0)
126 return -errno;
127
128 if (sa.un.sun_path[0] == 0)
129 sa.un.sun_path[0] = '@';
130
131 if (!(m->notify_socket = strdup(sa.un.sun_path)))
132 return -ENOMEM;
133
134 log_debug("Using notification socket %s", m->notify_socket);
135
136 return 0;
137 }
138
139 static int enable_special_signals(Manager *m) {
140 int fd;
141
142 assert(m);
143
144 /* Enable that we get SIGINT on control-alt-del */
145 if (reboot(RB_DISABLE_CAD) < 0)
146 log_warning("Failed to enable ctrl-alt-del handling: %m");
147
148 if ((fd = open_terminal("/dev/tty0", O_RDWR|O_NOCTTY|O_CLOEXEC)) < 0)
149 log_warning("Failed to open /dev/tty0: %m");
150 else {
151 /* Enable that we get SIGWINCH on kbrequest */
152 if (ioctl(fd, KDSIGACCEPT, SIGWINCH) < 0)
153 log_warning("Failed to enable kbrequest handling: %s", strerror(errno));
154
155 close_nointr_nofail(fd);
156 }
157
158 return 0;
159 }
160
161 static int manager_setup_signals(Manager *m) {
162 sigset_t mask;
163 struct epoll_event ev;
164 struct sigaction sa;
165
166 assert(m);
167
168 /* We are not interested in SIGSTOP and friends. */
169 zero(sa);
170 sa.sa_handler = SIG_DFL;
171 sa.sa_flags = SA_NOCLDSTOP|SA_RESTART;
172 assert_se(sigaction(SIGCHLD, &sa, NULL) == 0);
173
174 assert_se(sigemptyset(&mask) == 0);
175
176 sigset_add_many(&mask,
177 SIGCHLD, /* Child died */
178 SIGTERM, /* Reexecute daemon */
179 SIGHUP, /* Reload configuration */
180 SIGUSR1, /* systemd/upstart: reconnect to D-Bus */
181 SIGUSR2, /* systemd: dump status */
182 SIGINT, /* Kernel sends us this on control-alt-del */
183 SIGWINCH, /* Kernel sends us this on kbrequest (alt-arrowup) */
184 SIGPWR, /* Some kernel drivers and upsd send us this on power failure */
185 SIGRTMIN+0, /* systemd: start default.target */
186 SIGRTMIN+1, /* systemd: isolate rescue.target */
187 SIGRTMIN+2, /* systemd: isolate emergency.target */
188 SIGRTMIN+3, /* systemd: start halt.target */
189 SIGRTMIN+4, /* systemd: start poweroff.target */
190 SIGRTMIN+5, /* systemd: start reboot.target */
191 SIGRTMIN+6, /* systemd: start kexec.target */
192 SIGRTMIN+13, /* systemd: Immediate halt */
193 SIGRTMIN+14, /* systemd: Immediate poweroff */
194 SIGRTMIN+15, /* systemd: Immediate reboot */
195 SIGRTMIN+16, /* systemd: Immediate kexec */
196 SIGRTMIN+20, /* systemd: enable status messages */
197 SIGRTMIN+21, /* systemd: disable status messages */
198 SIGRTMIN+22, /* systemd: set log level to LOG_DEBUG */
199 SIGRTMIN+23, /* systemd: set log level to LOG_INFO */
200 SIGRTMIN+26, /* systemd: set log target to journal-or-kmsg */
201 SIGRTMIN+27, /* systemd: set log target to console */
202 SIGRTMIN+28, /* systemd: set log target to kmsg */
203 SIGRTMIN+29, /* systemd: set log target to syslog-or-kmsg */
204 -1);
205 assert_se(sigprocmask(SIG_SETMASK, &mask, NULL) == 0);
206
207 m->signal_watch.type = WATCH_SIGNAL;
208 if ((m->signal_watch.fd = signalfd(-1, &mask, SFD_NONBLOCK|SFD_CLOEXEC)) < 0)
209 return -errno;
210
211 zero(ev);
212 ev.events = EPOLLIN;
213 ev.data.ptr = &m->signal_watch;
214
215 if (epoll_ctl(m->epoll_fd, EPOLL_CTL_ADD, m->signal_watch.fd, &ev) < 0)
216 return -errno;
217
218 if (m->running_as == MANAGER_SYSTEM)
219 return enable_special_signals(m);
220
221 return 0;
222 }
223
224 static void manager_strip_environment(Manager *m) {
225 assert(m);
226
227 /* Remove variables from the inherited set that are part of
228 * the container interface:
229 * http://www.freedesktop.org/wiki/Software/systemd/ContainerInterface */
230 strv_remove_prefix(m->environment, "container=");
231 strv_remove_prefix(m->environment, "container_");
232
233 /* Remove variables from the inherited set that are part of
234 * the initrd interface:
235 * http://www.freedesktop.org/wiki/Software/systemd/InitrdInterface */
236 strv_remove_prefix(m->environment, "RD_");
237 }
238
239 int manager_new(ManagerRunningAs running_as, Manager **_m) {
240 Manager *m;
241 int r = -ENOMEM;
242
243 assert(_m);
244 assert(running_as >= 0);
245 assert(running_as < _MANAGER_RUNNING_AS_MAX);
246
247 if (!(m = new0(Manager, 1)))
248 return -ENOMEM;
249
250 dual_timestamp_get(&m->startup_timestamp);
251
252 m->running_as = running_as;
253 m->name_data_slot = m->conn_data_slot = m->subscribed_data_slot = -1;
254 m->exit_code = _MANAGER_EXIT_CODE_INVALID;
255 m->pin_cgroupfs_fd = -1;
256
257 #ifdef HAVE_AUDIT
258 m->audit_fd = -1;
259 #endif
260
261 m->signal_watch.fd = m->mount_watch.fd = m->udev_watch.fd = m->epoll_fd = m->dev_autofs_fd = m->swap_watch.fd = -1;
262 m->current_job_id = 1; /* start as id #1, so that we can leave #0 around as "null-like" value */
263
264 m->environment = strv_copy(environ);
265 if (!m->environment)
266 goto fail;
267
268 manager_strip_environment(m);
269
270 if (running_as == MANAGER_SYSTEM) {
271 m->default_controllers = strv_new("cpu", NULL);
272 if (!m->default_controllers)
273 goto fail;
274 }
275
276 if (!(m->units = hashmap_new(string_hash_func, string_compare_func)))
277 goto fail;
278
279 if (!(m->jobs = hashmap_new(trivial_hash_func, trivial_compare_func)))
280 goto fail;
281
282 if (!(m->transaction_jobs = hashmap_new(trivial_hash_func, trivial_compare_func)))
283 goto fail;
284
285 if (!(m->watch_pids = hashmap_new(trivial_hash_func, trivial_compare_func)))
286 goto fail;
287
288 if (!(m->cgroup_bondings = hashmap_new(string_hash_func, string_compare_func)))
289 goto fail;
290
291 if (!(m->watch_bus = hashmap_new(string_hash_func, string_compare_func)))
292 goto fail;
293
294 if ((m->epoll_fd = epoll_create1(EPOLL_CLOEXEC)) < 0)
295 goto fail;
296
297 if ((r = lookup_paths_init(&m->lookup_paths, m->running_as, true)) < 0)
298 goto fail;
299
300 if ((r = manager_setup_signals(m)) < 0)
301 goto fail;
302
303 if ((r = manager_setup_cgroup(m)) < 0)
304 goto fail;
305
306 if ((r = manager_setup_notify(m)) < 0)
307 goto fail;
308
309 /* Try to connect to the busses, if possible. */
310 if ((r = bus_init(m, running_as != MANAGER_SYSTEM)) < 0)
311 goto fail;
312
313 #ifdef HAVE_AUDIT
314 if ((m->audit_fd = audit_open()) < 0 &&
315 /* If the kernel lacks netlink or audit support,
316 * don't worry about it. */
317 errno != EAFNOSUPPORT && errno != EPROTONOSUPPORT)
318 log_error("Failed to connect to audit log: %m");
319 #endif
320
321 m->taint_usr = dir_is_empty("/usr") > 0;
322
323 *_m = m;
324 return 0;
325
326 fail:
327 manager_free(m);
328 return r;
329 }
330
331 static unsigned manager_dispatch_cleanup_queue(Manager *m) {
332 Unit *u;
333 unsigned n = 0;
334
335 assert(m);
336
337 while ((u = m->cleanup_queue)) {
338 assert(u->in_cleanup_queue);
339
340 unit_free(u);
341 n++;
342 }
343
344 return n;
345 }
346
347 enum {
348 GC_OFFSET_IN_PATH, /* This one is on the path we were traveling */
349 GC_OFFSET_UNSURE, /* No clue */
350 GC_OFFSET_GOOD, /* We still need this unit */
351 GC_OFFSET_BAD, /* We don't need this unit anymore */
352 _GC_OFFSET_MAX
353 };
354
355 static void unit_gc_sweep(Unit *u, unsigned gc_marker) {
356 Iterator i;
357 Unit *other;
358 bool is_bad;
359
360 assert(u);
361
362 if (u->gc_marker == gc_marker + GC_OFFSET_GOOD ||
363 u->gc_marker == gc_marker + GC_OFFSET_BAD ||
364 u->gc_marker == gc_marker + GC_OFFSET_IN_PATH)
365 return;
366
367 if (u->in_cleanup_queue)
368 goto bad;
369
370 if (unit_check_gc(u))
371 goto good;
372
373 u->gc_marker = gc_marker + GC_OFFSET_IN_PATH;
374
375 is_bad = true;
376
377 SET_FOREACH(other, u->dependencies[UNIT_REFERENCED_BY], i) {
378 unit_gc_sweep(other, gc_marker);
379
380 if (other->gc_marker == gc_marker + GC_OFFSET_GOOD)
381 goto good;
382
383 if (other->gc_marker != gc_marker + GC_OFFSET_BAD)
384 is_bad = false;
385 }
386
387 if (is_bad)
388 goto bad;
389
390 /* We were unable to find anything out about this entry, so
391 * let's investigate it later */
392 u->gc_marker = gc_marker + GC_OFFSET_UNSURE;
393 unit_add_to_gc_queue(u);
394 return;
395
396 bad:
397 /* We definitely know that this one is not useful anymore, so
398 * let's mark it for deletion */
399 u->gc_marker = gc_marker + GC_OFFSET_BAD;
400 unit_add_to_cleanup_queue(u);
401 return;
402
403 good:
404 u->gc_marker = gc_marker + GC_OFFSET_GOOD;
405 }
406
407 static unsigned manager_dispatch_gc_queue(Manager *m) {
408 Unit *u;
409 unsigned n = 0;
410 unsigned gc_marker;
411
412 assert(m);
413
414 if ((m->n_in_gc_queue < GC_QUEUE_ENTRIES_MAX) &&
415 (m->gc_queue_timestamp <= 0 ||
416 (m->gc_queue_timestamp + GC_QUEUE_USEC_MAX) > now(CLOCK_MONOTONIC)))
417 return 0;
418
419 log_debug("Running GC...");
420
421 m->gc_marker += _GC_OFFSET_MAX;
422 if (m->gc_marker + _GC_OFFSET_MAX <= _GC_OFFSET_MAX)
423 m->gc_marker = 1;
424
425 gc_marker = m->gc_marker;
426
427 while ((u = m->gc_queue)) {
428 assert(u->in_gc_queue);
429
430 unit_gc_sweep(u, gc_marker);
431
432 LIST_REMOVE(Unit, gc_queue, m->gc_queue, u);
433 u->in_gc_queue = false;
434
435 n++;
436
437 if (u->gc_marker == gc_marker + GC_OFFSET_BAD ||
438 u->gc_marker == gc_marker + GC_OFFSET_UNSURE) {
439 log_debug("Collecting %s", u->id);
440 u->gc_marker = gc_marker + GC_OFFSET_BAD;
441 unit_add_to_cleanup_queue(u);
442 }
443 }
444
445 m->n_in_gc_queue = 0;
446 m->gc_queue_timestamp = 0;
447
448 return n;
449 }
450
451 static void manager_clear_jobs_and_units(Manager *m) {
452 Job *j;
453 Unit *u;
454
455 assert(m);
456
457 while ((j = hashmap_first(m->transaction_jobs)))
458 job_free(j);
459
460 while ((u = hashmap_first(m->units)))
461 unit_free(u);
462
463 manager_dispatch_cleanup_queue(m);
464
465 assert(!m->load_queue);
466 assert(!m->run_queue);
467 assert(!m->dbus_unit_queue);
468 assert(!m->dbus_job_queue);
469 assert(!m->cleanup_queue);
470 assert(!m->gc_queue);
471
472 assert(hashmap_isempty(m->transaction_jobs));
473 assert(hashmap_isempty(m->jobs));
474 assert(hashmap_isempty(m->units));
475 }
476
477 void manager_free(Manager *m) {
478 UnitType c;
479
480 assert(m);
481
482 manager_clear_jobs_and_units(m);
483
484 for (c = 0; c < _UNIT_TYPE_MAX; c++)
485 if (unit_vtable[c]->shutdown)
486 unit_vtable[c]->shutdown(m);
487
488 /* If we reexecute ourselves, we keep the root cgroup
489 * around */
490 manager_shutdown_cgroup(m, m->exit_code != MANAGER_REEXECUTE);
491
492 manager_undo_generators(m);
493
494 bus_done(m);
495
496 hashmap_free(m->units);
497 hashmap_free(m->jobs);
498 hashmap_free(m->transaction_jobs);
499 hashmap_free(m->watch_pids);
500 hashmap_free(m->watch_bus);
501
502 if (m->epoll_fd >= 0)
503 close_nointr_nofail(m->epoll_fd);
504 if (m->signal_watch.fd >= 0)
505 close_nointr_nofail(m->signal_watch.fd);
506 if (m->notify_watch.fd >= 0)
507 close_nointr_nofail(m->notify_watch.fd);
508
509 #ifdef HAVE_AUDIT
510 if (m->audit_fd >= 0)
511 audit_close(m->audit_fd);
512 #endif
513
514 free(m->notify_socket);
515
516 lookup_paths_free(&m->lookup_paths);
517 strv_free(m->environment);
518
519 strv_free(m->default_controllers);
520
521 hashmap_free(m->cgroup_bondings);
522 set_free_free(m->unit_path_cache);
523
524 free(m);
525 }
526
527 int manager_enumerate(Manager *m) {
528 int r = 0, q;
529 UnitType c;
530
531 assert(m);
532
533 /* Let's ask every type to load all units from disk/kernel
534 * that it might know */
535 for (c = 0; c < _UNIT_TYPE_MAX; c++)
536 if (unit_vtable[c]->enumerate)
537 if ((q = unit_vtable[c]->enumerate(m)) < 0)
538 r = q;
539
540 manager_dispatch_load_queue(m);
541 return r;
542 }
543
544 int manager_coldplug(Manager *m) {
545 int r = 0, q;
546 Iterator i;
547 Unit *u;
548 char *k;
549
550 assert(m);
551
552 /* Then, let's set up their initial state. */
553 HASHMAP_FOREACH_KEY(u, k, m->units, i) {
554
555 /* ignore aliases */
556 if (u->id != k)
557 continue;
558
559 if ((q = unit_coldplug(u)) < 0)
560 r = q;
561 }
562
563 return r;
564 }
565
566 static void manager_build_unit_path_cache(Manager *m) {
567 char **i;
568 DIR *d = NULL;
569 int r;
570
571 assert(m);
572
573 set_free_free(m->unit_path_cache);
574
575 if (!(m->unit_path_cache = set_new(string_hash_func, string_compare_func))) {
576 log_error("Failed to allocate unit path cache.");
577 return;
578 }
579
580 /* This simply builds a list of files we know exist, so that
581 * we don't always have to go to disk */
582
583 STRV_FOREACH(i, m->lookup_paths.unit_path) {
584 struct dirent *de;
585
586 if (!(d = opendir(*i))) {
587 log_error("Failed to open directory: %m");
588 continue;
589 }
590
591 while ((de = readdir(d))) {
592 char *p;
593
594 if (ignore_file(de->d_name))
595 continue;
596
597 p = join(streq(*i, "/") ? "" : *i, "/", de->d_name, NULL);
598 if (!p) {
599 r = -ENOMEM;
600 goto fail;
601 }
602
603 if ((r = set_put(m->unit_path_cache, p)) < 0) {
604 free(p);
605 goto fail;
606 }
607 }
608
609 closedir(d);
610 d = NULL;
611 }
612
613 return;
614
615 fail:
616 log_error("Failed to build unit path cache: %s", strerror(-r));
617
618 set_free_free(m->unit_path_cache);
619 m->unit_path_cache = NULL;
620
621 if (d)
622 closedir(d);
623 }
624
625 int manager_startup(Manager *m, FILE *serialization, FDSet *fds) {
626 int r, q;
627
628 assert(m);
629
630 manager_run_generators(m);
631
632 manager_build_unit_path_cache(m);
633
634 /* If we will deserialize make sure that during enumeration
635 * this is already known, so we increase the counter here
636 * already */
637 if (serialization)
638 m->n_reloading ++;
639
640 /* First, enumerate what we can from all config files */
641 r = manager_enumerate(m);
642
643 /* Second, deserialize if there is something to deserialize */
644 if (serialization)
645 if ((q = manager_deserialize(m, serialization, fds)) < 0)
646 r = q;
647
648 /* Third, fire things up! */
649 if ((q = manager_coldplug(m)) < 0)
650 r = q;
651
652 if (serialization) {
653 assert(m->n_reloading > 0);
654 m->n_reloading --;
655 }
656
657 return r;
658 }
659
660 static void transaction_delete_job(Manager *m, Job *j, bool delete_dependencies) {
661 assert(m);
662 assert(j);
663
664 /* Deletes one job from the transaction */
665
666 manager_transaction_unlink_job(m, j, delete_dependencies);
667
668 if (!j->installed)
669 job_free(j);
670 }
671
672 static void transaction_delete_unit(Manager *m, Unit *u) {
673 Job *j;
674
675 /* Deletes all jobs associated with a certain unit from the
676 * transaction */
677
678 while ((j = hashmap_get(m->transaction_jobs, u)))
679 transaction_delete_job(m, j, true);
680 }
681
682 static void transaction_clean_dependencies(Manager *m) {
683 Iterator i;
684 Job *j;
685
686 assert(m);
687
688 /* Drops all dependencies of all installed jobs */
689
690 HASHMAP_FOREACH(j, m->jobs, i) {
691 while (j->subject_list)
692 job_dependency_free(j->subject_list);
693 while (j->object_list)
694 job_dependency_free(j->object_list);
695 }
696
697 assert(!m->transaction_anchor);
698 }
699
700 static void transaction_abort(Manager *m) {
701 Job *j;
702
703 assert(m);
704
705 while ((j = hashmap_first(m->transaction_jobs)))
706 if (j->installed)
707 transaction_delete_job(m, j, true);
708 else
709 job_free(j);
710
711 assert(hashmap_isempty(m->transaction_jobs));
712
713 transaction_clean_dependencies(m);
714 }
715
716 static void transaction_find_jobs_that_matter_to_anchor(Manager *m, Job *j, unsigned generation) {
717 JobDependency *l;
718
719 assert(m);
720
721 /* A recursive sweep through the graph that marks all units
722 * that matter to the anchor job, i.e. are directly or
723 * indirectly a dependency of the anchor job via paths that
724 * are fully marked as mattering. */
725
726 if (j)
727 l = j->subject_list;
728 else
729 l = m->transaction_anchor;
730
731 LIST_FOREACH(subject, l, l) {
732
733 /* This link does not matter */
734 if (!l->matters)
735 continue;
736
737 /* This unit has already been marked */
738 if (l->object->generation == generation)
739 continue;
740
741 l->object->matters_to_anchor = true;
742 l->object->generation = generation;
743
744 transaction_find_jobs_that_matter_to_anchor(m, l->object, generation);
745 }
746 }
747
748 static void transaction_merge_and_delete_job(Manager *m, Job *j, Job *other, JobType t) {
749 JobDependency *l, *last;
750
751 assert(j);
752 assert(other);
753 assert(j->unit == other->unit);
754 assert(!j->installed);
755
756 /* Merges 'other' into 'j' and then deletes j. */
757
758 j->type = t;
759 j->state = JOB_WAITING;
760 j->override = j->override || other->override;
761
762 j->matters_to_anchor = j->matters_to_anchor || other->matters_to_anchor;
763
764 /* Patch us in as new owner of the JobDependency objects */
765 last = NULL;
766 LIST_FOREACH(subject, l, other->subject_list) {
767 assert(l->subject == other);
768 l->subject = j;
769 last = l;
770 }
771
772 /* Merge both lists */
773 if (last) {
774 last->subject_next = j->subject_list;
775 if (j->subject_list)
776 j->subject_list->subject_prev = last;
777 j->subject_list = other->subject_list;
778 }
779
780 /* Patch us in as new owner of the JobDependency objects */
781 last = NULL;
782 LIST_FOREACH(object, l, other->object_list) {
783 assert(l->object == other);
784 l->object = j;
785 last = l;
786 }
787
788 /* Merge both lists */
789 if (last) {
790 last->object_next = j->object_list;
791 if (j->object_list)
792 j->object_list->object_prev = last;
793 j->object_list = other->object_list;
794 }
795
796 /* Kill the other job */
797 other->subject_list = NULL;
798 other->object_list = NULL;
799 transaction_delete_job(m, other, true);
800 }
801 static bool job_is_conflicted_by(Job *j) {
802 JobDependency *l;
803
804 assert(j);
805
806 /* Returns true if this job is pulled in by a least one
807 * ConflictedBy dependency. */
808
809 LIST_FOREACH(object, l, j->object_list)
810 if (l->conflicts)
811 return true;
812
813 return false;
814 }
815
816 static int delete_one_unmergeable_job(Manager *m, Job *j) {
817 Job *k;
818
819 assert(j);
820
821 /* Tries to delete one item in the linked list
822 * j->transaction_next->transaction_next->... that conflicts
823 * with another one, in an attempt to make an inconsistent
824 * transaction work. */
825
826 /* We rely here on the fact that if a merged with b does not
827 * merge with c, either a or b merge with c neither */
828 LIST_FOREACH(transaction, j, j)
829 LIST_FOREACH(transaction, k, j->transaction_next) {
830 Job *d;
831
832 /* Is this one mergeable? Then skip it */
833 if (job_type_is_mergeable(j->type, k->type))
834 continue;
835
836 /* Ok, we found two that conflict, let's see if we can
837 * drop one of them */
838 if (!j->matters_to_anchor && !k->matters_to_anchor) {
839
840 /* Both jobs don't matter, so let's
841 * find the one that is smarter to
842 * remove. Let's think positive and
843 * rather remove stops then starts --
844 * except if something is being
845 * stopped because it is conflicted by
846 * another unit in which case we
847 * rather remove the start. */
848
849 log_debug("Looking at job %s/%s conflicted_by=%s", j->unit->id, job_type_to_string(j->type), yes_no(j->type == JOB_STOP && job_is_conflicted_by(j)));
850 log_debug("Looking at job %s/%s conflicted_by=%s", k->unit->id, job_type_to_string(k->type), yes_no(k->type == JOB_STOP && job_is_conflicted_by(k)));
851
852 if (j->type == JOB_STOP) {
853
854 if (job_is_conflicted_by(j))
855 d = k;
856 else
857 d = j;
858
859 } else if (k->type == JOB_STOP) {
860
861 if (job_is_conflicted_by(k))
862 d = j;
863 else
864 d = k;
865 } else
866 d = j;
867
868 } else if (!j->matters_to_anchor)
869 d = j;
870 else if (!k->matters_to_anchor)
871 d = k;
872 else
873 return -ENOEXEC;
874
875 /* Ok, we can drop one, so let's do so. */
876 log_debug("Fixing conflicting jobs by deleting job %s/%s", d->unit->id, job_type_to_string(d->type));
877 transaction_delete_job(m, d, true);
878 return 0;
879 }
880
881 return -EINVAL;
882 }
883
884 static int transaction_merge_jobs(Manager *m, DBusError *e) {
885 Job *j;
886 Iterator i;
887 int r;
888
889 assert(m);
890
891 /* First step, check whether any of the jobs for one specific
892 * task conflict. If so, try to drop one of them. */
893 HASHMAP_FOREACH(j, m->transaction_jobs, i) {
894 JobType t;
895 Job *k;
896
897 t = j->type;
898 LIST_FOREACH(transaction, k, j->transaction_next) {
899 if (job_type_merge(&t, k->type) >= 0)
900 continue;
901
902 /* OK, we could not merge all jobs for this
903 * action. Let's see if we can get rid of one
904 * of them */
905
906 if ((r = delete_one_unmergeable_job(m, j)) >= 0)
907 /* Ok, we managed to drop one, now
908 * let's ask our callers to call us
909 * again after garbage collecting */
910 return -EAGAIN;
911
912 /* We couldn't merge anything. Failure */
913 dbus_set_error(e, BUS_ERROR_TRANSACTION_JOBS_CONFLICTING, "Transaction contains conflicting jobs '%s' and '%s' for %s. Probably contradicting requirement dependencies configured.",
914 job_type_to_string(t), job_type_to_string(k->type), k->unit->id);
915 return r;
916 }
917 }
918
919 /* Second step, merge the jobs. */
920 HASHMAP_FOREACH(j, m->transaction_jobs, i) {
921 JobType t = j->type;
922 Job *k;
923
924 /* Merge all transactions */
925 LIST_FOREACH(transaction, k, j->transaction_next)
926 assert_se(job_type_merge(&t, k->type) == 0);
927
928 /* If an active job is mergeable, merge it too */
929 if (j->unit->job)
930 job_type_merge(&t, j->unit->job->type); /* Might fail. Which is OK */
931
932 while ((k = j->transaction_next)) {
933 if (j->installed) {
934 transaction_merge_and_delete_job(m, k, j, t);
935 j = k;
936 } else
937 transaction_merge_and_delete_job(m, j, k, t);
938 }
939
940 if (j->unit->job && !j->installed)
941 transaction_merge_and_delete_job(m, j, j->unit->job, t);
942
943 assert(!j->transaction_next);
944 assert(!j->transaction_prev);
945 }
946
947 return 0;
948 }
949
950 static void transaction_drop_redundant(Manager *m) {
951 bool again;
952
953 assert(m);
954
955 /* Goes through the transaction and removes all jobs that are
956 * a noop */
957
958 do {
959 Job *j;
960 Iterator i;
961
962 again = false;
963
964 HASHMAP_FOREACH(j, m->transaction_jobs, i) {
965 bool changes_something = false;
966 Job *k;
967
968 LIST_FOREACH(transaction, k, j) {
969
970 if (!job_is_anchor(k) &&
971 (k->installed || job_type_is_redundant(k->type, unit_active_state(k->unit))) &&
972 (!k->unit->job || !job_type_is_conflicting(k->type, k->unit->job->type)))
973 continue;
974
975 changes_something = true;
976 break;
977 }
978
979 if (changes_something)
980 continue;
981
982 /* log_debug("Found redundant job %s/%s, dropping.", j->unit->id, job_type_to_string(j->type)); */
983 transaction_delete_job(m, j, false);
984 again = true;
985 break;
986 }
987
988 } while (again);
989 }
990
991 static bool unit_matters_to_anchor(Unit *u, Job *j) {
992 assert(u);
993 assert(!j->transaction_prev);
994
995 /* Checks whether at least one of the jobs for this unit
996 * matters to the anchor. */
997
998 LIST_FOREACH(transaction, j, j)
999 if (j->matters_to_anchor)
1000 return true;
1001
1002 return false;
1003 }
1004
1005 static int transaction_verify_order_one(Manager *m, Job *j, Job *from, unsigned generation, DBusError *e) {
1006 Iterator i;
1007 Unit *u;
1008 int r;
1009
1010 assert(m);
1011 assert(j);
1012 assert(!j->transaction_prev);
1013
1014 /* Does a recursive sweep through the ordering graph, looking
1015 * for a cycle. If we find cycle we try to break it. */
1016
1017 /* Have we seen this before? */
1018 if (j->generation == generation) {
1019 Job *k, *delete;
1020
1021 /* If the marker is NULL we have been here already and
1022 * decided the job was loop-free from here. Hence
1023 * shortcut things and return right-away. */
1024 if (!j->marker)
1025 return 0;
1026
1027 /* So, the marker is not NULL and we already have been
1028 * here. We have a cycle. Let's try to break it. We go
1029 * backwards in our path and try to find a suitable
1030 * job to remove. We use the marker to find our way
1031 * back, since smart how we are we stored our way back
1032 * in there. */
1033 log_warning("Found ordering cycle on %s/%s", j->unit->id, job_type_to_string(j->type));
1034
1035 delete = NULL;
1036 for (k = from; k; k = ((k->generation == generation && k->marker != k) ? k->marker : NULL)) {
1037
1038 log_info("Walked on cycle path to %s/%s", k->unit->id, job_type_to_string(k->type));
1039
1040 if (!delete &&
1041 !k->installed &&
1042 !unit_matters_to_anchor(k->unit, k)) {
1043 /* Ok, we can drop this one, so let's
1044 * do so. */
1045 delete = k;
1046 }
1047
1048 /* Check if this in fact was the beginning of
1049 * the cycle */
1050 if (k == j)
1051 break;
1052 }
1053
1054
1055 if (delete) {
1056 log_warning("Breaking ordering cycle by deleting job %s/%s", delete->unit->id, job_type_to_string(delete->type));
1057 transaction_delete_unit(m, delete->unit);
1058 return -EAGAIN;
1059 }
1060
1061 log_error("Unable to break cycle");
1062
1063 dbus_set_error(e, BUS_ERROR_TRANSACTION_ORDER_IS_CYCLIC, "Transaction order is cyclic. See system logs for details.");
1064 return -ENOEXEC;
1065 }
1066
1067 /* Make the marker point to where we come from, so that we can
1068 * find our way backwards if we want to break a cycle. We use
1069 * a special marker for the beginning: we point to
1070 * ourselves. */
1071 j->marker = from ? from : j;
1072 j->generation = generation;
1073
1074 /* We assume that the the dependencies are bidirectional, and
1075 * hence can ignore UNIT_AFTER */
1076 SET_FOREACH(u, j->unit->dependencies[UNIT_BEFORE], i) {
1077 Job *o;
1078
1079 /* Is there a job for this unit? */
1080 if (!(o = hashmap_get(m->transaction_jobs, u)))
1081
1082 /* Ok, there is no job for this in the
1083 * transaction, but maybe there is already one
1084 * running? */
1085 if (!(o = u->job))
1086 continue;
1087
1088 if ((r = transaction_verify_order_one(m, o, j, generation, e)) < 0)
1089 return r;
1090 }
1091
1092 /* Ok, let's backtrack, and remember that this entry is not on
1093 * our path anymore. */
1094 j->marker = NULL;
1095
1096 return 0;
1097 }
1098
1099 static int transaction_verify_order(Manager *m, unsigned *generation, DBusError *e) {
1100 Job *j;
1101 int r;
1102 Iterator i;
1103 unsigned g;
1104
1105 assert(m);
1106 assert(generation);
1107
1108 /* Check if the ordering graph is cyclic. If it is, try to fix
1109 * that up by dropping one of the jobs. */
1110
1111 g = (*generation)++;
1112
1113 HASHMAP_FOREACH(j, m->transaction_jobs, i)
1114 if ((r = transaction_verify_order_one(m, j, NULL, g, e)) < 0)
1115 return r;
1116
1117 return 0;
1118 }
1119
1120 static void transaction_collect_garbage(Manager *m) {
1121 bool again;
1122
1123 assert(m);
1124
1125 /* Drop jobs that are not required by any other job */
1126
1127 do {
1128 Iterator i;
1129 Job *j;
1130
1131 again = false;
1132
1133 HASHMAP_FOREACH(j, m->transaction_jobs, i) {
1134 if (j->object_list) {
1135 /* log_debug("Keeping job %s/%s because of %s/%s", */
1136 /* j->unit->id, job_type_to_string(j->type), */
1137 /* j->object_list->subject ? j->object_list->subject->unit->id : "root", */
1138 /* j->object_list->subject ? job_type_to_string(j->object_list->subject->type) : "root"); */
1139 continue;
1140 }
1141
1142 /* log_debug("Garbage collecting job %s/%s", j->unit->id, job_type_to_string(j->type)); */
1143 transaction_delete_job(m, j, true);
1144 again = true;
1145 break;
1146 }
1147
1148 } while (again);
1149 }
1150
1151 static int transaction_is_destructive(Manager *m, DBusError *e) {
1152 Iterator i;
1153 Job *j;
1154
1155 assert(m);
1156
1157 /* Checks whether applying this transaction means that
1158 * existing jobs would be replaced */
1159
1160 HASHMAP_FOREACH(j, m->transaction_jobs, i) {
1161
1162 /* Assume merged */
1163 assert(!j->transaction_prev);
1164 assert(!j->transaction_next);
1165
1166 if (j->unit->job &&
1167 j->unit->job != j &&
1168 !job_type_is_superset(j->type, j->unit->job->type)) {
1169
1170 dbus_set_error(e, BUS_ERROR_TRANSACTION_IS_DESTRUCTIVE, "Transaction is destructive.");
1171 return -EEXIST;
1172 }
1173 }
1174
1175 return 0;
1176 }
1177
1178 static void transaction_minimize_impact(Manager *m) {
1179 bool again;
1180 assert(m);
1181
1182 /* Drops all unnecessary jobs that reverse already active jobs
1183 * or that stop a running service. */
1184
1185 do {
1186 Job *j;
1187 Iterator i;
1188
1189 again = false;
1190
1191 HASHMAP_FOREACH(j, m->transaction_jobs, i) {
1192 LIST_FOREACH(transaction, j, j) {
1193 bool stops_running_service, changes_existing_job;
1194
1195 /* If it matters, we shouldn't drop it */
1196 if (j->matters_to_anchor)
1197 continue;
1198
1199 /* Would this stop a running service?
1200 * Would this change an existing job?
1201 * If so, let's drop this entry */
1202
1203 stops_running_service =
1204 j->type == JOB_STOP && UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(j->unit));
1205
1206 changes_existing_job =
1207 j->unit->job &&
1208 job_type_is_conflicting(j->type, j->unit->job->type);
1209
1210 if (!stops_running_service && !changes_existing_job)
1211 continue;
1212
1213 if (stops_running_service)
1214 log_debug("%s/%s would stop a running service.", j->unit->id, job_type_to_string(j->type));
1215
1216 if (changes_existing_job)
1217 log_debug("%s/%s would change existing job.", j->unit->id, job_type_to_string(j->type));
1218
1219 /* Ok, let's get rid of this */
1220 log_debug("Deleting %s/%s to minimize impact.", j->unit->id, job_type_to_string(j->type));
1221
1222 transaction_delete_job(m, j, true);
1223 again = true;
1224 break;
1225 }
1226
1227 if (again)
1228 break;
1229 }
1230
1231 } while (again);
1232 }
1233
1234 static int transaction_apply(Manager *m, JobMode mode) {
1235 Iterator i;
1236 Job *j;
1237 int r;
1238
1239 /* Moves the transaction jobs to the set of active jobs */
1240
1241 if (mode == JOB_ISOLATE) {
1242
1243 /* When isolating first kill all installed jobs which
1244 * aren't part of the new transaction */
1245 rescan:
1246 HASHMAP_FOREACH(j, m->jobs, i) {
1247 assert(j->installed);
1248
1249 if (hashmap_get(m->transaction_jobs, j->unit))
1250 continue;
1251
1252 /* 'j' itself is safe to remove, but if other jobs
1253 are invalidated recursively, our iterator may become
1254 invalid and we need to start over. */
1255 if (job_finish_and_invalidate(j, JOB_CANCELED) > 0)
1256 goto rescan;
1257 }
1258 }
1259
1260 HASHMAP_FOREACH(j, m->transaction_jobs, i) {
1261 /* Assume merged */
1262 assert(!j->transaction_prev);
1263 assert(!j->transaction_next);
1264
1265 if (j->installed)
1266 continue;
1267
1268 if ((r = hashmap_put(m->jobs, UINT32_TO_PTR(j->id), j)) < 0)
1269 goto rollback;
1270 }
1271
1272 while ((j = hashmap_steal_first(m->transaction_jobs))) {
1273 if (j->installed) {
1274 /* log_debug("Skipping already installed job %s/%s as %u", j->unit->id, job_type_to_string(j->type), (unsigned) j->id); */
1275 continue;
1276 }
1277
1278 if (j->unit->job)
1279 job_free(j->unit->job);
1280
1281 j->unit->job = j;
1282 j->installed = true;
1283 m->n_installed_jobs ++;
1284
1285 /* We're fully installed. Now let's free data we don't
1286 * need anymore. */
1287
1288 assert(!j->transaction_next);
1289 assert(!j->transaction_prev);
1290
1291 job_add_to_run_queue(j);
1292 job_add_to_dbus_queue(j);
1293 job_start_timer(j);
1294
1295 log_debug("Installed new job %s/%s as %u", j->unit->id, job_type_to_string(j->type), (unsigned) j->id);
1296 }
1297
1298 /* As last step, kill all remaining job dependencies. */
1299 transaction_clean_dependencies(m);
1300
1301 return 0;
1302
1303 rollback:
1304
1305 HASHMAP_FOREACH(j, m->transaction_jobs, i) {
1306 if (j->installed)
1307 continue;
1308
1309 hashmap_remove(m->jobs, UINT32_TO_PTR(j->id));
1310 }
1311
1312 return r;
1313 }
1314
1315 static int transaction_activate(Manager *m, JobMode mode, DBusError *e) {
1316 int r;
1317 unsigned generation = 1;
1318
1319 assert(m);
1320
1321 /* This applies the changes recorded in transaction_jobs to
1322 * the actual list of jobs, if possible. */
1323
1324 /* First step: figure out which jobs matter */
1325 transaction_find_jobs_that_matter_to_anchor(m, NULL, generation++);
1326
1327 /* Second step: Try not to stop any running services if
1328 * we don't have to. Don't try to reverse running
1329 * jobs if we don't have to. */
1330 if (mode == JOB_FAIL)
1331 transaction_minimize_impact(m);
1332
1333 /* Third step: Drop redundant jobs */
1334 transaction_drop_redundant(m);
1335
1336 for (;;) {
1337 /* Fourth step: Let's remove unneeded jobs that might
1338 * be lurking. */
1339 if (mode != JOB_ISOLATE)
1340 transaction_collect_garbage(m);
1341
1342 /* Fifth step: verify order makes sense and correct
1343 * cycles if necessary and possible */
1344 if ((r = transaction_verify_order(m, &generation, e)) >= 0)
1345 break;
1346
1347 if (r != -EAGAIN) {
1348 log_warning("Requested transaction contains an unfixable cyclic ordering dependency: %s", bus_error(e, r));
1349 goto rollback;
1350 }
1351
1352 /* Let's see if the resulting transaction ordering
1353 * graph is still cyclic... */
1354 }
1355
1356 for (;;) {
1357 /* Sixth step: let's drop unmergeable entries if
1358 * necessary and possible, merge entries we can
1359 * merge */
1360 if ((r = transaction_merge_jobs(m, e)) >= 0)
1361 break;
1362
1363 if (r != -EAGAIN) {
1364 log_warning("Requested transaction contains unmergeable jobs: %s", bus_error(e, r));
1365 goto rollback;
1366 }
1367
1368 /* Seventh step: an entry got dropped, let's garbage
1369 * collect its dependencies. */
1370 if (mode != JOB_ISOLATE)
1371 transaction_collect_garbage(m);
1372
1373 /* Let's see if the resulting transaction still has
1374 * unmergeable entries ... */
1375 }
1376
1377 /* Eights step: Drop redundant jobs again, if the merging now allows us to drop more. */
1378 transaction_drop_redundant(m);
1379
1380 /* Ninth step: check whether we can actually apply this */
1381 if (mode == JOB_FAIL)
1382 if ((r = transaction_is_destructive(m, e)) < 0) {
1383 log_notice("Requested transaction contradicts existing jobs: %s", bus_error(e, r));
1384 goto rollback;
1385 }
1386
1387 /* Tenth step: apply changes */
1388 if ((r = transaction_apply(m, mode)) < 0) {
1389 log_warning("Failed to apply transaction: %s", strerror(-r));
1390 goto rollback;
1391 }
1392
1393 assert(hashmap_isempty(m->transaction_jobs));
1394 assert(!m->transaction_anchor);
1395
1396 return 0;
1397
1398 rollback:
1399 transaction_abort(m);
1400 return r;
1401 }
1402
1403 static Job* transaction_add_one_job(Manager *m, JobType type, Unit *unit, bool override, bool *is_new) {
1404 Job *j, *f;
1405
1406 assert(m);
1407 assert(unit);
1408
1409 /* Looks for an existing prospective job and returns that. If
1410 * it doesn't exist it is created and added to the prospective
1411 * jobs list. */
1412
1413 f = hashmap_get(m->transaction_jobs, unit);
1414
1415 LIST_FOREACH(transaction, j, f) {
1416 assert(j->unit == unit);
1417
1418 if (j->type == type) {
1419 if (is_new)
1420 *is_new = false;
1421 return j;
1422 }
1423 }
1424
1425 if (unit->job && unit->job->type == type)
1426 j = unit->job;
1427 else if (!(j = job_new(m, type, unit)))
1428 return NULL;
1429
1430 j->generation = 0;
1431 j->marker = NULL;
1432 j->matters_to_anchor = false;
1433 j->override = override;
1434
1435 LIST_PREPEND(Job, transaction, f, j);
1436
1437 if (hashmap_replace(m->transaction_jobs, unit, f) < 0) {
1438 job_free(j);
1439 return NULL;
1440 }
1441
1442 if (is_new)
1443 *is_new = true;
1444
1445 /* log_debug("Added job %s/%s to transaction.", unit->id, job_type_to_string(type)); */
1446
1447 return j;
1448 }
1449
1450 void manager_transaction_unlink_job(Manager *m, Job *j, bool delete_dependencies) {
1451 assert(m);
1452 assert(j);
1453
1454 if (j->transaction_prev)
1455 j->transaction_prev->transaction_next = j->transaction_next;
1456 else if (j->transaction_next)
1457 hashmap_replace(m->transaction_jobs, j->unit, j->transaction_next);
1458 else
1459 hashmap_remove_value(m->transaction_jobs, j->unit, j);
1460
1461 if (j->transaction_next)
1462 j->transaction_next->transaction_prev = j->transaction_prev;
1463
1464 j->transaction_prev = j->transaction_next = NULL;
1465
1466 while (j->subject_list)
1467 job_dependency_free(j->subject_list);
1468
1469 while (j->object_list) {
1470 Job *other = j->object_list->matters ? j->object_list->subject : NULL;
1471
1472 job_dependency_free(j->object_list);
1473
1474 if (other && delete_dependencies) {
1475 log_debug("Deleting job %s/%s as dependency of job %s/%s",
1476 other->unit->id, job_type_to_string(other->type),
1477 j->unit->id, job_type_to_string(j->type));
1478 transaction_delete_job(m, other, delete_dependencies);
1479 }
1480 }
1481 }
1482
1483 static int transaction_add_job_and_dependencies(
1484 Manager *m,
1485 JobType type,
1486 Unit *unit,
1487 Job *by,
1488 bool matters,
1489 bool override,
1490 bool conflicts,
1491 bool ignore_requirements,
1492 bool ignore_order,
1493 DBusError *e,
1494 Job **_ret) {
1495 Job *ret;
1496 Iterator i;
1497 Unit *dep;
1498 int r;
1499 bool is_new;
1500
1501 assert(m);
1502 assert(type < _JOB_TYPE_MAX);
1503 assert(unit);
1504
1505 /* log_debug("Pulling in %s/%s from %s/%s", */
1506 /* unit->id, job_type_to_string(type), */
1507 /* by ? by->unit->id : "NA", */
1508 /* by ? job_type_to_string(by->type) : "NA"); */
1509
1510 if (unit->load_state != UNIT_LOADED &&
1511 unit->load_state != UNIT_ERROR &&
1512 unit->load_state != UNIT_MASKED) {
1513 dbus_set_error(e, BUS_ERROR_LOAD_FAILED, "Unit %s is not loaded properly.", unit->id);
1514 return -EINVAL;
1515 }
1516
1517 if (type != JOB_STOP && unit->load_state == UNIT_ERROR) {
1518 dbus_set_error(e, BUS_ERROR_LOAD_FAILED,
1519 "Unit %s failed to load: %s. "
1520 "See system logs and 'systemctl status %s' for details.",
1521 unit->id,
1522 strerror(-unit->load_error),
1523 unit->id);
1524 return -EINVAL;
1525 }
1526
1527 if (type != JOB_STOP && unit->load_state == UNIT_MASKED) {
1528 dbus_set_error(e, BUS_ERROR_MASKED, "Unit %s is masked.", unit->id);
1529 return -EINVAL;
1530 }
1531
1532 if (!unit_job_is_applicable(unit, type)) {
1533 dbus_set_error(e, BUS_ERROR_JOB_TYPE_NOT_APPLICABLE, "Job type %s is not applicable for unit %s.", job_type_to_string(type), unit->id);
1534 return -EBADR;
1535 }
1536
1537 /* First add the job. */
1538 if (!(ret = transaction_add_one_job(m, type, unit, override, &is_new)))
1539 return -ENOMEM;
1540
1541 ret->ignore_order = ret->ignore_order || ignore_order;
1542
1543 /* Then, add a link to the job. */
1544 if (!job_dependency_new(by, ret, matters, conflicts))
1545 return -ENOMEM;
1546
1547 if (is_new && !ignore_requirements) {
1548 Set *following;
1549
1550 /* If we are following some other unit, make sure we
1551 * add all dependencies of everybody following. */
1552 if (unit_following_set(ret->unit, &following) > 0) {
1553 SET_FOREACH(dep, following, i)
1554 if ((r = transaction_add_job_and_dependencies(m, type, dep, ret, false, override, false, false, ignore_order, e, NULL)) < 0) {
1555 log_warning("Cannot add dependency job for unit %s, ignoring: %s", dep->id, bus_error(e, r));
1556
1557 if (e)
1558 dbus_error_free(e);
1559 }
1560
1561 set_free(following);
1562 }
1563
1564 /* Finally, recursively add in all dependencies. */
1565 if (type == JOB_START || type == JOB_RELOAD_OR_START) {
1566 SET_FOREACH(dep, ret->unit->dependencies[UNIT_REQUIRES], i)
1567 if ((r = transaction_add_job_and_dependencies(m, JOB_START, dep, ret, true, override, false, false, ignore_order, e, NULL)) < 0) {
1568 if (r != -EBADR)
1569 goto fail;
1570
1571 if (e)
1572 dbus_error_free(e);
1573 }
1574
1575 SET_FOREACH(dep, ret->unit->dependencies[UNIT_BIND_TO], i)
1576 if ((r = transaction_add_job_and_dependencies(m, JOB_START, dep, ret, true, override, false, false, ignore_order, e, NULL)) < 0) {
1577
1578 if (r != -EBADR)
1579 goto fail;
1580
1581 if (e)
1582 dbus_error_free(e);
1583 }
1584
1585 SET_FOREACH(dep, ret->unit->dependencies[UNIT_REQUIRES_OVERRIDABLE], i)
1586 if ((r = transaction_add_job_and_dependencies(m, JOB_START, dep, ret, !override, override, false, false, ignore_order, e, NULL)) < 0) {
1587 log_warning("Cannot add dependency job for unit %s, ignoring: %s", dep->id, bus_error(e, r));
1588
1589 if (e)
1590 dbus_error_free(e);
1591 }
1592
1593 SET_FOREACH(dep, ret->unit->dependencies[UNIT_WANTS], i)
1594 if ((r = transaction_add_job_and_dependencies(m, JOB_START, dep, ret, false, false, false, false, ignore_order, e, NULL)) < 0) {
1595 log_warning("Cannot add dependency job for unit %s, ignoring: %s", dep->id, bus_error(e, r));
1596
1597 if (e)
1598 dbus_error_free(e);
1599 }
1600
1601 SET_FOREACH(dep, ret->unit->dependencies[UNIT_REQUISITE], i)
1602 if ((r = transaction_add_job_and_dependencies(m, JOB_VERIFY_ACTIVE, dep, ret, true, override, false, false, ignore_order, e, NULL)) < 0) {
1603
1604 if (r != -EBADR)
1605 goto fail;
1606
1607 if (e)
1608 dbus_error_free(e);
1609 }
1610
1611 SET_FOREACH(dep, ret->unit->dependencies[UNIT_REQUISITE_OVERRIDABLE], i)
1612 if ((r = transaction_add_job_and_dependencies(m, JOB_VERIFY_ACTIVE, dep, ret, !override, override, false, false, ignore_order, e, NULL)) < 0) {
1613 log_warning("Cannot add dependency job for unit %s, ignoring: %s", dep->id, bus_error(e, r));
1614
1615 if (e)
1616 dbus_error_free(e);
1617 }
1618
1619 SET_FOREACH(dep, ret->unit->dependencies[UNIT_CONFLICTS], i)
1620 if ((r = transaction_add_job_and_dependencies(m, JOB_STOP, dep, ret, true, override, true, false, ignore_order, e, NULL)) < 0) {
1621
1622 if (r != -EBADR)
1623 goto fail;
1624
1625 if (e)
1626 dbus_error_free(e);
1627 }
1628
1629 SET_FOREACH(dep, ret->unit->dependencies[UNIT_CONFLICTED_BY], i)
1630 if ((r = transaction_add_job_and_dependencies(m, JOB_STOP, dep, ret, false, override, false, false, ignore_order, e, NULL)) < 0) {
1631 log_warning("Cannot add dependency job for unit %s, ignoring: %s", dep->id, bus_error(e, r));
1632
1633 if (e)
1634 dbus_error_free(e);
1635 }
1636
1637 }
1638
1639 if (type == JOB_STOP || type == JOB_RESTART || type == JOB_TRY_RESTART) {
1640
1641 SET_FOREACH(dep, ret->unit->dependencies[UNIT_REQUIRED_BY], i)
1642 if ((r = transaction_add_job_and_dependencies(m, type, dep, ret, true, override, false, false, ignore_order, e, NULL)) < 0) {
1643
1644 if (r != -EBADR)
1645 goto fail;
1646
1647 if (e)
1648 dbus_error_free(e);
1649 }
1650
1651 SET_FOREACH(dep, ret->unit->dependencies[UNIT_BOUND_BY], i)
1652 if ((r = transaction_add_job_and_dependencies(m, type, dep, ret, true, override, false, false, ignore_order, e, NULL)) < 0) {
1653
1654 if (r != -EBADR)
1655 goto fail;
1656
1657 if (e)
1658 dbus_error_free(e);
1659 }
1660 }
1661
1662 if (type == JOB_RELOAD || type == JOB_RELOAD_OR_START) {
1663
1664 SET_FOREACH(dep, ret->unit->dependencies[UNIT_PROPAGATE_RELOAD_TO], i) {
1665 r = transaction_add_job_and_dependencies(m, JOB_RELOAD, dep, ret, false, override, false, false, ignore_order, e, NULL);
1666
1667 if (r < 0) {
1668 log_warning("Cannot add dependency reload job for unit %s, ignoring: %s", dep->id, bus_error(e, r));
1669
1670 if (e)
1671 dbus_error_free(e);
1672 }
1673 }
1674 }
1675
1676 /* JOB_VERIFY_STARTED, JOB_RELOAD require no dependency handling */
1677 }
1678
1679 if (_ret)
1680 *_ret = ret;
1681
1682 return 0;
1683
1684 fail:
1685 return r;
1686 }
1687
1688 static int transaction_add_isolate_jobs(Manager *m) {
1689 Iterator i;
1690 Unit *u;
1691 char *k;
1692 int r;
1693
1694 assert(m);
1695
1696 HASHMAP_FOREACH_KEY(u, k, m->units, i) {
1697
1698 /* ignore aliases */
1699 if (u->id != k)
1700 continue;
1701
1702 if (u->ignore_on_isolate)
1703 continue;
1704
1705 /* No need to stop inactive jobs */
1706 if (UNIT_IS_INACTIVE_OR_FAILED(unit_active_state(u)) && !u->job)
1707 continue;
1708
1709 /* Is there already something listed for this? */
1710 if (hashmap_get(m->transaction_jobs, u))
1711 continue;
1712
1713 if ((r = transaction_add_job_and_dependencies(m, JOB_STOP, u, NULL, true, false, false, false, false, NULL, NULL)) < 0)
1714 log_warning("Cannot add isolate job for unit %s, ignoring: %s", u->id, strerror(-r));
1715 }
1716
1717 return 0;
1718 }
1719
1720 int manager_add_job(Manager *m, JobType type, Unit *unit, JobMode mode, bool override, DBusError *e, Job **_ret) {
1721 int r;
1722 Job *ret;
1723
1724 assert(m);
1725 assert(type < _JOB_TYPE_MAX);
1726 assert(unit);
1727 assert(mode < _JOB_MODE_MAX);
1728
1729 if (mode == JOB_ISOLATE && type != JOB_START) {
1730 dbus_set_error(e, BUS_ERROR_INVALID_JOB_MODE, "Isolate is only valid for start.");
1731 return -EINVAL;
1732 }
1733
1734 if (mode == JOB_ISOLATE && !unit->allow_isolate) {
1735 dbus_set_error(e, BUS_ERROR_NO_ISOLATION, "Operation refused, unit may not be isolated.");
1736 return -EPERM;
1737 }
1738
1739 log_debug("Trying to enqueue job %s/%s/%s", unit->id, job_type_to_string(type), job_mode_to_string(mode));
1740
1741 if ((r = transaction_add_job_and_dependencies(m, type, unit, NULL, true, override, false,
1742 mode == JOB_IGNORE_DEPENDENCIES || mode == JOB_IGNORE_REQUIREMENTS,
1743 mode == JOB_IGNORE_DEPENDENCIES, e, &ret)) < 0) {
1744 transaction_abort(m);
1745 return r;
1746 }
1747
1748 if (mode == JOB_ISOLATE)
1749 if ((r = transaction_add_isolate_jobs(m)) < 0) {
1750 transaction_abort(m);
1751 return r;
1752 }
1753
1754 if ((r = transaction_activate(m, mode, e)) < 0)
1755 return r;
1756
1757 log_debug("Enqueued job %s/%s as %u", unit->id, job_type_to_string(type), (unsigned) ret->id);
1758
1759 if (_ret)
1760 *_ret = ret;
1761
1762 return 0;
1763 }
1764
1765 int manager_add_job_by_name(Manager *m, JobType type, const char *name, JobMode mode, bool override, DBusError *e, Job **_ret) {
1766 Unit *unit;
1767 int r;
1768
1769 assert(m);
1770 assert(type < _JOB_TYPE_MAX);
1771 assert(name);
1772 assert(mode < _JOB_MODE_MAX);
1773
1774 if ((r = manager_load_unit(m, name, NULL, NULL, &unit)) < 0)
1775 return r;
1776
1777 return manager_add_job(m, type, unit, mode, override, e, _ret);
1778 }
1779
1780 Job *manager_get_job(Manager *m, uint32_t id) {
1781 assert(m);
1782
1783 return hashmap_get(m->jobs, UINT32_TO_PTR(id));
1784 }
1785
1786 Unit *manager_get_unit(Manager *m, const char *name) {
1787 assert(m);
1788 assert(name);
1789
1790 return hashmap_get(m->units, name);
1791 }
1792
1793 unsigned manager_dispatch_load_queue(Manager *m) {
1794 Unit *u;
1795 unsigned n = 0;
1796
1797 assert(m);
1798
1799 /* Make sure we are not run recursively */
1800 if (m->dispatching_load_queue)
1801 return 0;
1802
1803 m->dispatching_load_queue = true;
1804
1805 /* Dispatches the load queue. Takes a unit from the queue and
1806 * tries to load its data until the queue is empty */
1807
1808 while ((u = m->load_queue)) {
1809 assert(u->in_load_queue);
1810
1811 unit_load(u);
1812 n++;
1813 }
1814
1815 m->dispatching_load_queue = false;
1816 return n;
1817 }
1818
1819 int manager_load_unit_prepare(Manager *m, const char *name, const char *path, DBusError *e, Unit **_ret) {
1820 Unit *ret;
1821 UnitType t;
1822 int r;
1823
1824 assert(m);
1825 assert(name || path);
1826
1827 /* This will prepare the unit for loading, but not actually
1828 * load anything from disk. */
1829
1830 if (path && !is_path(path)) {
1831 dbus_set_error(e, BUS_ERROR_INVALID_PATH, "Path %s is not absolute.", path);
1832 return -EINVAL;
1833 }
1834
1835 if (!name)
1836 name = file_name_from_path(path);
1837
1838 t = unit_name_to_type(name);
1839
1840 if (t == _UNIT_TYPE_INVALID || !unit_name_is_valid_no_type(name, false)) {
1841 dbus_set_error(e, BUS_ERROR_INVALID_NAME, "Unit name %s is not valid.", name);
1842 return -EINVAL;
1843 }
1844
1845 ret = manager_get_unit(m, name);
1846 if (ret) {
1847 *_ret = ret;
1848 return 1;
1849 }
1850
1851 ret = unit_new(m, unit_vtable[t]->object_size);
1852 if (!ret)
1853 return -ENOMEM;
1854
1855 if (path) {
1856 ret->fragment_path = strdup(path);
1857 if (!ret->fragment_path) {
1858 unit_free(ret);
1859 return -ENOMEM;
1860 }
1861 }
1862
1863 if ((r = unit_add_name(ret, name)) < 0) {
1864 unit_free(ret);
1865 return r;
1866 }
1867
1868 unit_add_to_load_queue(ret);
1869 unit_add_to_dbus_queue(ret);
1870 unit_add_to_gc_queue(ret);
1871
1872 if (_ret)
1873 *_ret = ret;
1874
1875 return 0;
1876 }
1877
1878 int manager_load_unit(Manager *m, const char *name, const char *path, DBusError *e, Unit **_ret) {
1879 int r;
1880
1881 assert(m);
1882
1883 /* This will load the service information files, but not actually
1884 * start any services or anything. */
1885
1886 if ((r = manager_load_unit_prepare(m, name, path, e, _ret)) != 0)
1887 return r;
1888
1889 manager_dispatch_load_queue(m);
1890
1891 if (_ret)
1892 *_ret = unit_follow_merge(*_ret);
1893
1894 return 0;
1895 }
1896
1897 void manager_dump_jobs(Manager *s, FILE *f, const char *prefix) {
1898 Iterator i;
1899 Job *j;
1900
1901 assert(s);
1902 assert(f);
1903
1904 HASHMAP_FOREACH(j, s->jobs, i)
1905 job_dump(j, f, prefix);
1906 }
1907
1908 void manager_dump_units(Manager *s, FILE *f, const char *prefix) {
1909 Iterator i;
1910 Unit *u;
1911 const char *t;
1912
1913 assert(s);
1914 assert(f);
1915
1916 HASHMAP_FOREACH_KEY(u, t, s->units, i)
1917 if (u->id == t)
1918 unit_dump(u, f, prefix);
1919 }
1920
1921 void manager_clear_jobs(Manager *m) {
1922 Job *j;
1923
1924 assert(m);
1925
1926 transaction_abort(m);
1927
1928 while ((j = hashmap_first(m->jobs)))
1929 job_finish_and_invalidate(j, JOB_CANCELED);
1930 }
1931
1932 unsigned manager_dispatch_run_queue(Manager *m) {
1933 Job *j;
1934 unsigned n = 0;
1935
1936 if (m->dispatching_run_queue)
1937 return 0;
1938
1939 m->dispatching_run_queue = true;
1940
1941 while ((j = m->run_queue)) {
1942 assert(j->installed);
1943 assert(j->in_run_queue);
1944
1945 job_run_and_invalidate(j);
1946 n++;
1947 }
1948
1949 m->dispatching_run_queue = false;
1950 return n;
1951 }
1952
1953 unsigned manager_dispatch_dbus_queue(Manager *m) {
1954 Job *j;
1955 Unit *u;
1956 unsigned n = 0;
1957
1958 assert(m);
1959
1960 if (m->dispatching_dbus_queue)
1961 return 0;
1962
1963 m->dispatching_dbus_queue = true;
1964
1965 while ((u = m->dbus_unit_queue)) {
1966 assert(u->in_dbus_queue);
1967
1968 bus_unit_send_change_signal(u);
1969 n++;
1970 }
1971
1972 while ((j = m->dbus_job_queue)) {
1973 assert(j->in_dbus_queue);
1974
1975 bus_job_send_change_signal(j);
1976 n++;
1977 }
1978
1979 m->dispatching_dbus_queue = false;
1980 return n;
1981 }
1982
1983 static int manager_process_notify_fd(Manager *m) {
1984 ssize_t n;
1985
1986 assert(m);
1987
1988 for (;;) {
1989 char buf[4096];
1990 struct msghdr msghdr;
1991 struct iovec iovec;
1992 struct ucred *ucred;
1993 union {
1994 struct cmsghdr cmsghdr;
1995 uint8_t buf[CMSG_SPACE(sizeof(struct ucred))];
1996 } control;
1997 Unit *u;
1998 char **tags;
1999
2000 zero(iovec);
2001 iovec.iov_base = buf;
2002 iovec.iov_len = sizeof(buf)-1;
2003
2004 zero(control);
2005 zero(msghdr);
2006 msghdr.msg_iov = &iovec;
2007 msghdr.msg_iovlen = 1;
2008 msghdr.msg_control = &control;
2009 msghdr.msg_controllen = sizeof(control);
2010
2011 if ((n = recvmsg(m->notify_watch.fd, &msghdr, MSG_DONTWAIT)) <= 0) {
2012 if (n >= 0)
2013 return -EIO;
2014
2015 if (errno == EAGAIN || errno == EINTR)
2016 break;
2017
2018 return -errno;
2019 }
2020
2021 if (msghdr.msg_controllen < CMSG_LEN(sizeof(struct ucred)) ||
2022 control.cmsghdr.cmsg_level != SOL_SOCKET ||
2023 control.cmsghdr.cmsg_type != SCM_CREDENTIALS ||
2024 control.cmsghdr.cmsg_len != CMSG_LEN(sizeof(struct ucred))) {
2025 log_warning("Received notify message without credentials. Ignoring.");
2026 continue;
2027 }
2028
2029 ucred = (struct ucred*) CMSG_DATA(&control.cmsghdr);
2030
2031 if (!(u = hashmap_get(m->watch_pids, LONG_TO_PTR(ucred->pid))))
2032 if (!(u = cgroup_unit_by_pid(m, ucred->pid))) {
2033 log_warning("Cannot find unit for notify message of PID %lu.", (unsigned long) ucred->pid);
2034 continue;
2035 }
2036
2037 assert((size_t) n < sizeof(buf));
2038 buf[n] = 0;
2039 if (!(tags = strv_split(buf, "\n\r")))
2040 return -ENOMEM;
2041
2042 log_debug("Got notification message for unit %s", u->id);
2043
2044 if (UNIT_VTABLE(u)->notify_message)
2045 UNIT_VTABLE(u)->notify_message(u, ucred->pid, tags);
2046
2047 strv_free(tags);
2048 }
2049
2050 return 0;
2051 }
2052
2053 static int manager_dispatch_sigchld(Manager *m) {
2054 assert(m);
2055
2056 for (;;) {
2057 siginfo_t si;
2058 Unit *u;
2059 int r;
2060
2061 zero(si);
2062
2063 /* First we call waitd() for a PID and do not reap the
2064 * zombie. That way we can still access /proc/$PID for
2065 * it while it is a zombie. */
2066 if (waitid(P_ALL, 0, &si, WEXITED|WNOHANG|WNOWAIT) < 0) {
2067
2068 if (errno == ECHILD)
2069 break;
2070
2071 if (errno == EINTR)
2072 continue;
2073
2074 return -errno;
2075 }
2076
2077 if (si.si_pid <= 0)
2078 break;
2079
2080 if (si.si_code == CLD_EXITED || si.si_code == CLD_KILLED || si.si_code == CLD_DUMPED) {
2081 char *name = NULL;
2082
2083 get_process_comm(si.si_pid, &name);
2084 log_debug("Got SIGCHLD for process %lu (%s)", (unsigned long) si.si_pid, strna(name));
2085 free(name);
2086 }
2087
2088 /* Let's flush any message the dying child might still
2089 * have queued for us. This ensures that the process
2090 * still exists in /proc so that we can figure out
2091 * which cgroup and hence unit it belongs to. */
2092 if ((r = manager_process_notify_fd(m)) < 0)
2093 return r;
2094
2095 /* And now figure out the unit this belongs to */
2096 if (!(u = hashmap_get(m->watch_pids, LONG_TO_PTR(si.si_pid))))
2097 u = cgroup_unit_by_pid(m, si.si_pid);
2098
2099 /* And now, we actually reap the zombie. */
2100 if (waitid(P_PID, si.si_pid, &si, WEXITED) < 0) {
2101 if (errno == EINTR)
2102 continue;
2103
2104 return -errno;
2105 }
2106
2107 if (si.si_code != CLD_EXITED && si.si_code != CLD_KILLED && si.si_code != CLD_DUMPED)
2108 continue;
2109
2110 log_debug("Child %lu died (code=%s, status=%i/%s)",
2111 (long unsigned) si.si_pid,
2112 sigchld_code_to_string(si.si_code),
2113 si.si_status,
2114 strna(si.si_code == CLD_EXITED
2115 ? exit_status_to_string(si.si_status, EXIT_STATUS_FULL)
2116 : signal_to_string(si.si_status)));
2117
2118 if (!u)
2119 continue;
2120
2121 log_debug("Child %lu belongs to %s", (long unsigned) si.si_pid, u->id);
2122
2123 hashmap_remove(m->watch_pids, LONG_TO_PTR(si.si_pid));
2124 UNIT_VTABLE(u)->sigchld_event(u, si.si_pid, si.si_code, si.si_status);
2125 }
2126
2127 return 0;
2128 }
2129
2130 static int manager_start_target(Manager *m, const char *name, JobMode mode) {
2131 int r;
2132 DBusError error;
2133
2134 dbus_error_init(&error);
2135
2136 log_debug("Activating special unit %s", name);
2137
2138 if ((r = manager_add_job_by_name(m, JOB_START, name, mode, true, &error, NULL)) < 0)
2139 log_error("Failed to enqueue %s job: %s", name, bus_error(&error, r));
2140
2141 dbus_error_free(&error);
2142
2143 return r;
2144 }
2145
2146 static int manager_process_signal_fd(Manager *m) {
2147 ssize_t n;
2148 struct signalfd_siginfo sfsi;
2149 bool sigchld = false;
2150
2151 assert(m);
2152
2153 for (;;) {
2154 if ((n = read(m->signal_watch.fd, &sfsi, sizeof(sfsi))) != sizeof(sfsi)) {
2155
2156 if (n >= 0)
2157 return -EIO;
2158
2159 if (errno == EINTR || errno == EAGAIN)
2160 break;
2161
2162 return -errno;
2163 }
2164
2165 if (sfsi.ssi_pid > 0) {
2166 char *p = NULL;
2167
2168 get_process_comm(sfsi.ssi_pid, &p);
2169
2170 log_debug("Received SIG%s from PID %lu (%s).",
2171 signal_to_string(sfsi.ssi_signo),
2172 (unsigned long) sfsi.ssi_pid, strna(p));
2173 free(p);
2174 } else
2175 log_debug("Received SIG%s.", signal_to_string(sfsi.ssi_signo));
2176
2177 switch (sfsi.ssi_signo) {
2178
2179 case SIGCHLD:
2180 sigchld = true;
2181 break;
2182
2183 case SIGTERM:
2184 if (m->running_as == MANAGER_SYSTEM) {
2185 /* This is for compatibility with the
2186 * original sysvinit */
2187 m->exit_code = MANAGER_REEXECUTE;
2188 break;
2189 }
2190
2191 /* Fall through */
2192
2193 case SIGINT:
2194 if (m->running_as == MANAGER_SYSTEM) {
2195 manager_start_target(m, SPECIAL_CTRL_ALT_DEL_TARGET, JOB_REPLACE);
2196 break;
2197 }
2198
2199 /* Run the exit target if there is one, if not, just exit. */
2200 if (manager_start_target(m, SPECIAL_EXIT_TARGET, JOB_REPLACE) < 0) {
2201 m->exit_code = MANAGER_EXIT;
2202 return 0;
2203 }
2204
2205 break;
2206
2207 case SIGWINCH:
2208 if (m->running_as == MANAGER_SYSTEM)
2209 manager_start_target(m, SPECIAL_KBREQUEST_TARGET, JOB_REPLACE);
2210
2211 /* This is a nop on non-init */
2212 break;
2213
2214 case SIGPWR:
2215 if (m->running_as == MANAGER_SYSTEM)
2216 manager_start_target(m, SPECIAL_SIGPWR_TARGET, JOB_REPLACE);
2217
2218 /* This is a nop on non-init */
2219 break;
2220
2221 case SIGUSR1: {
2222 Unit *u;
2223
2224 u = manager_get_unit(m, SPECIAL_DBUS_SERVICE);
2225
2226 if (!u || UNIT_IS_ACTIVE_OR_RELOADING(unit_active_state(u))) {
2227 log_info("Trying to reconnect to bus...");
2228 bus_init(m, true);
2229 }
2230
2231 if (!u || !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u))) {
2232 log_info("Loading D-Bus service...");
2233 manager_start_target(m, SPECIAL_DBUS_SERVICE, JOB_REPLACE);
2234 }
2235
2236 break;
2237 }
2238
2239 case SIGUSR2: {
2240 FILE *f;
2241 char *dump = NULL;
2242 size_t size;
2243
2244 if (!(f = open_memstream(&dump, &size))) {
2245 log_warning("Failed to allocate memory stream.");
2246 break;
2247 }
2248
2249 manager_dump_units(m, f, "\t");
2250 manager_dump_jobs(m, f, "\t");
2251
2252 if (ferror(f)) {
2253 fclose(f);
2254 free(dump);
2255 log_warning("Failed to write status stream");
2256 break;
2257 }
2258
2259 fclose(f);
2260 log_dump(LOG_INFO, dump);
2261 free(dump);
2262
2263 break;
2264 }
2265
2266 case SIGHUP:
2267 m->exit_code = MANAGER_RELOAD;
2268 break;
2269
2270 default: {
2271
2272 /* Starting SIGRTMIN+0 */
2273 static const char * const target_table[] = {
2274 [0] = SPECIAL_DEFAULT_TARGET,
2275 [1] = SPECIAL_RESCUE_TARGET,
2276 [2] = SPECIAL_EMERGENCY_TARGET,
2277 [3] = SPECIAL_HALT_TARGET,
2278 [4] = SPECIAL_POWEROFF_TARGET,
2279 [5] = SPECIAL_REBOOT_TARGET,
2280 [6] = SPECIAL_KEXEC_TARGET
2281 };
2282
2283 /* Starting SIGRTMIN+13, so that target halt and system halt are 10 apart */
2284 static const ManagerExitCode code_table[] = {
2285 [0] = MANAGER_HALT,
2286 [1] = MANAGER_POWEROFF,
2287 [2] = MANAGER_REBOOT,
2288 [3] = MANAGER_KEXEC
2289 };
2290
2291 if ((int) sfsi.ssi_signo >= SIGRTMIN+0 &&
2292 (int) sfsi.ssi_signo < SIGRTMIN+(int) ELEMENTSOF(target_table)) {
2293 int idx = (int) sfsi.ssi_signo - SIGRTMIN;
2294 manager_start_target(m, target_table[idx],
2295 (idx == 1 || idx == 2) ? JOB_ISOLATE : JOB_REPLACE);
2296 break;
2297 }
2298
2299 if ((int) sfsi.ssi_signo >= SIGRTMIN+13 &&
2300 (int) sfsi.ssi_signo < SIGRTMIN+13+(int) ELEMENTSOF(code_table)) {
2301 m->exit_code = code_table[sfsi.ssi_signo - SIGRTMIN - 13];
2302 break;
2303 }
2304
2305 switch (sfsi.ssi_signo - SIGRTMIN) {
2306
2307 case 20:
2308 log_debug("Enabling showing of status.");
2309 manager_set_show_status(m, true);
2310 break;
2311
2312 case 21:
2313 log_debug("Disabling showing of status.");
2314 manager_set_show_status(m, false);
2315 break;
2316
2317 case 22:
2318 log_set_max_level(LOG_DEBUG);
2319 log_notice("Setting log level to debug.");
2320 break;
2321
2322 case 23:
2323 log_set_max_level(LOG_INFO);
2324 log_notice("Setting log level to info.");
2325 break;
2326
2327 case 26:
2328 log_set_target(LOG_TARGET_JOURNAL_OR_KMSG);
2329 log_notice("Setting log target to journal-or-kmsg.");
2330 break;
2331
2332 case 27:
2333 log_set_target(LOG_TARGET_CONSOLE);
2334 log_notice("Setting log target to console.");
2335 break;
2336
2337 case 28:
2338 log_set_target(LOG_TARGET_KMSG);
2339 log_notice("Setting log target to kmsg.");
2340 break;
2341
2342 case 29:
2343 log_set_target(LOG_TARGET_SYSLOG_OR_KMSG);
2344 log_notice("Setting log target to syslog-or-kmsg.");
2345 break;
2346
2347 default:
2348 log_warning("Got unhandled signal <%s>.", signal_to_string(sfsi.ssi_signo));
2349 }
2350 }
2351 }
2352 }
2353
2354 if (sigchld)
2355 return manager_dispatch_sigchld(m);
2356
2357 return 0;
2358 }
2359
2360 static int process_event(Manager *m, struct epoll_event *ev) {
2361 int r;
2362 Watch *w;
2363
2364 assert(m);
2365 assert(ev);
2366
2367 assert_se(w = ev->data.ptr);
2368
2369 if (w->type == WATCH_INVALID)
2370 return 0;
2371
2372 switch (w->type) {
2373
2374 case WATCH_SIGNAL:
2375
2376 /* An incoming signal? */
2377 if (ev->events != EPOLLIN)
2378 return -EINVAL;
2379
2380 if ((r = manager_process_signal_fd(m)) < 0)
2381 return r;
2382
2383 break;
2384
2385 case WATCH_NOTIFY:
2386
2387 /* An incoming daemon notification event? */
2388 if (ev->events != EPOLLIN)
2389 return -EINVAL;
2390
2391 if ((r = manager_process_notify_fd(m)) < 0)
2392 return r;
2393
2394 break;
2395
2396 case WATCH_FD:
2397
2398 /* Some fd event, to be dispatched to the units */
2399 UNIT_VTABLE(w->data.unit)->fd_event(w->data.unit, w->fd, ev->events, w);
2400 break;
2401
2402 case WATCH_UNIT_TIMER:
2403 case WATCH_JOB_TIMER: {
2404 uint64_t v;
2405 ssize_t k;
2406
2407 /* Some timer event, to be dispatched to the units */
2408 if ((k = read(w->fd, &v, sizeof(v))) != sizeof(v)) {
2409
2410 if (k < 0 && (errno == EINTR || errno == EAGAIN))
2411 break;
2412
2413 return k < 0 ? -errno : -EIO;
2414 }
2415
2416 if (w->type == WATCH_UNIT_TIMER)
2417 UNIT_VTABLE(w->data.unit)->timer_event(w->data.unit, v, w);
2418 else
2419 job_timer_event(w->data.job, v, w);
2420 break;
2421 }
2422
2423 case WATCH_MOUNT:
2424 /* Some mount table change, intended for the mount subsystem */
2425 mount_fd_event(m, ev->events);
2426 break;
2427
2428 case WATCH_SWAP:
2429 /* Some swap table change, intended for the swap subsystem */
2430 swap_fd_event(m, ev->events);
2431 break;
2432
2433 case WATCH_UDEV:
2434 /* Some notification from udev, intended for the device subsystem */
2435 device_fd_event(m, ev->events);
2436 break;
2437
2438 case WATCH_DBUS_WATCH:
2439 bus_watch_event(m, w, ev->events);
2440 break;
2441
2442 case WATCH_DBUS_TIMEOUT:
2443 bus_timeout_event(m, w, ev->events);
2444 break;
2445
2446 default:
2447 log_error("event type=%i", w->type);
2448 assert_not_reached("Unknown epoll event type.");
2449 }
2450
2451 return 0;
2452 }
2453
2454 int manager_loop(Manager *m) {
2455 int r;
2456 int wait_msec = -1;
2457
2458 RATELIMIT_DEFINE(rl, 1*USEC_PER_SEC, 50000);
2459
2460 assert(m);
2461 m->exit_code = MANAGER_RUNNING;
2462
2463 /* Release the path cache */
2464 set_free_free(m->unit_path_cache);
2465 m->unit_path_cache = NULL;
2466
2467 manager_check_finished(m);
2468
2469 /* There might still be some zombies hanging around from
2470 * before we were exec()'ed. Leat's reap them */
2471 r = manager_dispatch_sigchld(m);
2472 if (r < 0)
2473 return r;
2474
2475 /* Sleep for half the watchdog time */
2476 if (m->runtime_watchdog > 0 && m->running_as == MANAGER_SYSTEM) {
2477 wait_msec = (int) (m->runtime_watchdog / 2 / USEC_PER_MSEC);
2478 if (wait_msec <= 0)
2479 wait_msec = 1;
2480 }
2481
2482 while (m->exit_code == MANAGER_RUNNING) {
2483 struct epoll_event event;
2484 int n;
2485
2486 if (wait_msec >= 0)
2487 watchdog_ping();
2488
2489 if (!ratelimit_test(&rl)) {
2490 /* Yay, something is going seriously wrong, pause a little */
2491 log_warning("Looping too fast. Throttling execution a little.");
2492 sleep(1);
2493 continue;
2494 }
2495
2496 if (manager_dispatch_load_queue(m) > 0)
2497 continue;
2498
2499 if (manager_dispatch_run_queue(m) > 0)
2500 continue;
2501
2502 if (bus_dispatch(m) > 0)
2503 continue;
2504
2505 if (manager_dispatch_cleanup_queue(m) > 0)
2506 continue;
2507
2508 if (manager_dispatch_gc_queue(m) > 0)
2509 continue;
2510
2511 if (manager_dispatch_dbus_queue(m) > 0)
2512 continue;
2513
2514 if (swap_dispatch_reload(m) > 0)
2515 continue;
2516
2517 n = epoll_wait(m->epoll_fd, &event, 1, wait_msec);
2518 if (n < 0) {
2519
2520 if (errno == EINTR)
2521 continue;
2522
2523 return -errno;
2524 } else if (n == 0)
2525 continue;
2526
2527 assert(n == 1);
2528
2529 r = process_event(m, &event);
2530 if (r < 0)
2531 return r;
2532 }
2533
2534 return m->exit_code;
2535 }
2536
2537 int manager_get_unit_from_dbus_path(Manager *m, const char *s, Unit **_u) {
2538 char *n;
2539 Unit *u;
2540
2541 assert(m);
2542 assert(s);
2543 assert(_u);
2544
2545 if (!startswith(s, "/org/freedesktop/systemd1/unit/"))
2546 return -EINVAL;
2547
2548 if (!(n = bus_path_unescape(s+31)))
2549 return -ENOMEM;
2550
2551 u = manager_get_unit(m, n);
2552 free(n);
2553
2554 if (!u)
2555 return -ENOENT;
2556
2557 *_u = u;
2558
2559 return 0;
2560 }
2561
2562 int manager_get_job_from_dbus_path(Manager *m, const char *s, Job **_j) {
2563 Job *j;
2564 unsigned id;
2565 int r;
2566
2567 assert(m);
2568 assert(s);
2569 assert(_j);
2570
2571 if (!startswith(s, "/org/freedesktop/systemd1/job/"))
2572 return -EINVAL;
2573
2574 if ((r = safe_atou(s + 30, &id)) < 0)
2575 return r;
2576
2577 if (!(j = manager_get_job(m, id)))
2578 return -ENOENT;
2579
2580 *_j = j;
2581
2582 return 0;
2583 }
2584
2585 void manager_send_unit_audit(Manager *m, Unit *u, int type, bool success) {
2586
2587 #ifdef HAVE_AUDIT
2588 char *p;
2589
2590 if (m->audit_fd < 0)
2591 return;
2592
2593 /* Don't generate audit events if the service was already
2594 * started and we're just deserializing */
2595 if (m->n_reloading > 0)
2596 return;
2597
2598 if (m->running_as != MANAGER_SYSTEM)
2599 return;
2600
2601 if (u->type != UNIT_SERVICE)
2602 return;
2603
2604 if (!(p = unit_name_to_prefix_and_instance(u->id))) {
2605 log_error("Failed to allocate unit name for audit message: %s", strerror(ENOMEM));
2606 return;
2607 }
2608
2609 if (audit_log_user_comm_message(m->audit_fd, type, "", p, NULL, NULL, NULL, success) < 0) {
2610 log_warning("Failed to send audit message: %m");
2611
2612 if (errno == EPERM) {
2613 /* We aren't allowed to send audit messages?
2614 * Then let's not retry again, to avoid
2615 * spamming the user with the same and same
2616 * messages over and over. */
2617
2618 audit_close(m->audit_fd);
2619 m->audit_fd = -1;
2620 }
2621 }
2622
2623 free(p);
2624 #endif
2625
2626 }
2627
2628 void manager_send_unit_plymouth(Manager *m, Unit *u) {
2629 int fd = -1;
2630 union sockaddr_union sa;
2631 int n = 0;
2632 char *message = NULL;
2633
2634 /* Don't generate plymouth events if the service was already
2635 * started and we're just deserializing */
2636 if (m->n_reloading > 0)
2637 return;
2638
2639 if (m->running_as != MANAGER_SYSTEM)
2640 return;
2641
2642 if (u->type != UNIT_SERVICE &&
2643 u->type != UNIT_MOUNT &&
2644 u->type != UNIT_SWAP)
2645 return;
2646
2647 /* We set SOCK_NONBLOCK here so that we rather drop the
2648 * message then wait for plymouth */
2649 if ((fd = socket(AF_UNIX, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0)) < 0) {
2650 log_error("socket() failed: %m");
2651 return;
2652 }
2653
2654 zero(sa);
2655 sa.sa.sa_family = AF_UNIX;
2656 strncpy(sa.un.sun_path+1, "/org/freedesktop/plymouthd", sizeof(sa.un.sun_path)-1);
2657 if (connect(fd, &sa.sa, offsetof(struct sockaddr_un, sun_path) + 1 + strlen(sa.un.sun_path+1)) < 0) {
2658
2659 if (errno != EPIPE &&
2660 errno != EAGAIN &&
2661 errno != ENOENT &&
2662 errno != ECONNREFUSED &&
2663 errno != ECONNRESET &&
2664 errno != ECONNABORTED)
2665 log_error("connect() failed: %m");
2666
2667 goto finish;
2668 }
2669
2670 if (asprintf(&message, "U\002%c%s%n", (int) (strlen(u->id) + 1), u->id, &n) < 0) {
2671 log_error("Out of memory");
2672 goto finish;
2673 }
2674
2675 errno = 0;
2676 if (write(fd, message, n + 1) != n + 1) {
2677
2678 if (errno != EPIPE &&
2679 errno != EAGAIN &&
2680 errno != ENOENT &&
2681 errno != ECONNREFUSED &&
2682 errno != ECONNRESET &&
2683 errno != ECONNABORTED)
2684 log_error("Failed to write Plymouth message: %m");
2685
2686 goto finish;
2687 }
2688
2689 finish:
2690 if (fd >= 0)
2691 close_nointr_nofail(fd);
2692
2693 free(message);
2694 }
2695
2696 void manager_dispatch_bus_name_owner_changed(
2697 Manager *m,
2698 const char *name,
2699 const char* old_owner,
2700 const char *new_owner) {
2701
2702 Unit *u;
2703
2704 assert(m);
2705 assert(name);
2706
2707 if (!(u = hashmap_get(m->watch_bus, name)))
2708 return;
2709
2710 UNIT_VTABLE(u)->bus_name_owner_change(u, name, old_owner, new_owner);
2711 }
2712
2713 void manager_dispatch_bus_query_pid_done(
2714 Manager *m,
2715 const char *name,
2716 pid_t pid) {
2717
2718 Unit *u;
2719
2720 assert(m);
2721 assert(name);
2722 assert(pid >= 1);
2723
2724 if (!(u = hashmap_get(m->watch_bus, name)))
2725 return;
2726
2727 UNIT_VTABLE(u)->bus_query_pid_done(u, name, pid);
2728 }
2729
2730 int manager_open_serialization(Manager *m, FILE **_f) {
2731 char *path = NULL;
2732 mode_t saved_umask;
2733 int fd;
2734 FILE *f;
2735
2736 assert(_f);
2737
2738 if (m->running_as == MANAGER_SYSTEM)
2739 asprintf(&path, "/run/systemd/dump-%lu-XXXXXX", (unsigned long) getpid());
2740 else
2741 asprintf(&path, "/tmp/systemd-dump-%lu-XXXXXX", (unsigned long) getpid());
2742
2743 if (!path)
2744 return -ENOMEM;
2745
2746 saved_umask = umask(0077);
2747 fd = mkostemp(path, O_RDWR|O_CLOEXEC);
2748 umask(saved_umask);
2749
2750 if (fd < 0) {
2751 free(path);
2752 return -errno;
2753 }
2754
2755 unlink(path);
2756
2757 log_debug("Serializing state to %s", path);
2758 free(path);
2759
2760 if (!(f = fdopen(fd, "w+")))
2761 return -errno;
2762
2763 *_f = f;
2764
2765 return 0;
2766 }
2767
2768 int manager_serialize(Manager *m, FILE *f, FDSet *fds) {
2769 Iterator i;
2770 Unit *u;
2771 const char *t;
2772 int r;
2773
2774 assert(m);
2775 assert(f);
2776 assert(fds);
2777
2778 m->n_reloading ++;
2779
2780 fprintf(f, "current-job-id=%i\n", m->current_job_id);
2781 fprintf(f, "taint-usr=%s\n", yes_no(m->taint_usr));
2782
2783 dual_timestamp_serialize(f, "initrd-timestamp", &m->initrd_timestamp);
2784 dual_timestamp_serialize(f, "startup-timestamp", &m->startup_timestamp);
2785 dual_timestamp_serialize(f, "finish-timestamp", &m->finish_timestamp);
2786
2787 fputc('\n', f);
2788
2789 HASHMAP_FOREACH_KEY(u, t, m->units, i) {
2790 if (u->id != t)
2791 continue;
2792
2793 if (!unit_can_serialize(u))
2794 continue;
2795
2796 /* Start marker */
2797 fputs(u->id, f);
2798 fputc('\n', f);
2799
2800 if ((r = unit_serialize(u, f, fds)) < 0) {
2801 m->n_reloading --;
2802 return r;
2803 }
2804 }
2805
2806 assert(m->n_reloading > 0);
2807 m->n_reloading --;
2808
2809 if (ferror(f))
2810 return -EIO;
2811
2812 r = bus_fdset_add_all(m, fds);
2813 if (r < 0)
2814 return r;
2815
2816 return 0;
2817 }
2818
2819 int manager_deserialize(Manager *m, FILE *f, FDSet *fds) {
2820 int r = 0;
2821
2822 assert(m);
2823 assert(f);
2824
2825 log_debug("Deserializing state...");
2826
2827 m->n_reloading ++;
2828
2829 for (;;) {
2830 char line[LINE_MAX], *l;
2831
2832 if (!fgets(line, sizeof(line), f)) {
2833 if (feof(f))
2834 r = 0;
2835 else
2836 r = -errno;
2837
2838 goto finish;
2839 }
2840
2841 char_array_0(line);
2842 l = strstrip(line);
2843
2844 if (l[0] == 0)
2845 break;
2846
2847 if (startswith(l, "current-job-id=")) {
2848 uint32_t id;
2849
2850 if (safe_atou32(l+15, &id) < 0)
2851 log_debug("Failed to parse current job id value %s", l+15);
2852 else
2853 m->current_job_id = MAX(m->current_job_id, id);
2854 } else if (startswith(l, "taint-usr=")) {
2855 int b;
2856
2857 if ((b = parse_boolean(l+10)) < 0)
2858 log_debug("Failed to parse taint /usr flag %s", l+10);
2859 else
2860 m->taint_usr = m->taint_usr || b;
2861 } else if (startswith(l, "initrd-timestamp="))
2862 dual_timestamp_deserialize(l+17, &m->initrd_timestamp);
2863 else if (startswith(l, "startup-timestamp="))
2864 dual_timestamp_deserialize(l+18, &m->startup_timestamp);
2865 else if (startswith(l, "finish-timestamp="))
2866 dual_timestamp_deserialize(l+17, &m->finish_timestamp);
2867 else
2868 log_debug("Unknown serialization item '%s'", l);
2869 }
2870
2871 for (;;) {
2872 Unit *u;
2873 char name[UNIT_NAME_MAX+2];
2874
2875 /* Start marker */
2876 if (!fgets(name, sizeof(name), f)) {
2877 if (feof(f))
2878 r = 0;
2879 else
2880 r = -errno;
2881
2882 goto finish;
2883 }
2884
2885 char_array_0(name);
2886
2887 if ((r = manager_load_unit(m, strstrip(name), NULL, NULL, &u)) < 0)
2888 goto finish;
2889
2890 if ((r = unit_deserialize(u, f, fds)) < 0)
2891 goto finish;
2892 }
2893
2894 finish:
2895 if (ferror(f)) {
2896 r = -EIO;
2897 goto finish;
2898 }
2899
2900 assert(m->n_reloading > 0);
2901 m->n_reloading --;
2902
2903 return r;
2904 }
2905
2906 int manager_reload(Manager *m) {
2907 int r, q;
2908 FILE *f;
2909 FDSet *fds;
2910
2911 assert(m);
2912
2913 if ((r = manager_open_serialization(m, &f)) < 0)
2914 return r;
2915
2916 m->n_reloading ++;
2917
2918 if (!(fds = fdset_new())) {
2919 m->n_reloading --;
2920 r = -ENOMEM;
2921 goto finish;
2922 }
2923
2924 if ((r = manager_serialize(m, f, fds)) < 0) {
2925 m->n_reloading --;
2926 goto finish;
2927 }
2928
2929 if (fseeko(f, 0, SEEK_SET) < 0) {
2930 m->n_reloading --;
2931 r = -errno;
2932 goto finish;
2933 }
2934
2935 /* From here on there is no way back. */
2936 manager_clear_jobs_and_units(m);
2937 manager_undo_generators(m);
2938
2939 /* Find new unit paths */
2940 lookup_paths_free(&m->lookup_paths);
2941 if ((q = lookup_paths_init(&m->lookup_paths, m->running_as, true)) < 0)
2942 r = q;
2943
2944 manager_run_generators(m);
2945
2946 manager_build_unit_path_cache(m);
2947
2948 /* First, enumerate what we can from all config files */
2949 if ((q = manager_enumerate(m)) < 0)
2950 r = q;
2951
2952 /* Second, deserialize our stored data */
2953 if ((q = manager_deserialize(m, f, fds)) < 0)
2954 r = q;
2955
2956 fclose(f);
2957 f = NULL;
2958
2959 /* Third, fire things up! */
2960 if ((q = manager_coldplug(m)) < 0)
2961 r = q;
2962
2963 assert(m->n_reloading > 0);
2964 m->n_reloading--;
2965
2966 finish:
2967 if (f)
2968 fclose(f);
2969
2970 if (fds)
2971 fdset_free(fds);
2972
2973 return r;
2974 }
2975
2976 bool manager_is_booting_or_shutting_down(Manager *m) {
2977 Unit *u;
2978
2979 assert(m);
2980
2981 /* Is the initial job still around? */
2982 if (manager_get_job(m, m->default_unit_job_id))
2983 return true;
2984
2985 /* Is there a job for the shutdown target? */
2986 u = manager_get_unit(m, SPECIAL_SHUTDOWN_TARGET);
2987 if (u)
2988 return !!u->job;
2989
2990 return false;
2991 }
2992
2993 void manager_reset_failed(Manager *m) {
2994 Unit *u;
2995 Iterator i;
2996
2997 assert(m);
2998
2999 HASHMAP_FOREACH(u, m->units, i)
3000 unit_reset_failed(u);
3001 }
3002
3003 bool manager_unit_pending_inactive(Manager *m, const char *name) {
3004 Unit *u;
3005
3006 assert(m);
3007 assert(name);
3008
3009 /* Returns true if the unit is inactive or going down */
3010 if (!(u = manager_get_unit(m, name)))
3011 return true;
3012
3013 return unit_pending_inactive(u);
3014 }
3015
3016 void manager_check_finished(Manager *m) {
3017 char userspace[FORMAT_TIMESPAN_MAX], initrd[FORMAT_TIMESPAN_MAX], kernel[FORMAT_TIMESPAN_MAX], sum[FORMAT_TIMESPAN_MAX];
3018 usec_t kernel_usec = 0, initrd_usec = 0, userspace_usec = 0, total_usec = 0;
3019
3020 assert(m);
3021
3022 if (dual_timestamp_is_set(&m->finish_timestamp))
3023 return;
3024
3025 if (hashmap_size(m->jobs) > 0)
3026 return;
3027
3028 dual_timestamp_get(&m->finish_timestamp);
3029
3030 if (m->running_as == MANAGER_SYSTEM && detect_container(NULL) <= 0) {
3031
3032 userspace_usec = m->finish_timestamp.monotonic - m->startup_timestamp.monotonic;
3033 total_usec = m->finish_timestamp.monotonic;
3034
3035 if (dual_timestamp_is_set(&m->initrd_timestamp)) {
3036
3037 kernel_usec = m->initrd_timestamp.monotonic;
3038 initrd_usec = m->startup_timestamp.monotonic - m->initrd_timestamp.monotonic;
3039
3040 log_info("Startup finished in %s (kernel) + %s (initrd) + %s (userspace) = %s.",
3041 format_timespan(kernel, sizeof(kernel), kernel_usec),
3042 format_timespan(initrd, sizeof(initrd), initrd_usec),
3043 format_timespan(userspace, sizeof(userspace), userspace_usec),
3044 format_timespan(sum, sizeof(sum), total_usec));
3045 } else {
3046 kernel_usec = m->startup_timestamp.monotonic;
3047 initrd_usec = 0;
3048
3049 log_info("Startup finished in %s (kernel) + %s (userspace) = %s.",
3050 format_timespan(kernel, sizeof(kernel), kernel_usec),
3051 format_timespan(userspace, sizeof(userspace), userspace_usec),
3052 format_timespan(sum, sizeof(sum), total_usec));
3053 }
3054 } else {
3055 userspace_usec = initrd_usec = kernel_usec = 0;
3056 total_usec = m->finish_timestamp.monotonic - m->startup_timestamp.monotonic;
3057
3058 log_debug("Startup finished in %s.",
3059 format_timespan(sum, sizeof(sum), total_usec));
3060 }
3061
3062 bus_broadcast_finished(m, kernel_usec, initrd_usec, userspace_usec, total_usec);
3063
3064 sd_notifyf(false,
3065 "READY=1\nSTATUS=Startup finished in %s.",
3066 format_timespan(sum, sizeof(sum), total_usec));
3067 }
3068
3069 void manager_run_generators(Manager *m) {
3070 DIR *d = NULL;
3071 const char *generator_path;
3072 const char *argv[3];
3073 mode_t u;
3074
3075 assert(m);
3076
3077 generator_path = m->running_as == MANAGER_SYSTEM ? SYSTEM_GENERATOR_PATH : USER_GENERATOR_PATH;
3078 if (!(d = opendir(generator_path))) {
3079
3080 if (errno == ENOENT)
3081 return;
3082
3083 log_error("Failed to enumerate generator directory: %m");
3084 return;
3085 }
3086
3087 if (!m->generator_unit_path) {
3088 const char *p;
3089 char user_path[] = "/tmp/systemd-generator-XXXXXX";
3090
3091 if (m->running_as == MANAGER_SYSTEM && getpid() == 1) {
3092 p = "/run/systemd/generator";
3093
3094 if (mkdir_p(p, 0755) < 0) {
3095 log_error("Failed to create generator directory: %m");
3096 goto finish;
3097 }
3098
3099 } else {
3100 if (!(p = mkdtemp(user_path))) {
3101 log_error("Failed to create generator directory: %m");
3102 goto finish;
3103 }
3104 }
3105
3106 if (!(m->generator_unit_path = strdup(p))) {
3107 log_error("Failed to allocate generator unit path.");
3108 goto finish;
3109 }
3110 }
3111
3112 argv[0] = NULL; /* Leave this empty, execute_directory() will fill something in */
3113 argv[1] = m->generator_unit_path;
3114 argv[2] = NULL;
3115
3116 u = umask(0022);
3117 execute_directory(generator_path, d, (char**) argv);
3118 umask(u);
3119
3120 if (rmdir(m->generator_unit_path) >= 0) {
3121 /* Uh? we were able to remove this dir? I guess that
3122 * means the directory was empty, hence let's shortcut
3123 * this */
3124
3125 free(m->generator_unit_path);
3126 m->generator_unit_path = NULL;
3127 goto finish;
3128 }
3129
3130 if (!strv_find(m->lookup_paths.unit_path, m->generator_unit_path)) {
3131 char **l;
3132
3133 if (!(l = strv_append(m->lookup_paths.unit_path, m->generator_unit_path))) {
3134 log_error("Failed to add generator directory to unit search path: %m");
3135 goto finish;
3136 }
3137
3138 strv_free(m->lookup_paths.unit_path);
3139 m->lookup_paths.unit_path = l;
3140
3141 log_debug("Added generator unit path %s to search path.", m->generator_unit_path);
3142 }
3143
3144 finish:
3145 if (d)
3146 closedir(d);
3147 }
3148
3149 void manager_undo_generators(Manager *m) {
3150 assert(m);
3151
3152 if (!m->generator_unit_path)
3153 return;
3154
3155 strv_remove(m->lookup_paths.unit_path, m->generator_unit_path);
3156 rm_rf(m->generator_unit_path, false, true, false);
3157
3158 free(m->generator_unit_path);
3159 m->generator_unit_path = NULL;
3160 }
3161
3162 int manager_set_default_controllers(Manager *m, char **controllers) {
3163 char **l;
3164
3165 assert(m);
3166
3167 if (!(l = strv_copy(controllers)))
3168 return -ENOMEM;
3169
3170 strv_free(m->default_controllers);
3171 m->default_controllers = l;
3172
3173 return 0;
3174 }
3175
3176 void manager_recheck_journal(Manager *m) {
3177 Unit *u;
3178
3179 assert(m);
3180
3181 if (m->running_as != MANAGER_SYSTEM)
3182 return;
3183
3184 u = manager_get_unit(m, SPECIAL_JOURNALD_SOCKET);
3185 if (u && SOCKET(u)->state != SOCKET_RUNNING) {
3186 log_close_journal();
3187 return;
3188 }
3189
3190 u = manager_get_unit(m, SPECIAL_JOURNALD_SERVICE);
3191 if (u && SERVICE(u)->state != SERVICE_RUNNING) {
3192 log_close_journal();
3193 return;
3194 }
3195
3196 /* Hmm, OK, so the socket is fully up and the service is up
3197 * too, then let's make use of the thing. */
3198 log_open();
3199 }
3200
3201 void manager_set_show_status(Manager *m, bool b) {
3202 assert(m);
3203
3204 if (m->running_as != MANAGER_SYSTEM)
3205 return;
3206
3207 m->show_status = b;
3208
3209 if (b)
3210 touch("/run/systemd/show-status");
3211 else
3212 unlink("/run/systemd/show-status");
3213 }
3214
3215 bool manager_get_show_status(Manager *m) {
3216 assert(m);
3217
3218 if (m->running_as != MANAGER_SYSTEM)
3219 return false;
3220
3221 if (m->show_status)
3222 return true;
3223
3224 /* If Plymouth is running make sure we show the status, so
3225 * that there's something nice to see when people press Esc */
3226
3227 return plymouth_running();
3228 }
3229
3230 static const char* const manager_running_as_table[_MANAGER_RUNNING_AS_MAX] = {
3231 [MANAGER_SYSTEM] = "system",
3232 [MANAGER_USER] = "user"
3233 };
3234
3235 DEFINE_STRING_TABLE_LOOKUP(manager_running_as, ManagerRunningAs);