]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/core/manager.c
journal: generate structured journal messages for a number of events
[thirdparty/systemd.git] / src / core / manager.c
CommitLineData
d6c9574f 1/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
60918275 2
a7334b09
LP
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
5430f7f2
LP
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
a7334b09
LP
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
5430f7f2 16 Lesser General Public License for more details.
a7334b09 17
5430f7f2 18 You should have received a copy of the GNU Lesser General Public License
a7334b09
LP
19 along with systemd; If not, see <http://www.gnu.org/licenses/>.
20***/
21
60918275
LP
22#include <assert.h>
23#include <errno.h>
87d1515d 24#include <string.h>
9152c765
LP
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>
e1414003
LP
31#include <sys/reboot.h>
32#include <sys/ioctl.h>
33#include <linux/kd.h>
80876c20
LP
34#include <termios.h>
35#include <fcntl.h>
a16e1123
LP
36#include <sys/types.h>
37#include <sys/stat.h>
fe51822e 38#include <dirent.h>
830f6caa
LP
39
40#ifdef HAVE_AUDIT
4927fcae 41#include <libaudit.h>
830f6caa 42#endif
60918275 43
877d54e9
LP
44#include "systemd/sd-daemon.h"
45#include "systemd/sd-id128.h"
46#include "systemd/sd-messages.h"
81527be1 47
60918275 48#include "manager.h"
75778e21 49#include "transaction.h"
60918275
LP
50#include "hashmap.h"
51#include "macro.h"
52#include "strv.h"
16354eff 53#include "log.h"
2a987ee8 54#include "util.h"
49e942b2 55#include "mkdir.h"
ea430986 56#include "ratelimit.h"
8e274523
LP
57#include "cgroup.h"
58#include "mount-setup.h"
9e2f7c11 59#include "unit-name.h"
4139c1b2
LP
60#include "dbus-unit.h"
61#include "dbus-job.h"
1137a57c 62#include "missing.h"
84e3543e 63#include "path-lookup.h"
514f4ef5 64#include "special.h"
398ef8ba 65#include "bus-errors.h"
d06dacd0 66#include "exit-status.h"
5dc4c17f 67#include "virt.h"
e96d6be7 68#include "watchdog.h"
b59e2465 69#include "cgroup-util.h"
9eb977db 70#include "path-util.h"
60918275 71
701cc384
LP
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 */
94b6dfa2 76#define GC_QUEUE_USEC_MAX (10*USEC_PER_SEC)
701cc384 77
8c47c732 78/* Where clients shall send notification messages to */
29252e9e 79#define NOTIFY_SOCKET "@/org/freedesktop/systemd1/notify"
8c47c732
LP
80
81static int manager_setup_notify(Manager *m) {
82 union {
83 struct sockaddr sa;
84 struct sockaddr_un un;
85 } sa;
86 struct epoll_event ev;
29252e9e 87 int one = 1;
8c47c732
LP
88
89 assert(m);
90
91 m->notify_watch.type = WATCH_NOTIFY;
29252e9e
LP
92 m->notify_watch.fd = socket(AF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
93 if (m->notify_watch.fd < 0) {
8c47c732
LP
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
31f92a7d 101 if (getpid() != 1 || detect_container(NULL) > 0)
29252e9e
LP
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));
8c47c732 105
29252e9e 106 sa.un.sun_path[0] = 0;
1d6702e8 107
29252e9e 108 if (bind(m->notify_watch.fd, &sa.sa, offsetof(struct sockaddr_un, sun_path) + 1 + strlen(sa.un.sun_path+1)) < 0) {
8c47c732
LP
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
29252e9e
LP
125 sa.un.sun_path[0] = '@';
126 m->notify_socket = strdup(sa.un.sun_path);
127 if (!m->notify_socket)
8c47c732
LP
128 return -ENOMEM;
129
b2bb3dbe
LP
130 log_debug("Using notification socket %s", m->notify_socket);
131
8c47c732
LP
132 return 0;
133}
134
80876c20 135static int enable_special_signals(Manager *m) {
4466ee6a 136 int fd;
80876c20
LP
137
138 assert(m);
139
a41b539e
LP
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)
80876c20
LP
143 log_warning("Failed to enable ctrl-alt-del handling: %m");
144
a41b539e
LP
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 {
80876c20
LP
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
ce578209 161static int manager_setup_signals(Manager *m) {
9152c765
LP
162 sigset_t mask;
163 struct epoll_event ev;
57c0c30e 164 struct sigaction sa;
60918275 165
ce578209
LP
166 assert(m);
167
57c0c30e
LP
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
ce578209 174 assert_se(sigemptyset(&mask) == 0);
7d793605
LP
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 */
0003d1ab 186 SIGRTMIN+1, /* systemd: isolate rescue.target */
7d793605
LP
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 */
0003d1ab
LP
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 */
0658666b
LP
196 SIGRTMIN+20, /* systemd: enable status messages */
197 SIGRTMIN+21, /* systemd: disable status messages */
253ee27a
LP
198 SIGRTMIN+22, /* systemd: set log level to LOG_DEBUG */
199 SIGRTMIN+23, /* systemd: set log level to LOG_INFO */
4cfa2c99 200 SIGRTMIN+26, /* systemd: set log target to journal-or-kmsg */
253ee27a
LP
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 */
7d793605 204 -1);
ce578209
LP
205 assert_se(sigprocmask(SIG_SETMASK, &mask, NULL) == 0);
206
ef734fd6 207 m->signal_watch.type = WATCH_SIGNAL;
ce578209
LP
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
a3d4e06d 218 if (m->running_as == MANAGER_SYSTEM)
80876c20 219 return enable_special_signals(m);
e1414003 220
ce578209
LP
221 return 0;
222}
223
71ecc858
LP
224static 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
9e58ff9c 239int manager_new(ManagerRunningAs running_as, Manager **_m) {
ce578209 240 Manager *m;
8e274523
LP
241 int r = -ENOMEM;
242
243 assert(_m);
a5dab5ce
LP
244 assert(running_as >= 0);
245 assert(running_as < _MANAGER_RUNNING_AS_MAX);
ce578209 246
60918275 247 if (!(m = new0(Manager, 1)))
8e274523 248 return -ENOMEM;
60918275 249
63983207 250 dual_timestamp_get(&m->startup_timestamp);
e537352b 251
a5dab5ce 252 m->running_as = running_as;
cbd37330 253 m->name_data_slot = m->conn_data_slot = m->subscribed_data_slot = -1;
a16e1123 254 m->exit_code = _MANAGER_EXIT_CODE_INVALID;
33be102a 255 m->pin_cgroupfs_fd = -1;
f2b68789 256 m->idle_pipe[0] = m->idle_pipe[1] = -1;
80876c20 257
4927fcae
LP
258#ifdef HAVE_AUDIT
259 m->audit_fd = -1;
260#endif
261
4e434314 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;
ea430986 263 m->current_job_id = 1; /* start as id #1, so that we can leave #0 around as "null-like" value */
9152c765 264
71ecc858
LP
265 m->environment = strv_copy(environ);
266 if (!m->environment)
1137a57c
LP
267 goto fail;
268
71ecc858
LP
269 manager_strip_environment(m);
270
88f06645
LP
271 if (running_as == MANAGER_SYSTEM) {
272 m->default_controllers = strv_new("cpu", NULL);
273 if (!m->default_controllers)
274 goto fail;
275 }
06d4c99a 276
87f0e418 277 if (!(m->units = hashmap_new(string_hash_func, string_compare_func)))
60918275
LP
278 goto fail;
279
280 if (!(m->jobs = hashmap_new(trivial_hash_func, trivial_compare_func)))
281 goto fail;
282
9152c765
LP
283 if (!(m->watch_pids = hashmap_new(trivial_hash_func, trivial_compare_func)))
284 goto fail;
285
8e274523
LP
286 if (!(m->cgroup_bondings = hashmap_new(string_hash_func, string_compare_func)))
287 goto fail;
288
05e343b7
LP
289 if (!(m->watch_bus = hashmap_new(string_hash_func, string_compare_func)))
290 goto fail;
291
9152c765
LP
292 if ((m->epoll_fd = epoll_create1(EPOLL_CLOEXEC)) < 0)
293 goto fail;
294
8e274523
LP
295 if ((r = manager_setup_signals(m)) < 0)
296 goto fail;
297
8e274523 298 if ((r = manager_setup_cgroup(m)) < 0)
9152c765
LP
299 goto fail;
300
8c47c732
LP
301 if ((r = manager_setup_notify(m)) < 0)
302 goto fail;
303
f278026d 304 /* Try to connect to the busses, if possible. */
3996fbe2 305 if ((r = bus_init(m, running_as != MANAGER_SYSTEM)) < 0)
ea430986
LP
306 goto fail;
307
e543deae 308#ifdef HAVE_AUDIT
5a8d081c
JN
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)
4927fcae 313 log_error("Failed to connect to audit log: %m");
e543deae 314#endif
4927fcae 315
72bc8d00
LP
316 m->taint_usr = dir_is_empty("/usr") > 0;
317
8e274523
LP
318 *_m = m;
319 return 0;
60918275
LP
320
321fail:
322 manager_free(m);
8e274523 323 return r;
60918275
LP
324}
325
23a177ef 326static unsigned manager_dispatch_cleanup_queue(Manager *m) {
595ed347 327 Unit *u;
23a177ef
LP
328 unsigned n = 0;
329
330 assert(m);
331
595ed347
MS
332 while ((u = m->cleanup_queue)) {
333 assert(u->in_cleanup_queue);
23a177ef 334
595ed347 335 unit_free(u);
23a177ef
LP
336 n++;
337 }
338
339 return n;
340}
341
eced69b3 342enum {
35b8ca3a 343 GC_OFFSET_IN_PATH, /* This one is on the path we were traveling */
eced69b3
LP
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
350static void unit_gc_sweep(Unit *u, unsigned gc_marker) {
701cc384
LP
351 Iterator i;
352 Unit *other;
eced69b3 353 bool is_bad;
701cc384
LP
354
355 assert(u);
356
ac155bb8
MS
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)
701cc384
LP
360 return;
361
ac155bb8 362 if (u->in_cleanup_queue)
701cc384
LP
363 goto bad;
364
365 if (unit_check_gc(u))
366 goto good;
367
ac155bb8 368 u->gc_marker = gc_marker + GC_OFFSET_IN_PATH;
eced69b3
LP
369
370 is_bad = true;
371
ac155bb8 372 SET_FOREACH(other, u->dependencies[UNIT_REFERENCED_BY], i) {
701cc384
LP
373 unit_gc_sweep(other, gc_marker);
374
ac155bb8 375 if (other->gc_marker == gc_marker + GC_OFFSET_GOOD)
701cc384 376 goto good;
eced69b3 377
ac155bb8 378 if (other->gc_marker != gc_marker + GC_OFFSET_BAD)
eced69b3 379 is_bad = false;
701cc384
LP
380 }
381
eced69b3
LP
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 */
ac155bb8 387 u->gc_marker = gc_marker + GC_OFFSET_UNSURE;
eced69b3
LP
388 unit_add_to_gc_queue(u);
389 return;
390
701cc384 391bad:
eced69b3
LP
392 /* We definitely know that this one is not useful anymore, so
393 * let's mark it for deletion */
ac155bb8 394 u->gc_marker = gc_marker + GC_OFFSET_BAD;
eced69b3 395 unit_add_to_cleanup_queue(u);
701cc384
LP
396 return;
397
398good:
ac155bb8 399 u->gc_marker = gc_marker + GC_OFFSET_GOOD;
701cc384
LP
400}
401
402static unsigned manager_dispatch_gc_queue(Manager *m) {
595ed347 403 Unit *u;
701cc384 404 unsigned n = 0;
eced69b3 405 unsigned gc_marker;
701cc384
LP
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
eced69b3
LP
416 m->gc_marker += _GC_OFFSET_MAX;
417 if (m->gc_marker + _GC_OFFSET_MAX <= _GC_OFFSET_MAX)
c9c0cadb 418 m->gc_marker = 1;
701cc384 419
eced69b3
LP
420 gc_marker = m->gc_marker;
421
595ed347
MS
422 while ((u = m->gc_queue)) {
423 assert(u->in_gc_queue);
701cc384 424
595ed347 425 unit_gc_sweep(u, gc_marker);
eced69b3 426
595ed347
MS
427 LIST_REMOVE(Unit, gc_queue, m->gc_queue, u);
428 u->in_gc_queue = false;
701cc384
LP
429
430 n++;
431
595ed347
MS
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);
701cc384
LP
437 }
438 }
439
440 m->n_in_gc_queue = 0;
441 m->gc_queue_timestamp = 0;
442
443 return n;
444}
445
a16e1123 446static void manager_clear_jobs_and_units(Manager *m) {
a16e1123 447 Unit *u;
60918275
LP
448
449 assert(m);
450
87f0e418
LP
451 while ((u = hashmap_first(m->units)))
452 unit_free(u);
964e0949
LP
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
964e0949
LP
463 assert(hashmap_isempty(m->jobs));
464 assert(hashmap_isempty(m->units));
a16e1123
LP
465}
466
467void manager_free(Manager *m) {
468 UnitType c;
c93ff2e9 469 int i;
87f0e418 470
a16e1123
LP
471 assert(m);
472
473 manager_clear_jobs_and_units(m);
23a177ef 474
7824bbeb
LP
475 for (c = 0; c < _UNIT_TYPE_MAX; c++)
476 if (unit_vtable[c]->shutdown)
477 unit_vtable[c]->shutdown(m);
478
a16e1123
LP
479 /* If we reexecute ourselves, we keep the root cgroup
480 * around */
c6c18be3 481 manager_shutdown_cgroup(m, m->exit_code != MANAGER_REEXECUTE);
8e274523 482
5a1e9937
LP
483 manager_undo_generators(m);
484
5e8d1c9a 485 bus_done(m);
ea430986 486
87f0e418 487 hashmap_free(m->units);
60918275 488 hashmap_free(m->jobs);
9152c765 489 hashmap_free(m->watch_pids);
05e343b7 490 hashmap_free(m->watch_bus);
9152c765
LP
491
492 if (m->epoll_fd >= 0)
a16e1123 493 close_nointr_nofail(m->epoll_fd);
acbb0225 494 if (m->signal_watch.fd >= 0)
a16e1123 495 close_nointr_nofail(m->signal_watch.fd);
8c47c732
LP
496 if (m->notify_watch.fd >= 0)
497 close_nointr_nofail(m->notify_watch.fd);
60918275 498
4927fcae
LP
499#ifdef HAVE_AUDIT
500 if (m->audit_fd >= 0)
501 audit_close(m->audit_fd);
502#endif
503
c952c6ec
LP
504 free(m->notify_socket);
505
84e3543e 506 lookup_paths_free(&m->lookup_paths);
1137a57c 507 strv_free(m->environment);
036643a2 508
06d4c99a
LP
509 strv_free(m->default_controllers);
510
8e274523 511 hashmap_free(m->cgroup_bondings);
c6c18be3 512 set_free_free(m->unit_path_cache);
33be102a 513
f2b68789
LP
514 close_pipe(m->idle_pipe);
515
664f88a7
LP
516 free(m->switch_root);
517 free(m->switch_root_init);
518
c93ff2e9
FC
519 for (i = 0; i < RLIMIT_NLIMITS; i++)
520 free(m->rlimit[i]);
521
60918275
LP
522 free(m);
523}
524
a16e1123
LP
525int manager_enumerate(Manager *m) {
526 int r = 0, q;
f50e0a01 527 UnitType c;
f50e0a01
LP
528
529 assert(m);
530
a16e1123
LP
531 /* Let's ask every type to load all units from disk/kernel
532 * that it might know */
f50e0a01
LP
533 for (c = 0; c < _UNIT_TYPE_MAX; c++)
534 if (unit_vtable[c]->enumerate)
a16e1123
LP
535 if ((q = unit_vtable[c]->enumerate(m)) < 0)
536 r = q;
f50e0a01
LP
537
538 manager_dispatch_load_queue(m);
a16e1123
LP
539 return r;
540}
541
542int manager_coldplug(Manager *m) {
543 int r = 0, q;
544 Iterator i;
545 Unit *u;
546 char *k;
547
548 assert(m);
f50e0a01
LP
549
550 /* Then, let's set up their initial state. */
551 HASHMAP_FOREACH_KEY(u, k, m->units, i) {
552
553 /* ignore aliases */
ac155bb8 554 if (u->id != k)
f50e0a01
LP
555 continue;
556
cca098b0
LP
557 if ((q = unit_coldplug(u)) < 0)
558 r = q;
f50e0a01
LP
559 }
560
a16e1123
LP
561 return r;
562}
563
fe51822e
LP
564static 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
b7def684 595 p = strjoin(streq(*i, "/") ? "" : *i, "/", de->d_name, NULL);
44d91056 596 if (!p) {
fe51822e
LP
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
613fail:
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
a16e1123
LP
623int manager_startup(Manager *m, FILE *serialization, FDSet *fds) {
624 int r, q;
625
626 assert(m);
627
5a1e9937
LP
628 manager_run_generators(m);
629
07719a21
LP
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
fe51822e
LP
638 manager_build_unit_path_cache(m);
639
9f611ad8
LP
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)
a7556052 644 m->n_reloading ++;
9f611ad8 645
a16e1123
LP
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 */
07719a21
LP
650 if (serialization) {
651 q = manager_deserialize(m, serialization, fds);
652 if (q < 0)
a16e1123 653 r = q;
07719a21 654 }
a16e1123
LP
655
656 /* Third, fire things up! */
07719a21
LP
657 q = manager_coldplug(m);
658 if (q < 0)
a16e1123
LP
659 r = q;
660
9f611ad8 661 if (serialization) {
a7556052
LP
662 assert(m->n_reloading > 0);
663 m->n_reloading --;
9f611ad8
LP
664 }
665
a16e1123 666 return r;
f50e0a01
LP
667}
668
398ef8ba 669int manager_add_job(Manager *m, JobType type, Unit *unit, JobMode mode, bool override, DBusError *e, Job **_ret) {
e5b5ae50 670 int r;
7527cb52 671 Transaction *tr;
e5b5ae50
LP
672
673 assert(m);
674 assert(type < _JOB_TYPE_MAX);
87f0e418 675 assert(unit);
e5b5ae50 676 assert(mode < _JOB_MODE_MAX);
60918275 677
398ef8ba
LP
678 if (mode == JOB_ISOLATE && type != JOB_START) {
679 dbus_set_error(e, BUS_ERROR_INVALID_JOB_MODE, "Isolate is only valid for start.");
c497c7a9 680 return -EINVAL;
398ef8ba 681 }
c497c7a9 682
ac155bb8 683 if (mode == JOB_ISOLATE && !unit->allow_isolate) {
2528a7a6
LP
684 dbus_set_error(e, BUS_ERROR_NO_ISOLATION, "Operation refused, unit may not be isolated.");
685 return -EPERM;
686 }
687
ac155bb8 688 log_debug("Trying to enqueue job %s/%s/%s", unit->id, job_type_to_string(type), job_mode_to_string(mode));
9f04bd52 689
e0209d83
MS
690 job_type_collapse(&type, unit);
691
7527cb52
MS
692 tr = transaction_new();
693 if (!tr)
694 return -ENOMEM;
11dd41ce 695
7527cb52
MS
696 r = transaction_add_job_and_dependencies(tr, type, unit, NULL, true, override, false,
697 mode == JOB_IGNORE_DEPENDENCIES || mode == JOB_IGNORE_REQUIREMENTS,
b94fbd30 698 mode == JOB_IGNORE_DEPENDENCIES, e);
7527cb52
MS
699 if (r < 0)
700 goto tr_abort;
c497c7a9 701
7527cb52
MS
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;
e5b5ae50 711
b94fbd30 712 log_debug("Enqueued job %s/%s as %u", unit->id, job_type_to_string(type), (unsigned) tr->anchor_job->id);
f50e0a01 713
e5b5ae50 714 if (_ret)
b94fbd30 715 *_ret = tr->anchor_job;
60918275 716
7527cb52 717 transaction_free(tr);
e5b5ae50 718 return 0;
7527cb52
MS
719
720tr_abort:
721 transaction_abort(tr);
722 transaction_free(tr);
723 return r;
e5b5ae50 724}
60918275 725
398ef8ba 726int manager_add_job_by_name(Manager *m, JobType type, const char *name, JobMode mode, bool override, DBusError *e, Job **_ret) {
28247076
LP
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
398ef8ba 735 if ((r = manager_load_unit(m, name, NULL, NULL, &unit)) < 0)
28247076
LP
736 return r;
737
398ef8ba 738 return manager_add_job(m, type, unit, mode, override, e, _ret);
28247076
LP
739}
740
60918275
LP
741Job *manager_get_job(Manager *m, uint32_t id) {
742 assert(m);
743
744 return hashmap_get(m->jobs, UINT32_TO_PTR(id));
745}
746
87f0e418 747Unit *manager_get_unit(Manager *m, const char *name) {
60918275
LP
748 assert(m);
749 assert(name);
750
87f0e418 751 return hashmap_get(m->units, name);
60918275
LP
752}
753
c1e1601e 754unsigned manager_dispatch_load_queue(Manager *m) {
595ed347 755 Unit *u;
c1e1601e 756 unsigned n = 0;
60918275
LP
757
758 assert(m);
759
223dabab
LP
760 /* Make sure we are not run recursively */
761 if (m->dispatching_load_queue)
c1e1601e 762 return 0;
223dabab
LP
763
764 m->dispatching_load_queue = true;
765
87f0e418 766 /* Dispatches the load queue. Takes a unit from the queue and
60918275
LP
767 * tries to load its data until the queue is empty */
768
595ed347
MS
769 while ((u = m->load_queue)) {
770 assert(u->in_load_queue);
034c6ed7 771
595ed347 772 unit_load(u);
c1e1601e 773 n++;
60918275
LP
774 }
775
223dabab 776 m->dispatching_load_queue = false;
c1e1601e 777 return n;
60918275
LP
778}
779
398ef8ba 780int manager_load_unit_prepare(Manager *m, const char *name, const char *path, DBusError *e, Unit **_ret) {
87f0e418 781 Unit *ret;
7d17cfbc 782 UnitType t;
60918275
LP
783 int r;
784
785 assert(m);
9e2f7c11 786 assert(name || path);
60918275 787
db06e3b6
LP
788 /* This will prepare the unit for loading, but not actually
789 * load anything from disk. */
0301abf4 790
398ef8ba
LP
791 if (path && !is_path(path)) {
792 dbus_set_error(e, BUS_ERROR_INVALID_PATH, "Path %s is not absolute.", path);
9e2f7c11 793 return -EINVAL;
398ef8ba 794 }
9e2f7c11
LP
795
796 if (!name)
9eb977db 797 name = path_get_file_name(path);
9e2f7c11 798
7d17cfbc
MS
799 t = unit_name_to_type(name);
800
5f739699 801 if (t == _UNIT_TYPE_INVALID || !unit_name_is_valid(name, false)) {
398ef8ba 802 dbus_set_error(e, BUS_ERROR_INVALID_NAME, "Unit name %s is not valid.", name);
9e2f7c11 803 return -EINVAL;
398ef8ba 804 }
60918275 805
7d17cfbc
MS
806 ret = manager_get_unit(m, name);
807 if (ret) {
034c6ed7 808 *_ret = ret;
413d6313 809 return 1;
034c6ed7 810 }
60918275 811
7d17cfbc
MS
812 ret = unit_new(m, unit_vtable[t]->object_size);
813 if (!ret)
60918275
LP
814 return -ENOMEM;
815
7d17cfbc 816 if (path) {
ac155bb8
MS
817 ret->fragment_path = strdup(path);
818 if (!ret->fragment_path) {
0301abf4
LP
819 unit_free(ret);
820 return -ENOMEM;
821 }
7d17cfbc 822 }
0301abf4 823
87f0e418
LP
824 if ((r = unit_add_name(ret, name)) < 0) {
825 unit_free(ret);
1ffba6fe 826 return r;
60918275
LP
827 }
828
87f0e418 829 unit_add_to_load_queue(ret);
c1e1601e 830 unit_add_to_dbus_queue(ret);
949061f0 831 unit_add_to_gc_queue(ret);
c1e1601e 832
db06e3b6
LP
833 if (_ret)
834 *_ret = ret;
835
836 return 0;
837}
838
398ef8ba 839int manager_load_unit(Manager *m, const char *name, const char *path, DBusError *e, Unit **_ret) {
db06e3b6
LP
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
398ef8ba 847 if ((r = manager_load_unit_prepare(m, name, path, e, _ret)) != 0)
db06e3b6
LP
848 return r;
849
f50e0a01 850 manager_dispatch_load_queue(m);
60918275 851
9e2f7c11 852 if (_ret)
413d6313 853 *_ret = unit_follow_merge(*_ret);
9e2f7c11 854
60918275
LP
855 return 0;
856}
a66d02c3 857
cea8e32e 858void manager_dump_jobs(Manager *s, FILE *f, const char *prefix) {
034c6ed7 859 Iterator i;
a66d02c3
LP
860 Job *j;
861
862 assert(s);
863 assert(f);
864
034c6ed7 865 HASHMAP_FOREACH(j, s->jobs, i)
cea8e32e 866 job_dump(j, f, prefix);
a66d02c3
LP
867}
868
87f0e418 869void manager_dump_units(Manager *s, FILE *f, const char *prefix) {
034c6ed7 870 Iterator i;
87f0e418 871 Unit *u;
11dd41ce 872 const char *t;
a66d02c3
LP
873
874 assert(s);
875 assert(f);
876
87f0e418 877 HASHMAP_FOREACH_KEY(u, t, s->units, i)
ac155bb8 878 if (u->id == t)
87f0e418 879 unit_dump(u, f, prefix);
a66d02c3 880}
7fad411c
LP
881
882void manager_clear_jobs(Manager *m) {
883 Job *j;
884
885 assert(m);
886
7fad411c 887 while ((j = hashmap_first(m->jobs)))
5273510e
MS
888 /* No need to recurse. We're cancelling all jobs. */
889 job_finish_and_invalidate(j, JOB_CANCELED, false);
7fad411c 890}
83c60c9f 891
c1e1601e 892unsigned manager_dispatch_run_queue(Manager *m) {
83c60c9f 893 Job *j;
c1e1601e 894 unsigned n = 0;
83c60c9f 895
034c6ed7 896 if (m->dispatching_run_queue)
c1e1601e 897 return 0;
034c6ed7
LP
898
899 m->dispatching_run_queue = true;
9152c765 900
034c6ed7 901 while ((j = m->run_queue)) {
ac1135be 902 assert(j->installed);
034c6ed7
LP
903 assert(j->in_run_queue);
904
905 job_run_and_invalidate(j);
c1e1601e 906 n++;
9152c765 907 }
034c6ed7
LP
908
909 m->dispatching_run_queue = false;
c1e1601e
LP
910 return n;
911}
912
913unsigned manager_dispatch_dbus_queue(Manager *m) {
914 Job *j;
595ed347 915 Unit *u;
c1e1601e
LP
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
595ed347
MS
925 while ((u = m->dbus_unit_queue)) {
926 assert(u->in_dbus_queue);
c1e1601e 927
595ed347 928 bus_unit_send_change_signal(u);
c1e1601e
LP
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;
9152c765
LP
941}
942
8c47c732
LP
943static 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
f6144808 975 if (errno == EAGAIN || errno == EINTR)
8c47c732
LP
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
c6c18be3 991 if (!(u = hashmap_get(m->watch_pids, LONG_TO_PTR(ucred->pid))))
8c47c732
LP
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
8c40acf7
LP
997 assert((size_t) n < sizeof(buf));
998 buf[n] = 0;
8c47c732
LP
999 if (!(tags = strv_split(buf, "\n\r")))
1000 return -ENOMEM;
1001
ac155bb8 1002 log_debug("Got notification message for unit %s", u->id);
8c47c732
LP
1003
1004 if (UNIT_VTABLE(u)->notify_message)
c952c6ec 1005 UNIT_VTABLE(u)->notify_message(u, ucred->pid, tags);
8c47c732
LP
1006
1007 strv_free(tags);
1008 }
1009
1010 return 0;
1011}
1012
034c6ed7 1013static int manager_dispatch_sigchld(Manager *m) {
9152c765
LP
1014 assert(m);
1015
1016 for (;;) {
1017 siginfo_t si;
87f0e418 1018 Unit *u;
8c47c732 1019 int r;
9152c765
LP
1020
1021 zero(si);
4112df16
LP
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) {
acbb0225
LP
1027
1028 if (errno == ECHILD)
1029 break;
1030
4112df16
LP
1031 if (errno == EINTR)
1032 continue;
1033
9152c765 1034 return -errno;
acbb0225 1035 }
9152c765 1036
4112df16 1037 if (si.si_pid <= 0)
9152c765
LP
1038 break;
1039
15d5d9d9 1040 if (si.si_code == CLD_EXITED || si.si_code == CLD_KILLED || si.si_code == CLD_DUMPED) {
4112df16
LP
1041 char *name = NULL;
1042
87d2c1ff 1043 get_process_comm(si.si_pid, &name);
bb00e604 1044 log_debug("Got SIGCHLD for process %lu (%s)", (unsigned long) si.si_pid, strna(name));
4112df16
LP
1045 free(name);
1046 }
1047
8c47c732
LP
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 */
c6c18be3 1056 if (!(u = hashmap_get(m->watch_pids, LONG_TO_PTR(si.si_pid))))
8c47c732
LP
1057 u = cgroup_unit_by_pid(m, si.si_pid);
1058
4112df16
LP
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
034c6ed7
LP
1067 if (si.si_code != CLD_EXITED && si.si_code != CLD_KILLED && si.si_code != CLD_DUMPED)
1068 continue;
1069
bb00e604
LP
1070 log_debug("Child %lu died (code=%s, status=%i/%s)",
1071 (long unsigned) si.si_pid,
4112df16
LP
1072 sigchld_code_to_string(si.si_code),
1073 si.si_status,
d06dacd0
LP
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)));
acbb0225 1077
8c47c732 1078 if (!u)
9152c765
LP
1079 continue;
1080
ac155bb8 1081 log_debug("Child %lu belongs to %s", (long unsigned) si.si_pid, u->id);
6c1a0478 1082
c6c18be3 1083 hashmap_remove(m->watch_pids, LONG_TO_PTR(si.si_pid));
87f0e418 1084 UNIT_VTABLE(u)->sigchld_event(u, si.si_pid, si.si_code, si.si_status);
9152c765
LP
1085 }
1086
1087 return 0;
1088}
1089
7d793605 1090static int manager_start_target(Manager *m, const char *name, JobMode mode) {
28247076 1091 int r;
398ef8ba
LP
1092 DBusError error;
1093
1094 dbus_error_init(&error);
1095
af2d49f7 1096 log_debug("Activating special unit %s", name);
1e001f52 1097
398ef8ba
LP
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));
28247076 1100
398ef8ba 1101 dbus_error_free(&error);
a1b256b0
LP
1102
1103 return r;
28247076
LP
1104}
1105
a16e1123 1106static int manager_process_signal_fd(Manager *m) {
9152c765
LP
1107 ssize_t n;
1108 struct signalfd_siginfo sfsi;
1109 bool sigchld = false;
1110
1111 assert(m);
1112
1113 for (;;) {
acbb0225 1114 if ((n = read(m->signal_watch.fd, &sfsi, sizeof(sfsi))) != sizeof(sfsi)) {
9152c765
LP
1115
1116 if (n >= 0)
1117 return -EIO;
1118
63090775 1119 if (errno == EINTR || errno == EAGAIN)
acbb0225 1120 break;
9152c765
LP
1121
1122 return -errno;
1123 }
1124
67370238
LP
1125 if (sfsi.ssi_pid > 0) {
1126 char *p = NULL;
1127
87d2c1ff 1128 get_process_comm(sfsi.ssi_pid, &p);
dfa7f7e1 1129
67370238 1130 log_debug("Received SIG%s from PID %lu (%s).",
4e240ab0 1131 signal_to_string(sfsi.ssi_signo),
67370238
LP
1132 (unsigned long) sfsi.ssi_pid, strna(p));
1133 free(p);
1134 } else
4e240ab0 1135 log_debug("Received SIG%s.", signal_to_string(sfsi.ssi_signo));
1e001f52 1136
b9cd2ec1
LP
1137 switch (sfsi.ssi_signo) {
1138
4112df16 1139 case SIGCHLD:
9152c765 1140 sigchld = true;
b9cd2ec1
LP
1141 break;
1142
6632c602 1143 case SIGTERM:
a3d4e06d 1144 if (m->running_as == MANAGER_SYSTEM) {
db06e3b6
LP
1145 /* This is for compatibility with the
1146 * original sysvinit */
e11dc4a2 1147 m->exit_code = MANAGER_REEXECUTE;
a1b256b0
LP
1148 break;
1149 }
84e9af1e 1150
a1b256b0 1151 /* Fall through */
e11dc4a2
LP
1152
1153 case SIGINT:
a3d4e06d 1154 if (m->running_as == MANAGER_SYSTEM) {
7d793605 1155 manager_start_target(m, SPECIAL_CTRL_ALT_DEL_TARGET, JOB_REPLACE);
84e9af1e
LP
1156 break;
1157 }
1158
a1b256b0 1159 /* Run the exit target if there is one, if not, just exit. */
0003d1ab 1160 if (manager_start_target(m, SPECIAL_EXIT_TARGET, JOB_REPLACE) < 0) {
a1b256b0
LP
1161 m->exit_code = MANAGER_EXIT;
1162 return 0;
1163 }
1164
1165 break;
84e9af1e 1166
28247076 1167 case SIGWINCH:
a3d4e06d 1168 if (m->running_as == MANAGER_SYSTEM)
7d793605 1169 manager_start_target(m, SPECIAL_KBREQUEST_TARGET, JOB_REPLACE);
84e9af1e 1170
28247076
LP
1171 /* This is a nop on non-init */
1172 break;
84e9af1e 1173
28247076 1174 case SIGPWR:
a3d4e06d 1175 if (m->running_as == MANAGER_SYSTEM)
7d793605 1176 manager_start_target(m, SPECIAL_SIGPWR_TARGET, JOB_REPLACE);
84e9af1e 1177
28247076 1178 /* This is a nop on non-init */
84e9af1e 1179 break;
6632c602 1180
1005d14f 1181 case SIGUSR1: {
57ee42ce
LP
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...");
3996fbe2 1188 bus_init(m, true);
57ee42ce
LP
1189 }
1190
1191 if (!u || !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u))) {
1192 log_info("Loading D-Bus service...");
7d793605 1193 manager_start_target(m, SPECIAL_DBUS_SERVICE, JOB_REPLACE);
57ee42ce
LP
1194 }
1195
1196 break;
1197 }
1198
2149e37c
LP
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
1005d14f 1223 break;
2149e37c 1224 }
1005d14f 1225
a16e1123
LP
1226 case SIGHUP:
1227 m->exit_code = MANAGER_RELOAD;
1228 break;
1229
7d793605 1230 default: {
253ee27a 1231
0003d1ab
LP
1232 /* Starting SIGRTMIN+0 */
1233 static const char * const target_table[] = {
7d793605
LP
1234 [0] = SPECIAL_DEFAULT_TARGET,
1235 [1] = SPECIAL_RESCUE_TARGET,
f057408c 1236 [2] = SPECIAL_EMERGENCY_TARGET,
7d793605
LP
1237 [3] = SPECIAL_HALT_TARGET,
1238 [4] = SPECIAL_POWEROFF_TARGET,
0003d1ab
LP
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
7d793605
LP
1249 };
1250
1251 if ((int) sfsi.ssi_signo >= SIGRTMIN+0 &&
0003d1ab 1252 (int) sfsi.ssi_signo < SIGRTMIN+(int) ELEMENTSOF(target_table)) {
764e9b5f
MS
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);
7d793605
LP
1256 break;
1257 }
1258
0003d1ab
LP
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
0658666b
LP
1265 switch (sfsi.ssi_signo - SIGRTMIN) {
1266
1267 case 20:
1268 log_debug("Enabling showing of status.");
27d340c7 1269 manager_set_show_status(m, true);
0658666b
LP
1270 break;
1271
1272 case 21:
1273 log_debug("Disabling showing of status.");
27d340c7 1274 manager_set_show_status(m, false);
0658666b
LP
1275 break;
1276
253ee27a
LP
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
4cfa2c99
LP
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
253ee27a
LP
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
0658666b 1307 default:
4e240ab0 1308 log_warning("Got unhandled signal <%s>.", signal_to_string(sfsi.ssi_signo));
0658666b 1309 }
b9cd2ec1 1310 }
7d793605 1311 }
9152c765
LP
1312 }
1313
1314 if (sigchld)
034c6ed7
LP
1315 return manager_dispatch_sigchld(m);
1316
1317 return 0;
1318}
1319
a16e1123 1320static int process_event(Manager *m, struct epoll_event *ev) {
034c6ed7 1321 int r;
acbb0225 1322 Watch *w;
034c6ed7
LP
1323
1324 assert(m);
1325 assert(ev);
1326
3df5bf61 1327 assert_se(w = ev->data.ptr);
034c6ed7 1328
40dde66f
LP
1329 if (w->type == WATCH_INVALID)
1330 return 0;
1331
acbb0225 1332 switch (w->type) {
034c6ed7 1333
ef734fd6 1334 case WATCH_SIGNAL:
034c6ed7 1335
acbb0225 1336 /* An incoming signal? */
f94ea366 1337 if (ev->events != EPOLLIN)
acbb0225 1338 return -EINVAL;
034c6ed7 1339
a16e1123 1340 if ((r = manager_process_signal_fd(m)) < 0)
acbb0225 1341 return r;
034c6ed7 1342
acbb0225 1343 break;
034c6ed7 1344
8c47c732
LP
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
acbb0225 1356 case WATCH_FD:
034c6ed7 1357
acbb0225 1358 /* Some fd event, to be dispatched to the units */
ea430986 1359 UNIT_VTABLE(w->data.unit)->fd_event(w->data.unit, w->fd, ev->events, w);
acbb0225 1360 break;
034c6ed7 1361
faf919f1
LP
1362 case WATCH_UNIT_TIMER:
1363 case WATCH_JOB_TIMER: {
acbb0225
LP
1364 uint64_t v;
1365 ssize_t k;
034c6ed7 1366
acbb0225 1367 /* Some timer event, to be dispatched to the units */
be888ebb 1368 if ((k = read(w->fd, &v, sizeof(v))) != sizeof(v)) {
034c6ed7 1369
acbb0225
LP
1370 if (k < 0 && (errno == EINTR || errno == EAGAIN))
1371 break;
034c6ed7 1372
acbb0225 1373 return k < 0 ? -errno : -EIO;
034c6ed7
LP
1374 }
1375
faf919f1
LP
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);
acbb0225
LP
1380 break;
1381 }
1382
ef734fd6
LP
1383 case WATCH_MOUNT:
1384 /* Some mount table change, intended for the mount subsystem */
1385 mount_fd_event(m, ev->events);
1386 break;
1387
4e434314
LP
1388 case WATCH_SWAP:
1389 /* Some swap table change, intended for the swap subsystem */
1390 swap_fd_event(m, ev->events);
1391 break;
1392
f94ea366
LP
1393 case WATCH_UDEV:
1394 /* Some notification from udev, intended for the device subsystem */
1395 device_fd_event(m, ev->events);
1396 break;
1397
ea430986
LP
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
acbb0225 1406 default:
c5fd1e57 1407 log_error("event type=%i", w->type);
acbb0225 1408 assert_not_reached("Unknown epoll event type.");
034c6ed7 1409 }
9152c765
LP
1410
1411 return 0;
1412}
1413
1414int manager_loop(Manager *m) {
1415 int r;
9152c765 1416
fac9f8df 1417 RATELIMIT_DEFINE(rl, 1*USEC_PER_SEC, 50000);
ea430986 1418
9152c765 1419 assert(m);
a16e1123 1420 m->exit_code = MANAGER_RUNNING;
9152c765 1421
fe51822e
LP
1422 /* Release the path cache */
1423 set_free_free(m->unit_path_cache);
1424 m->unit_path_cache = NULL;
1425
b0c918b9
LP
1426 manager_check_finished(m);
1427
a4312405
LP
1428 /* There might still be some zombies hanging around from
1429 * before we were exec()'ed. Leat's reap them */
e96d6be7
LP
1430 r = manager_dispatch_sigchld(m);
1431 if (r < 0)
a4312405
LP
1432 return r;
1433
a16e1123 1434 while (m->exit_code == MANAGER_RUNNING) {
957ca890
LP
1435 struct epoll_event event;
1436 int n;
c757a65b 1437 int wait_msec = -1;
9152c765 1438
c757a65b 1439 if (m->runtime_watchdog > 0 && m->running_as == MANAGER_SYSTEM)
e96d6be7
LP
1440 watchdog_ping();
1441
ea430986
LP
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);
e96d6be7 1446 continue;
ea430986
LP
1447 }
1448
37a8e683 1449 if (manager_dispatch_load_queue(m) > 0)
23a177ef
LP
1450 continue;
1451
37a8e683 1452 if (manager_dispatch_run_queue(m) > 0)
701cc384
LP
1453 continue;
1454
37a8e683 1455 if (bus_dispatch(m) > 0)
c1e1601e 1456 continue;
034c6ed7 1457
37a8e683 1458 if (manager_dispatch_cleanup_queue(m) > 0)
c1e1601e
LP
1459 continue;
1460
37a8e683 1461 if (manager_dispatch_gc_queue(m) > 0)
c1e1601e
LP
1462 continue;
1463
1464 if (manager_dispatch_dbus_queue(m) > 0)
ea430986 1465 continue;
ea430986 1466
e04aad61
LP
1467 if (swap_dispatch_reload(m) > 0)
1468 continue;
1469
c757a65b
LP
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
e96d6be7
LP
1478 n = epoll_wait(m->epoll_fd, &event, 1, wait_msec);
1479 if (n < 0) {
9152c765 1480
6089f4a9 1481 if (errno == EINTR)
9152c765
LP
1482 continue;
1483
1484 return -errno;
e96d6be7
LP
1485 } else if (n == 0)
1486 continue;
9152c765 1487
957ca890 1488 assert(n == 1);
b9cd2ec1 1489
e96d6be7
LP
1490 r = process_event(m, &event);
1491 if (r < 0)
957ca890 1492 return r;
a16e1123 1493 }
957ca890 1494
a16e1123 1495 return m->exit_code;
83c60c9f 1496}
ea430986 1497
80fbf05e 1498int manager_load_unit_from_dbus_path(Manager *m, const char *s, DBusError *e, Unit **_u) {
ea430986
LP
1499 char *n;
1500 Unit *u;
80fbf05e 1501 int r;
ea430986
LP
1502
1503 assert(m);
1504 assert(s);
1505 assert(_u);
1506
1507 if (!startswith(s, "/org/freedesktop/systemd1/unit/"))
1508 return -EINVAL;
1509
80fbf05e
MS
1510 n = bus_path_unescape(s+31);
1511 if (!n)
ea430986
LP
1512 return -ENOMEM;
1513
80fbf05e 1514 r = manager_load_unit(m, n, NULL, e, &u);
ea430986
LP
1515 free(n);
1516
80fbf05e
MS
1517 if (r < 0)
1518 return r;
ea430986
LP
1519
1520 *_u = u;
1521
1522 return 0;
1523}
86fbf370
LP
1524
1525int 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}
dfcd764e 1547
4927fcae 1548void manager_send_unit_audit(Manager *m, Unit *u, int type, bool success) {
e537352b 1549
4927fcae
LP
1550#ifdef HAVE_AUDIT
1551 char *p;
e537352b 1552
4927fcae 1553 if (m->audit_fd < 0)
e537352b
LP
1554 return;
1555
bbd3a7ba
LP
1556 /* Don't generate audit events if the service was already
1557 * started and we're just deserializing */
a7556052 1558 if (m->n_reloading > 0)
bbd3a7ba
LP
1559 return;
1560
f1dd0c3f
LP
1561 if (m->running_as != MANAGER_SYSTEM)
1562 return;
1563
ac155bb8 1564 if (u->type != UNIT_SERVICE)
f1dd0c3f
LP
1565 return;
1566
ac155bb8 1567 if (!(p = unit_name_to_prefix_and_instance(u->id))) {
4927fcae 1568 log_error("Failed to allocate unit name for audit message: %s", strerror(ENOMEM));
e537352b
LP
1569 return;
1570 }
1571
391ade86 1572 if (audit_log_user_comm_message(m->audit_fd, type, "", p, NULL, NULL, NULL, success) < 0) {
391ade86
LP
1573 if (errno == EPERM) {
1574 /* We aren't allowed to send audit messages?
44785992 1575 * Then let's not retry again. */
391ade86
LP
1576 audit_close(m->audit_fd);
1577 m->audit_fd = -1;
44785992
LP
1578 } else
1579 log_warning("Failed to send audit message: %m");
391ade86 1580 }
e537352b 1581
4927fcae
LP
1582 free(p);
1583#endif
e537352b 1584
e537352b
LP
1585}
1586
e983b760
LP
1587void 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;
e983b760
LP
1592
1593 /* Don't generate plymouth events if the service was already
1594 * started and we're just deserializing */
a7556052 1595 if (m->n_reloading > 0)
e983b760
LP
1596 return;
1597
1598 if (m->running_as != MANAGER_SYSTEM)
1599 return;
1600
ac155bb8
MS
1601 if (u->type != UNIT_SERVICE &&
1602 u->type != UNIT_MOUNT &&
1603 u->type != UNIT_SWAP)
e983b760
LP
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;
96707269
LP
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) {
e983b760
LP
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
ac155bb8 1629 if (asprintf(&message, "U\002%c%s%n", (int) (strlen(u->id) + 1), u->id, &n) < 0) {
0d0f0c50 1630 log_oom();
e983b760
LP
1631 goto finish;
1632 }
1633
1634 errno = 0;
bd40a2d8 1635 if (write(fd, message, n + 1) != n + 1) {
e983b760
LP
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
1648finish:
1649 if (fd >= 0)
1650 close_nointr_nofail(fd);
1651
1652 free(message);
1653}
1654
05e343b7
LP
1655void 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
1672void 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
d8d5ab98 1689int manager_open_serialization(Manager *m, FILE **_f) {
b925e726 1690 char *path = NULL;
a16e1123
LP
1691 mode_t saved_umask;
1692 int fd;
1693 FILE *f;
1694
1695 assert(_f);
1696
b925e726 1697 if (m->running_as == MANAGER_SYSTEM)
2b583ce6 1698 asprintf(&path, "/run/systemd/dump-%lu-XXXXXX", (unsigned long) getpid());
b925e726
LP
1699 else
1700 asprintf(&path, "/tmp/systemd-dump-%lu-XXXXXX", (unsigned long) getpid());
d8d5ab98 1701
b925e726
LP
1702 if (!path)
1703 return -ENOMEM;
a16e1123
LP
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
da19d5c1 1719 if (!(f = fdopen(fd, "w+")))
a16e1123
LP
1720 return -errno;
1721
1722 *_f = f;
1723
1724 return 0;
1725}
1726
6b78f9b4 1727int manager_serialize(Manager *m, FILE *f, FDSet *fds, bool serialize_jobs) {
a16e1123
LP
1728 Iterator i;
1729 Unit *u;
1730 const char *t;
1731 int r;
1732
1733 assert(m);
1734 assert(f);
1735 assert(fds);
1736
a7556052 1737 m->n_reloading ++;
38c52d46 1738
01d67b43
LP
1739 fprintf(f, "current-job-id=%i\n", m->current_job_id);
1740 fprintf(f, "taint-usr=%s\n", yes_no(m->taint_usr));
33c5fae9
LP
1741 fprintf(f, "n-installed-jobs=%u\n", m->n_installed_jobs);
1742 fprintf(f, "n-failed-jobs=%u\n", m->n_failed_jobs);
01d67b43 1743
e9ddabc2 1744 dual_timestamp_serialize(f, "initrd-timestamp", &m->initrd_timestamp);
f38ed060 1745
26a1efdf 1746 if (!in_initrd()) {
f38ed060
HH
1747 dual_timestamp_serialize(f, "startup-timestamp", &m->startup_timestamp);
1748 dual_timestamp_serialize(f, "finish-timestamp", &m->finish_timestamp);
1749 }
47a483a1 1750
f2382a94
LP
1751 fputc('\n', f);
1752
a16e1123 1753 HASHMAP_FOREACH_KEY(u, t, m->units, i) {
ac155bb8 1754 if (u->id != t)
a16e1123
LP
1755 continue;
1756
1757 if (!unit_can_serialize(u))
1758 continue;
1759
1760 /* Start marker */
ac155bb8 1761 fputs(u->id, f);
a16e1123
LP
1762 fputc('\n', f);
1763
6b78f9b4 1764 if ((r = unit_serialize(u, f, fds, serialize_jobs)) < 0) {
a7556052 1765 m->n_reloading --;
a16e1123 1766 return r;
38c52d46 1767 }
a16e1123
LP
1768 }
1769
a7556052
LP
1770 assert(m->n_reloading > 0);
1771 m->n_reloading --;
38c52d46 1772
a16e1123
LP
1773 if (ferror(f))
1774 return -EIO;
1775
b23de6af
LP
1776 r = bus_fdset_add_all(m, fds);
1777 if (r < 0)
1778 return r;
1779
a16e1123
LP
1780 return 0;
1781}
1782
1783int 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
a7556052 1791 m->n_reloading ++;
82c64bf5 1792
10f8e83c 1793 for (;;) {
20c03b7b 1794 char line[LINE_MAX], *l;
10f8e83c
LP
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
01d67b43
LP
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);
33c5fae9
LP
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;
01d67b43
LP
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="))
e9ddabc2
LP
1840 dual_timestamp_deserialize(l+17, &m->initrd_timestamp);
1841 else if (startswith(l, "startup-timestamp="))
799fd0fd 1842 dual_timestamp_deserialize(l+18, &m->startup_timestamp);
10717a1a 1843 else if (startswith(l, "finish-timestamp="))
799fd0fd 1844 dual_timestamp_deserialize(l+17, &m->finish_timestamp);
10717a1a 1845 else
10f8e83c
LP
1846 log_debug("Unknown serialization item '%s'", l);
1847 }
1848
a16e1123
LP
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))
10f8e83c
LP
1856 r = 0;
1857 else
1858 r = -errno;
a16e1123 1859
82c64bf5 1860 goto finish;
a16e1123
LP
1861 }
1862
1863 char_array_0(name);
1864
398ef8ba 1865 if ((r = manager_load_unit(m, strstrip(name), NULL, NULL, &u)) < 0)
82c64bf5 1866 goto finish;
a16e1123
LP
1867
1868 if ((r = unit_deserialize(u, f, fds)) < 0)
82c64bf5 1869 goto finish;
a16e1123
LP
1870 }
1871
10f8e83c 1872finish:
82c64bf5
LP
1873 if (ferror(f)) {
1874 r = -EIO;
1875 goto finish;
1876 }
a16e1123 1877
a7556052
LP
1878 assert(m->n_reloading > 0);
1879 m->n_reloading --;
82c64bf5
LP
1880
1881 return r;
a16e1123
LP
1882}
1883
1884int manager_reload(Manager *m) {
1885 int r, q;
1886 FILE *f;
1887 FDSet *fds;
1888
1889 assert(m);
1890
07719a21
LP
1891 r = manager_open_serialization(m, &f);
1892 if (r < 0)
a16e1123
LP
1893 return r;
1894
a7556052 1895 m->n_reloading ++;
38c52d46 1896
07719a21
LP
1897 fds = fdset_new();
1898 if (!fds) {
a7556052 1899 m->n_reloading --;
a16e1123
LP
1900 r = -ENOMEM;
1901 goto finish;
1902 }
1903
6b78f9b4 1904 r = manager_serialize(m, f, fds, true);
07719a21 1905 if (r < 0) {
a7556052 1906 m->n_reloading --;
a16e1123 1907 goto finish;
38c52d46 1908 }
a16e1123
LP
1909
1910 if (fseeko(f, 0, SEEK_SET) < 0) {
a7556052 1911 m->n_reloading --;
a16e1123
LP
1912 r = -errno;
1913 goto finish;
1914 }
1915
1916 /* From here on there is no way back. */
1917 manager_clear_jobs_and_units(m);
5a1e9937 1918 manager_undo_generators(m);
84e3543e 1919 lookup_paths_free(&m->lookup_paths);
2ded0c04 1920
07719a21 1921 /* Find new unit paths */
5a1e9937
LP
1922 manager_run_generators(m);
1923
07719a21
LP
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
5a1e9937
LP
1932 manager_build_unit_path_cache(m);
1933
a16e1123 1934 /* First, enumerate what we can from all config files */
07719a21
LP
1935 q = manager_enumerate(m);
1936 if (q < 0)
a16e1123
LP
1937 r = q;
1938
1939 /* Second, deserialize our stored data */
07719a21
LP
1940 q = manager_deserialize(m, f, fds);
1941 if (q < 0)
a16e1123
LP
1942 r = q;
1943
1944 fclose(f);
1945 f = NULL;
1946
1947 /* Third, fire things up! */
07719a21
LP
1948 q = manager_coldplug(m);
1949 if (q < 0)
a16e1123
LP
1950 r = q;
1951
a7556052
LP
1952 assert(m->n_reloading > 0);
1953 m->n_reloading--;
9f611ad8 1954
a16e1123
LP
1955finish:
1956 if (f)
1957 fclose(f);
1958
1959 if (fds)
1960 fdset_free(fds);
1961
1962 return r;
1963}
1964
9e58ff9c
LP
1965bool manager_is_booting_or_shutting_down(Manager *m) {
1966 Unit *u;
1967
1968 assert(m);
1969
1970 /* Is the initial job still around? */
bacbccb7 1971 if (manager_get_job(m, m->default_unit_job_id))
9e58ff9c
LP
1972 return true;
1973
1974 /* Is there a job for the shutdown target? */
27d340c7
LP
1975 u = manager_get_unit(m, SPECIAL_SHUTDOWN_TARGET);
1976 if (u)
ac155bb8 1977 return !!u->job;
9e58ff9c
LP
1978
1979 return false;
1980}
1981
fdf20a31 1982void manager_reset_failed(Manager *m) {
5632e374
LP
1983 Unit *u;
1984 Iterator i;
1985
1986 assert(m);
1987
1988 HASHMAP_FOREACH(u, m->units, i)
fdf20a31 1989 unit_reset_failed(u);
5632e374
LP
1990}
1991
8f6df3fa
LP
1992bool 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 */
8f6df3fa
LP
1999 if (!(u = manager_get_unit(m, name)))
2000 return true;
2001
18ffdfda 2002 return unit_pending_inactive(u);
8f6df3fa
LP
2003}
2004
b0c918b9 2005void manager_check_finished(Manager *m) {
e9ddabc2 2006 char userspace[FORMAT_TIMESPAN_MAX], initrd[FORMAT_TIMESPAN_MAX], kernel[FORMAT_TIMESPAN_MAX], sum[FORMAT_TIMESPAN_MAX];
7ea07dcd 2007 usec_t kernel_usec, initrd_usec, userspace_usec, total_usec;
b0c918b9
LP
2008
2009 assert(m);
2010
f2b68789 2011 if (hashmap_size(m->jobs) > 0)
b0c918b9
LP
2012 return;
2013
f2b68789
LP
2014 /* Notify Type=idle units that we are done now */
2015 close_pipe(m->idle_pipe);
2016
af6da548
LP
2017 /* Turn off confirm spawn now */
2018 m->confirm_spawn = false;
2019
f2b68789 2020 if (dual_timestamp_is_set(&m->finish_timestamp))
b0c918b9
LP
2021 return;
2022
2023 dual_timestamp_get(&m->finish_timestamp);
2024
e03ae661
LP
2025 if (m->running_as == MANAGER_SYSTEM && detect_container(NULL) <= 0) {
2026
18fa6b27
LP
2027 userspace_usec = m->finish_timestamp.monotonic - m->startup_timestamp.monotonic;
2028 total_usec = m->finish_timestamp.monotonic;
2029
e9ddabc2 2030 if (dual_timestamp_is_set(&m->initrd_timestamp)) {
18fa6b27
LP
2031
2032 kernel_usec = m->initrd_timestamp.monotonic;
2033 initrd_usec = m->startup_timestamp.monotonic - m->initrd_timestamp.monotonic;
2034
877d54e9
LP
2035 log_struct(LOG_INFO,
2036 "MESSAGE_ID=" SD_ID128_FORMAT_STR, SD_ID128_FORMAT_VAL(SD_MESSAGE_STARTUP_FINISHED),
2037 "KERNEL_USEC=%llu", (unsigned long long) kernel_usec,
2038 "INITRD_USEC=%llu", (unsigned long long) initrd_usec,
2039 "USERSPACE_USEC=%llu", (unsigned long long) userspace_usec,
2040 "MESSAGE=Startup finished in %s (kernel) + %s (initrd) + %s (userspace) = %s.",
2041 format_timespan(kernel, sizeof(kernel), kernel_usec),
2042 format_timespan(initrd, sizeof(initrd), initrd_usec),
2043 format_timespan(userspace, sizeof(userspace), userspace_usec),
2044 format_timespan(sum, sizeof(sum), total_usec),
2045 NULL);
18fa6b27
LP
2046 } else {
2047 kernel_usec = m->startup_timestamp.monotonic;
2048 initrd_usec = 0;
2049
877d54e9
LP
2050 log_struct(LOG_INFO,
2051 "MESSAGE_ID=" SD_ID128_FORMAT_STR, SD_ID128_FORMAT_VAL(SD_MESSAGE_STARTUP_FINISHED),
2052 "KERNEL_USEC=%llu", (unsigned long long) kernel_usec,
2053 "USERSPACE_USEC=%llu", (unsigned long long) userspace_usec,
2054 "MESSAGE=Startup finished in %s (kernel) + %s (userspace) = %s.",
2055 format_timespan(kernel, sizeof(kernel), kernel_usec),
2056 format_timespan(userspace, sizeof(userspace), userspace_usec),
2057 format_timespan(sum, sizeof(sum), total_usec),
2058 NULL);
18fa6b27
LP
2059 }
2060 } else {
877d54e9
LP
2061 initrd_usec = kernel_usec = 0;
2062 total_usec = userspace_usec = m->finish_timestamp.monotonic - m->startup_timestamp.monotonic;
2063
2064 log_struct(LOG_INFO,
2065 "MESSAGE_ID=" SD_ID128_FORMAT_STR, SD_ID128_FORMAT_VAL(SD_MESSAGE_STARTUP_FINISHED),
2066 "USERSPACE_USEC=%llu", (unsigned long long) userspace_usec,
2067 "MESSAGE=Startup finished in %s.",
2068 format_timespan(sum, sizeof(sum), total_usec),
2069 NULL);
18fa6b27 2070 }
b0c918b9 2071
18fa6b27 2072 bus_broadcast_finished(m, kernel_usec, initrd_usec, userspace_usec, total_usec);
530345e7
LP
2073
2074 sd_notifyf(false,
2075 "READY=1\nSTATUS=Startup finished in %s.",
2076 format_timespan(sum, sizeof(sum), total_usec));
b0c918b9
LP
2077}
2078
07719a21
LP
2079static int create_generator_dir(Manager *m, char **generator, const char *name) {
2080 char *p;
2081 int r;
2082
2083 assert(m);
2084 assert(generator);
2085 assert(name);
2086
2087 if (*generator)
2088 return 0;
2089
2090 if (m->running_as == MANAGER_SYSTEM && getpid() == 1) {
2091
2092 p = strappend("/run/systemd/", name);
0d0f0c50
SL
2093 if (!p)
2094 return log_oom();
07719a21 2095
d2e54fae 2096 r = mkdir_p_label(p, 0755);
07719a21
LP
2097 if (r < 0) {
2098 log_error("Failed to create generator directory: %s", strerror(-r));
2099 free(p);
2100 return r;
2101 }
2102 } else {
b7def684 2103 p = strjoin("/tmp/systemd-", name, ".XXXXXX", NULL);
0d0f0c50
SL
2104 if (!p)
2105 return log_oom();
07719a21
LP
2106
2107 if (!mkdtemp(p)) {
2108 free(p);
2109 log_error("Failed to create generator directory: %m");
2110 return -errno;
2111 }
2112 }
2113
2114 *generator = p;
2115 return 0;
2116}
2117
2118static void trim_generator_dir(Manager *m, char **generator) {
2119 assert(m);
2120 assert(generator);
2121
2122 if (!*generator)
2123 return;
2124
2125 if (rmdir(*generator) >= 0) {
2126 free(*generator);
2127 *generator = NULL;
2128 }
2129
2130 return;
2131}
2132
5a1e9937
LP
2133void manager_run_generators(Manager *m) {
2134 DIR *d = NULL;
5a1e9937 2135 const char *generator_path;
07719a21 2136 const char *argv[5];
07f8a4aa 2137 mode_t u;
07719a21 2138 int r;
5a1e9937
LP
2139
2140 assert(m);
2141
af2d49f7 2142 generator_path = m->running_as == MANAGER_SYSTEM ? SYSTEM_GENERATOR_PATH : USER_GENERATOR_PATH;
07719a21
LP
2143 d = opendir(generator_path);
2144 if (!d) {
5a1e9937
LP
2145 if (errno == ENOENT)
2146 return;
2147
2148 log_error("Failed to enumerate generator directory: %m");
2149 return;
2150 }
2151
07719a21
LP
2152 r = create_generator_dir(m, &m->generator_unit_path, "generator");
2153 if (r < 0)
2154 goto finish;
f1d19aa4 2155
07719a21
LP
2156 r = create_generator_dir(m, &m->generator_unit_path_early, "generator.early");
2157 if (r < 0)
2158 goto finish;
5a1e9937 2159
07719a21
LP
2160 r = create_generator_dir(m, &m->generator_unit_path_late, "generator.late");
2161 if (r < 0)
2162 goto finish;
5a1e9937 2163
83cc030f
LP
2164 argv[0] = NULL; /* Leave this empty, execute_directory() will fill something in */
2165 argv[1] = m->generator_unit_path;
07719a21
LP
2166 argv[2] = m->generator_unit_path_early;
2167 argv[3] = m->generator_unit_path_late;
2168 argv[4] = NULL;
5a1e9937 2169
07f8a4aa 2170 u = umask(0022);
83cc030f 2171 execute_directory(generator_path, d, (char**) argv);
07f8a4aa 2172 umask(u);
5a1e9937 2173
07719a21
LP
2174 trim_generator_dir(m, &m->generator_unit_path);
2175 trim_generator_dir(m, &m->generator_unit_path_early);
2176 trim_generator_dir(m, &m->generator_unit_path_late);
5a1e9937
LP
2177
2178finish:
2179 if (d)
2180 closedir(d);
5a1e9937
LP
2181}
2182
07719a21 2183static void remove_generator_dir(Manager *m, char **generator) {
5a1e9937 2184 assert(m);
07719a21 2185 assert(generator);
5a1e9937 2186
07719a21 2187 if (!*generator)
5a1e9937
LP
2188 return;
2189
07719a21
LP
2190 strv_remove(m->lookup_paths.unit_path, *generator);
2191 rm_rf(*generator, false, true, false);
5a1e9937 2192
07719a21
LP
2193 free(*generator);
2194 *generator = NULL;
2195}
2196
2197void manager_undo_generators(Manager *m) {
2198 assert(m);
2199
2200 remove_generator_dir(m, &m->generator_unit_path);
2201 remove_generator_dir(m, &m->generator_unit_path_early);
2202 remove_generator_dir(m, &m->generator_unit_path_late);
5a1e9937
LP
2203}
2204
06d4c99a
LP
2205int manager_set_default_controllers(Manager *m, char **controllers) {
2206 char **l;
2207
2208 assert(m);
2209
9156e799
LP
2210 l = strv_copy(controllers);
2211 if (!l)
06d4c99a
LP
2212 return -ENOMEM;
2213
2214 strv_free(m->default_controllers);
2215 m->default_controllers = l;
2216
b59e2465 2217 cg_shorten_controllers(m->default_controllers);
9156e799 2218
06d4c99a
LP
2219 return 0;
2220}
2221
c93ff2e9
FC
2222int manager_set_default_rlimits(Manager *m, struct rlimit **default_rlimit) {
2223 int i;
2224
2225 assert(m);
2226
2227 for (i = 0; i < RLIMIT_NLIMITS; i++) {
07719a21
LP
2228 if (!default_rlimit[i])
2229 continue;
c93ff2e9 2230
07719a21
LP
2231 m->rlimit[i] = newdup(struct rlimit, default_rlimit[i], 1);
2232 if (!m->rlimit[i])
2233 return -ENOMEM;
c93ff2e9
FC
2234 }
2235
2236 return 0;
2237}
2238
4cfa2c99 2239void manager_recheck_journal(Manager *m) {
f1dd0c3f
LP
2240 Unit *u;
2241
2242 assert(m);
2243
2244 if (m->running_as != MANAGER_SYSTEM)
2245 return;
2246
731a676c
LP
2247 u = manager_get_unit(m, SPECIAL_JOURNALD_SOCKET);
2248 if (u && SOCKET(u)->state != SOCKET_RUNNING) {
4cfa2c99 2249 log_close_journal();
731a676c 2250 return;
f1dd0c3f
LP
2251 }
2252
731a676c
LP
2253 u = manager_get_unit(m, SPECIAL_JOURNALD_SERVICE);
2254 if (u && SERVICE(u)->state != SERVICE_RUNNING) {
4cfa2c99 2255 log_close_journal();
731a676c
LP
2256 return;
2257 }
f1dd0c3f 2258
731a676c
LP
2259 /* Hmm, OK, so the socket is fully up and the service is up
2260 * too, then let's make use of the thing. */
f1dd0c3f
LP
2261 log_open();
2262}
2263
27d340c7
LP
2264void manager_set_show_status(Manager *m, bool b) {
2265 assert(m);
2266
2267 if (m->running_as != MANAGER_SYSTEM)
2268 return;
2269
2270 m->show_status = b;
2271
2272 if (b)
2273 touch("/run/systemd/show-status");
2274 else
2275 unlink("/run/systemd/show-status");
2276}
2277
2278bool manager_get_show_status(Manager *m) {
2279 assert(m);
2280
2281 if (m->running_as != MANAGER_SYSTEM)
2282 return false;
2283
2284 if (m->show_status)
2285 return true;
2286
2287 /* If Plymouth is running make sure we show the status, so
2288 * that there's something nice to see when people press Esc */
2289
2290 return plymouth_running();
2291}
2292
dfcd764e 2293static const char* const manager_running_as_table[_MANAGER_RUNNING_AS_MAX] = {
dfcd764e 2294 [MANAGER_SYSTEM] = "system",
af2d49f7 2295 [MANAGER_USER] = "user"
dfcd764e
LP
2296};
2297
2298DEFINE_STRING_TABLE_LOOKUP(manager_running_as, ManagerRunningAs);