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