1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
4 This file is part of systemd.
6 Copyright 2010 Lennart Poettering
8 systemd is free software; you can redistribute it and/or modify it
9 under the terms of the GNU Lesser General Public License as published by
10 the Free Software Foundation; either version 2.1 of the License, or
11 (at your option) any later version.
13 systemd is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 Lesser General Public License for more details.
18 You should have received a copy of the GNU Lesser General Public License
19 along with systemd; If not, see <http://www.gnu.org/licenses/>.
28 #include <sys/epoll.h>
29 #include <sys/inotify.h>
30 #include <sys/ioctl.h>
31 #include <sys/reboot.h>
32 #include <sys/timerfd.h>
40 #include "sd-daemon.h"
41 #include "sd-messages.h"
43 #include "alloc-util.h"
45 #include "boot-timestamps.h"
46 #include "bus-common-errors.h"
47 #include "bus-error.h"
48 #include "bus-kernel.h"
51 #include "dbus-manager.h"
52 #include "dbus-unit.h"
56 #include "exit-status.h"
62 #include "locale-setup.h"
68 #include "parse-util.h"
69 #include "path-lookup.h"
70 #include "path-util.h"
71 #include "process-util.h"
72 #include "ratelimit.h"
74 #include "signal-util.h"
76 #include "stat-util.h"
77 #include "string-table.h"
78 #include "string-util.h"
80 #include "terminal-util.h"
81 #include "time-util.h"
82 #include "transaction.h"
83 #include "umask-util.h"
84 #include "unit-name.h"
89 /* Initial delay and the interval for printing status messages about running jobs */
90 #define JOBS_IN_PROGRESS_WAIT_USEC (5*USEC_PER_SEC)
91 #define JOBS_IN_PROGRESS_PERIOD_USEC (USEC_PER_SEC / 3)
92 #define JOBS_IN_PROGRESS_PERIOD_DIVISOR 3
94 static int manager_dispatch_notify_fd(sd_event_source
*source
, int fd
, uint32_t revents
, void *userdata
);
95 static int manager_dispatch_signal_fd(sd_event_source
*source
, int fd
, uint32_t revents
, void *userdata
);
96 static int manager_dispatch_time_change_fd(sd_event_source
*source
, int fd
, uint32_t revents
, void *userdata
);
97 static int manager_dispatch_idle_pipe_fd(sd_event_source
*source
, int fd
, uint32_t revents
, void *userdata
);
98 static int manager_dispatch_jobs_in_progress(sd_event_source
*source
, usec_t usec
, void *userdata
);
99 static int manager_dispatch_run_queue(sd_event_source
*source
, void *userdata
);
100 static int manager_run_generators(Manager
*m
);
101 static void manager_undo_generators(Manager
*m
);
103 static void manager_watch_jobs_in_progress(Manager
*m
) {
109 if (m
->jobs_in_progress_event_source
)
112 next
= now(CLOCK_MONOTONIC
) + JOBS_IN_PROGRESS_WAIT_USEC
;
113 r
= sd_event_add_time(
115 &m
->jobs_in_progress_event_source
,
118 manager_dispatch_jobs_in_progress
, m
);
122 (void) sd_event_source_set_description(m
->jobs_in_progress_event_source
, "manager-jobs-in-progress");
125 #define CYLON_BUFFER_EXTRA (2*(sizeof(ANSI_RED)-1) + sizeof(ANSI_HIGHLIGHT_RED)-1 + 2*(sizeof(ANSI_NORMAL)-1))
127 static void draw_cylon(char buffer
[], size_t buflen
, unsigned width
, unsigned pos
) {
130 assert(buflen
>= CYLON_BUFFER_EXTRA
+ width
+ 1);
131 assert(pos
<= width
+1); /* 0 or width+1 mean that the center light is behind the corner */
135 p
= mempset(p
, ' ', pos
-2);
136 p
= stpcpy(p
, ANSI_RED
);
140 if (pos
> 0 && pos
<= width
) {
141 p
= stpcpy(p
, ANSI_HIGHLIGHT_RED
);
145 p
= stpcpy(p
, ANSI_NORMAL
);
148 p
= stpcpy(p
, ANSI_RED
);
151 p
= mempset(p
, ' ', width
-1-pos
);
152 strcpy(p
, ANSI_NORMAL
);
156 void manager_flip_auto_status(Manager
*m
, bool enable
) {
160 if (m
->show_status
== SHOW_STATUS_AUTO
)
161 manager_set_show_status(m
, SHOW_STATUS_TEMPORARY
);
163 if (m
->show_status
== SHOW_STATUS_TEMPORARY
)
164 manager_set_show_status(m
, SHOW_STATUS_AUTO
);
168 static void manager_print_jobs_in_progress(Manager
*m
) {
169 _cleanup_free_
char *job_of_n
= NULL
;
172 unsigned counter
= 0, print_nr
;
173 char cylon
[6 + CYLON_BUFFER_EXTRA
+ 1];
175 char time
[FORMAT_TIMESPAN_MAX
], limit
[FORMAT_TIMESPAN_MAX
] = "no limit";
179 assert(m
->n_running_jobs
> 0);
181 manager_flip_auto_status(m
, true);
183 print_nr
= (m
->jobs_in_progress_iteration
/ JOBS_IN_PROGRESS_PERIOD_DIVISOR
) % m
->n_running_jobs
;
185 HASHMAP_FOREACH(j
, m
->jobs
, i
)
186 if (j
->state
== JOB_RUNNING
&& counter
++ == print_nr
)
189 /* m->n_running_jobs must be consistent with the contents of m->jobs,
190 * so the above loop must have succeeded in finding j. */
191 assert(counter
== print_nr
+ 1);
194 cylon_pos
= m
->jobs_in_progress_iteration
% 14;
196 cylon_pos
= 14 - cylon_pos
;
197 draw_cylon(cylon
, sizeof(cylon
), 6, cylon_pos
);
199 m
->jobs_in_progress_iteration
++;
201 if (m
->n_running_jobs
> 1) {
202 if (asprintf(&job_of_n
, "(%u of %u) ", counter
, m
->n_running_jobs
) < 0)
206 format_timespan(time
, sizeof(time
), now(CLOCK_MONOTONIC
) - j
->begin_usec
, 1*USEC_PER_SEC
);
207 if (job_get_timeout(j
, &x
) > 0)
208 format_timespan(limit
, sizeof(limit
), x
- j
->begin_usec
, 1*USEC_PER_SEC
);
210 manager_status_printf(m
, STATUS_TYPE_EPHEMERAL
, cylon
,
211 "%sA %s job is running for %s (%s / %s)",
213 job_type_to_string(j
->type
),
214 unit_description(j
->unit
),
218 static int have_ask_password(void) {
219 _cleanup_closedir_
DIR *dir
;
221 dir
= opendir("/run/systemd/ask-password");
234 if (!de
&& errno
!= 0)
239 if (startswith(de
->d_name
, "ask."))
244 static int manager_dispatch_ask_password_fd(sd_event_source
*source
,
245 int fd
, uint32_t revents
, void *userdata
) {
246 Manager
*m
= userdata
;
252 m
->have_ask_password
= have_ask_password();
253 if (m
->have_ask_password
< 0)
254 /* Log error but continue. Negative have_ask_password
255 * is treated as unknown status. */
256 log_error_errno(m
->have_ask_password
, "Failed to list /run/systemd/ask-password: %m");
261 static void manager_close_ask_password(Manager
*m
) {
264 m
->ask_password_event_source
= sd_event_source_unref(m
->ask_password_event_source
);
265 m
->ask_password_inotify_fd
= safe_close(m
->ask_password_inotify_fd
);
266 m
->have_ask_password
= -EINVAL
;
269 static int manager_check_ask_password(Manager
*m
) {
274 if (!m
->ask_password_event_source
) {
275 assert(m
->ask_password_inotify_fd
< 0);
277 mkdir_p_label("/run/systemd/ask-password", 0755);
279 m
->ask_password_inotify_fd
= inotify_init1(IN_NONBLOCK
|IN_CLOEXEC
);
280 if (m
->ask_password_inotify_fd
< 0)
281 return log_error_errno(errno
, "inotify_init1() failed: %m");
283 if (inotify_add_watch(m
->ask_password_inotify_fd
, "/run/systemd/ask-password", IN_CREATE
|IN_DELETE
|IN_MOVE
) < 0) {
284 log_error_errno(errno
, "Failed to add watch on /run/systemd/ask-password: %m");
285 manager_close_ask_password(m
);
289 r
= sd_event_add_io(m
->event
, &m
->ask_password_event_source
,
290 m
->ask_password_inotify_fd
, EPOLLIN
,
291 manager_dispatch_ask_password_fd
, m
);
293 log_error_errno(errno
, "Failed to add event source for /run/systemd/ask-password: %m");
294 manager_close_ask_password(m
);
298 (void) sd_event_source_set_description(m
->ask_password_event_source
, "manager-ask-password");
300 /* Queries might have been added meanwhile... */
301 manager_dispatch_ask_password_fd(m
->ask_password_event_source
,
302 m
->ask_password_inotify_fd
, EPOLLIN
, m
);
305 return m
->have_ask_password
;
308 static int manager_watch_idle_pipe(Manager
*m
) {
313 if (m
->idle_pipe_event_source
)
316 if (m
->idle_pipe
[2] < 0)
319 r
= sd_event_add_io(m
->event
, &m
->idle_pipe_event_source
, m
->idle_pipe
[2], EPOLLIN
, manager_dispatch_idle_pipe_fd
, m
);
321 return log_error_errno(r
, "Failed to watch idle pipe: %m");
323 (void) sd_event_source_set_description(m
->idle_pipe_event_source
, "manager-idle-pipe");
328 static void manager_close_idle_pipe(Manager
*m
) {
331 m
->idle_pipe_event_source
= sd_event_source_unref(m
->idle_pipe_event_source
);
333 safe_close_pair(m
->idle_pipe
);
334 safe_close_pair(m
->idle_pipe
+ 2);
337 static int manager_setup_time_change(Manager
*m
) {
340 /* We only care for the cancellation event, hence we set the
341 * timeout to the latest possible value. */
342 struct itimerspec its
= {
343 .it_value
.tv_sec
= TIME_T_MAX
,
347 assert_cc(sizeof(time_t) == sizeof(TIME_T_MAX
));
352 /* Uses TFD_TIMER_CANCEL_ON_SET to get notifications whenever
353 * CLOCK_REALTIME makes a jump relative to CLOCK_MONOTONIC */
355 m
->time_change_fd
= timerfd_create(CLOCK_REALTIME
, TFD_NONBLOCK
|TFD_CLOEXEC
);
356 if (m
->time_change_fd
< 0)
357 return log_error_errno(errno
, "Failed to create timerfd: %m");
359 if (timerfd_settime(m
->time_change_fd
, TFD_TIMER_ABSTIME
|TFD_TIMER_CANCEL_ON_SET
, &its
, NULL
) < 0) {
360 log_debug_errno(errno
, "Failed to set up TFD_TIMER_CANCEL_ON_SET, ignoring: %m");
361 m
->time_change_fd
= safe_close(m
->time_change_fd
);
365 r
= sd_event_add_io(m
->event
, &m
->time_change_event_source
, m
->time_change_fd
, EPOLLIN
, manager_dispatch_time_change_fd
, m
);
367 return log_error_errno(r
, "Failed to create time change event source: %m");
369 (void) sd_event_source_set_description(m
->time_change_event_source
, "manager-time-change");
371 log_debug("Set up TFD_TIMER_CANCEL_ON_SET timerfd.");
376 static int enable_special_signals(Manager
*m
) {
377 _cleanup_close_
int fd
= -1;
381 /* Enable that we get SIGINT on control-alt-del. In containers
382 * this will fail with EPERM (older) or EINVAL (newer), so
384 if (reboot(RB_DISABLE_CAD
) < 0 && errno
!= EPERM
&& errno
!= EINVAL
)
385 log_warning_errno(errno
, "Failed to enable ctrl-alt-del handling: %m");
387 fd
= open_terminal("/dev/tty0", O_RDWR
|O_NOCTTY
|O_CLOEXEC
);
389 /* Support systems without virtual console */
391 log_warning_errno(errno
, "Failed to open /dev/tty0: %m");
393 /* Enable that we get SIGWINCH on kbrequest */
394 if (ioctl(fd
, KDSIGACCEPT
, SIGWINCH
) < 0)
395 log_warning_errno(errno
, "Failed to enable kbrequest handling: %m");
401 static int manager_setup_signals(Manager
*m
) {
402 struct sigaction sa
= {
403 .sa_handler
= SIG_DFL
,
404 .sa_flags
= SA_NOCLDSTOP
|SA_RESTART
,
411 assert_se(sigaction(SIGCHLD
, &sa
, NULL
) == 0);
413 /* We make liberal use of realtime signals here. On
414 * Linux/glibc we have 30 of them (with the exception of Linux
415 * on hppa, see below), between SIGRTMIN+0 ... SIGRTMIN+30
418 assert_se(sigemptyset(&mask
) == 0);
419 sigset_add_many(&mask
,
420 SIGCHLD
, /* Child died */
421 SIGTERM
, /* Reexecute daemon */
422 SIGHUP
, /* Reload configuration */
423 SIGUSR1
, /* systemd/upstart: reconnect to D-Bus */
424 SIGUSR2
, /* systemd: dump status */
425 SIGINT
, /* Kernel sends us this on control-alt-del */
426 SIGWINCH
, /* Kernel sends us this on kbrequest (alt-arrowup) */
427 SIGPWR
, /* Some kernel drivers and upsd send us this on power failure */
429 SIGRTMIN
+0, /* systemd: start default.target */
430 SIGRTMIN
+1, /* systemd: isolate rescue.target */
431 SIGRTMIN
+2, /* systemd: isolate emergency.target */
432 SIGRTMIN
+3, /* systemd: start halt.target */
433 SIGRTMIN
+4, /* systemd: start poweroff.target */
434 SIGRTMIN
+5, /* systemd: start reboot.target */
435 SIGRTMIN
+6, /* systemd: start kexec.target */
437 /* ... space for more special targets ... */
439 SIGRTMIN
+13, /* systemd: Immediate halt */
440 SIGRTMIN
+14, /* systemd: Immediate poweroff */
441 SIGRTMIN
+15, /* systemd: Immediate reboot */
442 SIGRTMIN
+16, /* systemd: Immediate kexec */
444 /* ... space for more immediate system state changes ... */
446 SIGRTMIN
+20, /* systemd: enable status messages */
447 SIGRTMIN
+21, /* systemd: disable status messages */
448 SIGRTMIN
+22, /* systemd: set log level to LOG_DEBUG */
449 SIGRTMIN
+23, /* systemd: set log level to LOG_INFO */
450 SIGRTMIN
+24, /* systemd: Immediate exit (--user only) */
452 /* .. one free signal here ... */
454 #if !defined(__hppa64__) && !defined(__hppa__)
455 /* Apparently Linux on hppa has fewer RT
456 * signals (SIGRTMAX is SIGRTMIN+25 there),
457 * hence let's not try to make use of them
458 * here. Since these commands are accessible
459 * by different means and only really a safety
460 * net, the missing functionality on hppa
461 * shouldn't matter. */
463 SIGRTMIN
+26, /* systemd: set log target to journal-or-kmsg */
464 SIGRTMIN
+27, /* systemd: set log target to console */
465 SIGRTMIN
+28, /* systemd: set log target to kmsg */
466 SIGRTMIN
+29, /* systemd: set log target to syslog-or-kmsg (obsolete) */
468 /* ... one free signal here SIGRTMIN+30 ... */
471 assert_se(sigprocmask(SIG_SETMASK
, &mask
, NULL
) == 0);
473 m
->signal_fd
= signalfd(-1, &mask
, SFD_NONBLOCK
|SFD_CLOEXEC
);
474 if (m
->signal_fd
< 0)
477 r
= sd_event_add_io(m
->event
, &m
->signal_event_source
, m
->signal_fd
, EPOLLIN
, manager_dispatch_signal_fd
, m
);
481 (void) sd_event_source_set_description(m
->signal_event_source
, "manager-signal");
483 /* Process signals a bit earlier than the rest of things, but
484 * later than notify_fd processing, so that the notify
485 * processing can still figure out to which process/service a
486 * message belongs, before we reap the process. */
487 r
= sd_event_source_set_priority(m
->signal_event_source
, -5);
491 if (m
->running_as
== MANAGER_SYSTEM
)
492 return enable_special_signals(m
);
497 static void manager_clean_environment(Manager
*m
) {
500 /* Let's remove some environment variables that we
501 * need ourselves to communicate with our clients */
515 static int manager_default_environment(Manager
*m
) {
518 if (m
->running_as
== MANAGER_SYSTEM
) {
519 /* The system manager always starts with a clean
520 * environment for its children. It does not import
521 * the kernel or the parents exported variables.
523 * The initial passed environ is untouched to keep
524 * /proc/self/environ valid; it is used for tagging
525 * the init process inside containers. */
526 m
->environment
= strv_new("PATH=" DEFAULT_PATH
,
529 /* Import locale variables LC_*= from configuration */
530 locale_setup(&m
->environment
);
532 /* The user manager passes its own environment
533 * along to its children. */
534 m
->environment
= strv_copy(environ
);
540 manager_clean_environment(m
);
541 strv_sort(m
->environment
);
547 int manager_new(ManagerRunningAs running_as
, bool test_run
, Manager
**_m
) {
549 static const char * const unit_log_fields
[_MANAGER_RUNNING_AS_MAX
] = {
550 [MANAGER_SYSTEM
] = "UNIT=",
551 [MANAGER_USER
] = "USER_UNIT=",
554 static const char * const unit_log_format_strings
[_MANAGER_RUNNING_AS_MAX
] = {
555 [MANAGER_SYSTEM
] = "UNIT=%s",
556 [MANAGER_USER
] = "USER_UNIT=%s",
563 assert(running_as
>= 0);
564 assert(running_as
< _MANAGER_RUNNING_AS_MAX
);
566 m
= new0(Manager
, 1);
571 if (running_as
== MANAGER_SYSTEM
&& detect_container() <= 0)
572 boot_timestamps(&m
->userspace_timestamp
, &m
->firmware_timestamp
, &m
->loader_timestamp
);
575 m
->running_as
= running_as
;
576 m
->exit_code
= _MANAGER_EXIT_CODE_INVALID
;
577 m
->default_timer_accuracy_usec
= USEC_PER_MINUTE
;
579 /* Prepare log fields we can use for structured logging */
580 m
->unit_log_field
= unit_log_fields
[running_as
];
581 m
->unit_log_format_string
= unit_log_format_strings
[running_as
];
583 m
->idle_pipe
[0] = m
->idle_pipe
[1] = m
->idle_pipe
[2] = m
->idle_pipe
[3] = -1;
585 m
->pin_cgroupfs_fd
= m
->notify_fd
= m
->signal_fd
= m
->time_change_fd
=
586 m
->dev_autofs_fd
= m
->private_listen_fd
= m
->kdbus_fd
= m
->cgroup_inotify_fd
= -1;
588 m
->current_job_id
= 1; /* start as id #1, so that we can leave #0 around as "null-like" value */
590 m
->ask_password_inotify_fd
= -1;
591 m
->have_ask_password
= -EINVAL
; /* we don't know */
594 m
->cgroup_netclass_registry_last
= CGROUP_NETCLASS_FIXED_MAX
;
596 m
->test_run
= test_run
;
598 /* Reboot immediately if the user hits C-A-D more often than 7x per 2s */
599 RATELIMIT_INIT(m
->ctrl_alt_del_ratelimit
, 2 * USEC_PER_SEC
, 7);
601 r
= manager_default_environment(m
);
605 r
= hashmap_ensure_allocated(&m
->units
, &string_hash_ops
);
609 r
= hashmap_ensure_allocated(&m
->jobs
, NULL
);
613 r
= hashmap_ensure_allocated(&m
->cgroup_unit
, &string_hash_ops
);
617 r
= hashmap_ensure_allocated(&m
->watch_bus
, &string_hash_ops
);
621 r
= sd_event_default(&m
->event
);
625 r
= sd_event_add_defer(m
->event
, &m
->run_queue_event_source
, manager_dispatch_run_queue
, m
);
629 r
= sd_event_source_set_priority(m
->run_queue_event_source
, SD_EVENT_PRIORITY_IDLE
);
633 r
= sd_event_source_set_enabled(m
->run_queue_event_source
, SD_EVENT_OFF
);
637 (void) sd_event_source_set_description(m
->run_queue_event_source
, "manager-run-queue");
639 r
= manager_setup_signals(m
);
643 r
= manager_setup_cgroup(m
);
647 r
= manager_setup_time_change(m
);
651 m
->udev
= udev_new();
657 /* Note that we set up neither kdbus, nor the notify fd
658 * here. We do that after deserialization, since they might
659 * have gotten serialized across the reexec. */
661 m
->taint_usr
= dir_is_empty("/usr") > 0;
671 static int manager_setup_notify(Manager
*m
) {
677 if (m
->notify_fd
< 0) {
678 _cleanup_close_
int fd
= -1;
679 union sockaddr_union sa
= {
680 .sa
.sa_family
= AF_UNIX
,
682 static const int one
= 1;
684 /* First free all secondary fields */
685 m
->notify_socket
= mfree(m
->notify_socket
);
686 m
->notify_event_source
= sd_event_source_unref(m
->notify_event_source
);
688 fd
= socket(AF_UNIX
, SOCK_DGRAM
|SOCK_CLOEXEC
|SOCK_NONBLOCK
, 0);
690 return log_error_errno(errno
, "Failed to allocate notification socket: %m");
692 if (m
->running_as
== MANAGER_SYSTEM
)
693 m
->notify_socket
= strdup("/run/systemd/notify");
697 e
= getenv("XDG_RUNTIME_DIR");
699 log_error_errno(errno
, "XDG_RUNTIME_DIR is not set: %m");
703 m
->notify_socket
= strappend(e
, "/systemd/notify");
705 if (!m
->notify_socket
)
708 (void) mkdir_parents_label(m
->notify_socket
, 0755);
709 (void) unlink(m
->notify_socket
);
711 strncpy(sa
.un
.sun_path
, m
->notify_socket
, sizeof(sa
.un
.sun_path
)-1);
712 r
= bind(fd
, &sa
.sa
, offsetof(struct sockaddr_un
, sun_path
) + strlen(sa
.un
.sun_path
));
714 return log_error_errno(errno
, "bind(%s) failed: %m", sa
.un
.sun_path
);
716 r
= setsockopt(fd
, SOL_SOCKET
, SO_PASSCRED
, &one
, sizeof(one
));
718 return log_error_errno(errno
, "SO_PASSCRED failed: %m");
723 log_debug("Using notification socket %s", m
->notify_socket
);
726 if (!m
->notify_event_source
) {
727 r
= sd_event_add_io(m
->event
, &m
->notify_event_source
, m
->notify_fd
, EPOLLIN
, manager_dispatch_notify_fd
, m
);
729 return log_error_errno(r
, "Failed to allocate notify event source: %m");
731 /* Process signals a bit earlier than SIGCHLD, so that we can
732 * still identify to which service an exit message belongs */
733 r
= sd_event_source_set_priority(m
->notify_event_source
, -7);
735 return log_error_errno(r
, "Failed to set priority of notify event source: %m");
737 (void) sd_event_source_set_description(m
->notify_event_source
, "manager-notify");
743 static int manager_setup_kdbus(Manager
*m
) {
744 _cleanup_free_
char *p
= NULL
;
748 if (m
->test_run
|| m
->kdbus_fd
>= 0)
750 if (!is_kdbus_available())
751 return -ESOCKTNOSUPPORT
;
753 m
->kdbus_fd
= bus_kernel_create_bus(
754 m
->running_as
== MANAGER_SYSTEM
? "system" : "user",
755 m
->running_as
== MANAGER_SYSTEM
, &p
);
758 return log_debug_errno(m
->kdbus_fd
, "Failed to set up kdbus: %m");
760 log_debug("Successfully set up kdbus on %s", p
);
765 static int manager_connect_bus(Manager
*m
, bool reexecuting
) {
766 bool try_bus_connect
;
776 (m
->running_as
== MANAGER_USER
&& getenv("DBUS_SESSION_BUS_ADDRESS"));
778 /* Try to connect to the buses, if possible. */
779 return bus_init(m
, try_bus_connect
);
782 static unsigned manager_dispatch_cleanup_queue(Manager
*m
) {
788 while ((u
= m
->cleanup_queue
)) {
789 assert(u
->in_cleanup_queue
);
799 GC_OFFSET_IN_PATH
, /* This one is on the path we were traveling */
800 GC_OFFSET_UNSURE
, /* No clue */
801 GC_OFFSET_GOOD
, /* We still need this unit */
802 GC_OFFSET_BAD
, /* We don't need this unit anymore */
806 static void unit_gc_sweep(Unit
*u
, unsigned gc_marker
) {
813 if (u
->gc_marker
== gc_marker
+ GC_OFFSET_GOOD
||
814 u
->gc_marker
== gc_marker
+ GC_OFFSET_BAD
||
815 u
->gc_marker
== gc_marker
+ GC_OFFSET_IN_PATH
)
818 if (u
->in_cleanup_queue
)
821 if (unit_check_gc(u
))
824 u
->gc_marker
= gc_marker
+ GC_OFFSET_IN_PATH
;
828 SET_FOREACH(other
, u
->dependencies
[UNIT_REFERENCED_BY
], i
) {
829 unit_gc_sweep(other
, gc_marker
);
831 if (other
->gc_marker
== gc_marker
+ GC_OFFSET_GOOD
)
834 if (other
->gc_marker
!= gc_marker
+ GC_OFFSET_BAD
)
841 /* We were unable to find anything out about this entry, so
842 * let's investigate it later */
843 u
->gc_marker
= gc_marker
+ GC_OFFSET_UNSURE
;
844 unit_add_to_gc_queue(u
);
848 /* We definitely know that this one is not useful anymore, so
849 * let's mark it for deletion */
850 u
->gc_marker
= gc_marker
+ GC_OFFSET_BAD
;
851 unit_add_to_cleanup_queue(u
);
855 u
->gc_marker
= gc_marker
+ GC_OFFSET_GOOD
;
858 static unsigned manager_dispatch_gc_queue(Manager
*m
) {
865 /* log_debug("Running GC..."); */
867 m
->gc_marker
+= _GC_OFFSET_MAX
;
868 if (m
->gc_marker
+ _GC_OFFSET_MAX
<= _GC_OFFSET_MAX
)
871 gc_marker
= m
->gc_marker
;
873 while ((u
= m
->gc_queue
)) {
874 assert(u
->in_gc_queue
);
876 unit_gc_sweep(u
, gc_marker
);
878 LIST_REMOVE(gc_queue
, m
->gc_queue
, u
);
879 u
->in_gc_queue
= false;
883 if (u
->gc_marker
== gc_marker
+ GC_OFFSET_BAD
||
884 u
->gc_marker
== gc_marker
+ GC_OFFSET_UNSURE
) {
886 log_unit_debug(u
, "Collecting.");
887 u
->gc_marker
= gc_marker
+ GC_OFFSET_BAD
;
888 unit_add_to_cleanup_queue(u
);
892 m
->n_in_gc_queue
= 0;
897 static void manager_clear_jobs_and_units(Manager
*m
) {
902 while ((u
= hashmap_first(m
->units
)))
905 manager_dispatch_cleanup_queue(m
);
907 assert(!m
->load_queue
);
908 assert(!m
->run_queue
);
909 assert(!m
->dbus_unit_queue
);
910 assert(!m
->dbus_job_queue
);
911 assert(!m
->cleanup_queue
);
912 assert(!m
->gc_queue
);
914 assert(hashmap_isempty(m
->jobs
));
915 assert(hashmap_isempty(m
->units
));
918 m
->n_running_jobs
= 0;
921 Manager
* manager_free(Manager
*m
) {
928 manager_clear_jobs_and_units(m
);
930 for (c
= 0; c
< _UNIT_TYPE_MAX
; c
++)
931 if (unit_vtable
[c
]->shutdown
)
932 unit_vtable
[c
]->shutdown(m
);
934 /* If we reexecute ourselves, we keep the root cgroup
936 manager_shutdown_cgroup(m
, m
->exit_code
!= MANAGER_REEXECUTE
);
938 manager_undo_generators(m
);
942 hashmap_free(m
->units
);
943 hashmap_free(m
->jobs
);
944 hashmap_free(m
->watch_pids1
);
945 hashmap_free(m
->watch_pids2
);
946 hashmap_free(m
->watch_bus
);
948 set_free(m
->startup_units
);
949 set_free(m
->failed_units
);
951 sd_event_source_unref(m
->signal_event_source
);
952 sd_event_source_unref(m
->notify_event_source
);
953 sd_event_source_unref(m
->time_change_event_source
);
954 sd_event_source_unref(m
->jobs_in_progress_event_source
);
955 sd_event_source_unref(m
->run_queue_event_source
);
957 safe_close(m
->signal_fd
);
958 safe_close(m
->notify_fd
);
959 safe_close(m
->time_change_fd
);
960 safe_close(m
->kdbus_fd
);
962 manager_close_ask_password(m
);
964 manager_close_idle_pipe(m
);
967 sd_event_unref(m
->event
);
969 free(m
->notify_socket
);
971 lookup_paths_free(&m
->lookup_paths
);
972 strv_free(m
->environment
);
974 hashmap_free(m
->cgroup_unit
);
975 set_free_free(m
->unit_path_cache
);
977 hashmap_free(m
->cgroup_netclass_registry
);
979 free(m
->switch_root
);
980 free(m
->switch_root_init
);
982 for (i
= 0; i
< _RLIMIT_MAX
; i
++)
985 assert(hashmap_isempty(m
->units_requiring_mounts_for
));
986 hashmap_free(m
->units_requiring_mounts_for
);
992 int manager_enumerate(Manager
*m
) {
998 /* Let's ask every type to load all units from disk/kernel
999 * that it might know */
1000 for (c
= 0; c
< _UNIT_TYPE_MAX
; c
++) {
1003 if (!unit_type_supported(c
)) {
1004 log_debug("Unit type .%s is not supported on this system.", unit_type_to_string(c
));
1008 if (!unit_vtable
[c
]->enumerate
)
1011 q
= unit_vtable
[c
]->enumerate(m
);
1016 manager_dispatch_load_queue(m
);
1020 static void manager_coldplug(Manager
*m
) {
1028 /* Then, let's set up their initial state. */
1029 HASHMAP_FOREACH_KEY(u
, k
, m
->units
, i
) {
1031 /* ignore aliases */
1035 r
= unit_coldplug(u
);
1037 log_warning_errno(r
, "We couldn't coldplug %s, proceeding anyway: %m", u
->id
);
1041 static void manager_build_unit_path_cache(Manager
*m
) {
1043 _cleanup_closedir_
DIR *d
= NULL
;
1048 set_free_free(m
->unit_path_cache
);
1050 m
->unit_path_cache
= set_new(&string_hash_ops
);
1051 if (!m
->unit_path_cache
) {
1052 log_error("Failed to allocate unit path cache.");
1056 /* This simply builds a list of files we know exist, so that
1057 * we don't always have to go to disk */
1059 STRV_FOREACH(i
, m
->lookup_paths
.unit_path
) {
1064 if (errno
!= ENOENT
)
1065 log_error_errno(errno
, "Failed to open directory %s: %m", *i
);
1069 while ((de
= readdir(d
))) {
1072 if (hidden_file(de
->d_name
))
1075 p
= strjoin(streq(*i
, "/") ? "" : *i
, "/", de
->d_name
, NULL
);
1081 r
= set_consume(m
->unit_path_cache
, p
);
1086 d
= safe_closedir(d
);
1092 log_error_errno(r
, "Failed to build unit path cache: %m");
1094 set_free_free(m
->unit_path_cache
);
1095 m
->unit_path_cache
= NULL
;
1099 static int manager_distribute_fds(Manager
*m
, FDSet
*fds
) {
1106 HASHMAP_FOREACH(u
, m
->units
, i
) {
1108 if (fdset_size(fds
) <= 0)
1111 if (UNIT_VTABLE(u
)->distribute_fds
) {
1112 r
= UNIT_VTABLE(u
)->distribute_fds(u
, fds
);
1121 int manager_startup(Manager
*m
, FILE *serialization
, FDSet
*fds
) {
1126 dual_timestamp_get(&m
->generators_start_timestamp
);
1127 r
= manager_run_generators(m
);
1128 dual_timestamp_get(&m
->generators_finish_timestamp
);
1132 r
= lookup_paths_init(
1133 &m
->lookup_paths
, m
->running_as
, true,
1135 m
->generator_unit_path
,
1136 m
->generator_unit_path_early
,
1137 m
->generator_unit_path_late
);
1141 manager_build_unit_path_cache(m
);
1143 /* If we will deserialize make sure that during enumeration
1144 * this is already known, so we increase the counter here
1149 /* First, enumerate what we can from all config files */
1150 dual_timestamp_get(&m
->units_load_start_timestamp
);
1151 r
= manager_enumerate(m
);
1152 dual_timestamp_get(&m
->units_load_finish_timestamp
);
1154 /* Second, deserialize if there is something to deserialize */
1156 r
= manager_deserialize(m
, serialization
, fds
);
1158 /* Any fds left? Find some unit which wants them. This is
1159 * useful to allow container managers to pass some file
1160 * descriptors to us pre-initialized. This enables
1161 * socket-based activation of entire containers. */
1162 if (fdset_size(fds
) > 0) {
1163 q
= manager_distribute_fds(m
, fds
);
1164 if (q
< 0 && r
== 0)
1168 /* We might have deserialized the notify fd, but if we didn't
1169 * then let's create the bus now */
1170 q
= manager_setup_notify(m
);
1171 if (q
< 0 && r
== 0)
1174 /* We might have deserialized the kdbus control fd, but if we
1175 * didn't, then let's create the bus now. */
1176 manager_setup_kdbus(m
);
1177 manager_connect_bus(m
, !!serialization
);
1178 bus_track_coldplug(m
, &m
->subscribed
, &m
->deserialized_subscribed
);
1180 /* Third, fire things up! */
1181 manager_coldplug(m
);
1183 if (serialization
) {
1184 assert(m
->n_reloading
> 0);
1187 /* Let's wait for the UnitNew/JobNew messages being
1188 * sent, before we notify that the reload is
1190 m
->send_reloading_done
= true;
1196 int manager_add_job(Manager
*m
, JobType type
, Unit
*unit
, JobMode mode
, bool override
, sd_bus_error
*e
, Job
**_ret
) {
1201 assert(type
< _JOB_TYPE_MAX
);
1203 assert(mode
< _JOB_MODE_MAX
);
1205 if (mode
== JOB_ISOLATE
&& type
!= JOB_START
)
1206 return sd_bus_error_setf(e
, SD_BUS_ERROR_INVALID_ARGS
, "Isolate is only valid for start.");
1208 if (mode
== JOB_ISOLATE
&& !unit
->allow_isolate
)
1209 return sd_bus_error_setf(e
, BUS_ERROR_NO_ISOLATION
, "Operation refused, unit may not be isolated.");
1211 log_unit_debug(unit
, "Trying to enqueue job %s/%s/%s", unit
->id
, job_type_to_string(type
), job_mode_to_string(mode
));
1213 type
= job_type_collapse(type
, unit
);
1215 tr
= transaction_new(mode
== JOB_REPLACE_IRREVERSIBLY
);
1219 r
= transaction_add_job_and_dependencies(tr
, type
, unit
, NULL
, true, override
, false,
1220 mode
== JOB_IGNORE_DEPENDENCIES
|| mode
== JOB_IGNORE_REQUIREMENTS
,
1221 mode
== JOB_IGNORE_DEPENDENCIES
, e
);
1225 if (mode
== JOB_ISOLATE
) {
1226 r
= transaction_add_isolate_jobs(tr
, m
);
1231 r
= transaction_activate(tr
, m
, mode
, e
);
1235 log_unit_debug(unit
,
1236 "Enqueued job %s/%s as %u", unit
->id
,
1237 job_type_to_string(type
), (unsigned) tr
->anchor_job
->id
);
1240 *_ret
= tr
->anchor_job
;
1242 transaction_free(tr
);
1246 transaction_abort(tr
);
1247 transaction_free(tr
);
1251 int manager_add_job_by_name(Manager
*m
, JobType type
, const char *name
, JobMode mode
, bool override
, sd_bus_error
*e
, Job
**_ret
) {
1256 assert(type
< _JOB_TYPE_MAX
);
1258 assert(mode
< _JOB_MODE_MAX
);
1260 r
= manager_load_unit(m
, name
, NULL
, NULL
, &unit
);
1264 return manager_add_job(m
, type
, unit
, mode
, override
, e
, _ret
);
1267 Job
*manager_get_job(Manager
*m
, uint32_t id
) {
1270 return hashmap_get(m
->jobs
, UINT32_TO_PTR(id
));
1273 Unit
*manager_get_unit(Manager
*m
, const char *name
) {
1277 return hashmap_get(m
->units
, name
);
1280 unsigned manager_dispatch_load_queue(Manager
*m
) {
1286 /* Make sure we are not run recursively */
1287 if (m
->dispatching_load_queue
)
1290 m
->dispatching_load_queue
= true;
1292 /* Dispatches the load queue. Takes a unit from the queue and
1293 * tries to load its data until the queue is empty */
1295 while ((u
= m
->load_queue
)) {
1296 assert(u
->in_load_queue
);
1302 m
->dispatching_load_queue
= false;
1306 int manager_load_unit_prepare(
1318 assert(name
|| path
);
1320 /* This will prepare the unit for loading, but not actually
1321 * load anything from disk. */
1323 if (path
&& !is_path(path
))
1324 return sd_bus_error_setf(e
, SD_BUS_ERROR_INVALID_ARGS
, "Path %s is not absolute.", path
);
1327 name
= basename(path
);
1329 t
= unit_name_to_type(name
);
1331 if (t
== _UNIT_TYPE_INVALID
|| !unit_name_is_valid(name
, UNIT_NAME_PLAIN
|UNIT_NAME_INSTANCE
))
1332 return sd_bus_error_setf(e
, SD_BUS_ERROR_INVALID_ARGS
, "Unit name %s is not valid.", name
);
1334 ret
= manager_get_unit(m
, name
);
1340 ret
= unit_new(m
, unit_vtable
[t
]->object_size
);
1345 ret
->fragment_path
= strdup(path
);
1346 if (!ret
->fragment_path
) {
1352 r
= unit_add_name(ret
, name
);
1358 unit_add_to_load_queue(ret
);
1359 unit_add_to_dbus_queue(ret
);
1360 unit_add_to_gc_queue(ret
);
1368 int manager_load_unit(
1379 /* This will load the service information files, but not actually
1380 * start any services or anything. */
1382 r
= manager_load_unit_prepare(m
, name
, path
, e
, _ret
);
1386 manager_dispatch_load_queue(m
);
1389 *_ret
= unit_follow_merge(*_ret
);
1394 void manager_dump_jobs(Manager
*s
, FILE *f
, const char *prefix
) {
1401 HASHMAP_FOREACH(j
, s
->jobs
, i
)
1402 job_dump(j
, f
, prefix
);
1405 void manager_dump_units(Manager
*s
, FILE *f
, const char *prefix
) {
1413 HASHMAP_FOREACH_KEY(u
, t
, s
->units
, i
)
1415 unit_dump(u
, f
, prefix
);
1418 void manager_clear_jobs(Manager
*m
) {
1423 while ((j
= hashmap_first(m
->jobs
)))
1424 /* No need to recurse. We're cancelling all jobs. */
1425 job_finish_and_invalidate(j
, JOB_CANCELED
, false);
1428 static int manager_dispatch_run_queue(sd_event_source
*source
, void *userdata
) {
1429 Manager
*m
= userdata
;
1435 while ((j
= m
->run_queue
)) {
1436 assert(j
->installed
);
1437 assert(j
->in_run_queue
);
1439 job_run_and_invalidate(j
);
1442 if (m
->n_running_jobs
> 0)
1443 manager_watch_jobs_in_progress(m
);
1445 if (m
->n_on_console
> 0)
1446 manager_watch_idle_pipe(m
);
1451 static unsigned manager_dispatch_dbus_queue(Manager
*m
) {
1458 if (m
->dispatching_dbus_queue
)
1461 m
->dispatching_dbus_queue
= true;
1463 while ((u
= m
->dbus_unit_queue
)) {
1464 assert(u
->in_dbus_queue
);
1466 bus_unit_send_change_signal(u
);
1470 while ((j
= m
->dbus_job_queue
)) {
1471 assert(j
->in_dbus_queue
);
1473 bus_job_send_change_signal(j
);
1477 m
->dispatching_dbus_queue
= false;
1479 if (m
->send_reloading_done
) {
1480 m
->send_reloading_done
= false;
1482 bus_manager_send_reloading(m
, false);
1485 if (m
->queued_message
)
1486 bus_send_queued_message(m
);
1491 static void manager_invoke_notify_message(Manager
*m
, Unit
*u
, pid_t pid
, const char *buf
, size_t n
, FDSet
*fds
) {
1492 _cleanup_strv_free_
char **tags
= NULL
;
1499 tags
= strv_split(buf
, "\n\r");
1505 if (UNIT_VTABLE(u
)->notify_message
)
1506 UNIT_VTABLE(u
)->notify_message(u
, pid
, tags
, fds
);
1508 log_unit_debug(u
, "Got notification message for unit. Ignoring.");
1511 static int manager_dispatch_notify_fd(sd_event_source
*source
, int fd
, uint32_t revents
, void *userdata
) {
1512 _cleanup_fdset_free_ FDSet
*fds
= NULL
;
1513 Manager
*m
= userdata
;
1515 char buf
[NOTIFY_BUFFER_MAX
+1];
1516 struct iovec iovec
= {
1518 .iov_len
= sizeof(buf
)-1,
1521 struct cmsghdr cmsghdr
;
1522 uint8_t buf
[CMSG_SPACE(sizeof(struct ucred
)) +
1523 CMSG_SPACE(sizeof(int) * NOTIFY_FD_MAX
)];
1525 struct msghdr msghdr
= {
1528 .msg_control
= &control
,
1529 .msg_controllen
= sizeof(control
),
1532 struct cmsghdr
*cmsg
;
1533 struct ucred
*ucred
= NULL
;
1536 int r
, *fd_array
= NULL
;
1541 assert(m
->notify_fd
== fd
);
1543 if (revents
!= EPOLLIN
) {
1544 log_warning("Got unexpected poll event for notify fd.");
1548 n
= recvmsg(m
->notify_fd
, &msghdr
, MSG_DONTWAIT
|MSG_CMSG_CLOEXEC
);
1550 if (errno
== EAGAIN
|| errno
== EINTR
)
1556 CMSG_FOREACH(cmsg
, &msghdr
) {
1557 if (cmsg
->cmsg_level
== SOL_SOCKET
&& cmsg
->cmsg_type
== SCM_RIGHTS
) {
1559 fd_array
= (int*) CMSG_DATA(cmsg
);
1560 n_fds
= (cmsg
->cmsg_len
- CMSG_LEN(0)) / sizeof(int);
1562 } else if (cmsg
->cmsg_level
== SOL_SOCKET
&&
1563 cmsg
->cmsg_type
== SCM_CREDENTIALS
&&
1564 cmsg
->cmsg_len
== CMSG_LEN(sizeof(struct ucred
))) {
1566 ucred
= (struct ucred
*) CMSG_DATA(cmsg
);
1573 r
= fdset_new_array(&fds
, fd_array
, n_fds
);
1575 close_many(fd_array
, n_fds
);
1580 if (!ucred
|| ucred
->pid
<= 0) {
1581 log_warning("Received notify message without valid credentials. Ignoring.");
1585 if ((size_t) n
>= sizeof(buf
)) {
1586 log_warning("Received notify message exceeded maximum size. Ignoring.");
1592 /* Notify every unit that might be interested, but try
1593 * to avoid notifying the same one multiple times. */
1594 u1
= manager_get_unit_by_pid_cgroup(m
, ucred
->pid
);
1596 manager_invoke_notify_message(m
, u1
, ucred
->pid
, buf
, n
, fds
);
1600 u2
= hashmap_get(m
->watch_pids1
, PID_TO_PTR(ucred
->pid
));
1601 if (u2
&& u2
!= u1
) {
1602 manager_invoke_notify_message(m
, u2
, ucred
->pid
, buf
, n
, fds
);
1606 u3
= hashmap_get(m
->watch_pids2
, PID_TO_PTR(ucred
->pid
));
1607 if (u3
&& u3
!= u2
&& u3
!= u1
) {
1608 manager_invoke_notify_message(m
, u3
, ucred
->pid
, buf
, n
, fds
);
1613 log_warning("Cannot find unit for notify message of PID "PID_FMT
".", ucred
->pid
);
1615 if (fdset_size(fds
) > 0)
1616 log_warning("Got auxiliary fds with notification message, closing all.");
1621 static void invoke_sigchld_event(Manager
*m
, Unit
*u
, const siginfo_t
*si
) {
1626 log_unit_debug(u
, "Child "PID_FMT
" belongs to %s", si
->si_pid
, u
->id
);
1628 unit_unwatch_pid(u
, si
->si_pid
);
1629 UNIT_VTABLE(u
)->sigchld_event(u
, si
->si_pid
, si
->si_code
, si
->si_status
);
1632 static int manager_dispatch_sigchld(Manager
*m
) {
1638 /* First we call waitd() for a PID and do not reap the
1639 * zombie. That way we can still access /proc/$PID for
1640 * it while it is a zombie. */
1641 if (waitid(P_ALL
, 0, &si
, WEXITED
|WNOHANG
|WNOWAIT
) < 0) {
1643 if (errno
== ECHILD
)
1655 if (si
.si_code
== CLD_EXITED
|| si
.si_code
== CLD_KILLED
|| si
.si_code
== CLD_DUMPED
) {
1656 _cleanup_free_
char *name
= NULL
;
1659 get_process_comm(si
.si_pid
, &name
);
1661 log_debug("Child "PID_FMT
" (%s) died (code=%s, status=%i/%s)",
1662 si
.si_pid
, strna(name
),
1663 sigchld_code_to_string(si
.si_code
),
1665 strna(si
.si_code
== CLD_EXITED
1666 ? exit_status_to_string(si
.si_status
, EXIT_STATUS_FULL
)
1667 : signal_to_string(si
.si_status
)));
1669 /* And now figure out the unit this belongs
1670 * to, it might be multiple... */
1671 u1
= manager_get_unit_by_pid_cgroup(m
, si
.si_pid
);
1673 invoke_sigchld_event(m
, u1
, &si
);
1674 u2
= hashmap_get(m
->watch_pids1
, PID_TO_PTR(si
.si_pid
));
1676 invoke_sigchld_event(m
, u2
, &si
);
1677 u3
= hashmap_get(m
->watch_pids2
, PID_TO_PTR(si
.si_pid
));
1678 if (u3
&& u3
!= u2
&& u3
!= u1
)
1679 invoke_sigchld_event(m
, u3
, &si
);
1682 /* And now, we actually reap the zombie. */
1683 if (waitid(P_PID
, si
.si_pid
, &si
, WEXITED
) < 0) {
1694 static int manager_start_target(Manager
*m
, const char *name
, JobMode mode
) {
1695 _cleanup_bus_error_free_ sd_bus_error error
= SD_BUS_ERROR_NULL
;
1698 log_debug("Activating special unit %s", name
);
1700 r
= manager_add_job_by_name(m
, JOB_START
, name
, mode
, true, &error
, NULL
);
1702 log_error("Failed to enqueue %s job: %s", name
, bus_error_message(&error
, r
));
1707 static int manager_dispatch_signal_fd(sd_event_source
*source
, int fd
, uint32_t revents
, void *userdata
) {
1708 Manager
*m
= userdata
;
1710 struct signalfd_siginfo sfsi
;
1711 bool sigchld
= false;
1715 assert(m
->signal_fd
== fd
);
1717 if (revents
!= EPOLLIN
) {
1718 log_warning("Got unexpected events from signal file descriptor.");
1723 n
= read(m
->signal_fd
, &sfsi
, sizeof(sfsi
));
1724 if (n
!= sizeof(sfsi
)) {
1729 if (errno
== EINTR
|| errno
== EAGAIN
)
1735 log_received_signal(sfsi
.ssi_signo
== SIGCHLD
||
1736 (sfsi
.ssi_signo
== SIGTERM
&& m
->running_as
== MANAGER_USER
)
1737 ? LOG_DEBUG
: LOG_INFO
,
1740 switch (sfsi
.ssi_signo
) {
1747 if (m
->running_as
== MANAGER_SYSTEM
) {
1748 /* This is for compatibility with the
1749 * original sysvinit */
1750 m
->exit_code
= MANAGER_REEXECUTE
;
1757 if (m
->running_as
== MANAGER_SYSTEM
) {
1759 /* If the user presses C-A-D more than
1760 * 7 times within 2s, we reboot
1763 if (ratelimit_test(&m
->ctrl_alt_del_ratelimit
))
1764 manager_start_target(m
, SPECIAL_CTRL_ALT_DEL_TARGET
, JOB_REPLACE_IRREVERSIBLY
);
1766 log_notice("Ctrl-Alt-Del was pressed more than 7 times within 2s, rebooting immediately.");
1767 status_printf(NULL
, true, false, "Ctrl-Alt-Del was pressed more than 7 times within 2s, rebooting immediately.");
1768 m
->exit_code
= MANAGER_REBOOT
;
1774 /* Run the exit target if there is one, if not, just exit. */
1775 if (manager_start_target(m
, SPECIAL_EXIT_TARGET
, JOB_REPLACE
) < 0) {
1776 m
->exit_code
= MANAGER_EXIT
;
1783 if (m
->running_as
== MANAGER_SYSTEM
)
1784 manager_start_target(m
, SPECIAL_KBREQUEST_TARGET
, JOB_REPLACE
);
1786 /* This is a nop on non-init */
1790 if (m
->running_as
== MANAGER_SYSTEM
)
1791 manager_start_target(m
, SPECIAL_SIGPWR_TARGET
, JOB_REPLACE
);
1793 /* This is a nop on non-init */
1799 u
= manager_get_unit(m
, SPECIAL_DBUS_SERVICE
);
1801 if (!u
|| UNIT_IS_ACTIVE_OR_RELOADING(unit_active_state(u
))) {
1802 log_info("Trying to reconnect to bus...");
1806 if (!u
|| !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u
))) {
1807 log_info("Loading D-Bus service...");
1808 manager_start_target(m
, SPECIAL_DBUS_SERVICE
, JOB_REPLACE
);
1815 _cleanup_free_
char *dump
= NULL
;
1816 _cleanup_fclose_
FILE *f
= NULL
;
1819 f
= open_memstream(&dump
, &size
);
1821 log_warning_errno(errno
, "Failed to allocate memory stream: %m");
1825 manager_dump_units(m
, f
, "\t");
1826 manager_dump_jobs(m
, f
, "\t");
1828 r
= fflush_and_check(f
);
1830 log_warning_errno(r
, "Failed to write status stream: %m");
1834 log_dump(LOG_INFO
, dump
);
1839 m
->exit_code
= MANAGER_RELOAD
;
1844 /* Starting SIGRTMIN+0 */
1845 static const char * const target_table
[] = {
1846 [0] = SPECIAL_DEFAULT_TARGET
,
1847 [1] = SPECIAL_RESCUE_TARGET
,
1848 [2] = SPECIAL_EMERGENCY_TARGET
,
1849 [3] = SPECIAL_HALT_TARGET
,
1850 [4] = SPECIAL_POWEROFF_TARGET
,
1851 [5] = SPECIAL_REBOOT_TARGET
,
1852 [6] = SPECIAL_KEXEC_TARGET
1855 /* Starting SIGRTMIN+13, so that target halt and system halt are 10 apart */
1856 static const ManagerExitCode code_table
[] = {
1858 [1] = MANAGER_POWEROFF
,
1859 [2] = MANAGER_REBOOT
,
1863 if ((int) sfsi
.ssi_signo
>= SIGRTMIN
+0 &&
1864 (int) sfsi
.ssi_signo
< SIGRTMIN
+(int) ELEMENTSOF(target_table
)) {
1865 int idx
= (int) sfsi
.ssi_signo
- SIGRTMIN
;
1866 manager_start_target(m
, target_table
[idx
],
1867 (idx
== 1 || idx
== 2) ? JOB_ISOLATE
: JOB_REPLACE
);
1871 if ((int) sfsi
.ssi_signo
>= SIGRTMIN
+13 &&
1872 (int) sfsi
.ssi_signo
< SIGRTMIN
+13+(int) ELEMENTSOF(code_table
)) {
1873 m
->exit_code
= code_table
[sfsi
.ssi_signo
- SIGRTMIN
- 13];
1877 switch (sfsi
.ssi_signo
- SIGRTMIN
) {
1880 log_debug("Enabling showing of status.");
1881 manager_set_show_status(m
, SHOW_STATUS_YES
);
1885 log_debug("Disabling showing of status.");
1886 manager_set_show_status(m
, SHOW_STATUS_NO
);
1890 log_set_max_level(LOG_DEBUG
);
1891 log_notice("Setting log level to debug.");
1895 log_set_max_level(LOG_INFO
);
1896 log_notice("Setting log level to info.");
1900 if (m
->running_as
== MANAGER_USER
) {
1901 m
->exit_code
= MANAGER_EXIT
;
1905 /* This is a nop on init */
1909 case 29: /* compatibility: used to be mapped to LOG_TARGET_SYSLOG_OR_KMSG */
1910 log_set_target(LOG_TARGET_JOURNAL_OR_KMSG
);
1911 log_notice("Setting log target to journal-or-kmsg.");
1915 log_set_target(LOG_TARGET_CONSOLE
);
1916 log_notice("Setting log target to console.");
1920 log_set_target(LOG_TARGET_KMSG
);
1921 log_notice("Setting log target to kmsg.");
1925 log_warning("Got unhandled signal <%s>.", signal_to_string(sfsi
.ssi_signo
));
1932 manager_dispatch_sigchld(m
);
1937 static int manager_dispatch_time_change_fd(sd_event_source
*source
, int fd
, uint32_t revents
, void *userdata
) {
1938 Manager
*m
= userdata
;
1943 assert(m
->time_change_fd
== fd
);
1945 log_struct(LOG_INFO
,
1946 LOG_MESSAGE_ID(SD_MESSAGE_TIME_CHANGE
),
1947 LOG_MESSAGE("Time has been changed"),
1950 /* Restart the watch */
1951 m
->time_change_event_source
= sd_event_source_unref(m
->time_change_event_source
);
1952 m
->time_change_fd
= safe_close(m
->time_change_fd
);
1954 manager_setup_time_change(m
);
1956 HASHMAP_FOREACH(u
, m
->units
, i
)
1957 if (UNIT_VTABLE(u
)->time_change
)
1958 UNIT_VTABLE(u
)->time_change(u
);
1963 static int manager_dispatch_idle_pipe_fd(sd_event_source
*source
, int fd
, uint32_t revents
, void *userdata
) {
1964 Manager
*m
= userdata
;
1967 assert(m
->idle_pipe
[2] == fd
);
1969 m
->no_console_output
= m
->n_on_console
> 0;
1971 manager_close_idle_pipe(m
);
1976 static int manager_dispatch_jobs_in_progress(sd_event_source
*source
, usec_t usec
, void *userdata
) {
1977 Manager
*m
= userdata
;
1984 manager_print_jobs_in_progress(m
);
1986 next
= now(CLOCK_MONOTONIC
) + JOBS_IN_PROGRESS_PERIOD_USEC
;
1987 r
= sd_event_source_set_time(source
, next
);
1991 return sd_event_source_set_enabled(source
, SD_EVENT_ONESHOT
);
1994 int manager_loop(Manager
*m
) {
1997 RATELIMIT_DEFINE(rl
, 1*USEC_PER_SEC
, 50000);
2000 m
->exit_code
= MANAGER_OK
;
2002 /* Release the path cache */
2003 m
->unit_path_cache
= set_free_free(m
->unit_path_cache
);
2005 manager_check_finished(m
);
2007 /* There might still be some zombies hanging around from
2008 * before we were exec()'ed. Let's reap them. */
2009 r
= manager_dispatch_sigchld(m
);
2013 while (m
->exit_code
== MANAGER_OK
) {
2016 if (m
->runtime_watchdog
> 0 && m
->running_as
== MANAGER_SYSTEM
)
2019 if (!ratelimit_test(&rl
)) {
2020 /* Yay, something is going seriously wrong, pause a little */
2021 log_warning("Looping too fast. Throttling execution a little.");
2026 if (manager_dispatch_load_queue(m
) > 0)
2029 if (manager_dispatch_gc_queue(m
) > 0)
2032 if (manager_dispatch_cleanup_queue(m
) > 0)
2035 if (manager_dispatch_cgroup_queue(m
) > 0)
2038 if (manager_dispatch_dbus_queue(m
) > 0)
2041 /* Sleep for half the watchdog time */
2042 if (m
->runtime_watchdog
> 0 && m
->running_as
== MANAGER_SYSTEM
) {
2043 wait_usec
= m
->runtime_watchdog
/ 2;
2047 wait_usec
= USEC_INFINITY
;
2049 r
= sd_event_run(m
->event
, wait_usec
);
2051 return log_error_errno(r
, "Failed to run event loop: %m");
2054 return m
->exit_code
;
2057 int manager_load_unit_from_dbus_path(Manager
*m
, const char *s
, sd_bus_error
*e
, Unit
**_u
) {
2058 _cleanup_free_
char *n
= NULL
;
2066 r
= unit_name_from_dbus_path(s
, &n
);
2070 r
= manager_load_unit(m
, n
, NULL
, e
, &u
);
2079 int manager_get_job_from_dbus_path(Manager
*m
, const char *s
, Job
**_j
) {
2089 p
= startswith(s
, "/org/freedesktop/systemd1/job/");
2093 r
= safe_atou(p
, &id
);
2097 j
= manager_get_job(m
, id
);
2106 void manager_send_unit_audit(Manager
*m
, Unit
*u
, int type
, bool success
) {
2109 _cleanup_free_
char *p
= NULL
;
2113 if (m
->running_as
!= MANAGER_SYSTEM
)
2116 audit_fd
= get_audit_fd();
2120 /* Don't generate audit events if the service was already
2121 * started and we're just deserializing */
2122 if (m
->n_reloading
> 0)
2125 if (u
->type
!= UNIT_SERVICE
)
2128 r
= unit_name_to_prefix_and_instance(u
->id
, &p
);
2130 log_error_errno(r
, "Failed to extract prefix and instance of unit name: %m");
2134 msg
= strjoina("unit=", p
);
2135 if (audit_log_user_comm_message(audit_fd
, type
, msg
, "systemd", NULL
, NULL
, NULL
, success
) < 0) {
2137 /* We aren't allowed to send audit messages?
2138 * Then let's not retry again. */
2141 log_warning_errno(errno
, "Failed to send audit message: %m");
2147 void manager_send_unit_plymouth(Manager
*m
, Unit
*u
) {
2148 union sockaddr_union sa
= PLYMOUTH_SOCKET
;
2151 _cleanup_free_
char *message
= NULL
;
2152 _cleanup_close_
int fd
= -1;
2154 /* Don't generate plymouth events if the service was already
2155 * started and we're just deserializing */
2156 if (m
->n_reloading
> 0)
2159 if (m
->running_as
!= MANAGER_SYSTEM
)
2162 if (detect_container() > 0)
2165 if (u
->type
!= UNIT_SERVICE
&&
2166 u
->type
!= UNIT_MOUNT
&&
2167 u
->type
!= UNIT_SWAP
)
2170 /* We set SOCK_NONBLOCK here so that we rather drop the
2171 * message then wait for plymouth */
2172 fd
= socket(AF_UNIX
, SOCK_STREAM
|SOCK_CLOEXEC
|SOCK_NONBLOCK
, 0);
2174 log_error_errno(errno
, "socket() failed: %m");
2178 if (connect(fd
, &sa
.sa
, offsetof(struct sockaddr_un
, sun_path
) + 1 + strlen(sa
.un
.sun_path
+1)) < 0) {
2180 if (!IN_SET(errno
, EPIPE
, EAGAIN
, ENOENT
, ECONNREFUSED
, ECONNRESET
, ECONNABORTED
))
2181 log_error_errno(errno
, "connect() failed: %m");
2185 if (asprintf(&message
, "U\002%c%s%n", (int) (strlen(u
->id
) + 1), u
->id
, &n
) < 0) {
2191 if (write(fd
, message
, n
+ 1) != n
+ 1)
2192 if (!IN_SET(errno
, EPIPE
, EAGAIN
, ENOENT
, ECONNREFUSED
, ECONNRESET
, ECONNABORTED
))
2193 log_error_errno(errno
, "Failed to write Plymouth message: %m");
2196 int manager_open_serialization(Manager
*m
, FILE **_f
) {
2203 path
= m
->running_as
== MANAGER_SYSTEM
? "/run/systemd" : "/tmp";
2204 fd
= open_tmpfile(path
, O_RDWR
|O_CLOEXEC
);
2208 log_debug("Serializing state to %s", path
);
2210 f
= fdopen(fd
, "w+");
2221 int manager_serialize(Manager
*m
, FILE *f
, FDSet
*fds
, bool switching_root
) {
2234 fprintf(f
, "current-job-id=%"PRIu32
"\n", m
->current_job_id
);
2235 fprintf(f
, "taint-usr=%s\n", yes_no(m
->taint_usr
));
2236 fprintf(f
, "n-installed-jobs=%u\n", m
->n_installed_jobs
);
2237 fprintf(f
, "n-failed-jobs=%u\n", m
->n_failed_jobs
);
2239 dual_timestamp_serialize(f
, "firmware-timestamp", &m
->firmware_timestamp
);
2240 dual_timestamp_serialize(f
, "loader-timestamp", &m
->loader_timestamp
);
2241 dual_timestamp_serialize(f
, "kernel-timestamp", &m
->kernel_timestamp
);
2242 dual_timestamp_serialize(f
, "initrd-timestamp", &m
->initrd_timestamp
);
2245 dual_timestamp_serialize(f
, "userspace-timestamp", &m
->userspace_timestamp
);
2246 dual_timestamp_serialize(f
, "finish-timestamp", &m
->finish_timestamp
);
2247 dual_timestamp_serialize(f
, "security-start-timestamp", &m
->security_start_timestamp
);
2248 dual_timestamp_serialize(f
, "security-finish-timestamp", &m
->security_finish_timestamp
);
2249 dual_timestamp_serialize(f
, "generators-start-timestamp", &m
->generators_start_timestamp
);
2250 dual_timestamp_serialize(f
, "generators-finish-timestamp", &m
->generators_finish_timestamp
);
2251 dual_timestamp_serialize(f
, "units-load-start-timestamp", &m
->units_load_start_timestamp
);
2252 dual_timestamp_serialize(f
, "units-load-finish-timestamp", &m
->units_load_finish_timestamp
);
2255 if (!switching_root
) {
2256 STRV_FOREACH(e
, m
->environment
) {
2257 _cleanup_free_
char *ce
;
2263 fprintf(f
, "env=%s\n", *e
);
2267 if (m
->notify_fd
>= 0) {
2270 copy
= fdset_put_dup(fds
, m
->notify_fd
);
2274 fprintf(f
, "notify-fd=%i\n", copy
);
2275 fprintf(f
, "notify-socket=%s\n", m
->notify_socket
);
2278 if (m
->kdbus_fd
>= 0) {
2281 copy
= fdset_put_dup(fds
, m
->kdbus_fd
);
2285 fprintf(f
, "kdbus-fd=%i\n", copy
);
2288 bus_track_serialize(m
->subscribed
, f
);
2292 HASHMAP_FOREACH_KEY(u
, t
, m
->units
, i
) {
2300 r
= unit_serialize(u
, f
, fds
, !switching_root
);
2307 assert(m
->n_reloading
> 0);
2313 r
= bus_fdset_add_all(m
, fds
);
2320 int manager_deserialize(Manager
*m
, FILE *f
, FDSet
*fds
) {
2326 log_debug("Deserializing state...");
2331 char line
[LINE_MAX
], *l
;
2333 if (!fgets(line
, sizeof(line
), f
)) {
2348 if (startswith(l
, "current-job-id=")) {
2351 if (safe_atou32(l
+15, &id
) < 0)
2352 log_debug("Failed to parse current job id value %s", l
+15);
2354 m
->current_job_id
= MAX(m
->current_job_id
, id
);
2356 } else if (startswith(l
, "n-installed-jobs=")) {
2359 if (safe_atou32(l
+17, &n
) < 0)
2360 log_debug("Failed to parse installed jobs counter %s", l
+17);
2362 m
->n_installed_jobs
+= n
;
2364 } else if (startswith(l
, "n-failed-jobs=")) {
2367 if (safe_atou32(l
+14, &n
) < 0)
2368 log_debug("Failed to parse failed jobs counter %s", l
+14);
2370 m
->n_failed_jobs
+= n
;
2372 } else if (startswith(l
, "taint-usr=")) {
2375 b
= parse_boolean(l
+10);
2377 log_debug("Failed to parse taint /usr flag %s", l
+10);
2379 m
->taint_usr
= m
->taint_usr
|| b
;
2381 } else if (startswith(l
, "firmware-timestamp="))
2382 dual_timestamp_deserialize(l
+19, &m
->firmware_timestamp
);
2383 else if (startswith(l
, "loader-timestamp="))
2384 dual_timestamp_deserialize(l
+17, &m
->loader_timestamp
);
2385 else if (startswith(l
, "kernel-timestamp="))
2386 dual_timestamp_deserialize(l
+17, &m
->kernel_timestamp
);
2387 else if (startswith(l
, "initrd-timestamp="))
2388 dual_timestamp_deserialize(l
+17, &m
->initrd_timestamp
);
2389 else if (startswith(l
, "userspace-timestamp="))
2390 dual_timestamp_deserialize(l
+20, &m
->userspace_timestamp
);
2391 else if (startswith(l
, "finish-timestamp="))
2392 dual_timestamp_deserialize(l
+17, &m
->finish_timestamp
);
2393 else if (startswith(l
, "security-start-timestamp="))
2394 dual_timestamp_deserialize(l
+25, &m
->security_start_timestamp
);
2395 else if (startswith(l
, "security-finish-timestamp="))
2396 dual_timestamp_deserialize(l
+26, &m
->security_finish_timestamp
);
2397 else if (startswith(l
, "generators-start-timestamp="))
2398 dual_timestamp_deserialize(l
+27, &m
->generators_start_timestamp
);
2399 else if (startswith(l
, "generators-finish-timestamp="))
2400 dual_timestamp_deserialize(l
+28, &m
->generators_finish_timestamp
);
2401 else if (startswith(l
, "units-load-start-timestamp="))
2402 dual_timestamp_deserialize(l
+27, &m
->units_load_start_timestamp
);
2403 else if (startswith(l
, "units-load-finish-timestamp="))
2404 dual_timestamp_deserialize(l
+28, &m
->units_load_finish_timestamp
);
2405 else if (startswith(l
, "env=")) {
2406 _cleanup_free_
char *uce
= NULL
;
2409 r
= cunescape(l
+ 4, UNESCAPE_RELAX
, &uce
);
2413 e
= strv_env_set(m
->environment
, uce
);
2419 strv_free(m
->environment
);
2422 } else if (startswith(l
, "notify-fd=")) {
2425 if (safe_atoi(l
+ 10, &fd
) < 0 || fd
< 0 || !fdset_contains(fds
, fd
))
2426 log_debug("Failed to parse notify fd: %s", l
+ 10);
2428 m
->notify_event_source
= sd_event_source_unref(m
->notify_event_source
);
2429 safe_close(m
->notify_fd
);
2430 m
->notify_fd
= fdset_remove(fds
, fd
);
2433 } else if (startswith(l
, "notify-socket=")) {
2442 free(m
->notify_socket
);
2443 m
->notify_socket
= n
;
2445 } else if (startswith(l
, "kdbus-fd=")) {
2448 if (safe_atoi(l
+ 9, &fd
) < 0 || fd
< 0 || !fdset_contains(fds
, fd
))
2449 log_debug("Failed to parse kdbus fd: %s", l
+ 9);
2451 safe_close(m
->kdbus_fd
);
2452 m
->kdbus_fd
= fdset_remove(fds
, fd
);
2458 k
= bus_track_deserialize_item(&m
->deserialized_subscribed
, l
);
2460 log_debug_errno(k
, "Failed to deserialize bus tracker object: %m");
2462 log_debug("Unknown serialization item '%s'", l
);
2468 char name
[UNIT_NAME_MAX
+2];
2471 if (!fgets(name
, sizeof(name
), f
)) {
2482 r
= manager_load_unit(m
, strstrip(name
), NULL
, NULL
, &u
);
2486 r
= unit_deserialize(u
, f
, fds
);
2495 assert(m
->n_reloading
> 0);
2501 int manager_reload(Manager
*m
) {
2503 _cleanup_fclose_
FILE *f
= NULL
;
2504 _cleanup_fdset_free_ FDSet
*fds
= NULL
;
2508 r
= manager_open_serialization(m
, &f
);
2513 bus_manager_send_reloading(m
, true);
2521 r
= manager_serialize(m
, f
, fds
, false);
2527 if (fseeko(f
, 0, SEEK_SET
) < 0) {
2532 /* From here on there is no way back. */
2533 manager_clear_jobs_and_units(m
);
2534 manager_undo_generators(m
);
2535 lookup_paths_free(&m
->lookup_paths
);
2537 /* Find new unit paths */
2538 q
= manager_run_generators(m
);
2539 if (q
< 0 && r
>= 0)
2542 q
= lookup_paths_init(
2543 &m
->lookup_paths
, m
->running_as
, true,
2545 m
->generator_unit_path
,
2546 m
->generator_unit_path_early
,
2547 m
->generator_unit_path_late
);
2548 if (q
< 0 && r
>= 0)
2551 manager_build_unit_path_cache(m
);
2553 /* First, enumerate what we can from all config files */
2554 q
= manager_enumerate(m
);
2555 if (q
< 0 && r
>= 0)
2558 /* Second, deserialize our stored data */
2559 q
= manager_deserialize(m
, f
, fds
);
2560 if (q
< 0 && r
>= 0)
2566 /* Re-register notify_fd as event source */
2567 q
= manager_setup_notify(m
);
2568 if (q
< 0 && r
>= 0)
2571 /* Third, fire things up! */
2572 manager_coldplug(m
);
2574 assert(m
->n_reloading
> 0);
2577 m
->send_reloading_done
= true;
2582 bool manager_is_reloading_or_reexecuting(Manager
*m
) {
2585 return m
->n_reloading
!= 0;
2588 void manager_reset_failed(Manager
*m
) {
2594 HASHMAP_FOREACH(u
, m
->units
, i
)
2595 unit_reset_failed(u
);
2598 bool manager_unit_inactive_or_pending(Manager
*m
, const char *name
) {
2604 /* Returns true if the unit is inactive or going down */
2605 u
= manager_get_unit(m
, name
);
2609 return unit_inactive_or_pending(u
);
2612 static void manager_notify_finished(Manager
*m
) {
2613 char userspace
[FORMAT_TIMESPAN_MAX
], initrd
[FORMAT_TIMESPAN_MAX
], kernel
[FORMAT_TIMESPAN_MAX
], sum
[FORMAT_TIMESPAN_MAX
];
2614 usec_t firmware_usec
, loader_usec
, kernel_usec
, initrd_usec
, userspace_usec
, total_usec
;
2619 if (m
->running_as
== MANAGER_SYSTEM
&& detect_container() <= 0) {
2621 /* Note that m->kernel_usec.monotonic is always at 0,
2622 * and m->firmware_usec.monotonic and
2623 * m->loader_usec.monotonic should be considered
2624 * negative values. */
2626 firmware_usec
= m
->firmware_timestamp
.monotonic
- m
->loader_timestamp
.monotonic
;
2627 loader_usec
= m
->loader_timestamp
.monotonic
- m
->kernel_timestamp
.monotonic
;
2628 userspace_usec
= m
->finish_timestamp
.monotonic
- m
->userspace_timestamp
.monotonic
;
2629 total_usec
= m
->firmware_timestamp
.monotonic
+ m
->finish_timestamp
.monotonic
;
2631 if (dual_timestamp_is_set(&m
->initrd_timestamp
)) {
2633 kernel_usec
= m
->initrd_timestamp
.monotonic
- m
->kernel_timestamp
.monotonic
;
2634 initrd_usec
= m
->userspace_timestamp
.monotonic
- m
->initrd_timestamp
.monotonic
;
2636 log_struct(LOG_INFO
,
2637 LOG_MESSAGE_ID(SD_MESSAGE_STARTUP_FINISHED
),
2638 "KERNEL_USEC="USEC_FMT
, kernel_usec
,
2639 "INITRD_USEC="USEC_FMT
, initrd_usec
,
2640 "USERSPACE_USEC="USEC_FMT
, userspace_usec
,
2641 LOG_MESSAGE("Startup finished in %s (kernel) + %s (initrd) + %s (userspace) = %s.",
2642 format_timespan(kernel
, sizeof(kernel
), kernel_usec
, USEC_PER_MSEC
),
2643 format_timespan(initrd
, sizeof(initrd
), initrd_usec
, USEC_PER_MSEC
),
2644 format_timespan(userspace
, sizeof(userspace
), userspace_usec
, USEC_PER_MSEC
),
2645 format_timespan(sum
, sizeof(sum
), total_usec
, USEC_PER_MSEC
)),
2648 kernel_usec
= m
->userspace_timestamp
.monotonic
- m
->kernel_timestamp
.monotonic
;
2651 log_struct(LOG_INFO
,
2652 LOG_MESSAGE_ID(SD_MESSAGE_STARTUP_FINISHED
),
2653 "KERNEL_USEC="USEC_FMT
, kernel_usec
,
2654 "USERSPACE_USEC="USEC_FMT
, userspace_usec
,
2655 LOG_MESSAGE("Startup finished in %s (kernel) + %s (userspace) = %s.",
2656 format_timespan(kernel
, sizeof(kernel
), kernel_usec
, USEC_PER_MSEC
),
2657 format_timespan(userspace
, sizeof(userspace
), userspace_usec
, USEC_PER_MSEC
),
2658 format_timespan(sum
, sizeof(sum
), total_usec
, USEC_PER_MSEC
)),
2662 firmware_usec
= loader_usec
= initrd_usec
= kernel_usec
= 0;
2663 total_usec
= userspace_usec
= m
->finish_timestamp
.monotonic
- m
->userspace_timestamp
.monotonic
;
2665 log_struct(LOG_INFO
,
2666 LOG_MESSAGE_ID(SD_MESSAGE_STARTUP_FINISHED
),
2667 "USERSPACE_USEC="USEC_FMT
, userspace_usec
,
2668 LOG_MESSAGE("Startup finished in %s.",
2669 format_timespan(sum
, sizeof(sum
), total_usec
, USEC_PER_MSEC
)),
2673 bus_manager_send_finished(m
, firmware_usec
, loader_usec
, kernel_usec
, initrd_usec
, userspace_usec
, total_usec
);
2677 "STATUS=Startup finished in %s.",
2678 format_timespan(sum
, sizeof(sum
), total_usec
, USEC_PER_MSEC
));
2681 void manager_check_finished(Manager
*m
) {
2684 if (m
->n_reloading
> 0)
2687 /* Verify that we are actually running currently. Initially
2688 * the exit code is set to invalid, and during operation it is
2689 * then set to MANAGER_OK */
2690 if (m
->exit_code
!= MANAGER_OK
)
2693 if (hashmap_size(m
->jobs
) > 0) {
2694 if (m
->jobs_in_progress_event_source
)
2695 /* Ignore any failure, this is only for feedback */
2696 (void) sd_event_source_set_time(m
->jobs_in_progress_event_source
, now(CLOCK_MONOTONIC
) + JOBS_IN_PROGRESS_WAIT_USEC
);
2701 manager_flip_auto_status(m
, false);
2703 /* Notify Type=idle units that we are done now */
2704 manager_close_idle_pipe(m
);
2706 /* Turn off confirm spawn now */
2707 m
->confirm_spawn
= false;
2709 /* No need to update ask password status when we're going non-interactive */
2710 manager_close_ask_password(m
);
2712 /* This is no longer the first boot */
2713 manager_set_first_boot(m
, false);
2715 if (dual_timestamp_is_set(&m
->finish_timestamp
))
2718 dual_timestamp_get(&m
->finish_timestamp
);
2720 manager_notify_finished(m
);
2722 manager_invalidate_startup_units(m
);
2725 static int create_generator_dir(Manager
*m
, char **generator
, const char *name
) {
2736 if (m
->running_as
== MANAGER_SYSTEM
&& getpid() == 1) {
2737 /* systemd --system, not running --test */
2739 p
= strappend("/run/systemd/", name
);
2743 r
= mkdir_p_label(p
, 0755);
2745 log_error_errno(r
, "Failed to create generator directory %s: %m", p
);
2749 } else if (m
->running_as
== MANAGER_USER
) {
2750 const char *s
= NULL
;
2752 s
= getenv("XDG_RUNTIME_DIR");
2755 p
= strjoin(s
, "/systemd/", name
, NULL
);
2759 r
= mkdir_p_label(p
, 0755);
2761 log_error_errno(r
, "Failed to create generator directory %s: %m", p
);
2766 /* systemd --system --test */
2768 p
= strjoin("/tmp/systemd-", name
, ".XXXXXX", NULL
);
2773 log_error_errno(errno
, "Failed to create generator directory %s: %m", p
);
2783 static void trim_generator_dir(Manager
*m
, char **generator
) {
2790 if (rmdir(*generator
) >= 0)
2791 *generator
= mfree(*generator
);
2796 static int manager_run_generators(Manager
*m
) {
2797 _cleanup_strv_free_
char **paths
= NULL
;
2798 const char *argv
[5];
2807 paths
= generator_paths(m
->running_as
);
2811 /* Optimize by skipping the whole process by not creating output directories
2812 * if no generators are found. */
2813 STRV_FOREACH(path
, paths
) {
2814 r
= access(*path
, F_OK
);
2817 if (errno
!= ENOENT
)
2818 log_warning_errno(errno
, "Failed to open generator directory %s: %m", *path
);
2823 r
= create_generator_dir(m
, &m
->generator_unit_path
, "generator");
2827 r
= create_generator_dir(m
, &m
->generator_unit_path_early
, "generator.early");
2831 r
= create_generator_dir(m
, &m
->generator_unit_path_late
, "generator.late");
2835 argv
[0] = NULL
; /* Leave this empty, execute_directory() will fill something in */
2836 argv
[1] = m
->generator_unit_path
;
2837 argv
[2] = m
->generator_unit_path_early
;
2838 argv
[3] = m
->generator_unit_path_late
;
2841 RUN_WITH_UMASK(0022)
2842 execute_directories((const char* const*) paths
, DEFAULT_TIMEOUT_USEC
, (char**) argv
);
2845 trim_generator_dir(m
, &m
->generator_unit_path
);
2846 trim_generator_dir(m
, &m
->generator_unit_path_early
);
2847 trim_generator_dir(m
, &m
->generator_unit_path_late
);
2851 static void remove_generator_dir(Manager
*m
, char **generator
) {
2858 strv_remove(m
->lookup_paths
.unit_path
, *generator
);
2859 (void) rm_rf(*generator
, REMOVE_ROOT
);
2861 *generator
= mfree(*generator
);
2864 static void manager_undo_generators(Manager
*m
) {
2867 remove_generator_dir(m
, &m
->generator_unit_path
);
2868 remove_generator_dir(m
, &m
->generator_unit_path_early
);
2869 remove_generator_dir(m
, &m
->generator_unit_path_late
);
2872 int manager_environment_add(Manager
*m
, char **minus
, char **plus
) {
2873 char **a
= NULL
, **b
= NULL
, **l
;
2878 if (!strv_isempty(minus
)) {
2879 a
= strv_env_delete(l
, 1, minus
);
2886 if (!strv_isempty(plus
)) {
2887 b
= strv_env_merge(2, l
, plus
);
2896 if (m
->environment
!= l
)
2897 strv_free(m
->environment
);
2904 manager_clean_environment(m
);
2905 strv_sort(m
->environment
);
2910 int manager_set_default_rlimits(Manager
*m
, struct rlimit
**default_rlimit
) {
2915 for (i
= 0; i
< _RLIMIT_MAX
; i
++) {
2916 if (!default_rlimit
[i
])
2919 m
->rlimit
[i
] = newdup(struct rlimit
, default_rlimit
[i
], 1);
2927 void manager_recheck_journal(Manager
*m
) {
2932 if (m
->running_as
!= MANAGER_SYSTEM
)
2935 u
= manager_get_unit(m
, SPECIAL_JOURNALD_SOCKET
);
2936 if (u
&& SOCKET(u
)->state
!= SOCKET_RUNNING
) {
2937 log_close_journal();
2941 u
= manager_get_unit(m
, SPECIAL_JOURNALD_SERVICE
);
2942 if (u
&& SERVICE(u
)->state
!= SERVICE_RUNNING
) {
2943 log_close_journal();
2947 /* Hmm, OK, so the socket is fully up and the service is up
2948 * too, then let's make use of the thing. */
2952 void manager_set_show_status(Manager
*m
, ShowStatus mode
) {
2954 assert(IN_SET(mode
, SHOW_STATUS_AUTO
, SHOW_STATUS_NO
, SHOW_STATUS_YES
, SHOW_STATUS_TEMPORARY
));
2956 if (m
->running_as
!= MANAGER_SYSTEM
)
2959 m
->show_status
= mode
;
2962 (void) touch("/run/systemd/show-status");
2964 (void) unlink("/run/systemd/show-status");
2967 static bool manager_get_show_status(Manager
*m
, StatusType type
) {
2970 if (m
->running_as
!= MANAGER_SYSTEM
)
2973 if (m
->no_console_output
)
2976 if (!IN_SET(manager_state(m
), MANAGER_INITIALIZING
, MANAGER_STARTING
, MANAGER_STOPPING
))
2979 /* If we cannot find out the status properly, just proceed. */
2980 if (type
!= STATUS_TYPE_EMERGENCY
&& manager_check_ask_password(m
) > 0)
2983 if (m
->show_status
> 0)
2989 void manager_set_first_boot(Manager
*m
, bool b
) {
2992 if (m
->running_as
!= MANAGER_SYSTEM
)
2995 if (m
->first_boot
!= (int) b
) {
2997 (void) touch("/run/systemd/first-boot");
2999 (void) unlink("/run/systemd/first-boot");
3005 void manager_status_printf(Manager
*m
, StatusType type
, const char *status
, const char *format
, ...) {
3008 /* If m is NULL, assume we're after shutdown and let the messages through. */
3010 if (m
&& !manager_get_show_status(m
, type
))
3013 /* XXX We should totally drop the check for ephemeral here
3014 * and thus effectively make 'Type=idle' pointless. */
3015 if (type
== STATUS_TYPE_EPHEMERAL
&& m
&& m
->n_on_console
> 0)
3018 va_start(ap
, format
);
3019 status_vprintf(status
, true, type
== STATUS_TYPE_EPHEMERAL
, format
, ap
);
3023 Set
*manager_get_units_requiring_mounts_for(Manager
*m
, const char *path
) {
3024 char p
[strlen(path
)+1];
3030 path_kill_slashes(p
);
3032 return hashmap_get(m
->units_requiring_mounts_for
, streq(p
, "/") ? "" : p
);
3035 const char *manager_get_runtime_prefix(Manager
*m
) {
3038 return m
->running_as
== MANAGER_SYSTEM
?
3040 getenv("XDG_RUNTIME_DIR");
3043 int manager_update_failed_units(Manager
*m
, Unit
*u
, bool failed
) {
3048 assert(u
->manager
== m
);
3050 size
= set_size(m
->failed_units
);
3053 r
= set_ensure_allocated(&m
->failed_units
, NULL
);
3057 if (set_put(m
->failed_units
, u
) < 0)
3060 (void) set_remove(m
->failed_units
, u
);
3062 if (set_size(m
->failed_units
) != size
)
3063 bus_manager_send_change_signal(m
);
3068 ManagerState
manager_state(Manager
*m
) {
3073 /* Did we ever finish booting? If not then we are still starting up */
3074 if (!dual_timestamp_is_set(&m
->finish_timestamp
)) {
3076 u
= manager_get_unit(m
, SPECIAL_BASIC_TARGET
);
3077 if (!u
|| !UNIT_IS_ACTIVE_OR_RELOADING(unit_active_state(u
)))
3078 return MANAGER_INITIALIZING
;
3080 return MANAGER_STARTING
;
3083 /* Is the special shutdown target queued? If so, we are in shutdown state */
3084 u
= manager_get_unit(m
, SPECIAL_SHUTDOWN_TARGET
);
3085 if (u
&& u
->job
&& IN_SET(u
->job
->type
, JOB_START
, JOB_RESTART
, JOB_TRY_RESTART
, JOB_RELOAD_OR_START
))
3086 return MANAGER_STOPPING
;
3088 /* Are the rescue or emergency targets active or queued? If so we are in maintenance state */
3089 u
= manager_get_unit(m
, SPECIAL_RESCUE_TARGET
);
3090 if (u
&& (UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u
)) ||
3091 (u
->job
&& IN_SET(u
->job
->type
, JOB_START
, JOB_RESTART
, JOB_TRY_RESTART
, JOB_RELOAD_OR_START
))))
3092 return MANAGER_MAINTENANCE
;
3094 u
= manager_get_unit(m
, SPECIAL_EMERGENCY_TARGET
);
3095 if (u
&& (UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u
)) ||
3096 (u
->job
&& IN_SET(u
->job
->type
, JOB_START
, JOB_RESTART
, JOB_TRY_RESTART
, JOB_RELOAD_OR_START
))))
3097 return MANAGER_MAINTENANCE
;
3099 /* Are there any failed units? If so, we are in degraded mode */
3100 if (set_size(m
->failed_units
) > 0)
3101 return MANAGER_DEGRADED
;
3103 return MANAGER_RUNNING
;
3106 static const char *const manager_state_table
[_MANAGER_STATE_MAX
] = {
3107 [MANAGER_INITIALIZING
] = "initializing",
3108 [MANAGER_STARTING
] = "starting",
3109 [MANAGER_RUNNING
] = "running",
3110 [MANAGER_DEGRADED
] = "degraded",
3111 [MANAGER_MAINTENANCE
] = "maintenance",
3112 [MANAGER_STOPPING
] = "stopping",
3115 DEFINE_STRING_TABLE_LOOKUP(manager_state
, ManagerState
);