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