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"
44 #include "boot-timestamps.h"
45 #include "bus-common-errors.h"
46 #include "bus-error.h"
47 #include "bus-kernel.h"
50 #include "dbus-manager.h"
51 #include "dbus-unit.h"
55 #include "exit-status.h"
61 #include "locale-setup.h"
67 #include "parse-util.h"
68 #include "path-lookup.h"
69 #include "path-util.h"
70 #include "process-util.h"
71 #include "ratelimit.h"
73 #include "signal-util.h"
75 #include "stat-util.h"
76 #include "string-table.h"
77 #include "string-util.h"
79 #include "terminal-util.h"
80 #include "time-util.h"
81 #include "transaction.h"
82 #include "unit-name.h"
87 /* Initial delay and the interval for printing status messages about running jobs */
88 #define JOBS_IN_PROGRESS_WAIT_USEC (5*USEC_PER_SEC)
89 #define JOBS_IN_PROGRESS_PERIOD_USEC (USEC_PER_SEC / 3)
90 #define JOBS_IN_PROGRESS_PERIOD_DIVISOR 3
92 static int manager_dispatch_notify_fd(sd_event_source
*source
, int fd
, uint32_t revents
, void *userdata
);
93 static int manager_dispatch_signal_fd(sd_event_source
*source
, int fd
, uint32_t revents
, void *userdata
);
94 static int manager_dispatch_time_change_fd(sd_event_source
*source
, int fd
, uint32_t revents
, void *userdata
);
95 static int manager_dispatch_idle_pipe_fd(sd_event_source
*source
, int fd
, uint32_t revents
, void *userdata
);
96 static int manager_dispatch_jobs_in_progress(sd_event_source
*source
, usec_t usec
, void *userdata
);
97 static int manager_dispatch_run_queue(sd_event_source
*source
, void *userdata
);
98 static int manager_run_generators(Manager
*m
);
99 static void manager_undo_generators(Manager
*m
);
101 static void manager_watch_jobs_in_progress(Manager
*m
) {
107 if (m
->jobs_in_progress_event_source
)
110 next
= now(CLOCK_MONOTONIC
) + JOBS_IN_PROGRESS_WAIT_USEC
;
111 r
= sd_event_add_time(
113 &m
->jobs_in_progress_event_source
,
116 manager_dispatch_jobs_in_progress
, m
);
120 (void) sd_event_source_set_description(m
->jobs_in_progress_event_source
, "manager-jobs-in-progress");
123 #define CYLON_BUFFER_EXTRA (2*(sizeof(ANSI_RED)-1) + sizeof(ANSI_HIGHLIGHT_RED)-1 + 2*(sizeof(ANSI_NORMAL)-1))
125 static void draw_cylon(char buffer
[], size_t buflen
, unsigned width
, unsigned pos
) {
128 assert(buflen
>= CYLON_BUFFER_EXTRA
+ width
+ 1);
129 assert(pos
<= width
+1); /* 0 or width+1 mean that the center light is behind the corner */
133 p
= mempset(p
, ' ', pos
-2);
134 p
= stpcpy(p
, ANSI_RED
);
138 if (pos
> 0 && pos
<= width
) {
139 p
= stpcpy(p
, ANSI_HIGHLIGHT_RED
);
143 p
= stpcpy(p
, ANSI_NORMAL
);
146 p
= stpcpy(p
, ANSI_RED
);
149 p
= mempset(p
, ' ', width
-1-pos
);
150 strcpy(p
, ANSI_NORMAL
);
154 void manager_flip_auto_status(Manager
*m
, bool enable
) {
158 if (m
->show_status
== SHOW_STATUS_AUTO
)
159 manager_set_show_status(m
, SHOW_STATUS_TEMPORARY
);
161 if (m
->show_status
== SHOW_STATUS_TEMPORARY
)
162 manager_set_show_status(m
, SHOW_STATUS_AUTO
);
166 static void manager_print_jobs_in_progress(Manager
*m
) {
167 _cleanup_free_
char *job_of_n
= NULL
;
170 unsigned counter
= 0, print_nr
;
171 char cylon
[6 + CYLON_BUFFER_EXTRA
+ 1];
173 char time
[FORMAT_TIMESPAN_MAX
], limit
[FORMAT_TIMESPAN_MAX
] = "no limit";
177 assert(m
->n_running_jobs
> 0);
179 manager_flip_auto_status(m
, true);
181 print_nr
= (m
->jobs_in_progress_iteration
/ JOBS_IN_PROGRESS_PERIOD_DIVISOR
) % m
->n_running_jobs
;
183 HASHMAP_FOREACH(j
, m
->jobs
, i
)
184 if (j
->state
== JOB_RUNNING
&& counter
++ == print_nr
)
187 /* m->n_running_jobs must be consistent with the contents of m->jobs,
188 * so the above loop must have succeeded in finding j. */
189 assert(counter
== print_nr
+ 1);
192 cylon_pos
= m
->jobs_in_progress_iteration
% 14;
194 cylon_pos
= 14 - cylon_pos
;
195 draw_cylon(cylon
, sizeof(cylon
), 6, cylon_pos
);
197 m
->jobs_in_progress_iteration
++;
199 if (m
->n_running_jobs
> 1) {
200 if (asprintf(&job_of_n
, "(%u of %u) ", counter
, m
->n_running_jobs
) < 0)
204 format_timespan(time
, sizeof(time
), now(CLOCK_MONOTONIC
) - j
->begin_usec
, 1*USEC_PER_SEC
);
205 if (job_get_timeout(j
, &x
) > 0)
206 format_timespan(limit
, sizeof(limit
), x
- j
->begin_usec
, 1*USEC_PER_SEC
);
208 manager_status_printf(m
, STATUS_TYPE_EPHEMERAL
, cylon
,
209 "%sA %s job is running for %s (%s / %s)",
211 job_type_to_string(j
->type
),
212 unit_description(j
->unit
),
216 static int have_ask_password(void) {
217 _cleanup_closedir_
DIR *dir
;
219 dir
= opendir("/run/systemd/ask-password");
232 if (!de
&& errno
!= 0)
237 if (startswith(de
->d_name
, "ask."))
242 static int manager_dispatch_ask_password_fd(sd_event_source
*source
,
243 int fd
, uint32_t revents
, void *userdata
) {
244 Manager
*m
= userdata
;
250 m
->have_ask_password
= have_ask_password();
251 if (m
->have_ask_password
< 0)
252 /* Log error but continue. Negative have_ask_password
253 * is treated as unknown status. */
254 log_error_errno(m
->have_ask_password
, "Failed to list /run/systemd/ask-password: %m");
259 static void manager_close_ask_password(Manager
*m
) {
262 m
->ask_password_event_source
= sd_event_source_unref(m
->ask_password_event_source
);
263 m
->ask_password_inotify_fd
= safe_close(m
->ask_password_inotify_fd
);
264 m
->have_ask_password
= -EINVAL
;
267 static int manager_check_ask_password(Manager
*m
) {
272 if (!m
->ask_password_event_source
) {
273 assert(m
->ask_password_inotify_fd
< 0);
275 mkdir_p_label("/run/systemd/ask-password", 0755);
277 m
->ask_password_inotify_fd
= inotify_init1(IN_NONBLOCK
|IN_CLOEXEC
);
278 if (m
->ask_password_inotify_fd
< 0)
279 return log_error_errno(errno
, "inotify_init1() failed: %m");
281 if (inotify_add_watch(m
->ask_password_inotify_fd
, "/run/systemd/ask-password", IN_CREATE
|IN_DELETE
|IN_MOVE
) < 0) {
282 log_error_errno(errno
, "Failed to add watch on /run/systemd/ask-password: %m");
283 manager_close_ask_password(m
);
287 r
= sd_event_add_io(m
->event
, &m
->ask_password_event_source
,
288 m
->ask_password_inotify_fd
, EPOLLIN
,
289 manager_dispatch_ask_password_fd
, m
);
291 log_error_errno(errno
, "Failed to add event source for /run/systemd/ask-password: %m");
292 manager_close_ask_password(m
);
296 (void) sd_event_source_set_description(m
->ask_password_event_source
, "manager-ask-password");
298 /* Queries might have been added meanwhile... */
299 manager_dispatch_ask_password_fd(m
->ask_password_event_source
,
300 m
->ask_password_inotify_fd
, EPOLLIN
, m
);
303 return m
->have_ask_password
;
306 static int manager_watch_idle_pipe(Manager
*m
) {
311 if (m
->idle_pipe_event_source
)
314 if (m
->idle_pipe
[2] < 0)
317 r
= sd_event_add_io(m
->event
, &m
->idle_pipe_event_source
, m
->idle_pipe
[2], EPOLLIN
, manager_dispatch_idle_pipe_fd
, m
);
319 return log_error_errno(r
, "Failed to watch idle pipe: %m");
321 (void) sd_event_source_set_description(m
->idle_pipe_event_source
, "manager-idle-pipe");
326 static void manager_close_idle_pipe(Manager
*m
) {
329 m
->idle_pipe_event_source
= sd_event_source_unref(m
->idle_pipe_event_source
);
331 safe_close_pair(m
->idle_pipe
);
332 safe_close_pair(m
->idle_pipe
+ 2);
335 static int manager_setup_time_change(Manager
*m
) {
338 /* We only care for the cancellation event, hence we set the
339 * timeout to the latest possible value. */
340 struct itimerspec its
= {
341 .it_value
.tv_sec
= TIME_T_MAX
,
345 assert_cc(sizeof(time_t) == sizeof(TIME_T_MAX
));
350 /* Uses TFD_TIMER_CANCEL_ON_SET to get notifications whenever
351 * CLOCK_REALTIME makes a jump relative to CLOCK_MONOTONIC */
353 m
->time_change_fd
= timerfd_create(CLOCK_REALTIME
, TFD_NONBLOCK
|TFD_CLOEXEC
);
354 if (m
->time_change_fd
< 0)
355 return log_error_errno(errno
, "Failed to create timerfd: %m");
357 if (timerfd_settime(m
->time_change_fd
, TFD_TIMER_ABSTIME
|TFD_TIMER_CANCEL_ON_SET
, &its
, NULL
) < 0) {
358 log_debug_errno(errno
, "Failed to set up TFD_TIMER_CANCEL_ON_SET, ignoring: %m");
359 m
->time_change_fd
= safe_close(m
->time_change_fd
);
363 r
= sd_event_add_io(m
->event
, &m
->time_change_event_source
, m
->time_change_fd
, EPOLLIN
, manager_dispatch_time_change_fd
, m
);
365 return log_error_errno(r
, "Failed to create time change event source: %m");
367 (void) sd_event_source_set_description(m
->time_change_event_source
, "manager-time-change");
369 log_debug("Set up TFD_TIMER_CANCEL_ON_SET timerfd.");
374 static int enable_special_signals(Manager
*m
) {
375 _cleanup_close_
int fd
= -1;
379 /* Enable that we get SIGINT on control-alt-del. In containers
380 * this will fail with EPERM (older) or EINVAL (newer), so
382 if (reboot(RB_DISABLE_CAD
) < 0 && errno
!= EPERM
&& errno
!= EINVAL
)
383 log_warning_errno(errno
, "Failed to enable ctrl-alt-del handling: %m");
385 fd
= open_terminal("/dev/tty0", O_RDWR
|O_NOCTTY
|O_CLOEXEC
);
387 /* Support systems without virtual console */
389 log_warning_errno(errno
, "Failed to open /dev/tty0: %m");
391 /* Enable that we get SIGWINCH on kbrequest */
392 if (ioctl(fd
, KDSIGACCEPT
, SIGWINCH
) < 0)
393 log_warning_errno(errno
, "Failed to enable kbrequest handling: %m");
399 static int manager_setup_signals(Manager
*m
) {
400 struct sigaction sa
= {
401 .sa_handler
= SIG_DFL
,
402 .sa_flags
= SA_NOCLDSTOP
|SA_RESTART
,
409 assert_se(sigaction(SIGCHLD
, &sa
, NULL
) == 0);
411 /* We make liberal use of realtime signals here. On
412 * Linux/glibc we have 30 of them (with the exception of Linux
413 * on hppa, see below), between SIGRTMIN+0 ... SIGRTMIN+30
416 assert_se(sigemptyset(&mask
) == 0);
417 sigset_add_many(&mask
,
418 SIGCHLD
, /* Child died */
419 SIGTERM
, /* Reexecute daemon */
420 SIGHUP
, /* Reload configuration */
421 SIGUSR1
, /* systemd/upstart: reconnect to D-Bus */
422 SIGUSR2
, /* systemd: dump status */
423 SIGINT
, /* Kernel sends us this on control-alt-del */
424 SIGWINCH
, /* Kernel sends us this on kbrequest (alt-arrowup) */
425 SIGPWR
, /* Some kernel drivers and upsd send us this on power failure */
427 SIGRTMIN
+0, /* systemd: start default.target */
428 SIGRTMIN
+1, /* systemd: isolate rescue.target */
429 SIGRTMIN
+2, /* systemd: isolate emergency.target */
430 SIGRTMIN
+3, /* systemd: start halt.target */
431 SIGRTMIN
+4, /* systemd: start poweroff.target */
432 SIGRTMIN
+5, /* systemd: start reboot.target */
433 SIGRTMIN
+6, /* systemd: start kexec.target */
435 /* ... space for more special targets ... */
437 SIGRTMIN
+13, /* systemd: Immediate halt */
438 SIGRTMIN
+14, /* systemd: Immediate poweroff */
439 SIGRTMIN
+15, /* systemd: Immediate reboot */
440 SIGRTMIN
+16, /* systemd: Immediate kexec */
442 /* ... space for more immediate system state changes ... */
444 SIGRTMIN
+20, /* systemd: enable status messages */
445 SIGRTMIN
+21, /* systemd: disable status messages */
446 SIGRTMIN
+22, /* systemd: set log level to LOG_DEBUG */
447 SIGRTMIN
+23, /* systemd: set log level to LOG_INFO */
448 SIGRTMIN
+24, /* systemd: Immediate exit (--user only) */
450 /* .. one free signal here ... */
452 #if !defined(__hppa64__) && !defined(__hppa__)
453 /* Apparently Linux on hppa has fewer RT
454 * signals (SIGRTMAX is SIGRTMIN+25 there),
455 * hence let's not try to make use of them
456 * here. Since these commands are accessible
457 * by different means and only really a safety
458 * net, the missing functionality on hppa
459 * shouldn't matter. */
461 SIGRTMIN
+26, /* systemd: set log target to journal-or-kmsg */
462 SIGRTMIN
+27, /* systemd: set log target to console */
463 SIGRTMIN
+28, /* systemd: set log target to kmsg */
464 SIGRTMIN
+29, /* systemd: set log target to syslog-or-kmsg (obsolete) */
466 /* ... one free signal here SIGRTMIN+30 ... */
469 assert_se(sigprocmask(SIG_SETMASK
, &mask
, NULL
) == 0);
471 m
->signal_fd
= signalfd(-1, &mask
, SFD_NONBLOCK
|SFD_CLOEXEC
);
472 if (m
->signal_fd
< 0)
475 r
= sd_event_add_io(m
->event
, &m
->signal_event_source
, m
->signal_fd
, EPOLLIN
, manager_dispatch_signal_fd
, m
);
479 (void) sd_event_source_set_description(m
->signal_event_source
, "manager-signal");
481 /* Process signals a bit earlier than the rest of things, but
482 * later than notify_fd processing, so that the notify
483 * processing can still figure out to which process/service a
484 * message belongs, before we reap the process. */
485 r
= sd_event_source_set_priority(m
->signal_event_source
, -5);
489 if (m
->running_as
== MANAGER_SYSTEM
)
490 return enable_special_signals(m
);
495 static void manager_clean_environment(Manager
*m
) {
498 /* Let's remove some environment variables that we
499 * need ourselves to communicate with our clients */
513 static int manager_default_environment(Manager
*m
) {
516 if (m
->running_as
== MANAGER_SYSTEM
) {
517 /* The system manager always starts with a clean
518 * environment for its children. It does not import
519 * the kernel or the parents exported variables.
521 * The initial passed environ is untouched to keep
522 * /proc/self/environ valid; it is used for tagging
523 * the init process inside containers. */
524 m
->environment
= strv_new("PATH=" DEFAULT_PATH
,
527 /* Import locale variables LC_*= from configuration */
528 locale_setup(&m
->environment
);
530 /* The user manager passes its own environment
531 * along to its children. */
532 m
->environment
= strv_copy(environ
);
538 manager_clean_environment(m
);
539 strv_sort(m
->environment
);
545 int manager_new(ManagerRunningAs running_as
, bool test_run
, Manager
**_m
) {
547 static const char * const unit_log_fields
[_MANAGER_RUNNING_AS_MAX
] = {
548 [MANAGER_SYSTEM
] = "UNIT=",
549 [MANAGER_USER
] = "USER_UNIT=",
552 static const char * const unit_log_format_strings
[_MANAGER_RUNNING_AS_MAX
] = {
553 [MANAGER_SYSTEM
] = "UNIT=%s",
554 [MANAGER_USER
] = "USER_UNIT=%s",
561 assert(running_as
>= 0);
562 assert(running_as
< _MANAGER_RUNNING_AS_MAX
);
564 m
= new0(Manager
, 1);
569 if (running_as
== MANAGER_SYSTEM
&& detect_container() <= 0)
570 boot_timestamps(&m
->userspace_timestamp
, &m
->firmware_timestamp
, &m
->loader_timestamp
);
573 m
->running_as
= running_as
;
574 m
->exit_code
= _MANAGER_EXIT_CODE_INVALID
;
575 m
->default_timer_accuracy_usec
= USEC_PER_MINUTE
;
577 /* Prepare log fields we can use for structured logging */
578 m
->unit_log_field
= unit_log_fields
[running_as
];
579 m
->unit_log_format_string
= unit_log_format_strings
[running_as
];
581 m
->idle_pipe
[0] = m
->idle_pipe
[1] = m
->idle_pipe
[2] = m
->idle_pipe
[3] = -1;
583 m
->pin_cgroupfs_fd
= m
->notify_fd
= m
->signal_fd
= m
->time_change_fd
=
584 m
->dev_autofs_fd
= m
->private_listen_fd
= m
->kdbus_fd
= m
->cgroup_inotify_fd
= -1;
586 m
->current_job_id
= 1; /* start as id #1, so that we can leave #0 around as "null-like" value */
588 m
->ask_password_inotify_fd
= -1;
589 m
->have_ask_password
= -EINVAL
; /* we don't know */
592 m
->cgroup_netclass_registry_last
= CGROUP_NETCLASS_FIXED_MAX
;
594 m
->test_run
= test_run
;
596 /* Reboot immediately if the user hits C-A-D more often than 7x per 2s */
597 RATELIMIT_INIT(m
->ctrl_alt_del_ratelimit
, 2 * USEC_PER_SEC
, 7);
599 r
= manager_default_environment(m
);
603 r
= hashmap_ensure_allocated(&m
->units
, &string_hash_ops
);
607 r
= hashmap_ensure_allocated(&m
->jobs
, NULL
);
611 r
= hashmap_ensure_allocated(&m
->cgroup_unit
, &string_hash_ops
);
615 r
= hashmap_ensure_allocated(&m
->watch_bus
, &string_hash_ops
);
619 r
= sd_event_default(&m
->event
);
623 r
= sd_event_add_defer(m
->event
, &m
->run_queue_event_source
, manager_dispatch_run_queue
, m
);
627 r
= sd_event_source_set_priority(m
->run_queue_event_source
, SD_EVENT_PRIORITY_IDLE
);
631 r
= sd_event_source_set_enabled(m
->run_queue_event_source
, SD_EVENT_OFF
);
635 (void) sd_event_source_set_description(m
->run_queue_event_source
, "manager-run-queue");
637 r
= manager_setup_signals(m
);
641 r
= manager_setup_cgroup(m
);
645 r
= manager_setup_time_change(m
);
649 m
->udev
= udev_new();
655 /* Note that we set up neither kdbus, nor the notify fd
656 * here. We do that after deserialization, since they might
657 * have gotten serialized across the reexec. */
659 m
->taint_usr
= dir_is_empty("/usr") > 0;
669 static int manager_setup_notify(Manager
*m
) {
675 if (m
->notify_fd
< 0) {
676 _cleanup_close_
int fd
= -1;
677 union sockaddr_union sa
= {
678 .sa
.sa_family
= AF_UNIX
,
680 static const int one
= 1;
682 /* First free all secondary fields */
683 m
->notify_socket
= mfree(m
->notify_socket
);
684 m
->notify_event_source
= sd_event_source_unref(m
->notify_event_source
);
686 fd
= socket(AF_UNIX
, SOCK_DGRAM
|SOCK_CLOEXEC
|SOCK_NONBLOCK
, 0);
688 return log_error_errno(errno
, "Failed to allocate notification socket: %m");
690 if (m
->running_as
== MANAGER_SYSTEM
)
691 m
->notify_socket
= strdup("/run/systemd/notify");
695 e
= getenv("XDG_RUNTIME_DIR");
697 log_error_errno(errno
, "XDG_RUNTIME_DIR is not set: %m");
701 m
->notify_socket
= strappend(e
, "/systemd/notify");
703 if (!m
->notify_socket
)
706 (void) mkdir_parents_label(m
->notify_socket
, 0755);
707 (void) unlink(m
->notify_socket
);
709 strncpy(sa
.un
.sun_path
, m
->notify_socket
, sizeof(sa
.un
.sun_path
)-1);
710 r
= bind(fd
, &sa
.sa
, offsetof(struct sockaddr_un
, sun_path
) + strlen(sa
.un
.sun_path
));
712 return log_error_errno(errno
, "bind(%s) failed: %m", sa
.un
.sun_path
);
714 r
= setsockopt(fd
, SOL_SOCKET
, SO_PASSCRED
, &one
, sizeof(one
));
716 return log_error_errno(errno
, "SO_PASSCRED failed: %m");
721 log_debug("Using notification socket %s", m
->notify_socket
);
724 if (!m
->notify_event_source
) {
725 r
= sd_event_add_io(m
->event
, &m
->notify_event_source
, m
->notify_fd
, EPOLLIN
, manager_dispatch_notify_fd
, m
);
727 return log_error_errno(r
, "Failed to allocate notify event source: %m");
729 /* Process signals a bit earlier than SIGCHLD, so that we can
730 * still identify to which service an exit message belongs */
731 r
= sd_event_source_set_priority(m
->notify_event_source
, -7);
733 return log_error_errno(r
, "Failed to set priority of notify event source: %m");
735 (void) sd_event_source_set_description(m
->notify_event_source
, "manager-notify");
741 static int manager_setup_kdbus(Manager
*m
) {
742 _cleanup_free_
char *p
= NULL
;
746 if (m
->test_run
|| m
->kdbus_fd
>= 0)
748 if (!is_kdbus_available())
749 return -ESOCKTNOSUPPORT
;
751 m
->kdbus_fd
= bus_kernel_create_bus(
752 m
->running_as
== MANAGER_SYSTEM
? "system" : "user",
753 m
->running_as
== MANAGER_SYSTEM
, &p
);
756 return log_debug_errno(m
->kdbus_fd
, "Failed to set up kdbus: %m");
758 log_debug("Successfully set up kdbus on %s", p
);
763 static int manager_connect_bus(Manager
*m
, bool reexecuting
) {
764 bool try_bus_connect
;
774 (m
->running_as
== MANAGER_USER
&& getenv("DBUS_SESSION_BUS_ADDRESS"));
776 /* Try to connect to the buses, if possible. */
777 return bus_init(m
, try_bus_connect
);
780 static unsigned manager_dispatch_cleanup_queue(Manager
*m
) {
786 while ((u
= m
->cleanup_queue
)) {
787 assert(u
->in_cleanup_queue
);
797 GC_OFFSET_IN_PATH
, /* This one is on the path we were traveling */
798 GC_OFFSET_UNSURE
, /* No clue */
799 GC_OFFSET_GOOD
, /* We still need this unit */
800 GC_OFFSET_BAD
, /* We don't need this unit anymore */
804 static void unit_gc_sweep(Unit
*u
, unsigned gc_marker
) {
811 if (u
->gc_marker
== gc_marker
+ GC_OFFSET_GOOD
||
812 u
->gc_marker
== gc_marker
+ GC_OFFSET_BAD
||
813 u
->gc_marker
== gc_marker
+ GC_OFFSET_IN_PATH
)
816 if (u
->in_cleanup_queue
)
819 if (unit_check_gc(u
))
822 u
->gc_marker
= gc_marker
+ GC_OFFSET_IN_PATH
;
826 SET_FOREACH(other
, u
->dependencies
[UNIT_REFERENCED_BY
], i
) {
827 unit_gc_sweep(other
, gc_marker
);
829 if (other
->gc_marker
== gc_marker
+ GC_OFFSET_GOOD
)
832 if (other
->gc_marker
!= gc_marker
+ GC_OFFSET_BAD
)
839 /* We were unable to find anything out about this entry, so
840 * let's investigate it later */
841 u
->gc_marker
= gc_marker
+ GC_OFFSET_UNSURE
;
842 unit_add_to_gc_queue(u
);
846 /* We definitely know that this one is not useful anymore, so
847 * let's mark it for deletion */
848 u
->gc_marker
= gc_marker
+ GC_OFFSET_BAD
;
849 unit_add_to_cleanup_queue(u
);
853 u
->gc_marker
= gc_marker
+ GC_OFFSET_GOOD
;
856 static unsigned manager_dispatch_gc_queue(Manager
*m
) {
863 /* log_debug("Running GC..."); */
865 m
->gc_marker
+= _GC_OFFSET_MAX
;
866 if (m
->gc_marker
+ _GC_OFFSET_MAX
<= _GC_OFFSET_MAX
)
869 gc_marker
= m
->gc_marker
;
871 while ((u
= m
->gc_queue
)) {
872 assert(u
->in_gc_queue
);
874 unit_gc_sweep(u
, gc_marker
);
876 LIST_REMOVE(gc_queue
, m
->gc_queue
, u
);
877 u
->in_gc_queue
= false;
881 if (u
->gc_marker
== gc_marker
+ GC_OFFSET_BAD
||
882 u
->gc_marker
== gc_marker
+ GC_OFFSET_UNSURE
) {
884 log_unit_debug(u
, "Collecting.");
885 u
->gc_marker
= gc_marker
+ GC_OFFSET_BAD
;
886 unit_add_to_cleanup_queue(u
);
890 m
->n_in_gc_queue
= 0;
895 static void manager_clear_jobs_and_units(Manager
*m
) {
900 while ((u
= hashmap_first(m
->units
)))
903 manager_dispatch_cleanup_queue(m
);
905 assert(!m
->load_queue
);
906 assert(!m
->run_queue
);
907 assert(!m
->dbus_unit_queue
);
908 assert(!m
->dbus_job_queue
);
909 assert(!m
->cleanup_queue
);
910 assert(!m
->gc_queue
);
912 assert(hashmap_isempty(m
->jobs
));
913 assert(hashmap_isempty(m
->units
));
916 m
->n_running_jobs
= 0;
919 Manager
* manager_free(Manager
*m
) {
926 manager_clear_jobs_and_units(m
);
928 for (c
= 0; c
< _UNIT_TYPE_MAX
; c
++)
929 if (unit_vtable
[c
]->shutdown
)
930 unit_vtable
[c
]->shutdown(m
);
932 /* If we reexecute ourselves, we keep the root cgroup
934 manager_shutdown_cgroup(m
, m
->exit_code
!= MANAGER_REEXECUTE
);
936 manager_undo_generators(m
);
940 hashmap_free(m
->units
);
941 hashmap_free(m
->jobs
);
942 hashmap_free(m
->watch_pids1
);
943 hashmap_free(m
->watch_pids2
);
944 hashmap_free(m
->watch_bus
);
946 set_free(m
->startup_units
);
947 set_free(m
->failed_units
);
949 sd_event_source_unref(m
->signal_event_source
);
950 sd_event_source_unref(m
->notify_event_source
);
951 sd_event_source_unref(m
->time_change_event_source
);
952 sd_event_source_unref(m
->jobs_in_progress_event_source
);
953 sd_event_source_unref(m
->run_queue_event_source
);
955 safe_close(m
->signal_fd
);
956 safe_close(m
->notify_fd
);
957 safe_close(m
->time_change_fd
);
958 safe_close(m
->kdbus_fd
);
960 manager_close_ask_password(m
);
962 manager_close_idle_pipe(m
);
965 sd_event_unref(m
->event
);
967 free(m
->notify_socket
);
969 lookup_paths_free(&m
->lookup_paths
);
970 strv_free(m
->environment
);
972 hashmap_free(m
->cgroup_unit
);
973 set_free_free(m
->unit_path_cache
);
975 hashmap_free(m
->cgroup_netclass_registry
);
977 free(m
->switch_root
);
978 free(m
->switch_root_init
);
980 for (i
= 0; i
< _RLIMIT_MAX
; i
++)
983 assert(hashmap_isempty(m
->units_requiring_mounts_for
));
984 hashmap_free(m
->units_requiring_mounts_for
);
990 int manager_enumerate(Manager
*m
) {
996 /* Let's ask every type to load all units from disk/kernel
997 * that it might know */
998 for (c
= 0; c
< _UNIT_TYPE_MAX
; c
++) {
1001 if (!unit_type_supported(c
)) {
1002 log_debug("Unit type .%s is not supported on this system.", unit_type_to_string(c
));
1006 if (!unit_vtable
[c
]->enumerate
)
1009 q
= unit_vtable
[c
]->enumerate(m
);
1014 manager_dispatch_load_queue(m
);
1018 static void manager_coldplug(Manager
*m
) {
1026 /* Then, let's set up their initial state. */
1027 HASHMAP_FOREACH_KEY(u
, k
, m
->units
, i
) {
1029 /* ignore aliases */
1033 r
= unit_coldplug(u
);
1035 log_warning_errno(r
, "We couldn't coldplug %s, proceeding anyway: %m", u
->id
);
1039 static void manager_build_unit_path_cache(Manager
*m
) {
1041 _cleanup_closedir_
DIR *d
= NULL
;
1046 set_free_free(m
->unit_path_cache
);
1048 m
->unit_path_cache
= set_new(&string_hash_ops
);
1049 if (!m
->unit_path_cache
) {
1050 log_error("Failed to allocate unit path cache.");
1054 /* This simply builds a list of files we know exist, so that
1055 * we don't always have to go to disk */
1057 STRV_FOREACH(i
, m
->lookup_paths
.unit_path
) {
1062 if (errno
!= ENOENT
)
1063 log_error_errno(errno
, "Failed to open directory %s: %m", *i
);
1067 while ((de
= readdir(d
))) {
1070 if (hidden_file(de
->d_name
))
1073 p
= strjoin(streq(*i
, "/") ? "" : *i
, "/", de
->d_name
, NULL
);
1079 r
= set_consume(m
->unit_path_cache
, p
);
1084 d
= safe_closedir(d
);
1090 log_error_errno(r
, "Failed to build unit path cache: %m");
1092 set_free_free(m
->unit_path_cache
);
1093 m
->unit_path_cache
= NULL
;
1097 static int manager_distribute_fds(Manager
*m
, FDSet
*fds
) {
1104 HASHMAP_FOREACH(u
, m
->units
, i
) {
1106 if (fdset_size(fds
) <= 0)
1109 if (UNIT_VTABLE(u
)->distribute_fds
) {
1110 r
= UNIT_VTABLE(u
)->distribute_fds(u
, fds
);
1119 int manager_startup(Manager
*m
, FILE *serialization
, FDSet
*fds
) {
1124 dual_timestamp_get(&m
->generators_start_timestamp
);
1125 r
= manager_run_generators(m
);
1126 dual_timestamp_get(&m
->generators_finish_timestamp
);
1130 r
= lookup_paths_init(
1131 &m
->lookup_paths
, m
->running_as
, true,
1133 m
->generator_unit_path
,
1134 m
->generator_unit_path_early
,
1135 m
->generator_unit_path_late
);
1139 manager_build_unit_path_cache(m
);
1141 /* If we will deserialize make sure that during enumeration
1142 * this is already known, so we increase the counter here
1147 /* First, enumerate what we can from all config files */
1148 dual_timestamp_get(&m
->units_load_start_timestamp
);
1149 r
= manager_enumerate(m
);
1150 dual_timestamp_get(&m
->units_load_finish_timestamp
);
1152 /* Second, deserialize if there is something to deserialize */
1154 r
= manager_deserialize(m
, serialization
, fds
);
1156 /* Any fds left? Find some unit which wants them. This is
1157 * useful to allow container managers to pass some file
1158 * descriptors to us pre-initialized. This enables
1159 * socket-based activation of entire containers. */
1160 if (fdset_size(fds
) > 0) {
1161 q
= manager_distribute_fds(m
, fds
);
1162 if (q
< 0 && r
== 0)
1166 /* We might have deserialized the notify fd, but if we didn't
1167 * then let's create the bus now */
1168 q
= manager_setup_notify(m
);
1169 if (q
< 0 && r
== 0)
1172 /* We might have deserialized the kdbus control fd, but if we
1173 * didn't, then let's create the bus now. */
1174 manager_setup_kdbus(m
);
1175 manager_connect_bus(m
, !!serialization
);
1176 bus_track_coldplug(m
, &m
->subscribed
, &m
->deserialized_subscribed
);
1178 /* Third, fire things up! */
1179 manager_coldplug(m
);
1181 if (serialization
) {
1182 assert(m
->n_reloading
> 0);
1185 /* Let's wait for the UnitNew/JobNew messages being
1186 * sent, before we notify that the reload is
1188 m
->send_reloading_done
= true;
1194 int manager_add_job(Manager
*m
, JobType type
, Unit
*unit
, JobMode mode
, bool override
, sd_bus_error
*e
, Job
**_ret
) {
1199 assert(type
< _JOB_TYPE_MAX
);
1201 assert(mode
< _JOB_MODE_MAX
);
1203 if (mode
== JOB_ISOLATE
&& type
!= JOB_START
)
1204 return sd_bus_error_setf(e
, SD_BUS_ERROR_INVALID_ARGS
, "Isolate is only valid for start.");
1206 if (mode
== JOB_ISOLATE
&& !unit
->allow_isolate
)
1207 return sd_bus_error_setf(e
, BUS_ERROR_NO_ISOLATION
, "Operation refused, unit may not be isolated.");
1209 log_unit_debug(unit
, "Trying to enqueue job %s/%s/%s", unit
->id
, job_type_to_string(type
), job_mode_to_string(mode
));
1211 type
= job_type_collapse(type
, unit
);
1213 tr
= transaction_new(mode
== JOB_REPLACE_IRREVERSIBLY
);
1217 r
= transaction_add_job_and_dependencies(tr
, type
, unit
, NULL
, true, override
, false,
1218 mode
== JOB_IGNORE_DEPENDENCIES
|| mode
== JOB_IGNORE_REQUIREMENTS
,
1219 mode
== JOB_IGNORE_DEPENDENCIES
, e
);
1223 if (mode
== JOB_ISOLATE
) {
1224 r
= transaction_add_isolate_jobs(tr
, m
);
1229 r
= transaction_activate(tr
, m
, mode
, e
);
1233 log_unit_debug(unit
,
1234 "Enqueued job %s/%s as %u", unit
->id
,
1235 job_type_to_string(type
), (unsigned) tr
->anchor_job
->id
);
1238 *_ret
= tr
->anchor_job
;
1240 transaction_free(tr
);
1244 transaction_abort(tr
);
1245 transaction_free(tr
);
1249 int manager_add_job_by_name(Manager
*m
, JobType type
, const char *name
, JobMode mode
, bool override
, sd_bus_error
*e
, Job
**_ret
) {
1254 assert(type
< _JOB_TYPE_MAX
);
1256 assert(mode
< _JOB_MODE_MAX
);
1258 r
= manager_load_unit(m
, name
, NULL
, NULL
, &unit
);
1262 return manager_add_job(m
, type
, unit
, mode
, override
, e
, _ret
);
1265 Job
*manager_get_job(Manager
*m
, uint32_t id
) {
1268 return hashmap_get(m
->jobs
, UINT32_TO_PTR(id
));
1271 Unit
*manager_get_unit(Manager
*m
, const char *name
) {
1275 return hashmap_get(m
->units
, name
);
1278 unsigned manager_dispatch_load_queue(Manager
*m
) {
1284 /* Make sure we are not run recursively */
1285 if (m
->dispatching_load_queue
)
1288 m
->dispatching_load_queue
= true;
1290 /* Dispatches the load queue. Takes a unit from the queue and
1291 * tries to load its data until the queue is empty */
1293 while ((u
= m
->load_queue
)) {
1294 assert(u
->in_load_queue
);
1300 m
->dispatching_load_queue
= false;
1304 int manager_load_unit_prepare(
1316 assert(name
|| path
);
1318 /* This will prepare the unit for loading, but not actually
1319 * load anything from disk. */
1321 if (path
&& !is_path(path
))
1322 return sd_bus_error_setf(e
, SD_BUS_ERROR_INVALID_ARGS
, "Path %s is not absolute.", path
);
1325 name
= basename(path
);
1327 t
= unit_name_to_type(name
);
1329 if (t
== _UNIT_TYPE_INVALID
|| !unit_name_is_valid(name
, UNIT_NAME_PLAIN
|UNIT_NAME_INSTANCE
))
1330 return sd_bus_error_setf(e
, SD_BUS_ERROR_INVALID_ARGS
, "Unit name %s is not valid.", name
);
1332 ret
= manager_get_unit(m
, name
);
1338 ret
= unit_new(m
, unit_vtable
[t
]->object_size
);
1343 ret
->fragment_path
= strdup(path
);
1344 if (!ret
->fragment_path
) {
1350 r
= unit_add_name(ret
, name
);
1356 unit_add_to_load_queue(ret
);
1357 unit_add_to_dbus_queue(ret
);
1358 unit_add_to_gc_queue(ret
);
1366 int manager_load_unit(
1377 /* This will load the service information files, but not actually
1378 * start any services or anything. */
1380 r
= manager_load_unit_prepare(m
, name
, path
, e
, _ret
);
1384 manager_dispatch_load_queue(m
);
1387 *_ret
= unit_follow_merge(*_ret
);
1392 void manager_dump_jobs(Manager
*s
, FILE *f
, const char *prefix
) {
1399 HASHMAP_FOREACH(j
, s
->jobs
, i
)
1400 job_dump(j
, f
, prefix
);
1403 void manager_dump_units(Manager
*s
, FILE *f
, const char *prefix
) {
1411 HASHMAP_FOREACH_KEY(u
, t
, s
->units
, i
)
1413 unit_dump(u
, f
, prefix
);
1416 void manager_clear_jobs(Manager
*m
) {
1421 while ((j
= hashmap_first(m
->jobs
)))
1422 /* No need to recurse. We're cancelling all jobs. */
1423 job_finish_and_invalidate(j
, JOB_CANCELED
, false);
1426 static int manager_dispatch_run_queue(sd_event_source
*source
, void *userdata
) {
1427 Manager
*m
= userdata
;
1433 while ((j
= m
->run_queue
)) {
1434 assert(j
->installed
);
1435 assert(j
->in_run_queue
);
1437 job_run_and_invalidate(j
);
1440 if (m
->n_running_jobs
> 0)
1441 manager_watch_jobs_in_progress(m
);
1443 if (m
->n_on_console
> 0)
1444 manager_watch_idle_pipe(m
);
1449 static unsigned manager_dispatch_dbus_queue(Manager
*m
) {
1456 if (m
->dispatching_dbus_queue
)
1459 m
->dispatching_dbus_queue
= true;
1461 while ((u
= m
->dbus_unit_queue
)) {
1462 assert(u
->in_dbus_queue
);
1464 bus_unit_send_change_signal(u
);
1468 while ((j
= m
->dbus_job_queue
)) {
1469 assert(j
->in_dbus_queue
);
1471 bus_job_send_change_signal(j
);
1475 m
->dispatching_dbus_queue
= false;
1477 if (m
->send_reloading_done
) {
1478 m
->send_reloading_done
= false;
1480 bus_manager_send_reloading(m
, false);
1483 if (m
->queued_message
)
1484 bus_send_queued_message(m
);
1489 static void manager_invoke_notify_message(Manager
*m
, Unit
*u
, pid_t pid
, char *buf
, size_t n
, FDSet
*fds
) {
1490 _cleanup_strv_free_
char **tags
= NULL
;
1497 tags
= strv_split(buf
, "\n\r");
1503 if (UNIT_VTABLE(u
)->notify_message
)
1504 UNIT_VTABLE(u
)->notify_message(u
, pid
, tags
, fds
);
1506 log_unit_debug(u
, "Got notification message for unit. Ignoring.");
1509 static int manager_dispatch_notify_fd(sd_event_source
*source
, int fd
, uint32_t revents
, void *userdata
) {
1510 Manager
*m
= userdata
;
1515 assert(m
->notify_fd
== fd
);
1517 if (revents
!= EPOLLIN
) {
1518 log_warning("Got unexpected poll event for notify fd.");
1523 _cleanup_fdset_free_ FDSet
*fds
= NULL
;
1524 char buf
[NOTIFY_BUFFER_MAX
+1];
1525 struct iovec iovec
= {
1527 .iov_len
= sizeof(buf
)-1,
1530 struct cmsghdr cmsghdr
;
1531 uint8_t buf
[CMSG_SPACE(sizeof(struct ucred
)) +
1532 CMSG_SPACE(sizeof(int) * NOTIFY_FD_MAX
)];
1534 struct msghdr msghdr
= {
1537 .msg_control
= &control
,
1538 .msg_controllen
= sizeof(control
),
1540 struct cmsghdr
*cmsg
;
1541 struct ucred
*ucred
= NULL
;
1544 int *fd_array
= NULL
;
1547 n
= recvmsg(m
->notify_fd
, &msghdr
, MSG_DONTWAIT
|MSG_CMSG_CLOEXEC
);
1549 if (errno
== EAGAIN
|| errno
== EINTR
)
1555 CMSG_FOREACH(cmsg
, &msghdr
) {
1556 if (cmsg
->cmsg_level
== SOL_SOCKET
&& cmsg
->cmsg_type
== SCM_RIGHTS
) {
1558 fd_array
= (int*) CMSG_DATA(cmsg
);
1559 n_fds
= (cmsg
->cmsg_len
- CMSG_LEN(0)) / sizeof(int);
1561 } else if (cmsg
->cmsg_level
== SOL_SOCKET
&&
1562 cmsg
->cmsg_type
== SCM_CREDENTIALS
&&
1563 cmsg
->cmsg_len
== CMSG_LEN(sizeof(struct ucred
))) {
1565 ucred
= (struct ucred
*) CMSG_DATA(cmsg
);
1572 r
= fdset_new_array(&fds
, fd_array
, n_fds
);
1574 close_many(fd_array
, n_fds
);
1579 if (!ucred
|| ucred
->pid
<= 0) {
1580 log_warning("Received notify message without valid credentials. Ignoring.");
1584 if ((size_t) n
>= sizeof(buf
)) {
1585 log_warning("Received notify message exceeded maximum size. Ignoring.");
1591 /* Notify every unit that might be interested, but try
1592 * to avoid notifying the same one multiple times. */
1593 u1
= manager_get_unit_by_pid_cgroup(m
, ucred
->pid
);
1595 manager_invoke_notify_message(m
, u1
, ucred
->pid
, buf
, n
, fds
);
1599 u2
= hashmap_get(m
->watch_pids1
, PID_TO_PTR(ucred
->pid
));
1600 if (u2
&& u2
!= u1
) {
1601 manager_invoke_notify_message(m
, u2
, ucred
->pid
, buf
, n
, fds
);
1605 u3
= hashmap_get(m
->watch_pids2
, PID_TO_PTR(ucred
->pid
));
1606 if (u3
&& u3
!= u2
&& u3
!= u1
) {
1607 manager_invoke_notify_message(m
, u3
, ucred
->pid
, buf
, n
, fds
);
1612 log_warning("Cannot find unit for notify message of PID "PID_FMT
".", ucred
->pid
);
1614 if (fdset_size(fds
) > 0)
1615 log_warning("Got auxiliary fds with notification message, closing all.");
1621 static void invoke_sigchld_event(Manager
*m
, Unit
*u
, 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 set_free_free(m
->unit_path_cache
);
2004 m
->unit_path_cache
= NULL
;
2006 manager_check_finished(m
);
2008 /* There might still be some zombies hanging around from
2009 * before we were exec()'ed. Let's reap them. */
2010 r
= manager_dispatch_sigchld(m
);
2014 while (m
->exit_code
== MANAGER_OK
) {
2017 if (m
->runtime_watchdog
> 0 && m
->running_as
== MANAGER_SYSTEM
)
2020 if (!ratelimit_test(&rl
)) {
2021 /* Yay, something is going seriously wrong, pause a little */
2022 log_warning("Looping too fast. Throttling execution a little.");
2027 if (manager_dispatch_load_queue(m
) > 0)
2030 if (manager_dispatch_gc_queue(m
) > 0)
2033 if (manager_dispatch_cleanup_queue(m
) > 0)
2036 if (manager_dispatch_cgroup_queue(m
) > 0)
2039 if (manager_dispatch_dbus_queue(m
) > 0)
2042 /* Sleep for half the watchdog time */
2043 if (m
->runtime_watchdog
> 0 && m
->running_as
== MANAGER_SYSTEM
) {
2044 wait_usec
= m
->runtime_watchdog
/ 2;
2048 wait_usec
= USEC_INFINITY
;
2050 r
= sd_event_run(m
->event
, wait_usec
);
2052 return log_error_errno(r
, "Failed to run event loop: %m");
2055 return m
->exit_code
;
2058 int manager_load_unit_from_dbus_path(Manager
*m
, const char *s
, sd_bus_error
*e
, Unit
**_u
) {
2059 _cleanup_free_
char *n
= NULL
;
2067 r
= unit_name_from_dbus_path(s
, &n
);
2071 r
= manager_load_unit(m
, n
, NULL
, e
, &u
);
2080 int manager_get_job_from_dbus_path(Manager
*m
, const char *s
, Job
**_j
) {
2090 p
= startswith(s
, "/org/freedesktop/systemd1/job/");
2094 r
= safe_atou(p
, &id
);
2098 j
= manager_get_job(m
, id
);
2107 void manager_send_unit_audit(Manager
*m
, Unit
*u
, int type
, bool success
) {
2110 _cleanup_free_
char *p
= NULL
;
2114 audit_fd
= get_audit_fd();
2118 /* Don't generate audit events if the service was already
2119 * started and we're just deserializing */
2120 if (m
->n_reloading
> 0)
2123 if (m
->running_as
!= MANAGER_SYSTEM
)
2126 if (u
->type
!= UNIT_SERVICE
)
2129 r
= unit_name_to_prefix_and_instance(u
->id
, &p
);
2131 log_error_errno(r
, "Failed to extract prefix and instance of unit name: %m");
2135 msg
= strjoina("unit=", p
);
2136 if (audit_log_user_comm_message(audit_fd
, type
, msg
, "systemd", NULL
, NULL
, NULL
, success
) < 0) {
2138 /* We aren't allowed to send audit messages?
2139 * Then let's not retry again. */
2142 log_warning_errno(errno
, "Failed to send audit message: %m");
2148 void manager_send_unit_plymouth(Manager
*m
, Unit
*u
) {
2149 union sockaddr_union sa
= PLYMOUTH_SOCKET
;
2152 _cleanup_free_
char *message
= NULL
;
2153 _cleanup_close_
int fd
= -1;
2155 /* Don't generate plymouth events if the service was already
2156 * started and we're just deserializing */
2157 if (m
->n_reloading
> 0)
2160 if (m
->running_as
!= MANAGER_SYSTEM
)
2163 if (detect_container() > 0)
2166 if (u
->type
!= UNIT_SERVICE
&&
2167 u
->type
!= UNIT_MOUNT
&&
2168 u
->type
!= UNIT_SWAP
)
2171 /* We set SOCK_NONBLOCK here so that we rather drop the
2172 * message then wait for plymouth */
2173 fd
= socket(AF_UNIX
, SOCK_STREAM
|SOCK_CLOEXEC
|SOCK_NONBLOCK
, 0);
2175 log_error_errno(errno
, "socket() failed: %m");
2179 if (connect(fd
, &sa
.sa
, offsetof(struct sockaddr_un
, sun_path
) + 1 + strlen(sa
.un
.sun_path
+1)) < 0) {
2181 if (!IN_SET(errno
, EPIPE
, EAGAIN
, ENOENT
, ECONNREFUSED
, ECONNRESET
, ECONNABORTED
))
2182 log_error_errno(errno
, "connect() failed: %m");
2186 if (asprintf(&message
, "U\002%c%s%n", (int) (strlen(u
->id
) + 1), u
->id
, &n
) < 0) {
2192 if (write(fd
, message
, n
+ 1) != n
+ 1)
2193 if (!IN_SET(errno
, EPIPE
, EAGAIN
, ENOENT
, ECONNREFUSED
, ECONNRESET
, ECONNABORTED
))
2194 log_error_errno(errno
, "Failed to write Plymouth message: %m");
2197 int manager_open_serialization(Manager
*m
, FILE **_f
) {
2204 path
= m
->running_as
== MANAGER_SYSTEM
? "/run/systemd" : "/tmp";
2205 fd
= open_tmpfile(path
, O_RDWR
|O_CLOEXEC
);
2209 log_debug("Serializing state to %s", path
);
2211 f
= fdopen(fd
, "w+");
2222 int manager_serialize(Manager
*m
, FILE *f
, FDSet
*fds
, bool switching_root
) {
2235 fprintf(f
, "current-job-id=%"PRIu32
"\n", m
->current_job_id
);
2236 fprintf(f
, "taint-usr=%s\n", yes_no(m
->taint_usr
));
2237 fprintf(f
, "n-installed-jobs=%u\n", m
->n_installed_jobs
);
2238 fprintf(f
, "n-failed-jobs=%u\n", m
->n_failed_jobs
);
2240 dual_timestamp_serialize(f
, "firmware-timestamp", &m
->firmware_timestamp
);
2241 dual_timestamp_serialize(f
, "loader-timestamp", &m
->loader_timestamp
);
2242 dual_timestamp_serialize(f
, "kernel-timestamp", &m
->kernel_timestamp
);
2243 dual_timestamp_serialize(f
, "initrd-timestamp", &m
->initrd_timestamp
);
2246 dual_timestamp_serialize(f
, "userspace-timestamp", &m
->userspace_timestamp
);
2247 dual_timestamp_serialize(f
, "finish-timestamp", &m
->finish_timestamp
);
2248 dual_timestamp_serialize(f
, "security-start-timestamp", &m
->security_start_timestamp
);
2249 dual_timestamp_serialize(f
, "security-finish-timestamp", &m
->security_finish_timestamp
);
2250 dual_timestamp_serialize(f
, "generators-start-timestamp", &m
->generators_start_timestamp
);
2251 dual_timestamp_serialize(f
, "generators-finish-timestamp", &m
->generators_finish_timestamp
);
2252 dual_timestamp_serialize(f
, "units-load-start-timestamp", &m
->units_load_start_timestamp
);
2253 dual_timestamp_serialize(f
, "units-load-finish-timestamp", &m
->units_load_finish_timestamp
);
2256 if (!switching_root
) {
2257 STRV_FOREACH(e
, m
->environment
) {
2258 _cleanup_free_
char *ce
;
2264 fprintf(f
, "env=%s\n", *e
);
2268 if (m
->notify_fd
>= 0) {
2271 copy
= fdset_put_dup(fds
, m
->notify_fd
);
2275 fprintf(f
, "notify-fd=%i\n", copy
);
2276 fprintf(f
, "notify-socket=%s\n", m
->notify_socket
);
2279 if (m
->kdbus_fd
>= 0) {
2282 copy
= fdset_put_dup(fds
, m
->kdbus_fd
);
2286 fprintf(f
, "kdbus-fd=%i\n", copy
);
2289 bus_track_serialize(m
->subscribed
, f
);
2293 HASHMAP_FOREACH_KEY(u
, t
, m
->units
, i
) {
2301 r
= unit_serialize(u
, f
, fds
, !switching_root
);
2308 assert(m
->n_reloading
> 0);
2314 r
= bus_fdset_add_all(m
, fds
);
2321 int manager_deserialize(Manager
*m
, FILE *f
, FDSet
*fds
) {
2327 log_debug("Deserializing state...");
2332 char line
[LINE_MAX
], *l
;
2334 if (!fgets(line
, sizeof(line
), f
)) {
2349 if (startswith(l
, "current-job-id=")) {
2352 if (safe_atou32(l
+15, &id
) < 0)
2353 log_debug("Failed to parse current job id value %s", l
+15);
2355 m
->current_job_id
= MAX(m
->current_job_id
, id
);
2357 } else if (startswith(l
, "n-installed-jobs=")) {
2360 if (safe_atou32(l
+17, &n
) < 0)
2361 log_debug("Failed to parse installed jobs counter %s", l
+17);
2363 m
->n_installed_jobs
+= n
;
2365 } else if (startswith(l
, "n-failed-jobs=")) {
2368 if (safe_atou32(l
+14, &n
) < 0)
2369 log_debug("Failed to parse failed jobs counter %s", l
+14);
2371 m
->n_failed_jobs
+= n
;
2373 } else if (startswith(l
, "taint-usr=")) {
2376 b
= parse_boolean(l
+10);
2378 log_debug("Failed to parse taint /usr flag %s", l
+10);
2380 m
->taint_usr
= m
->taint_usr
|| b
;
2382 } else if (startswith(l
, "firmware-timestamp="))
2383 dual_timestamp_deserialize(l
+19, &m
->firmware_timestamp
);
2384 else if (startswith(l
, "loader-timestamp="))
2385 dual_timestamp_deserialize(l
+17, &m
->loader_timestamp
);
2386 else if (startswith(l
, "kernel-timestamp="))
2387 dual_timestamp_deserialize(l
+17, &m
->kernel_timestamp
);
2388 else if (startswith(l
, "initrd-timestamp="))
2389 dual_timestamp_deserialize(l
+17, &m
->initrd_timestamp
);
2390 else if (startswith(l
, "userspace-timestamp="))
2391 dual_timestamp_deserialize(l
+20, &m
->userspace_timestamp
);
2392 else if (startswith(l
, "finish-timestamp="))
2393 dual_timestamp_deserialize(l
+17, &m
->finish_timestamp
);
2394 else if (startswith(l
, "security-start-timestamp="))
2395 dual_timestamp_deserialize(l
+25, &m
->security_start_timestamp
);
2396 else if (startswith(l
, "security-finish-timestamp="))
2397 dual_timestamp_deserialize(l
+26, &m
->security_finish_timestamp
);
2398 else if (startswith(l
, "generators-start-timestamp="))
2399 dual_timestamp_deserialize(l
+27, &m
->generators_start_timestamp
);
2400 else if (startswith(l
, "generators-finish-timestamp="))
2401 dual_timestamp_deserialize(l
+28, &m
->generators_finish_timestamp
);
2402 else if (startswith(l
, "units-load-start-timestamp="))
2403 dual_timestamp_deserialize(l
+27, &m
->units_load_start_timestamp
);
2404 else if (startswith(l
, "units-load-finish-timestamp="))
2405 dual_timestamp_deserialize(l
+28, &m
->units_load_finish_timestamp
);
2406 else if (startswith(l
, "env=")) {
2407 _cleanup_free_
char *uce
= NULL
;
2410 r
= cunescape(l
+ 4, UNESCAPE_RELAX
, &uce
);
2414 e
= strv_env_set(m
->environment
, uce
);
2420 strv_free(m
->environment
);
2423 } else if (startswith(l
, "notify-fd=")) {
2426 if (safe_atoi(l
+ 10, &fd
) < 0 || fd
< 0 || !fdset_contains(fds
, fd
))
2427 log_debug("Failed to parse notify fd: %s", l
+ 10);
2429 m
->notify_event_source
= sd_event_source_unref(m
->notify_event_source
);
2430 safe_close(m
->notify_fd
);
2431 m
->notify_fd
= fdset_remove(fds
, fd
);
2434 } else if (startswith(l
, "notify-socket=")) {
2443 free(m
->notify_socket
);
2444 m
->notify_socket
= n
;
2446 } else if (startswith(l
, "kdbus-fd=")) {
2449 if (safe_atoi(l
+ 9, &fd
) < 0 || fd
< 0 || !fdset_contains(fds
, fd
))
2450 log_debug("Failed to parse kdbus fd: %s", l
+ 9);
2452 safe_close(m
->kdbus_fd
);
2453 m
->kdbus_fd
= fdset_remove(fds
, fd
);
2459 k
= bus_track_deserialize_item(&m
->deserialized_subscribed
, l
);
2461 log_debug_errno(k
, "Failed to deserialize bus tracker object: %m");
2463 log_debug("Unknown serialization item '%s'", l
);
2469 char name
[UNIT_NAME_MAX
+2];
2472 if (!fgets(name
, sizeof(name
), f
)) {
2483 r
= manager_load_unit(m
, strstrip(name
), NULL
, NULL
, &u
);
2487 r
= unit_deserialize(u
, f
, fds
);
2496 assert(m
->n_reloading
> 0);
2502 int manager_reload(Manager
*m
) {
2504 _cleanup_fclose_
FILE *f
= NULL
;
2505 _cleanup_fdset_free_ FDSet
*fds
= NULL
;
2509 r
= manager_open_serialization(m
, &f
);
2514 bus_manager_send_reloading(m
, true);
2522 r
= manager_serialize(m
, f
, fds
, false);
2528 if (fseeko(f
, 0, SEEK_SET
) < 0) {
2533 /* From here on there is no way back. */
2534 manager_clear_jobs_and_units(m
);
2535 manager_undo_generators(m
);
2536 lookup_paths_free(&m
->lookup_paths
);
2538 /* Find new unit paths */
2539 q
= manager_run_generators(m
);
2540 if (q
< 0 && r
>= 0)
2543 q
= lookup_paths_init(
2544 &m
->lookup_paths
, m
->running_as
, true,
2546 m
->generator_unit_path
,
2547 m
->generator_unit_path_early
,
2548 m
->generator_unit_path_late
);
2549 if (q
< 0 && r
>= 0)
2552 manager_build_unit_path_cache(m
);
2554 /* First, enumerate what we can from all config files */
2555 q
= manager_enumerate(m
);
2556 if (q
< 0 && r
>= 0)
2559 /* Second, deserialize our stored data */
2560 q
= manager_deserialize(m
, f
, fds
);
2561 if (q
< 0 && r
>= 0)
2567 /* Re-register notify_fd as event source */
2568 q
= manager_setup_notify(m
);
2569 if (q
< 0 && r
>= 0)
2572 /* Third, fire things up! */
2573 manager_coldplug(m
);
2575 assert(m
->n_reloading
> 0);
2578 m
->send_reloading_done
= true;
2583 bool manager_is_reloading_or_reexecuting(Manager
*m
) {
2586 return m
->n_reloading
!= 0;
2589 void manager_reset_failed(Manager
*m
) {
2595 HASHMAP_FOREACH(u
, m
->units
, i
)
2596 unit_reset_failed(u
);
2599 bool manager_unit_inactive_or_pending(Manager
*m
, const char *name
) {
2605 /* Returns true if the unit is inactive or going down */
2606 u
= manager_get_unit(m
, name
);
2610 return unit_inactive_or_pending(u
);
2613 static void manager_notify_finished(Manager
*m
) {
2614 char userspace
[FORMAT_TIMESPAN_MAX
], initrd
[FORMAT_TIMESPAN_MAX
], kernel
[FORMAT_TIMESPAN_MAX
], sum
[FORMAT_TIMESPAN_MAX
];
2615 usec_t firmware_usec
, loader_usec
, kernel_usec
, initrd_usec
, userspace_usec
, total_usec
;
2620 if (m
->running_as
== MANAGER_SYSTEM
&& detect_container() <= 0) {
2622 /* Note that m->kernel_usec.monotonic is always at 0,
2623 * and m->firmware_usec.monotonic and
2624 * m->loader_usec.monotonic should be considered
2625 * negative values. */
2627 firmware_usec
= m
->firmware_timestamp
.monotonic
- m
->loader_timestamp
.monotonic
;
2628 loader_usec
= m
->loader_timestamp
.monotonic
- m
->kernel_timestamp
.monotonic
;
2629 userspace_usec
= m
->finish_timestamp
.monotonic
- m
->userspace_timestamp
.monotonic
;
2630 total_usec
= m
->firmware_timestamp
.monotonic
+ m
->finish_timestamp
.monotonic
;
2632 if (dual_timestamp_is_set(&m
->initrd_timestamp
)) {
2634 kernel_usec
= m
->initrd_timestamp
.monotonic
- m
->kernel_timestamp
.monotonic
;
2635 initrd_usec
= m
->userspace_timestamp
.monotonic
- m
->initrd_timestamp
.monotonic
;
2637 log_struct(LOG_INFO
,
2638 LOG_MESSAGE_ID(SD_MESSAGE_STARTUP_FINISHED
),
2639 "KERNEL_USEC="USEC_FMT
, kernel_usec
,
2640 "INITRD_USEC="USEC_FMT
, initrd_usec
,
2641 "USERSPACE_USEC="USEC_FMT
, userspace_usec
,
2642 LOG_MESSAGE("Startup finished in %s (kernel) + %s (initrd) + %s (userspace) = %s.",
2643 format_timespan(kernel
, sizeof(kernel
), kernel_usec
, USEC_PER_MSEC
),
2644 format_timespan(initrd
, sizeof(initrd
), initrd_usec
, USEC_PER_MSEC
),
2645 format_timespan(userspace
, sizeof(userspace
), userspace_usec
, USEC_PER_MSEC
),
2646 format_timespan(sum
, sizeof(sum
), total_usec
, USEC_PER_MSEC
)),
2649 kernel_usec
= m
->userspace_timestamp
.monotonic
- m
->kernel_timestamp
.monotonic
;
2652 log_struct(LOG_INFO
,
2653 LOG_MESSAGE_ID(SD_MESSAGE_STARTUP_FINISHED
),
2654 "KERNEL_USEC="USEC_FMT
, kernel_usec
,
2655 "USERSPACE_USEC="USEC_FMT
, userspace_usec
,
2656 LOG_MESSAGE("Startup finished in %s (kernel) + %s (userspace) = %s.",
2657 format_timespan(kernel
, sizeof(kernel
), kernel_usec
, USEC_PER_MSEC
),
2658 format_timespan(userspace
, sizeof(userspace
), userspace_usec
, USEC_PER_MSEC
),
2659 format_timespan(sum
, sizeof(sum
), total_usec
, USEC_PER_MSEC
)),
2663 firmware_usec
= loader_usec
= initrd_usec
= kernel_usec
= 0;
2664 total_usec
= userspace_usec
= m
->finish_timestamp
.monotonic
- m
->userspace_timestamp
.monotonic
;
2666 log_struct(LOG_INFO
,
2667 LOG_MESSAGE_ID(SD_MESSAGE_STARTUP_FINISHED
),
2668 "USERSPACE_USEC="USEC_FMT
, userspace_usec
,
2669 LOG_MESSAGE("Startup finished in %s.",
2670 format_timespan(sum
, sizeof(sum
), total_usec
, USEC_PER_MSEC
)),
2674 bus_manager_send_finished(m
, firmware_usec
, loader_usec
, kernel_usec
, initrd_usec
, userspace_usec
, total_usec
);
2678 "STATUS=Startup finished in %s.",
2679 format_timespan(sum
, sizeof(sum
), total_usec
, USEC_PER_MSEC
));
2682 void manager_check_finished(Manager
*m
) {
2685 if (m
->n_reloading
> 0)
2688 /* Verify that we are actually running currently. Initially
2689 * the exit code is set to invalid, and during operation it is
2690 * then set to MANAGER_OK */
2691 if (m
->exit_code
!= MANAGER_OK
)
2694 if (hashmap_size(m
->jobs
) > 0) {
2695 if (m
->jobs_in_progress_event_source
)
2696 /* Ignore any failure, this is only for feedback */
2697 (void) sd_event_source_set_time(m
->jobs_in_progress_event_source
, now(CLOCK_MONOTONIC
) + JOBS_IN_PROGRESS_WAIT_USEC
);
2702 manager_flip_auto_status(m
, false);
2704 /* Notify Type=idle units that we are done now */
2705 manager_close_idle_pipe(m
);
2707 /* Turn off confirm spawn now */
2708 m
->confirm_spawn
= false;
2710 /* No need to update ask password status when we're going non-interactive */
2711 manager_close_ask_password(m
);
2713 /* This is no longer the first boot */
2714 manager_set_first_boot(m
, false);
2716 if (dual_timestamp_is_set(&m
->finish_timestamp
))
2719 dual_timestamp_get(&m
->finish_timestamp
);
2721 manager_notify_finished(m
);
2723 manager_invalidate_startup_units(m
);
2726 static int create_generator_dir(Manager
*m
, char **generator
, const char *name
) {
2737 if (m
->running_as
== MANAGER_SYSTEM
&& getpid() == 1) {
2738 /* systemd --system, not running --test */
2740 p
= strappend("/run/systemd/", name
);
2744 r
= mkdir_p_label(p
, 0755);
2746 log_error_errno(r
, "Failed to create generator directory %s: %m", p
);
2750 } else if (m
->running_as
== MANAGER_USER
) {
2751 const char *s
= NULL
;
2753 s
= getenv("XDG_RUNTIME_DIR");
2756 p
= strjoin(s
, "/systemd/", name
, NULL
);
2760 r
= mkdir_p_label(p
, 0755);
2762 log_error_errno(r
, "Failed to create generator directory %s: %m", p
);
2767 /* systemd --system --test */
2769 p
= strjoin("/tmp/systemd-", name
, ".XXXXXX", NULL
);
2774 log_error_errno(errno
, "Failed to create generator directory %s: %m",
2785 static void trim_generator_dir(Manager
*m
, char **generator
) {
2792 if (rmdir(*generator
) >= 0)
2793 *generator
= mfree(*generator
);
2798 static int manager_run_generators(Manager
*m
) {
2799 _cleanup_strv_free_
char **paths
= NULL
;
2800 const char *argv
[5];
2809 paths
= generator_paths(m
->running_as
);
2813 /* Optimize by skipping the whole process by not creating output directories
2814 * if no generators are found. */
2815 STRV_FOREACH(path
, paths
) {
2816 r
= access(*path
, F_OK
);
2819 if (errno
!= ENOENT
)
2820 log_warning_errno(errno
, "Failed to open generator directory %s: %m", *path
);
2825 r
= create_generator_dir(m
, &m
->generator_unit_path
, "generator");
2829 r
= create_generator_dir(m
, &m
->generator_unit_path_early
, "generator.early");
2833 r
= create_generator_dir(m
, &m
->generator_unit_path_late
, "generator.late");
2837 argv
[0] = NULL
; /* Leave this empty, execute_directory() will fill something in */
2838 argv
[1] = m
->generator_unit_path
;
2839 argv
[2] = m
->generator_unit_path_early
;
2840 argv
[3] = m
->generator_unit_path_late
;
2843 RUN_WITH_UMASK(0022)
2844 execute_directories((const char* const*) paths
, DEFAULT_TIMEOUT_USEC
, (char**) argv
);
2847 trim_generator_dir(m
, &m
->generator_unit_path
);
2848 trim_generator_dir(m
, &m
->generator_unit_path_early
);
2849 trim_generator_dir(m
, &m
->generator_unit_path_late
);
2853 static void remove_generator_dir(Manager
*m
, char **generator
) {
2860 strv_remove(m
->lookup_paths
.unit_path
, *generator
);
2861 (void) rm_rf(*generator
, REMOVE_ROOT
);
2863 *generator
= mfree(*generator
);
2866 static void manager_undo_generators(Manager
*m
) {
2869 remove_generator_dir(m
, &m
->generator_unit_path
);
2870 remove_generator_dir(m
, &m
->generator_unit_path_early
);
2871 remove_generator_dir(m
, &m
->generator_unit_path_late
);
2874 int manager_environment_add(Manager
*m
, char **minus
, char **plus
) {
2875 char **a
= NULL
, **b
= NULL
, **l
;
2880 if (!strv_isempty(minus
)) {
2881 a
= strv_env_delete(l
, 1, minus
);
2888 if (!strv_isempty(plus
)) {
2889 b
= strv_env_merge(2, l
, plus
);
2898 if (m
->environment
!= l
)
2899 strv_free(m
->environment
);
2906 manager_clean_environment(m
);
2907 strv_sort(m
->environment
);
2912 int manager_set_default_rlimits(Manager
*m
, struct rlimit
**default_rlimit
) {
2917 for (i
= 0; i
< _RLIMIT_MAX
; i
++) {
2918 if (!default_rlimit
[i
])
2921 m
->rlimit
[i
] = newdup(struct rlimit
, default_rlimit
[i
], 1);
2929 void manager_recheck_journal(Manager
*m
) {
2934 if (m
->running_as
!= MANAGER_SYSTEM
)
2937 u
= manager_get_unit(m
, SPECIAL_JOURNALD_SOCKET
);
2938 if (u
&& SOCKET(u
)->state
!= SOCKET_RUNNING
) {
2939 log_close_journal();
2943 u
= manager_get_unit(m
, SPECIAL_JOURNALD_SERVICE
);
2944 if (u
&& SERVICE(u
)->state
!= SERVICE_RUNNING
) {
2945 log_close_journal();
2949 /* Hmm, OK, so the socket is fully up and the service is up
2950 * too, then let's make use of the thing. */
2954 void manager_set_show_status(Manager
*m
, ShowStatus mode
) {
2956 assert(IN_SET(mode
, SHOW_STATUS_AUTO
, SHOW_STATUS_NO
, SHOW_STATUS_YES
, SHOW_STATUS_TEMPORARY
));
2958 if (m
->running_as
!= MANAGER_SYSTEM
)
2961 m
->show_status
= mode
;
2964 (void) touch("/run/systemd/show-status");
2966 (void) unlink("/run/systemd/show-status");
2969 static bool manager_get_show_status(Manager
*m
, StatusType type
) {
2972 if (m
->running_as
!= MANAGER_SYSTEM
)
2975 if (m
->no_console_output
)
2978 if (!IN_SET(manager_state(m
), MANAGER_INITIALIZING
, MANAGER_STARTING
, MANAGER_STOPPING
))
2981 /* If we cannot find out the status properly, just proceed. */
2982 if (type
!= STATUS_TYPE_EMERGENCY
&& manager_check_ask_password(m
) > 0)
2985 if (m
->show_status
> 0)
2991 void manager_set_first_boot(Manager
*m
, bool b
) {
2994 if (m
->running_as
!= MANAGER_SYSTEM
)
2997 if (m
->first_boot
!= (int) b
) {
2999 (void) touch("/run/systemd/first-boot");
3001 (void) unlink("/run/systemd/first-boot");
3007 void manager_status_printf(Manager
*m
, StatusType type
, const char *status
, const char *format
, ...) {
3010 /* If m is NULL, assume we're after shutdown and let the messages through. */
3012 if (m
&& !manager_get_show_status(m
, type
))
3015 /* XXX We should totally drop the check for ephemeral here
3016 * and thus effectively make 'Type=idle' pointless. */
3017 if (type
== STATUS_TYPE_EPHEMERAL
&& m
&& m
->n_on_console
> 0)
3020 va_start(ap
, format
);
3021 status_vprintf(status
, true, type
== STATUS_TYPE_EPHEMERAL
, format
, ap
);
3025 Set
*manager_get_units_requiring_mounts_for(Manager
*m
, const char *path
) {
3026 char p
[strlen(path
)+1];
3032 path_kill_slashes(p
);
3034 return hashmap_get(m
->units_requiring_mounts_for
, streq(p
, "/") ? "" : p
);
3037 const char *manager_get_runtime_prefix(Manager
*m
) {
3040 return m
->running_as
== MANAGER_SYSTEM
?
3042 getenv("XDG_RUNTIME_DIR");
3045 int manager_update_failed_units(Manager
*m
, Unit
*u
, bool failed
) {
3050 assert(u
->manager
== m
);
3052 size
= set_size(m
->failed_units
);
3055 r
= set_ensure_allocated(&m
->failed_units
, NULL
);
3059 if (set_put(m
->failed_units
, u
) < 0)
3062 (void) set_remove(m
->failed_units
, u
);
3064 if (set_size(m
->failed_units
) != size
)
3065 bus_manager_send_change_signal(m
);
3070 ManagerState
manager_state(Manager
*m
) {
3075 /* Did we ever finish booting? If not then we are still starting up */
3076 if (!dual_timestamp_is_set(&m
->finish_timestamp
)) {
3078 u
= manager_get_unit(m
, SPECIAL_BASIC_TARGET
);
3079 if (!u
|| !UNIT_IS_ACTIVE_OR_RELOADING(unit_active_state(u
)))
3080 return MANAGER_INITIALIZING
;
3082 return MANAGER_STARTING
;
3085 /* Is the special shutdown target queued? If so, we are in shutdown state */
3086 u
= manager_get_unit(m
, SPECIAL_SHUTDOWN_TARGET
);
3087 if (u
&& u
->job
&& IN_SET(u
->job
->type
, JOB_START
, JOB_RESTART
, JOB_TRY_RESTART
, JOB_RELOAD_OR_START
))
3088 return MANAGER_STOPPING
;
3090 /* Are the rescue or emergency targets active or queued? If so we are in maintenance state */
3091 u
= manager_get_unit(m
, SPECIAL_RESCUE_TARGET
);
3092 if (u
&& (UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u
)) ||
3093 (u
->job
&& IN_SET(u
->job
->type
, JOB_START
, JOB_RESTART
, JOB_TRY_RESTART
, JOB_RELOAD_OR_START
))))
3094 return MANAGER_MAINTENANCE
;
3096 u
= manager_get_unit(m
, SPECIAL_EMERGENCY_TARGET
);
3097 if (u
&& (UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u
)) ||
3098 (u
->job
&& IN_SET(u
->job
->type
, JOB_START
, JOB_RESTART
, JOB_TRY_RESTART
, JOB_RELOAD_OR_START
))))
3099 return MANAGER_MAINTENANCE
;
3101 /* Are there any failed units? If so, we are in degraded mode */
3102 if (set_size(m
->failed_units
) > 0)
3103 return MANAGER_DEGRADED
;
3105 return MANAGER_RUNNING
;
3108 static const char *const manager_state_table
[_MANAGER_STATE_MAX
] = {
3109 [MANAGER_INITIALIZING
] = "initializing",
3110 [MANAGER_STARTING
] = "starting",
3111 [MANAGER_RUNNING
] = "running",
3112 [MANAGER_DEGRADED
] = "degraded",
3113 [MANAGER_MAINTENANCE
] = "maintenance",
3114 [MANAGER_STOPPING
] = "stopping",
3117 DEFINE_STRING_TABLE_LOOKUP(manager_state
, ManagerState
);