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
, 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 Manager
*m
= userdata
;
1517 assert(m
->notify_fd
== fd
);
1519 if (revents
!= EPOLLIN
) {
1520 log_warning("Got unexpected poll event for notify fd.");
1525 _cleanup_fdset_free_ FDSet
*fds
= NULL
;
1526 char buf
[NOTIFY_BUFFER_MAX
+1];
1527 struct iovec iovec
= {
1529 .iov_len
= sizeof(buf
)-1,
1532 struct cmsghdr cmsghdr
;
1533 uint8_t buf
[CMSG_SPACE(sizeof(struct ucred
)) +
1534 CMSG_SPACE(sizeof(int) * NOTIFY_FD_MAX
)];
1536 struct msghdr msghdr
= {
1539 .msg_control
= &control
,
1540 .msg_controllen
= sizeof(control
),
1542 struct cmsghdr
*cmsg
;
1543 struct ucred
*ucred
= NULL
;
1546 int *fd_array
= NULL
;
1549 n
= recvmsg(m
->notify_fd
, &msghdr
, MSG_DONTWAIT
|MSG_CMSG_CLOEXEC
);
1551 if (errno
== EAGAIN
|| errno
== EINTR
)
1557 CMSG_FOREACH(cmsg
, &msghdr
) {
1558 if (cmsg
->cmsg_level
== SOL_SOCKET
&& cmsg
->cmsg_type
== SCM_RIGHTS
) {
1560 fd_array
= (int*) CMSG_DATA(cmsg
);
1561 n_fds
= (cmsg
->cmsg_len
- CMSG_LEN(0)) / sizeof(int);
1563 } else if (cmsg
->cmsg_level
== SOL_SOCKET
&&
1564 cmsg
->cmsg_type
== SCM_CREDENTIALS
&&
1565 cmsg
->cmsg_len
== CMSG_LEN(sizeof(struct ucred
))) {
1567 ucred
= (struct ucred
*) CMSG_DATA(cmsg
);
1574 r
= fdset_new_array(&fds
, fd_array
, n_fds
);
1576 close_many(fd_array
, n_fds
);
1581 if (!ucred
|| ucred
->pid
<= 0) {
1582 log_warning("Received notify message without valid credentials. Ignoring.");
1586 if ((size_t) n
>= sizeof(buf
)) {
1587 log_warning("Received notify message exceeded maximum size. Ignoring.");
1593 /* Notify every unit that might be interested, but try
1594 * to avoid notifying the same one multiple times. */
1595 u1
= manager_get_unit_by_pid_cgroup(m
, ucred
->pid
);
1597 manager_invoke_notify_message(m
, u1
, ucred
->pid
, buf
, n
, fds
);
1601 u2
= hashmap_get(m
->watch_pids1
, PID_TO_PTR(ucred
->pid
));
1602 if (u2
&& u2
!= u1
) {
1603 manager_invoke_notify_message(m
, u2
, ucred
->pid
, buf
, n
, fds
);
1607 u3
= hashmap_get(m
->watch_pids2
, PID_TO_PTR(ucred
->pid
));
1608 if (u3
&& u3
!= u2
&& u3
!= u1
) {
1609 manager_invoke_notify_message(m
, u3
, ucred
->pid
, buf
, n
, fds
);
1614 log_warning("Cannot find unit for notify message of PID "PID_FMT
".", ucred
->pid
);
1616 if (fdset_size(fds
) > 0)
1617 log_warning("Got auxiliary fds with notification message, closing all.");
1623 static void invoke_sigchld_event(Manager
*m
, Unit
*u
, siginfo_t
*si
) {
1628 log_unit_debug(u
, "Child "PID_FMT
" belongs to %s", si
->si_pid
, u
->id
);
1630 unit_unwatch_pid(u
, si
->si_pid
);
1631 UNIT_VTABLE(u
)->sigchld_event(u
, si
->si_pid
, si
->si_code
, si
->si_status
);
1634 static int manager_dispatch_sigchld(Manager
*m
) {
1640 /* First we call waitd() for a PID and do not reap the
1641 * zombie. That way we can still access /proc/$PID for
1642 * it while it is a zombie. */
1643 if (waitid(P_ALL
, 0, &si
, WEXITED
|WNOHANG
|WNOWAIT
) < 0) {
1645 if (errno
== ECHILD
)
1657 if (si
.si_code
== CLD_EXITED
|| si
.si_code
== CLD_KILLED
|| si
.si_code
== CLD_DUMPED
) {
1658 _cleanup_free_
char *name
= NULL
;
1661 get_process_comm(si
.si_pid
, &name
);
1663 log_debug("Child "PID_FMT
" (%s) died (code=%s, status=%i/%s)",
1664 si
.si_pid
, strna(name
),
1665 sigchld_code_to_string(si
.si_code
),
1667 strna(si
.si_code
== CLD_EXITED
1668 ? exit_status_to_string(si
.si_status
, EXIT_STATUS_FULL
)
1669 : signal_to_string(si
.si_status
)));
1671 /* And now figure out the unit this belongs
1672 * to, it might be multiple... */
1673 u1
= manager_get_unit_by_pid_cgroup(m
, si
.si_pid
);
1675 invoke_sigchld_event(m
, u1
, &si
);
1676 u2
= hashmap_get(m
->watch_pids1
, PID_TO_PTR(si
.si_pid
));
1678 invoke_sigchld_event(m
, u2
, &si
);
1679 u3
= hashmap_get(m
->watch_pids2
, PID_TO_PTR(si
.si_pid
));
1680 if (u3
&& u3
!= u2
&& u3
!= u1
)
1681 invoke_sigchld_event(m
, u3
, &si
);
1684 /* And now, we actually reap the zombie. */
1685 if (waitid(P_PID
, si
.si_pid
, &si
, WEXITED
) < 0) {
1696 static int manager_start_target(Manager
*m
, const char *name
, JobMode mode
) {
1697 _cleanup_bus_error_free_ sd_bus_error error
= SD_BUS_ERROR_NULL
;
1700 log_debug("Activating special unit %s", name
);
1702 r
= manager_add_job_by_name(m
, JOB_START
, name
, mode
, true, &error
, NULL
);
1704 log_error("Failed to enqueue %s job: %s", name
, bus_error_message(&error
, r
));
1709 static int manager_dispatch_signal_fd(sd_event_source
*source
, int fd
, uint32_t revents
, void *userdata
) {
1710 Manager
*m
= userdata
;
1712 struct signalfd_siginfo sfsi
;
1713 bool sigchld
= false;
1717 assert(m
->signal_fd
== fd
);
1719 if (revents
!= EPOLLIN
) {
1720 log_warning("Got unexpected events from signal file descriptor.");
1725 n
= read(m
->signal_fd
, &sfsi
, sizeof(sfsi
));
1726 if (n
!= sizeof(sfsi
)) {
1731 if (errno
== EINTR
|| errno
== EAGAIN
)
1737 log_received_signal(sfsi
.ssi_signo
== SIGCHLD
||
1738 (sfsi
.ssi_signo
== SIGTERM
&& m
->running_as
== MANAGER_USER
)
1739 ? LOG_DEBUG
: LOG_INFO
,
1742 switch (sfsi
.ssi_signo
) {
1749 if (m
->running_as
== MANAGER_SYSTEM
) {
1750 /* This is for compatibility with the
1751 * original sysvinit */
1752 m
->exit_code
= MANAGER_REEXECUTE
;
1759 if (m
->running_as
== MANAGER_SYSTEM
) {
1761 /* If the user presses C-A-D more than
1762 * 7 times within 2s, we reboot
1765 if (ratelimit_test(&m
->ctrl_alt_del_ratelimit
))
1766 manager_start_target(m
, SPECIAL_CTRL_ALT_DEL_TARGET
, JOB_REPLACE_IRREVERSIBLY
);
1768 log_notice("Ctrl-Alt-Del was pressed more than 7 times within 2s, rebooting immediately.");
1769 status_printf(NULL
, true, false, "Ctrl-Alt-Del was pressed more than 7 times within 2s, rebooting immediately.");
1770 m
->exit_code
= MANAGER_REBOOT
;
1776 /* Run the exit target if there is one, if not, just exit. */
1777 if (manager_start_target(m
, SPECIAL_EXIT_TARGET
, JOB_REPLACE
) < 0) {
1778 m
->exit_code
= MANAGER_EXIT
;
1785 if (m
->running_as
== MANAGER_SYSTEM
)
1786 manager_start_target(m
, SPECIAL_KBREQUEST_TARGET
, JOB_REPLACE
);
1788 /* This is a nop on non-init */
1792 if (m
->running_as
== MANAGER_SYSTEM
)
1793 manager_start_target(m
, SPECIAL_SIGPWR_TARGET
, JOB_REPLACE
);
1795 /* This is a nop on non-init */
1801 u
= manager_get_unit(m
, SPECIAL_DBUS_SERVICE
);
1803 if (!u
|| UNIT_IS_ACTIVE_OR_RELOADING(unit_active_state(u
))) {
1804 log_info("Trying to reconnect to bus...");
1808 if (!u
|| !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u
))) {
1809 log_info("Loading D-Bus service...");
1810 manager_start_target(m
, SPECIAL_DBUS_SERVICE
, JOB_REPLACE
);
1817 _cleanup_free_
char *dump
= NULL
;
1818 _cleanup_fclose_
FILE *f
= NULL
;
1821 f
= open_memstream(&dump
, &size
);
1823 log_warning_errno(errno
, "Failed to allocate memory stream: %m");
1827 manager_dump_units(m
, f
, "\t");
1828 manager_dump_jobs(m
, f
, "\t");
1830 r
= fflush_and_check(f
);
1832 log_warning_errno(r
, "Failed to write status stream: %m");
1836 log_dump(LOG_INFO
, dump
);
1841 m
->exit_code
= MANAGER_RELOAD
;
1846 /* Starting SIGRTMIN+0 */
1847 static const char * const target_table
[] = {
1848 [0] = SPECIAL_DEFAULT_TARGET
,
1849 [1] = SPECIAL_RESCUE_TARGET
,
1850 [2] = SPECIAL_EMERGENCY_TARGET
,
1851 [3] = SPECIAL_HALT_TARGET
,
1852 [4] = SPECIAL_POWEROFF_TARGET
,
1853 [5] = SPECIAL_REBOOT_TARGET
,
1854 [6] = SPECIAL_KEXEC_TARGET
1857 /* Starting SIGRTMIN+13, so that target halt and system halt are 10 apart */
1858 static const ManagerExitCode code_table
[] = {
1860 [1] = MANAGER_POWEROFF
,
1861 [2] = MANAGER_REBOOT
,
1865 if ((int) sfsi
.ssi_signo
>= SIGRTMIN
+0 &&
1866 (int) sfsi
.ssi_signo
< SIGRTMIN
+(int) ELEMENTSOF(target_table
)) {
1867 int idx
= (int) sfsi
.ssi_signo
- SIGRTMIN
;
1868 manager_start_target(m
, target_table
[idx
],
1869 (idx
== 1 || idx
== 2) ? JOB_ISOLATE
: JOB_REPLACE
);
1873 if ((int) sfsi
.ssi_signo
>= SIGRTMIN
+13 &&
1874 (int) sfsi
.ssi_signo
< SIGRTMIN
+13+(int) ELEMENTSOF(code_table
)) {
1875 m
->exit_code
= code_table
[sfsi
.ssi_signo
- SIGRTMIN
- 13];
1879 switch (sfsi
.ssi_signo
- SIGRTMIN
) {
1882 log_debug("Enabling showing of status.");
1883 manager_set_show_status(m
, SHOW_STATUS_YES
);
1887 log_debug("Disabling showing of status.");
1888 manager_set_show_status(m
, SHOW_STATUS_NO
);
1892 log_set_max_level(LOG_DEBUG
);
1893 log_notice("Setting log level to debug.");
1897 log_set_max_level(LOG_INFO
);
1898 log_notice("Setting log level to info.");
1902 if (m
->running_as
== MANAGER_USER
) {
1903 m
->exit_code
= MANAGER_EXIT
;
1907 /* This is a nop on init */
1911 case 29: /* compatibility: used to be mapped to LOG_TARGET_SYSLOG_OR_KMSG */
1912 log_set_target(LOG_TARGET_JOURNAL_OR_KMSG
);
1913 log_notice("Setting log target to journal-or-kmsg.");
1917 log_set_target(LOG_TARGET_CONSOLE
);
1918 log_notice("Setting log target to console.");
1922 log_set_target(LOG_TARGET_KMSG
);
1923 log_notice("Setting log target to kmsg.");
1927 log_warning("Got unhandled signal <%s>.", signal_to_string(sfsi
.ssi_signo
));
1934 manager_dispatch_sigchld(m
);
1939 static int manager_dispatch_time_change_fd(sd_event_source
*source
, int fd
, uint32_t revents
, void *userdata
) {
1940 Manager
*m
= userdata
;
1945 assert(m
->time_change_fd
== fd
);
1947 log_struct(LOG_INFO
,
1948 LOG_MESSAGE_ID(SD_MESSAGE_TIME_CHANGE
),
1949 LOG_MESSAGE("Time has been changed"),
1952 /* Restart the watch */
1953 m
->time_change_event_source
= sd_event_source_unref(m
->time_change_event_source
);
1954 m
->time_change_fd
= safe_close(m
->time_change_fd
);
1956 manager_setup_time_change(m
);
1958 HASHMAP_FOREACH(u
, m
->units
, i
)
1959 if (UNIT_VTABLE(u
)->time_change
)
1960 UNIT_VTABLE(u
)->time_change(u
);
1965 static int manager_dispatch_idle_pipe_fd(sd_event_source
*source
, int fd
, uint32_t revents
, void *userdata
) {
1966 Manager
*m
= userdata
;
1969 assert(m
->idle_pipe
[2] == fd
);
1971 m
->no_console_output
= m
->n_on_console
> 0;
1973 manager_close_idle_pipe(m
);
1978 static int manager_dispatch_jobs_in_progress(sd_event_source
*source
, usec_t usec
, void *userdata
) {
1979 Manager
*m
= userdata
;
1986 manager_print_jobs_in_progress(m
);
1988 next
= now(CLOCK_MONOTONIC
) + JOBS_IN_PROGRESS_PERIOD_USEC
;
1989 r
= sd_event_source_set_time(source
, next
);
1993 return sd_event_source_set_enabled(source
, SD_EVENT_ONESHOT
);
1996 int manager_loop(Manager
*m
) {
1999 RATELIMIT_DEFINE(rl
, 1*USEC_PER_SEC
, 50000);
2002 m
->exit_code
= MANAGER_OK
;
2004 /* Release the path cache */
2005 set_free_free(m
->unit_path_cache
);
2006 m
->unit_path_cache
= NULL
;
2008 manager_check_finished(m
);
2010 /* There might still be some zombies hanging around from
2011 * before we were exec()'ed. Let's reap them. */
2012 r
= manager_dispatch_sigchld(m
);
2016 while (m
->exit_code
== MANAGER_OK
) {
2019 if (m
->runtime_watchdog
> 0 && m
->running_as
== MANAGER_SYSTEM
)
2022 if (!ratelimit_test(&rl
)) {
2023 /* Yay, something is going seriously wrong, pause a little */
2024 log_warning("Looping too fast. Throttling execution a little.");
2029 if (manager_dispatch_load_queue(m
) > 0)
2032 if (manager_dispatch_gc_queue(m
) > 0)
2035 if (manager_dispatch_cleanup_queue(m
) > 0)
2038 if (manager_dispatch_cgroup_queue(m
) > 0)
2041 if (manager_dispatch_dbus_queue(m
) > 0)
2044 /* Sleep for half the watchdog time */
2045 if (m
->runtime_watchdog
> 0 && m
->running_as
== MANAGER_SYSTEM
) {
2046 wait_usec
= m
->runtime_watchdog
/ 2;
2050 wait_usec
= USEC_INFINITY
;
2052 r
= sd_event_run(m
->event
, wait_usec
);
2054 return log_error_errno(r
, "Failed to run event loop: %m");
2057 return m
->exit_code
;
2060 int manager_load_unit_from_dbus_path(Manager
*m
, const char *s
, sd_bus_error
*e
, Unit
**_u
) {
2061 _cleanup_free_
char *n
= NULL
;
2069 r
= unit_name_from_dbus_path(s
, &n
);
2073 r
= manager_load_unit(m
, n
, NULL
, e
, &u
);
2082 int manager_get_job_from_dbus_path(Manager
*m
, const char *s
, Job
**_j
) {
2092 p
= startswith(s
, "/org/freedesktop/systemd1/job/");
2096 r
= safe_atou(p
, &id
);
2100 j
= manager_get_job(m
, id
);
2109 void manager_send_unit_audit(Manager
*m
, Unit
*u
, int type
, bool success
) {
2112 _cleanup_free_
char *p
= NULL
;
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 (m
->running_as
!= MANAGER_SYSTEM
)
2128 if (u
->type
!= UNIT_SERVICE
)
2131 r
= unit_name_to_prefix_and_instance(u
->id
, &p
);
2133 log_error_errno(r
, "Failed to extract prefix and instance of unit name: %m");
2137 msg
= strjoina("unit=", p
);
2138 if (audit_log_user_comm_message(audit_fd
, type
, msg
, "systemd", NULL
, NULL
, NULL
, success
) < 0) {
2140 /* We aren't allowed to send audit messages?
2141 * Then let's not retry again. */
2144 log_warning_errno(errno
, "Failed to send audit message: %m");
2150 void manager_send_unit_plymouth(Manager
*m
, Unit
*u
) {
2151 union sockaddr_union sa
= PLYMOUTH_SOCKET
;
2154 _cleanup_free_
char *message
= NULL
;
2155 _cleanup_close_
int fd
= -1;
2157 /* Don't generate plymouth events if the service was already
2158 * started and we're just deserializing */
2159 if (m
->n_reloading
> 0)
2162 if (m
->running_as
!= MANAGER_SYSTEM
)
2165 if (detect_container() > 0)
2168 if (u
->type
!= UNIT_SERVICE
&&
2169 u
->type
!= UNIT_MOUNT
&&
2170 u
->type
!= UNIT_SWAP
)
2173 /* We set SOCK_NONBLOCK here so that we rather drop the
2174 * message then wait for plymouth */
2175 fd
= socket(AF_UNIX
, SOCK_STREAM
|SOCK_CLOEXEC
|SOCK_NONBLOCK
, 0);
2177 log_error_errno(errno
, "socket() failed: %m");
2181 if (connect(fd
, &sa
.sa
, offsetof(struct sockaddr_un
, sun_path
) + 1 + strlen(sa
.un
.sun_path
+1)) < 0) {
2183 if (!IN_SET(errno
, EPIPE
, EAGAIN
, ENOENT
, ECONNREFUSED
, ECONNRESET
, ECONNABORTED
))
2184 log_error_errno(errno
, "connect() failed: %m");
2188 if (asprintf(&message
, "U\002%c%s%n", (int) (strlen(u
->id
) + 1), u
->id
, &n
) < 0) {
2194 if (write(fd
, message
, n
+ 1) != n
+ 1)
2195 if (!IN_SET(errno
, EPIPE
, EAGAIN
, ENOENT
, ECONNREFUSED
, ECONNRESET
, ECONNABORTED
))
2196 log_error_errno(errno
, "Failed to write Plymouth message: %m");
2199 int manager_open_serialization(Manager
*m
, FILE **_f
) {
2206 path
= m
->running_as
== MANAGER_SYSTEM
? "/run/systemd" : "/tmp";
2207 fd
= open_tmpfile(path
, O_RDWR
|O_CLOEXEC
);
2211 log_debug("Serializing state to %s", path
);
2213 f
= fdopen(fd
, "w+");
2224 int manager_serialize(Manager
*m
, FILE *f
, FDSet
*fds
, bool switching_root
) {
2237 fprintf(f
, "current-job-id=%"PRIu32
"\n", m
->current_job_id
);
2238 fprintf(f
, "taint-usr=%s\n", yes_no(m
->taint_usr
));
2239 fprintf(f
, "n-installed-jobs=%u\n", m
->n_installed_jobs
);
2240 fprintf(f
, "n-failed-jobs=%u\n", m
->n_failed_jobs
);
2242 dual_timestamp_serialize(f
, "firmware-timestamp", &m
->firmware_timestamp
);
2243 dual_timestamp_serialize(f
, "loader-timestamp", &m
->loader_timestamp
);
2244 dual_timestamp_serialize(f
, "kernel-timestamp", &m
->kernel_timestamp
);
2245 dual_timestamp_serialize(f
, "initrd-timestamp", &m
->initrd_timestamp
);
2248 dual_timestamp_serialize(f
, "userspace-timestamp", &m
->userspace_timestamp
);
2249 dual_timestamp_serialize(f
, "finish-timestamp", &m
->finish_timestamp
);
2250 dual_timestamp_serialize(f
, "security-start-timestamp", &m
->security_start_timestamp
);
2251 dual_timestamp_serialize(f
, "security-finish-timestamp", &m
->security_finish_timestamp
);
2252 dual_timestamp_serialize(f
, "generators-start-timestamp", &m
->generators_start_timestamp
);
2253 dual_timestamp_serialize(f
, "generators-finish-timestamp", &m
->generators_finish_timestamp
);
2254 dual_timestamp_serialize(f
, "units-load-start-timestamp", &m
->units_load_start_timestamp
);
2255 dual_timestamp_serialize(f
, "units-load-finish-timestamp", &m
->units_load_finish_timestamp
);
2258 if (!switching_root
) {
2259 STRV_FOREACH(e
, m
->environment
) {
2260 _cleanup_free_
char *ce
;
2266 fprintf(f
, "env=%s\n", *e
);
2270 if (m
->notify_fd
>= 0) {
2273 copy
= fdset_put_dup(fds
, m
->notify_fd
);
2277 fprintf(f
, "notify-fd=%i\n", copy
);
2278 fprintf(f
, "notify-socket=%s\n", m
->notify_socket
);
2281 if (m
->kdbus_fd
>= 0) {
2284 copy
= fdset_put_dup(fds
, m
->kdbus_fd
);
2288 fprintf(f
, "kdbus-fd=%i\n", copy
);
2291 bus_track_serialize(m
->subscribed
, f
);
2295 HASHMAP_FOREACH_KEY(u
, t
, m
->units
, i
) {
2303 r
= unit_serialize(u
, f
, fds
, !switching_root
);
2310 assert(m
->n_reloading
> 0);
2316 r
= bus_fdset_add_all(m
, fds
);
2323 int manager_deserialize(Manager
*m
, FILE *f
, FDSet
*fds
) {
2329 log_debug("Deserializing state...");
2334 char line
[LINE_MAX
], *l
;
2336 if (!fgets(line
, sizeof(line
), f
)) {
2351 if (startswith(l
, "current-job-id=")) {
2354 if (safe_atou32(l
+15, &id
) < 0)
2355 log_debug("Failed to parse current job id value %s", l
+15);
2357 m
->current_job_id
= MAX(m
->current_job_id
, id
);
2359 } else if (startswith(l
, "n-installed-jobs=")) {
2362 if (safe_atou32(l
+17, &n
) < 0)
2363 log_debug("Failed to parse installed jobs counter %s", l
+17);
2365 m
->n_installed_jobs
+= n
;
2367 } else if (startswith(l
, "n-failed-jobs=")) {
2370 if (safe_atou32(l
+14, &n
) < 0)
2371 log_debug("Failed to parse failed jobs counter %s", l
+14);
2373 m
->n_failed_jobs
+= n
;
2375 } else if (startswith(l
, "taint-usr=")) {
2378 b
= parse_boolean(l
+10);
2380 log_debug("Failed to parse taint /usr flag %s", l
+10);
2382 m
->taint_usr
= m
->taint_usr
|| b
;
2384 } else if (startswith(l
, "firmware-timestamp="))
2385 dual_timestamp_deserialize(l
+19, &m
->firmware_timestamp
);
2386 else if (startswith(l
, "loader-timestamp="))
2387 dual_timestamp_deserialize(l
+17, &m
->loader_timestamp
);
2388 else if (startswith(l
, "kernel-timestamp="))
2389 dual_timestamp_deserialize(l
+17, &m
->kernel_timestamp
);
2390 else if (startswith(l
, "initrd-timestamp="))
2391 dual_timestamp_deserialize(l
+17, &m
->initrd_timestamp
);
2392 else if (startswith(l
, "userspace-timestamp="))
2393 dual_timestamp_deserialize(l
+20, &m
->userspace_timestamp
);
2394 else if (startswith(l
, "finish-timestamp="))
2395 dual_timestamp_deserialize(l
+17, &m
->finish_timestamp
);
2396 else if (startswith(l
, "security-start-timestamp="))
2397 dual_timestamp_deserialize(l
+25, &m
->security_start_timestamp
);
2398 else if (startswith(l
, "security-finish-timestamp="))
2399 dual_timestamp_deserialize(l
+26, &m
->security_finish_timestamp
);
2400 else if (startswith(l
, "generators-start-timestamp="))
2401 dual_timestamp_deserialize(l
+27, &m
->generators_start_timestamp
);
2402 else if (startswith(l
, "generators-finish-timestamp="))
2403 dual_timestamp_deserialize(l
+28, &m
->generators_finish_timestamp
);
2404 else if (startswith(l
, "units-load-start-timestamp="))
2405 dual_timestamp_deserialize(l
+27, &m
->units_load_start_timestamp
);
2406 else if (startswith(l
, "units-load-finish-timestamp="))
2407 dual_timestamp_deserialize(l
+28, &m
->units_load_finish_timestamp
);
2408 else if (startswith(l
, "env=")) {
2409 _cleanup_free_
char *uce
= NULL
;
2412 r
= cunescape(l
+ 4, UNESCAPE_RELAX
, &uce
);
2416 e
= strv_env_set(m
->environment
, uce
);
2422 strv_free(m
->environment
);
2425 } else if (startswith(l
, "notify-fd=")) {
2428 if (safe_atoi(l
+ 10, &fd
) < 0 || fd
< 0 || !fdset_contains(fds
, fd
))
2429 log_debug("Failed to parse notify fd: %s", l
+ 10);
2431 m
->notify_event_source
= sd_event_source_unref(m
->notify_event_source
);
2432 safe_close(m
->notify_fd
);
2433 m
->notify_fd
= fdset_remove(fds
, fd
);
2436 } else if (startswith(l
, "notify-socket=")) {
2445 free(m
->notify_socket
);
2446 m
->notify_socket
= n
;
2448 } else if (startswith(l
, "kdbus-fd=")) {
2451 if (safe_atoi(l
+ 9, &fd
) < 0 || fd
< 0 || !fdset_contains(fds
, fd
))
2452 log_debug("Failed to parse kdbus fd: %s", l
+ 9);
2454 safe_close(m
->kdbus_fd
);
2455 m
->kdbus_fd
= fdset_remove(fds
, fd
);
2461 k
= bus_track_deserialize_item(&m
->deserialized_subscribed
, l
);
2463 log_debug_errno(k
, "Failed to deserialize bus tracker object: %m");
2465 log_debug("Unknown serialization item '%s'", l
);
2471 char name
[UNIT_NAME_MAX
+2];
2474 if (!fgets(name
, sizeof(name
), f
)) {
2485 r
= manager_load_unit(m
, strstrip(name
), NULL
, NULL
, &u
);
2489 r
= unit_deserialize(u
, f
, fds
);
2498 assert(m
->n_reloading
> 0);
2504 int manager_reload(Manager
*m
) {
2506 _cleanup_fclose_
FILE *f
= NULL
;
2507 _cleanup_fdset_free_ FDSet
*fds
= NULL
;
2511 r
= manager_open_serialization(m
, &f
);
2516 bus_manager_send_reloading(m
, true);
2524 r
= manager_serialize(m
, f
, fds
, false);
2530 if (fseeko(f
, 0, SEEK_SET
) < 0) {
2535 /* From here on there is no way back. */
2536 manager_clear_jobs_and_units(m
);
2537 manager_undo_generators(m
);
2538 lookup_paths_free(&m
->lookup_paths
);
2540 /* Find new unit paths */
2541 q
= manager_run_generators(m
);
2542 if (q
< 0 && r
>= 0)
2545 q
= lookup_paths_init(
2546 &m
->lookup_paths
, m
->running_as
, true,
2548 m
->generator_unit_path
,
2549 m
->generator_unit_path_early
,
2550 m
->generator_unit_path_late
);
2551 if (q
< 0 && r
>= 0)
2554 manager_build_unit_path_cache(m
);
2556 /* First, enumerate what we can from all config files */
2557 q
= manager_enumerate(m
);
2558 if (q
< 0 && r
>= 0)
2561 /* Second, deserialize our stored data */
2562 q
= manager_deserialize(m
, f
, fds
);
2563 if (q
< 0 && r
>= 0)
2569 /* Re-register notify_fd as event source */
2570 q
= manager_setup_notify(m
);
2571 if (q
< 0 && r
>= 0)
2574 /* Third, fire things up! */
2575 manager_coldplug(m
);
2577 assert(m
->n_reloading
> 0);
2580 m
->send_reloading_done
= true;
2585 bool manager_is_reloading_or_reexecuting(Manager
*m
) {
2588 return m
->n_reloading
!= 0;
2591 void manager_reset_failed(Manager
*m
) {
2597 HASHMAP_FOREACH(u
, m
->units
, i
)
2598 unit_reset_failed(u
);
2601 bool manager_unit_inactive_or_pending(Manager
*m
, const char *name
) {
2607 /* Returns true if the unit is inactive or going down */
2608 u
= manager_get_unit(m
, name
);
2612 return unit_inactive_or_pending(u
);
2615 static void manager_notify_finished(Manager
*m
) {
2616 char userspace
[FORMAT_TIMESPAN_MAX
], initrd
[FORMAT_TIMESPAN_MAX
], kernel
[FORMAT_TIMESPAN_MAX
], sum
[FORMAT_TIMESPAN_MAX
];
2617 usec_t firmware_usec
, loader_usec
, kernel_usec
, initrd_usec
, userspace_usec
, total_usec
;
2622 if (m
->running_as
== MANAGER_SYSTEM
&& detect_container() <= 0) {
2624 /* Note that m->kernel_usec.monotonic is always at 0,
2625 * and m->firmware_usec.monotonic and
2626 * m->loader_usec.monotonic should be considered
2627 * negative values. */
2629 firmware_usec
= m
->firmware_timestamp
.monotonic
- m
->loader_timestamp
.monotonic
;
2630 loader_usec
= m
->loader_timestamp
.monotonic
- m
->kernel_timestamp
.monotonic
;
2631 userspace_usec
= m
->finish_timestamp
.monotonic
- m
->userspace_timestamp
.monotonic
;
2632 total_usec
= m
->firmware_timestamp
.monotonic
+ m
->finish_timestamp
.monotonic
;
2634 if (dual_timestamp_is_set(&m
->initrd_timestamp
)) {
2636 kernel_usec
= m
->initrd_timestamp
.monotonic
- m
->kernel_timestamp
.monotonic
;
2637 initrd_usec
= m
->userspace_timestamp
.monotonic
- m
->initrd_timestamp
.monotonic
;
2639 log_struct(LOG_INFO
,
2640 LOG_MESSAGE_ID(SD_MESSAGE_STARTUP_FINISHED
),
2641 "KERNEL_USEC="USEC_FMT
, kernel_usec
,
2642 "INITRD_USEC="USEC_FMT
, initrd_usec
,
2643 "USERSPACE_USEC="USEC_FMT
, userspace_usec
,
2644 LOG_MESSAGE("Startup finished in %s (kernel) + %s (initrd) + %s (userspace) = %s.",
2645 format_timespan(kernel
, sizeof(kernel
), kernel_usec
, USEC_PER_MSEC
),
2646 format_timespan(initrd
, sizeof(initrd
), initrd_usec
, USEC_PER_MSEC
),
2647 format_timespan(userspace
, sizeof(userspace
), userspace_usec
, USEC_PER_MSEC
),
2648 format_timespan(sum
, sizeof(sum
), total_usec
, USEC_PER_MSEC
)),
2651 kernel_usec
= m
->userspace_timestamp
.monotonic
- m
->kernel_timestamp
.monotonic
;
2654 log_struct(LOG_INFO
,
2655 LOG_MESSAGE_ID(SD_MESSAGE_STARTUP_FINISHED
),
2656 "KERNEL_USEC="USEC_FMT
, kernel_usec
,
2657 "USERSPACE_USEC="USEC_FMT
, userspace_usec
,
2658 LOG_MESSAGE("Startup finished in %s (kernel) + %s (userspace) = %s.",
2659 format_timespan(kernel
, sizeof(kernel
), kernel_usec
, USEC_PER_MSEC
),
2660 format_timespan(userspace
, sizeof(userspace
), userspace_usec
, USEC_PER_MSEC
),
2661 format_timespan(sum
, sizeof(sum
), total_usec
, USEC_PER_MSEC
)),
2665 firmware_usec
= loader_usec
= initrd_usec
= kernel_usec
= 0;
2666 total_usec
= userspace_usec
= m
->finish_timestamp
.monotonic
- m
->userspace_timestamp
.monotonic
;
2668 log_struct(LOG_INFO
,
2669 LOG_MESSAGE_ID(SD_MESSAGE_STARTUP_FINISHED
),
2670 "USERSPACE_USEC="USEC_FMT
, userspace_usec
,
2671 LOG_MESSAGE("Startup finished in %s.",
2672 format_timespan(sum
, sizeof(sum
), total_usec
, USEC_PER_MSEC
)),
2676 bus_manager_send_finished(m
, firmware_usec
, loader_usec
, kernel_usec
, initrd_usec
, userspace_usec
, total_usec
);
2680 "STATUS=Startup finished in %s.",
2681 format_timespan(sum
, sizeof(sum
), total_usec
, USEC_PER_MSEC
));
2684 void manager_check_finished(Manager
*m
) {
2687 if (m
->n_reloading
> 0)
2690 /* Verify that we are actually running currently. Initially
2691 * the exit code is set to invalid, and during operation it is
2692 * then set to MANAGER_OK */
2693 if (m
->exit_code
!= MANAGER_OK
)
2696 if (hashmap_size(m
->jobs
) > 0) {
2697 if (m
->jobs_in_progress_event_source
)
2698 /* Ignore any failure, this is only for feedback */
2699 (void) sd_event_source_set_time(m
->jobs_in_progress_event_source
, now(CLOCK_MONOTONIC
) + JOBS_IN_PROGRESS_WAIT_USEC
);
2704 manager_flip_auto_status(m
, false);
2706 /* Notify Type=idle units that we are done now */
2707 manager_close_idle_pipe(m
);
2709 /* Turn off confirm spawn now */
2710 m
->confirm_spawn
= false;
2712 /* No need to update ask password status when we're going non-interactive */
2713 manager_close_ask_password(m
);
2715 /* This is no longer the first boot */
2716 manager_set_first_boot(m
, false);
2718 if (dual_timestamp_is_set(&m
->finish_timestamp
))
2721 dual_timestamp_get(&m
->finish_timestamp
);
2723 manager_notify_finished(m
);
2725 manager_invalidate_startup_units(m
);
2728 static int create_generator_dir(Manager
*m
, char **generator
, const char *name
) {
2739 if (m
->running_as
== MANAGER_SYSTEM
&& getpid() == 1) {
2740 /* systemd --system, not running --test */
2742 p
= strappend("/run/systemd/", name
);
2746 r
= mkdir_p_label(p
, 0755);
2748 log_error_errno(r
, "Failed to create generator directory %s: %m", p
);
2752 } else if (m
->running_as
== MANAGER_USER
) {
2753 const char *s
= NULL
;
2755 s
= getenv("XDG_RUNTIME_DIR");
2758 p
= strjoin(s
, "/systemd/", name
, NULL
);
2762 r
= mkdir_p_label(p
, 0755);
2764 log_error_errno(r
, "Failed to create generator directory %s: %m", p
);
2769 /* systemd --system --test */
2771 p
= strjoin("/tmp/systemd-", name
, ".XXXXXX", NULL
);
2776 log_error_errno(errno
, "Failed to create generator directory %s: %m",
2787 static void trim_generator_dir(Manager
*m
, char **generator
) {
2794 if (rmdir(*generator
) >= 0)
2795 *generator
= mfree(*generator
);
2800 static int manager_run_generators(Manager
*m
) {
2801 _cleanup_strv_free_
char **paths
= NULL
;
2802 const char *argv
[5];
2811 paths
= generator_paths(m
->running_as
);
2815 /* Optimize by skipping the whole process by not creating output directories
2816 * if no generators are found. */
2817 STRV_FOREACH(path
, paths
) {
2818 r
= access(*path
, F_OK
);
2821 if (errno
!= ENOENT
)
2822 log_warning_errno(errno
, "Failed to open generator directory %s: %m", *path
);
2827 r
= create_generator_dir(m
, &m
->generator_unit_path
, "generator");
2831 r
= create_generator_dir(m
, &m
->generator_unit_path_early
, "generator.early");
2835 r
= create_generator_dir(m
, &m
->generator_unit_path_late
, "generator.late");
2839 argv
[0] = NULL
; /* Leave this empty, execute_directory() will fill something in */
2840 argv
[1] = m
->generator_unit_path
;
2841 argv
[2] = m
->generator_unit_path_early
;
2842 argv
[3] = m
->generator_unit_path_late
;
2845 RUN_WITH_UMASK(0022)
2846 execute_directories((const char* const*) paths
, DEFAULT_TIMEOUT_USEC
, (char**) argv
);
2849 trim_generator_dir(m
, &m
->generator_unit_path
);
2850 trim_generator_dir(m
, &m
->generator_unit_path_early
);
2851 trim_generator_dir(m
, &m
->generator_unit_path_late
);
2855 static void remove_generator_dir(Manager
*m
, char **generator
) {
2862 strv_remove(m
->lookup_paths
.unit_path
, *generator
);
2863 (void) rm_rf(*generator
, REMOVE_ROOT
);
2865 *generator
= mfree(*generator
);
2868 static void manager_undo_generators(Manager
*m
) {
2871 remove_generator_dir(m
, &m
->generator_unit_path
);
2872 remove_generator_dir(m
, &m
->generator_unit_path_early
);
2873 remove_generator_dir(m
, &m
->generator_unit_path_late
);
2876 int manager_environment_add(Manager
*m
, char **minus
, char **plus
) {
2877 char **a
= NULL
, **b
= NULL
, **l
;
2882 if (!strv_isempty(minus
)) {
2883 a
= strv_env_delete(l
, 1, minus
);
2890 if (!strv_isempty(plus
)) {
2891 b
= strv_env_merge(2, l
, plus
);
2900 if (m
->environment
!= l
)
2901 strv_free(m
->environment
);
2908 manager_clean_environment(m
);
2909 strv_sort(m
->environment
);
2914 int manager_set_default_rlimits(Manager
*m
, struct rlimit
**default_rlimit
) {
2919 for (i
= 0; i
< _RLIMIT_MAX
; i
++) {
2920 if (!default_rlimit
[i
])
2923 m
->rlimit
[i
] = newdup(struct rlimit
, default_rlimit
[i
], 1);
2931 void manager_recheck_journal(Manager
*m
) {
2936 if (m
->running_as
!= MANAGER_SYSTEM
)
2939 u
= manager_get_unit(m
, SPECIAL_JOURNALD_SOCKET
);
2940 if (u
&& SOCKET(u
)->state
!= SOCKET_RUNNING
) {
2941 log_close_journal();
2945 u
= manager_get_unit(m
, SPECIAL_JOURNALD_SERVICE
);
2946 if (u
&& SERVICE(u
)->state
!= SERVICE_RUNNING
) {
2947 log_close_journal();
2951 /* Hmm, OK, so the socket is fully up and the service is up
2952 * too, then let's make use of the thing. */
2956 void manager_set_show_status(Manager
*m
, ShowStatus mode
) {
2958 assert(IN_SET(mode
, SHOW_STATUS_AUTO
, SHOW_STATUS_NO
, SHOW_STATUS_YES
, SHOW_STATUS_TEMPORARY
));
2960 if (m
->running_as
!= MANAGER_SYSTEM
)
2963 m
->show_status
= mode
;
2966 (void) touch("/run/systemd/show-status");
2968 (void) unlink("/run/systemd/show-status");
2971 static bool manager_get_show_status(Manager
*m
, StatusType type
) {
2974 if (m
->running_as
!= MANAGER_SYSTEM
)
2977 if (m
->no_console_output
)
2980 if (!IN_SET(manager_state(m
), MANAGER_INITIALIZING
, MANAGER_STARTING
, MANAGER_STOPPING
))
2983 /* If we cannot find out the status properly, just proceed. */
2984 if (type
!= STATUS_TYPE_EMERGENCY
&& manager_check_ask_password(m
) > 0)
2987 if (m
->show_status
> 0)
2993 void manager_set_first_boot(Manager
*m
, bool b
) {
2996 if (m
->running_as
!= MANAGER_SYSTEM
)
2999 if (m
->first_boot
!= (int) b
) {
3001 (void) touch("/run/systemd/first-boot");
3003 (void) unlink("/run/systemd/first-boot");
3009 void manager_status_printf(Manager
*m
, StatusType type
, const char *status
, const char *format
, ...) {
3012 /* If m is NULL, assume we're after shutdown and let the messages through. */
3014 if (m
&& !manager_get_show_status(m
, type
))
3017 /* XXX We should totally drop the check for ephemeral here
3018 * and thus effectively make 'Type=idle' pointless. */
3019 if (type
== STATUS_TYPE_EPHEMERAL
&& m
&& m
->n_on_console
> 0)
3022 va_start(ap
, format
);
3023 status_vprintf(status
, true, type
== STATUS_TYPE_EPHEMERAL
, format
, ap
);
3027 Set
*manager_get_units_requiring_mounts_for(Manager
*m
, const char *path
) {
3028 char p
[strlen(path
)+1];
3034 path_kill_slashes(p
);
3036 return hashmap_get(m
->units_requiring_mounts_for
, streq(p
, "/") ? "" : p
);
3039 const char *manager_get_runtime_prefix(Manager
*m
) {
3042 return m
->running_as
== MANAGER_SYSTEM
?
3044 getenv("XDG_RUNTIME_DIR");
3047 int manager_update_failed_units(Manager
*m
, Unit
*u
, bool failed
) {
3052 assert(u
->manager
== m
);
3054 size
= set_size(m
->failed_units
);
3057 r
= set_ensure_allocated(&m
->failed_units
, NULL
);
3061 if (set_put(m
->failed_units
, u
) < 0)
3064 (void) set_remove(m
->failed_units
, u
);
3066 if (set_size(m
->failed_units
) != size
)
3067 bus_manager_send_change_signal(m
);
3072 ManagerState
manager_state(Manager
*m
) {
3077 /* Did we ever finish booting? If not then we are still starting up */
3078 if (!dual_timestamp_is_set(&m
->finish_timestamp
)) {
3080 u
= manager_get_unit(m
, SPECIAL_BASIC_TARGET
);
3081 if (!u
|| !UNIT_IS_ACTIVE_OR_RELOADING(unit_active_state(u
)))
3082 return MANAGER_INITIALIZING
;
3084 return MANAGER_STARTING
;
3087 /* Is the special shutdown target queued? If so, we are in shutdown state */
3088 u
= manager_get_unit(m
, SPECIAL_SHUTDOWN_TARGET
);
3089 if (u
&& u
->job
&& IN_SET(u
->job
->type
, JOB_START
, JOB_RESTART
, JOB_TRY_RESTART
, JOB_RELOAD_OR_START
))
3090 return MANAGER_STOPPING
;
3092 /* Are the rescue or emergency targets active or queued? If so we are in maintenance state */
3093 u
= manager_get_unit(m
, SPECIAL_RESCUE_TARGET
);
3094 if (u
&& (UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u
)) ||
3095 (u
->job
&& IN_SET(u
->job
->type
, JOB_START
, JOB_RESTART
, JOB_TRY_RESTART
, JOB_RELOAD_OR_START
))))
3096 return MANAGER_MAINTENANCE
;
3098 u
= manager_get_unit(m
, SPECIAL_EMERGENCY_TARGET
);
3099 if (u
&& (UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u
)) ||
3100 (u
->job
&& IN_SET(u
->job
->type
, JOB_START
, JOB_RESTART
, JOB_TRY_RESTART
, JOB_RELOAD_OR_START
))))
3101 return MANAGER_MAINTENANCE
;
3103 /* Are there any failed units? If so, we are in degraded mode */
3104 if (set_size(m
->failed_units
) > 0)
3105 return MANAGER_DEGRADED
;
3107 return MANAGER_RUNNING
;
3110 static const char *const manager_state_table
[_MANAGER_STATE_MAX
] = {
3111 [MANAGER_INITIALIZING
] = "initializing",
3112 [MANAGER_STARTING
] = "starting",
3113 [MANAGER_RUNNING
] = "running",
3114 [MANAGER_DEGRADED
] = "degraded",
3115 [MANAGER_MAINTENANCE
] = "maintenance",
3116 [MANAGER_STOPPING
] = "stopping",
3119 DEFINE_STRING_TABLE_LOOKUP(manager_state
, ManagerState
);