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