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