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/>.
25 #include <sys/epoll.h>
27 #include <sys/signalfd.h>
31 #include <sys/reboot.h>
32 #include <sys/ioctl.h>
36 #include <sys/types.h>
39 #include <sys/timerfd.h>
45 #include "sd-daemon.h"
47 #include "sd-messages.h"
50 #include "transaction.h"
57 #include "ratelimit.h"
58 #include "locale-setup.h"
59 #include "mount-setup.h"
60 #include "unit-name.h"
62 #include "path-lookup.h"
64 #include "exit-status.h"
67 #include "cgroup-util.h"
68 #include "path-util.h"
70 #include "boot-timestamps.h"
72 #include "bus-errors.h"
73 #include "bus-error.h"
76 #include "dbus-unit.h"
78 #include "dbus-manager.h"
80 /* As soon as 5s passed since a unit was added to our GC queue, make sure to run a gc sweep */
81 #define GC_QUEUE_USEC_MAX (10*USEC_PER_SEC)
83 /* Initial delay and the interval for printing status messages about running jobs */
84 #define JOBS_IN_PROGRESS_WAIT_SEC 5
85 #define JOBS_IN_PROGRESS_PERIOD_SEC 1
86 #define JOBS_IN_PROGRESS_PERIOD_DIVISOR 3
88 /* Where clients shall send notification messages to */
89 #define NOTIFY_SOCKET "@/org/freedesktop/systemd1/notify"
91 #define TIME_T_MAX (time_t)((1UL << ((sizeof(time_t) << 3) - 1)) - 1)
93 static int manager_dispatch_notify_fd(sd_event_source
*source
, int fd
, uint32_t revents
, void *userdata
);
94 static int manager_dispatch_signal_fd(sd_event_source
*source
, int fd
, uint32_t revents
, void *userdata
);
95 static int manager_dispatch_time_change_fd(sd_event_source
*source
, int fd
, uint32_t revents
, void *userdata
);
96 static int manager_dispatch_idle_pipe_fd(sd_event_source
*source
, int fd
, uint32_t revents
, void *userdata
);
97 static int manager_dispatch_jobs_in_progress(sd_event_source
*source
, usec_t usec
, void *userdata
);
98 static int manager_dispatch_run_queue(sd_event_source
*source
, void *userdata
);
100 static int manager_setup_notify(Manager
*m
) {
103 struct sockaddr_un un
;
105 .sa
.sa_family
= AF_UNIX
,
109 m
->notify_fd
= socket(AF_UNIX
, SOCK_DGRAM
|SOCK_CLOEXEC
|SOCK_NONBLOCK
, 0);
110 if (m
->notify_fd
< 0) {
111 log_error("Failed to allocate notification socket: %m");
115 if (getpid() != 1 || detect_container(NULL
) > 0)
116 snprintf(sa
.un
.sun_path
, sizeof(sa
.un
.sun_path
), NOTIFY_SOCKET
"/%llu", random_ull());
118 strncpy(sa
.un
.sun_path
, NOTIFY_SOCKET
, sizeof(sa
.un
.sun_path
));
119 sa
.un
.sun_path
[0] = 0;
121 r
= bind(m
->notify_fd
, &sa
.sa
, offsetof(struct sockaddr_un
, sun_path
) + 1 + strlen(sa
.un
.sun_path
+1));
123 log_error("bind() failed: %m");
127 r
= setsockopt(m
->notify_fd
, SOL_SOCKET
, SO_PASSCRED
, &one
, sizeof(one
));
129 log_error("SO_PASSCRED failed: %m");
133 r
= sd_event_add_io(m
->event
, m
->notify_fd
, EPOLLIN
, manager_dispatch_notify_fd
, m
, &m
->notify_event_source
);
135 log_error("Failed to allocate notify event source: %s", strerror(-r
));
139 sa
.un
.sun_path
[0] = '@';
140 m
->notify_socket
= strdup(sa
.un
.sun_path
);
141 if (!m
->notify_socket
)
144 log_debug("Using notification socket %s", m
->notify_socket
);
149 static int manager_watch_jobs_in_progress(Manager
*m
) {
152 if (m
->jobs_in_progress_event_source
)
155 return sd_event_add_monotonic(m
->event
, JOBS_IN_PROGRESS_WAIT_SEC
, 0, manager_dispatch_jobs_in_progress
, m
, &m
->jobs_in_progress_event_source
);
158 #define CYLON_BUFFER_EXTRA (2*(sizeof(ANSI_RED_ON)-1) + sizeof(ANSI_HIGHLIGHT_RED_ON)-1 + 2*(sizeof(ANSI_HIGHLIGHT_OFF)-1))
160 static void draw_cylon(char buffer
[], size_t buflen
, unsigned width
, unsigned pos
) {
163 assert(buflen
>= CYLON_BUFFER_EXTRA
+ width
+ 1);
164 assert(pos
<= width
+1); /* 0 or width+1 mean that the center light is behind the corner */
168 p
= mempset(p
, ' ', pos
-2);
169 p
= stpcpy(p
, ANSI_RED_ON
);
173 if (pos
> 0 && pos
<= width
) {
174 p
= stpcpy(p
, ANSI_HIGHLIGHT_RED_ON
);
178 p
= stpcpy(p
, ANSI_HIGHLIGHT_OFF
);
181 p
= stpcpy(p
, ANSI_RED_ON
);
184 p
= mempset(p
, ' ', width
-1-pos
);
185 strcpy(p
, ANSI_HIGHLIGHT_OFF
);
189 static void manager_print_jobs_in_progress(Manager
*m
) {
190 _cleanup_free_
char *job_of_n
= NULL
;
193 unsigned counter
= 0, print_nr
;
194 char cylon
[6 + CYLON_BUFFER_EXTRA
+ 1];
199 print_nr
= (m
->jobs_in_progress_iteration
/ JOBS_IN_PROGRESS_PERIOD_DIVISOR
) % m
->n_running_jobs
;
201 HASHMAP_FOREACH(j
, m
->jobs
, i
)
202 if (j
->state
== JOB_RUNNING
&& counter
++ == print_nr
)
205 /* m->n_running_jobs must be consistent with the contents of m->jobs,
206 * so the above loop must have succeeded in finding j. */
207 assert(counter
== print_nr
+ 1);
210 cylon_pos
= m
->jobs_in_progress_iteration
% 14;
212 cylon_pos
= 14 - cylon_pos
;
213 draw_cylon(cylon
, sizeof(cylon
), 6, cylon_pos
);
215 if (m
->n_running_jobs
> 1)
216 if (asprintf(&job_of_n
, "(%u of %u) ", counter
, m
->n_running_jobs
) < 0)
219 manager_status_printf(m
, true, cylon
, "%sA %s job is running for %s",
220 strempty(job_of_n
), job_type_to_string(j
->type
), unit_description(j
->unit
));
222 m
->jobs_in_progress_iteration
++;
225 static int manager_watch_idle_pipe(Manager
*m
) {
230 if (m
->idle_pipe_event_source
)
233 if (m
->idle_pipe
[2] < 0)
236 r
= sd_event_add_io(m
->event
, m
->idle_pipe
[2], EPOLLIN
, manager_dispatch_idle_pipe_fd
, m
, &m
->idle_pipe_event_source
);
238 log_error("Failed to watch idle pipe: %s", strerror(-r
));
245 static void manager_close_idle_pipe(Manager
*m
) {
248 close_pipe(m
->idle_pipe
);
249 close_pipe(m
->idle_pipe
+ 2);
252 static int manager_setup_time_change(Manager
*m
) {
255 /* We only care for the cancellation event, hence we set the
256 * timeout to the latest possible value. */
257 struct itimerspec its
= {
258 .it_value
.tv_sec
= TIME_T_MAX
,
262 assert_cc(sizeof(time_t) == sizeof(TIME_T_MAX
));
264 /* Uses TFD_TIMER_CANCEL_ON_SET to get notifications whenever
265 * CLOCK_REALTIME makes a jump relative to CLOCK_MONOTONIC */
267 m
->time_change_fd
= timerfd_create(CLOCK_REALTIME
, TFD_NONBLOCK
|TFD_CLOEXEC
);
268 if (m
->time_change_fd
< 0) {
269 log_error("Failed to create timerfd: %m");
273 if (timerfd_settime(m
->time_change_fd
, TFD_TIMER_ABSTIME
|TFD_TIMER_CANCEL_ON_SET
, &its
, NULL
) < 0) {
274 log_debug("Failed to set up TFD_TIMER_CANCEL_ON_SET, ignoring: %m");
275 close_nointr_nofail(m
->time_change_fd
);
276 m
->time_change_fd
= -1;
280 r
= sd_event_add_io(m
->event
, m
->time_change_fd
, EPOLLIN
, manager_dispatch_time_change_fd
, m
, &m
->time_change_event_source
);
282 log_error("Failed to create time change event source: %s", strerror(-r
));
286 log_debug("Set up TFD_TIMER_CANCEL_ON_SET timerfd.");
291 static int enable_special_signals(Manager
*m
) {
292 _cleanup_close_
int fd
= -1;
296 /* Enable that we get SIGINT on control-alt-del. In containers
297 * this will fail with EPERM (older) or EINVAL (newer), so
299 if (reboot(RB_DISABLE_CAD
) < 0 && errno
!= EPERM
&& errno
!= EINVAL
)
300 log_warning("Failed to enable ctrl-alt-del handling: %m");
302 fd
= open_terminal("/dev/tty0", O_RDWR
|O_NOCTTY
|O_CLOEXEC
);
304 /* Support systems without virtual console */
306 log_warning("Failed to open /dev/tty0: %m");
308 /* Enable that we get SIGWINCH on kbrequest */
309 if (ioctl(fd
, KDSIGACCEPT
, SIGWINCH
) < 0)
310 log_warning("Failed to enable kbrequest handling: %m");
316 static int manager_setup_signals(Manager
*m
) {
317 struct sigaction sa
= {
318 .sa_handler
= SIG_DFL
,
319 .sa_flags
= SA_NOCLDSTOP
|SA_RESTART
,
326 /* We are not interested in SIGSTOP and friends. */
327 assert_se(sigaction(SIGCHLD
, &sa
, NULL
) == 0);
329 assert_se(sigemptyset(&mask
) == 0);
331 sigset_add_many(&mask
,
332 SIGCHLD
, /* Child died */
333 SIGTERM
, /* Reexecute daemon */
334 SIGHUP
, /* Reload configuration */
335 SIGUSR1
, /* systemd/upstart: reconnect to D-Bus */
336 SIGUSR2
, /* systemd: dump status */
337 SIGINT
, /* Kernel sends us this on control-alt-del */
338 SIGWINCH
, /* Kernel sends us this on kbrequest (alt-arrowup) */
339 SIGPWR
, /* Some kernel drivers and upsd send us this on power failure */
340 SIGRTMIN
+0, /* systemd: start default.target */
341 SIGRTMIN
+1, /* systemd: isolate rescue.target */
342 SIGRTMIN
+2, /* systemd: isolate emergency.target */
343 SIGRTMIN
+3, /* systemd: start halt.target */
344 SIGRTMIN
+4, /* systemd: start poweroff.target */
345 SIGRTMIN
+5, /* systemd: start reboot.target */
346 SIGRTMIN
+6, /* systemd: start kexec.target */
347 SIGRTMIN
+13, /* systemd: Immediate halt */
348 SIGRTMIN
+14, /* systemd: Immediate poweroff */
349 SIGRTMIN
+15, /* systemd: Immediate reboot */
350 SIGRTMIN
+16, /* systemd: Immediate kexec */
351 SIGRTMIN
+20, /* systemd: enable status messages */
352 SIGRTMIN
+21, /* systemd: disable status messages */
353 SIGRTMIN
+22, /* systemd: set log level to LOG_DEBUG */
354 SIGRTMIN
+23, /* systemd: set log level to LOG_INFO */
355 SIGRTMIN
+24, /* systemd: Immediate exit (--user only) */
356 SIGRTMIN
+26, /* systemd: set log target to journal-or-kmsg */
357 SIGRTMIN
+27, /* systemd: set log target to console */
358 SIGRTMIN
+28, /* systemd: set log target to kmsg */
359 SIGRTMIN
+29, /* systemd: set log target to syslog-or-kmsg */
361 assert_se(sigprocmask(SIG_SETMASK
, &mask
, NULL
) == 0);
363 m
->signal_fd
= signalfd(-1, &mask
, SFD_NONBLOCK
|SFD_CLOEXEC
);
364 if (m
->signal_fd
< 0)
367 r
= sd_event_add_io(m
->event
, m
->signal_fd
, EPOLLIN
, manager_dispatch_signal_fd
, m
, &m
->signal_event_source
);
371 /* Process signals a bit earlier than the rest of things */
372 r
= sd_event_source_set_priority(m
->signal_event_source
, -5);
376 if (m
->running_as
== SYSTEMD_SYSTEM
)
377 return enable_special_signals(m
);
382 static int manager_default_environment(Manager
*m
) {
385 if (m
->running_as
== SYSTEMD_SYSTEM
) {
386 /* The system manager always starts with a clean
387 * environment for its children. It does not import
388 * the kernel or the parents exported variables.
390 * The initial passed environ is untouched to keep
391 * /proc/self/environ valid; it is used for tagging
392 * the init process inside containers. */
393 m
->environment
= strv_new("PATH=" DEFAULT_PATH
,
396 /* Import locale variables LC_*= from configuration */
397 locale_setup(&m
->environment
);
399 /* The user manager passes its own environment
400 * along to its children. */
401 m
->environment
= strv_copy(environ
);
406 strv_sort(m
->environment
);
411 int manager_new(SystemdRunningAs running_as
, bool reexecuting
, Manager
**_m
) {
414 bool try_bus_connect
= false;
417 assert(running_as
>= 0);
418 assert(running_as
< _SYSTEMD_RUNNING_AS_MAX
);
420 m
= new0(Manager
, 1);
425 if (detect_container(NULL
) <= 0)
426 boot_timestamps(&m
->userspace_timestamp
, &m
->firmware_timestamp
, &m
->loader_timestamp
);
429 m
->running_as
= running_as
;
430 m
->exit_code
= _MANAGER_EXIT_CODE_INVALID
;
432 m
->idle_pipe
[0] = m
->idle_pipe
[1] = m
->idle_pipe
[2] = m
->idle_pipe
[3] = -1;
434 m
->pin_cgroupfs_fd
= m
->notify_fd
= m
->signal_fd
= m
->time_change_fd
= m
->dev_autofs_fd
= m
->private_listen_fd
= -1;
435 m
->current_job_id
= 1; /* start as id #1, so that we can leave #0 around as "null-like" value */
437 r
= manager_default_environment(m
);
441 r
= hashmap_ensure_allocated(&m
->units
, string_hash_func
, string_compare_func
);
445 r
= hashmap_ensure_allocated(&m
->jobs
, trivial_hash_func
, trivial_compare_func
);
449 r
= hashmap_ensure_allocated(&m
->cgroup_unit
, string_hash_func
, string_compare_func
);
453 r
= hashmap_ensure_allocated(&m
->watch_pids
, trivial_hash_func
, trivial_compare_func
);
457 r
= hashmap_ensure_allocated(&m
->watch_bus
, string_hash_func
, string_compare_func
);
461 r
= sd_event_default(&m
->event
);
465 r
= sd_event_add_defer(m
->event
, manager_dispatch_run_queue
, m
, &m
->run_queue_event_source
);
469 r
= sd_event_source_set_priority(m
->run_queue_event_source
, SD_EVENT_PRIORITY_IDLE
);
473 r
= sd_event_source_set_enabled(m
->run_queue_event_source
, SD_EVENT_OFF
);
477 r
= manager_setup_signals(m
);
481 r
= manager_setup_cgroup(m
);
485 r
= manager_setup_notify(m
);
489 r
= manager_setup_time_change(m
);
493 m
->udev
= udev_new();
499 if (running_as
== SYSTEMD_SYSTEM
)
500 try_bus_connect
= reexecuting
;
501 else if (getenv("DBUS_SESSION_BUS_ADDRESS"))
502 try_bus_connect
= true;
504 log_debug("Skipping DBus session bus connection attempt - no DBUS_SESSION_BUS_ADDRESS set...");
506 /* Try to connect to the busses, if possible. */
507 r
= bus_init(m
, try_bus_connect
);
511 m
->taint_usr
= dir_is_empty("/usr") > 0;
521 static unsigned manager_dispatch_cleanup_queue(Manager
*m
) {
527 while ((u
= m
->cleanup_queue
)) {
528 assert(u
->in_cleanup_queue
);
538 GC_OFFSET_IN_PATH
, /* This one is on the path we were traveling */
539 GC_OFFSET_UNSURE
, /* No clue */
540 GC_OFFSET_GOOD
, /* We still need this unit */
541 GC_OFFSET_BAD
, /* We don't need this unit anymore */
545 static void unit_gc_sweep(Unit
*u
, unsigned gc_marker
) {
552 if (u
->gc_marker
== gc_marker
+ GC_OFFSET_GOOD
||
553 u
->gc_marker
== gc_marker
+ GC_OFFSET_BAD
||
554 u
->gc_marker
== gc_marker
+ GC_OFFSET_IN_PATH
)
557 if (u
->in_cleanup_queue
)
560 if (unit_check_gc(u
))
563 u
->gc_marker
= gc_marker
+ GC_OFFSET_IN_PATH
;
567 SET_FOREACH(other
, u
->dependencies
[UNIT_REFERENCED_BY
], i
) {
568 unit_gc_sweep(other
, gc_marker
);
570 if (other
->gc_marker
== gc_marker
+ GC_OFFSET_GOOD
)
573 if (other
->gc_marker
!= gc_marker
+ GC_OFFSET_BAD
)
580 /* We were unable to find anything out about this entry, so
581 * let's investigate it later */
582 u
->gc_marker
= gc_marker
+ GC_OFFSET_UNSURE
;
583 unit_add_to_gc_queue(u
);
587 /* We definitely know that this one is not useful anymore, so
588 * let's mark it for deletion */
589 u
->gc_marker
= gc_marker
+ GC_OFFSET_BAD
;
590 unit_add_to_cleanup_queue(u
);
594 u
->gc_marker
= gc_marker
+ GC_OFFSET_GOOD
;
597 static unsigned manager_dispatch_gc_queue(Manager
*m
) {
604 /* log_debug("Running GC..."); */
606 m
->gc_marker
+= _GC_OFFSET_MAX
;
607 if (m
->gc_marker
+ _GC_OFFSET_MAX
<= _GC_OFFSET_MAX
)
610 gc_marker
= m
->gc_marker
;
612 while ((u
= m
->gc_queue
)) {
613 assert(u
->in_gc_queue
);
615 unit_gc_sweep(u
, gc_marker
);
617 LIST_REMOVE(gc_queue
, m
->gc_queue
, u
);
618 u
->in_gc_queue
= false;
622 if (u
->gc_marker
== gc_marker
+ GC_OFFSET_BAD
||
623 u
->gc_marker
== gc_marker
+ GC_OFFSET_UNSURE
) {
624 log_debug_unit(u
->id
, "Collecting %s", u
->id
);
625 u
->gc_marker
= gc_marker
+ GC_OFFSET_BAD
;
626 unit_add_to_cleanup_queue(u
);
630 m
->n_in_gc_queue
= 0;
635 static void manager_clear_jobs_and_units(Manager
*m
) {
640 while ((u
= hashmap_first(m
->units
)))
643 manager_dispatch_cleanup_queue(m
);
645 assert(!m
->load_queue
);
646 assert(!m
->run_queue
);
647 assert(!m
->dbus_unit_queue
);
648 assert(!m
->dbus_job_queue
);
649 assert(!m
->cleanup_queue
);
650 assert(!m
->gc_queue
);
652 assert(hashmap_isempty(m
->jobs
));
653 assert(hashmap_isempty(m
->units
));
656 m
->n_running_jobs
= 0;
659 void manager_free(Manager
*m
) {
665 manager_clear_jobs_and_units(m
);
667 for (c
= 0; c
< _UNIT_TYPE_MAX
; c
++)
668 if (unit_vtable
[c
]->shutdown
)
669 unit_vtable
[c
]->shutdown(m
);
671 /* If we reexecute ourselves, we keep the root cgroup
673 manager_shutdown_cgroup(m
, m
->exit_code
!= MANAGER_REEXECUTE
);
675 manager_undo_generators(m
);
679 hashmap_free(m
->units
);
680 hashmap_free(m
->jobs
);
681 hashmap_free(m
->watch_pids
);
682 hashmap_free(m
->watch_bus
);
684 sd_event_source_unref(m
->signal_event_source
);
685 sd_event_source_unref(m
->notify_event_source
);
686 sd_event_source_unref(m
->time_change_event_source
);
687 sd_event_source_unref(m
->jobs_in_progress_event_source
);
688 sd_event_source_unref(m
->idle_pipe_event_source
);
689 sd_event_source_unref(m
->run_queue_event_source
);
691 if (m
->signal_fd
>= 0)
692 close_nointr_nofail(m
->signal_fd
);
693 if (m
->notify_fd
>= 0)
694 close_nointr_nofail(m
->notify_fd
);
695 if (m
->time_change_fd
>= 0)
696 close_nointr_nofail(m
->time_change_fd
);
698 manager_close_idle_pipe(m
);
701 sd_event_unref(m
->event
);
703 free(m
->notify_socket
);
705 lookup_paths_free(&m
->lookup_paths
);
706 strv_free(m
->environment
);
708 hashmap_free(m
->cgroup_unit
);
709 set_free_free(m
->unit_path_cache
);
711 free(m
->switch_root
);
712 free(m
->switch_root_init
);
714 for (i
= 0; i
< RLIMIT_NLIMITS
; i
++)
717 assert(hashmap_isempty(m
->units_requiring_mounts_for
));
718 hashmap_free(m
->units_requiring_mounts_for
);
723 int manager_enumerate(Manager
*m
) {
729 /* Let's ask every type to load all units from disk/kernel
730 * that it might know */
731 for (c
= 0; c
< _UNIT_TYPE_MAX
; c
++)
732 if (unit_vtable
[c
]->enumerate
) {
733 q
= unit_vtable
[c
]->enumerate(m
);
738 manager_dispatch_load_queue(m
);
742 static int manager_coldplug(Manager
*m
) {
750 /* Then, let's set up their initial state. */
751 HASHMAP_FOREACH_KEY(u
, k
, m
->units
, i
) {
757 if ((q
= unit_coldplug(u
)) < 0)
764 static void manager_build_unit_path_cache(Manager
*m
) {
766 _cleanup_free_
DIR *d
= NULL
;
771 set_free_free(m
->unit_path_cache
);
773 m
->unit_path_cache
= set_new(string_hash_func
, string_compare_func
);
774 if (!m
->unit_path_cache
) {
775 log_error("Failed to allocate unit path cache.");
779 /* This simply builds a list of files we know exist, so that
780 * we don't always have to go to disk */
782 STRV_FOREACH(i
, m
->lookup_paths
.unit_path
) {
788 log_error("Failed to open directory %s: %m", *i
);
792 while ((de
= readdir(d
))) {
795 if (ignore_file(de
->d_name
))
798 p
= strjoin(streq(*i
, "/") ? "" : *i
, "/", de
->d_name
, NULL
);
804 r
= set_consume(m
->unit_path_cache
, p
);
816 log_error("Failed to build unit path cache: %s", strerror(-r
));
818 set_free_free(m
->unit_path_cache
);
819 m
->unit_path_cache
= NULL
;
823 static int manager_distribute_fds(Manager
*m
, FDSet
*fds
) {
830 HASHMAP_FOREACH(u
, m
->units
, i
) {
832 if (fdset_size(fds
) <= 0)
835 if (UNIT_VTABLE(u
)->distribute_fds
) {
836 r
= UNIT_VTABLE(u
)->distribute_fds(u
, fds
);
845 int manager_startup(Manager
*m
, FILE *serialization
, FDSet
*fds
) {
850 dual_timestamp_get(&m
->generators_start_timestamp
);
851 manager_run_generators(m
);
852 dual_timestamp_get(&m
->generators_finish_timestamp
);
854 r
= lookup_paths_init(
855 &m
->lookup_paths
, m
->running_as
, true,
856 m
->generator_unit_path
,
857 m
->generator_unit_path_early
,
858 m
->generator_unit_path_late
);
862 manager_build_unit_path_cache(m
);
864 /* If we will deserialize make sure that during enumeration
865 * this is already known, so we increase the counter here
870 /* First, enumerate what we can from all config files */
871 dual_timestamp_get(&m
->units_load_start_timestamp
);
872 r
= manager_enumerate(m
);
873 dual_timestamp_get(&m
->units_load_finish_timestamp
);
875 /* Second, deserialize if there is something to deserialize */
877 q
= manager_deserialize(m
, serialization
, fds
);
882 /* Any fds left? Find some unit which wants them. This is
883 * useful to allow container managers to pass some file
884 * descriptors to us pre-initialized. This enables
885 * socket-based activation of entire containers. */
886 if (fdset_size(fds
) > 0) {
887 q
= manager_distribute_fds(m
, fds
);
892 /* Third, fire things up! */
893 q
= manager_coldplug(m
);
898 assert(m
->n_reloading
> 0);
901 /* Let's wait for the UnitNew/JobNew messages being
902 * sent, before we notify that the reload is
904 m
->send_reloading_done
= true;
910 int manager_add_job(Manager
*m
, JobType type
, Unit
*unit
, JobMode mode
, bool override
, sd_bus_error
*e
, Job
**_ret
) {
915 assert(type
< _JOB_TYPE_MAX
);
917 assert(mode
< _JOB_MODE_MAX
);
919 if (mode
== JOB_ISOLATE
&& type
!= JOB_START
) {
920 sd_bus_error_setf(e
, SD_BUS_ERROR_INVALID_ARGS
, "Isolate is only valid for start.");
924 if (mode
== JOB_ISOLATE
&& !unit
->allow_isolate
) {
925 sd_bus_error_setf(e
, BUS_ERROR_NO_ISOLATION
, "Operation refused, unit may not be isolated.");
929 log_debug_unit(unit
->id
,
930 "Trying to enqueue job %s/%s/%s", unit
->id
,
931 job_type_to_string(type
), job_mode_to_string(mode
));
933 job_type_collapse(&type
, unit
);
935 tr
= transaction_new(mode
== JOB_REPLACE_IRREVERSIBLY
);
939 r
= transaction_add_job_and_dependencies(tr
, type
, unit
, NULL
, true, override
, false,
940 mode
== JOB_IGNORE_DEPENDENCIES
|| mode
== JOB_IGNORE_REQUIREMENTS
,
941 mode
== JOB_IGNORE_DEPENDENCIES
, e
);
945 if (mode
== JOB_ISOLATE
) {
946 r
= transaction_add_isolate_jobs(tr
, m
);
951 r
= transaction_activate(tr
, m
, mode
, e
);
955 log_debug_unit(unit
->id
,
956 "Enqueued job %s/%s as %u", unit
->id
,
957 job_type_to_string(type
), (unsigned) tr
->anchor_job
->id
);
960 *_ret
= tr
->anchor_job
;
962 transaction_free(tr
);
966 transaction_abort(tr
);
967 transaction_free(tr
);
971 int manager_add_job_by_name(Manager
*m
, JobType type
, const char *name
, JobMode mode
, bool override
, sd_bus_error
*e
, Job
**_ret
) {
976 assert(type
< _JOB_TYPE_MAX
);
978 assert(mode
< _JOB_MODE_MAX
);
980 r
= manager_load_unit(m
, name
, NULL
, NULL
, &unit
);
984 return manager_add_job(m
, type
, unit
, mode
, override
, e
, _ret
);
987 Job
*manager_get_job(Manager
*m
, uint32_t id
) {
990 return hashmap_get(m
->jobs
, UINT32_TO_PTR(id
));
993 Unit
*manager_get_unit(Manager
*m
, const char *name
) {
997 return hashmap_get(m
->units
, name
);
1000 unsigned manager_dispatch_load_queue(Manager
*m
) {
1006 /* Make sure we are not run recursively */
1007 if (m
->dispatching_load_queue
)
1010 m
->dispatching_load_queue
= true;
1012 /* Dispatches the load queue. Takes a unit from the queue and
1013 * tries to load its data until the queue is empty */
1015 while ((u
= m
->load_queue
)) {
1016 assert(u
->in_load_queue
);
1022 m
->dispatching_load_queue
= false;
1026 int manager_load_unit_prepare(
1038 assert(name
|| path
);
1040 /* This will prepare the unit for loading, but not actually
1041 * load anything from disk. */
1043 if (path
&& !is_path(path
))
1044 return sd_bus_error_setf(e
, SD_BUS_ERROR_INVALID_ARGS
, "Path %s is not absolute.", path
);
1047 name
= path_get_file_name(path
);
1049 t
= unit_name_to_type(name
);
1051 if (t
== _UNIT_TYPE_INVALID
|| !unit_name_is_valid(name
, false))
1052 return sd_bus_error_setf(e
, SD_BUS_ERROR_INVALID_ARGS
, "Unit name %s is not valid.", name
);
1054 ret
= manager_get_unit(m
, name
);
1060 ret
= unit_new(m
, unit_vtable
[t
]->object_size
);
1065 ret
->fragment_path
= strdup(path
);
1066 if (!ret
->fragment_path
) {
1072 r
= unit_add_name(ret
, name
);
1078 unit_add_to_load_queue(ret
);
1079 unit_add_to_dbus_queue(ret
);
1080 unit_add_to_gc_queue(ret
);
1088 int manager_load_unit(
1099 /* This will load the service information files, but not actually
1100 * start any services or anything. */
1102 r
= manager_load_unit_prepare(m
, name
, path
, e
, _ret
);
1106 manager_dispatch_load_queue(m
);
1109 *_ret
= unit_follow_merge(*_ret
);
1114 void manager_dump_jobs(Manager
*s
, FILE *f
, const char *prefix
) {
1121 HASHMAP_FOREACH(j
, s
->jobs
, i
)
1122 job_dump(j
, f
, prefix
);
1125 void manager_dump_units(Manager
*s
, FILE *f
, const char *prefix
) {
1133 HASHMAP_FOREACH_KEY(u
, t
, s
->units
, i
)
1135 unit_dump(u
, f
, prefix
);
1138 void manager_clear_jobs(Manager
*m
) {
1143 while ((j
= hashmap_first(m
->jobs
)))
1144 /* No need to recurse. We're cancelling all jobs. */
1145 job_finish_and_invalidate(j
, JOB_CANCELED
, false);
1148 static int manager_dispatch_run_queue(sd_event_source
*source
, void *userdata
) {
1149 Manager
*m
= userdata
;
1155 while ((j
= m
->run_queue
)) {
1156 assert(j
->installed
);
1157 assert(j
->in_run_queue
);
1159 job_run_and_invalidate(j
);
1162 if (m
->n_running_jobs
> 0)
1163 manager_watch_jobs_in_progress(m
);
1165 if (m
->n_on_console
> 0)
1166 manager_watch_idle_pipe(m
);
1171 static unsigned manager_dispatch_dbus_queue(Manager
*m
) {
1178 if (m
->dispatching_dbus_queue
)
1181 m
->dispatching_dbus_queue
= true;
1183 while ((u
= m
->dbus_unit_queue
)) {
1184 assert(u
->in_dbus_queue
);
1186 bus_unit_send_change_signal(u
);
1190 while ((j
= m
->dbus_job_queue
)) {
1191 assert(j
->in_dbus_queue
);
1193 bus_job_send_change_signal(j
);
1197 m
->dispatching_dbus_queue
= false;
1199 if (m
->send_reloading_done
) {
1200 m
->send_reloading_done
= false;
1202 bus_manager_send_reloading(m
, false);
1205 if (m
->queued_message
)
1206 bus_send_queued_message(m
);
1211 static int manager_dispatch_notify_fd(sd_event_source
*source
, int fd
, uint32_t revents
, void *userdata
) {
1212 Manager
*m
= userdata
;
1216 assert(m
->notify_fd
== fd
);
1218 if (revents
!= EPOLLIN
) {
1219 log_warning("Got unexpected poll event for notify fd.");
1225 struct iovec iovec
= {
1227 .iov_len
= sizeof(buf
)-1,
1231 struct cmsghdr cmsghdr
;
1232 uint8_t buf
[CMSG_SPACE(sizeof(struct ucred
))];
1235 struct msghdr msghdr
= {
1238 .msg_control
= &control
,
1239 .msg_controllen
= sizeof(control
),
1241 struct ucred
*ucred
;
1243 _cleanup_strv_free_
char **tags
= NULL
;
1245 n
= recvmsg(m
->notify_fd
, &msghdr
, MSG_DONTWAIT
);
1250 if (errno
== EAGAIN
|| errno
== EINTR
)
1256 if (msghdr
.msg_controllen
< CMSG_LEN(sizeof(struct ucred
)) ||
1257 control
.cmsghdr
.cmsg_level
!= SOL_SOCKET
||
1258 control
.cmsghdr
.cmsg_type
!= SCM_CREDENTIALS
||
1259 control
.cmsghdr
.cmsg_len
!= CMSG_LEN(sizeof(struct ucred
))) {
1260 log_warning("Received notify message without credentials. Ignoring.");
1264 ucred
= (struct ucred
*) CMSG_DATA(&control
.cmsghdr
);
1266 u
= hashmap_get(m
->watch_pids
, LONG_TO_PTR(ucred
->pid
));
1268 u
= manager_get_unit_by_pid(m
, ucred
->pid
);
1270 log_warning("Cannot find unit for notify message of PID %lu.", (unsigned long) ucred
->pid
);
1275 assert((size_t) n
< sizeof(buf
));
1277 tags
= strv_split(buf
, "\n\r");
1281 log_debug_unit(u
->id
, "Got notification message for unit %s", u
->id
);
1283 if (UNIT_VTABLE(u
)->notify_message
)
1284 UNIT_VTABLE(u
)->notify_message(u
, ucred
->pid
, tags
);
1290 static int manager_dispatch_sigchld(Manager
*m
) {
1298 /* First we call waitd() for a PID and do not reap the
1299 * zombie. That way we can still access /proc/$PID for
1300 * it while it is a zombie. */
1301 if (waitid(P_ALL
, 0, &si
, WEXITED
|WNOHANG
|WNOWAIT
) < 0) {
1303 if (errno
== ECHILD
)
1315 if (si
.si_code
== CLD_EXITED
|| si
.si_code
== CLD_KILLED
|| si
.si_code
== CLD_DUMPED
) {
1316 _cleanup_free_
char *name
= NULL
;
1318 get_process_comm(si
.si_pid
, &name
);
1319 log_debug("Got SIGCHLD for process %lu (%s)", (unsigned long) si
.si_pid
, strna(name
));
1322 /* Let's flush any message the dying child might still
1323 * have queued for us. This ensures that the process
1324 * still exists in /proc so that we can figure out
1325 * which cgroup and hence unit it belongs to. */
1326 r
= manager_dispatch_notify_fd(m
->notify_event_source
, m
->notify_fd
, EPOLLIN
, m
);
1330 /* And now figure out the unit this belongs to */
1331 u
= hashmap_get(m
->watch_pids
, LONG_TO_PTR(si
.si_pid
));
1333 u
= manager_get_unit_by_pid(m
, si
.si_pid
);
1335 /* And now, we actually reap the zombie. */
1336 if (waitid(P_PID
, si
.si_pid
, &si
, WEXITED
) < 0) {
1343 if (si
.si_code
!= CLD_EXITED
&& si
.si_code
!= CLD_KILLED
&& si
.si_code
!= CLD_DUMPED
)
1346 log_debug("Child %lu died (code=%s, status=%i/%s)",
1347 (long unsigned) si
.si_pid
,
1348 sigchld_code_to_string(si
.si_code
),
1350 strna(si
.si_code
== CLD_EXITED
1351 ? exit_status_to_string(si
.si_status
, EXIT_STATUS_FULL
)
1352 : signal_to_string(si
.si_status
)));
1357 log_debug_unit(u
->id
,
1358 "Child %lu belongs to %s", (long unsigned) si
.si_pid
, u
->id
);
1360 hashmap_remove(m
->watch_pids
, LONG_TO_PTR(si
.si_pid
));
1361 UNIT_VTABLE(u
)->sigchld_event(u
, si
.si_pid
, si
.si_code
, si
.si_status
);
1367 static int manager_start_target(Manager
*m
, const char *name
, JobMode mode
) {
1368 _cleanup_bus_error_free_ sd_bus_error error
= SD_BUS_ERROR_NULL
;
1371 log_debug_unit(name
, "Activating special unit %s", name
);
1373 r
= manager_add_job_by_name(m
, JOB_START
, name
, mode
, true, &error
, NULL
);
1375 log_error_unit(name
, "Failed to enqueue %s job: %s", name
, bus_error_message(&error
, r
));
1380 static int manager_dispatch_signal_fd(sd_event_source
*source
, int fd
, uint32_t revents
, void *userdata
) {
1381 Manager
*m
= userdata
;
1383 struct signalfd_siginfo sfsi
;
1384 bool sigchld
= false;
1387 assert(m
->signal_fd
== fd
);
1389 if (revents
!= EPOLLIN
) {
1390 log_warning("Got unexpected events from signal file descriptor.");
1395 n
= read(m
->signal_fd
, &sfsi
, sizeof(sfsi
));
1396 if (n
!= sizeof(sfsi
)) {
1401 if (errno
== EINTR
|| errno
== EAGAIN
)
1407 if (sfsi
.ssi_pid
> 0) {
1410 get_process_comm(sfsi
.ssi_pid
, &p
);
1412 log_debug("Received SIG%s from PID %lu (%s).",
1413 signal_to_string(sfsi
.ssi_signo
),
1414 (unsigned long) sfsi
.ssi_pid
, strna(p
));
1417 log_debug("Received SIG%s.", signal_to_string(sfsi
.ssi_signo
));
1419 switch (sfsi
.ssi_signo
) {
1426 if (m
->running_as
== SYSTEMD_SYSTEM
) {
1427 /* This is for compatibility with the
1428 * original sysvinit */
1429 m
->exit_code
= MANAGER_REEXECUTE
;
1436 if (m
->running_as
== SYSTEMD_SYSTEM
) {
1437 manager_start_target(m
, SPECIAL_CTRL_ALT_DEL_TARGET
, JOB_REPLACE_IRREVERSIBLY
);
1441 /* Run the exit target if there is one, if not, just exit. */
1442 if (manager_start_target(m
, SPECIAL_EXIT_TARGET
, JOB_REPLACE
) < 0) {
1443 m
->exit_code
= MANAGER_EXIT
;
1450 if (m
->running_as
== SYSTEMD_SYSTEM
)
1451 manager_start_target(m
, SPECIAL_KBREQUEST_TARGET
, JOB_REPLACE
);
1453 /* This is a nop on non-init */
1457 if (m
->running_as
== SYSTEMD_SYSTEM
)
1458 manager_start_target(m
, SPECIAL_SIGPWR_TARGET
, JOB_REPLACE
);
1460 /* This is a nop on non-init */
1466 u
= manager_get_unit(m
, SPECIAL_DBUS_SERVICE
);
1468 if (!u
|| UNIT_IS_ACTIVE_OR_RELOADING(unit_active_state(u
))) {
1469 log_info("Trying to reconnect to bus...");
1473 if (!u
|| !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u
))) {
1474 log_info("Loading D-Bus service...");
1475 manager_start_target(m
, SPECIAL_DBUS_SERVICE
, JOB_REPLACE
);
1482 _cleanup_free_
char *dump
= NULL
;
1483 _cleanup_fclose_
FILE *f
= NULL
;
1486 f
= open_memstream(&dump
, &size
);
1488 log_warning("Failed to allocate memory stream.");
1492 manager_dump_units(m
, f
, "\t");
1493 manager_dump_jobs(m
, f
, "\t");
1496 log_warning("Failed to write status stream");
1500 log_dump(LOG_INFO
, dump
);
1505 m
->exit_code
= MANAGER_RELOAD
;
1510 /* Starting SIGRTMIN+0 */
1511 static const char * const target_table
[] = {
1512 [0] = SPECIAL_DEFAULT_TARGET
,
1513 [1] = SPECIAL_RESCUE_TARGET
,
1514 [2] = SPECIAL_EMERGENCY_TARGET
,
1515 [3] = SPECIAL_HALT_TARGET
,
1516 [4] = SPECIAL_POWEROFF_TARGET
,
1517 [5] = SPECIAL_REBOOT_TARGET
,
1518 [6] = SPECIAL_KEXEC_TARGET
1521 /* Starting SIGRTMIN+13, so that target halt and system halt are 10 apart */
1522 static const ManagerExitCode code_table
[] = {
1524 [1] = MANAGER_POWEROFF
,
1525 [2] = MANAGER_REBOOT
,
1529 if ((int) sfsi
.ssi_signo
>= SIGRTMIN
+0 &&
1530 (int) sfsi
.ssi_signo
< SIGRTMIN
+(int) ELEMENTSOF(target_table
)) {
1531 int idx
= (int) sfsi
.ssi_signo
- SIGRTMIN
;
1532 manager_start_target(m
, target_table
[idx
],
1533 (idx
== 1 || idx
== 2) ? JOB_ISOLATE
: JOB_REPLACE
);
1537 if ((int) sfsi
.ssi_signo
>= SIGRTMIN
+13 &&
1538 (int) sfsi
.ssi_signo
< SIGRTMIN
+13+(int) ELEMENTSOF(code_table
)) {
1539 m
->exit_code
= code_table
[sfsi
.ssi_signo
- SIGRTMIN
- 13];
1543 switch (sfsi
.ssi_signo
- SIGRTMIN
) {
1546 log_debug("Enabling showing of status.");
1547 manager_set_show_status(m
, true);
1551 log_debug("Disabling showing of status.");
1552 manager_set_show_status(m
, false);
1556 log_set_max_level(LOG_DEBUG
);
1557 log_notice("Setting log level to debug.");
1561 log_set_max_level(LOG_INFO
);
1562 log_notice("Setting log level to info.");
1566 if (m
->running_as
== SYSTEMD_USER
) {
1567 m
->exit_code
= MANAGER_EXIT
;
1571 /* This is a nop on init */
1575 log_set_target(LOG_TARGET_JOURNAL_OR_KMSG
);
1576 log_notice("Setting log target to journal-or-kmsg.");
1580 log_set_target(LOG_TARGET_CONSOLE
);
1581 log_notice("Setting log target to console.");
1585 log_set_target(LOG_TARGET_KMSG
);
1586 log_notice("Setting log target to kmsg.");
1590 log_set_target(LOG_TARGET_SYSLOG_OR_KMSG
);
1591 log_notice("Setting log target to syslog-or-kmsg.");
1595 log_warning("Got unhandled signal <%s>.", signal_to_string(sfsi
.ssi_signo
));
1602 return manager_dispatch_sigchld(m
);
1607 static int manager_dispatch_time_change_fd(sd_event_source
*source
, int fd
, uint32_t revents
, void *userdata
) {
1608 Manager
*m
= userdata
;
1613 assert(m
->time_change_fd
== fd
);
1615 log_struct(LOG_INFO
,
1616 MESSAGE_ID(SD_MESSAGE_TIME_CHANGE
),
1617 "MESSAGE=Time has been changed",
1620 /* Restart the watch */
1621 m
->time_change_event_source
= sd_event_source_unref(m
->time_change_event_source
);
1623 close_nointr_nofail(m
->time_change_fd
);
1624 m
->time_change_fd
= -1;
1626 manager_setup_time_change(m
);
1628 HASHMAP_FOREACH(u
, m
->units
, i
)
1629 if (UNIT_VTABLE(u
)->time_change
)
1630 UNIT_VTABLE(u
)->time_change(u
);
1635 static int manager_dispatch_idle_pipe_fd(sd_event_source
*source
, int fd
, uint32_t revents
, void *userdata
) {
1636 Manager
*m
= userdata
;
1639 assert(m
->idle_pipe
[2] == fd
);
1641 m
->no_console_output
= m
->n_on_console
> 0;
1643 m
->idle_pipe_event_source
= sd_event_source_unref(m
->idle_pipe_event_source
);
1644 manager_close_idle_pipe(m
);
1649 static int manager_dispatch_jobs_in_progress(sd_event_source
*source
, usec_t usec
, void *userdata
) {
1650 Manager
*m
= userdata
;
1654 manager_print_jobs_in_progress(m
);
1658 int manager_loop(Manager
*m
) {
1661 RATELIMIT_DEFINE(rl
, 1*USEC_PER_SEC
, 50000);
1664 m
->exit_code
= MANAGER_RUNNING
;
1666 /* Release the path cache */
1667 set_free_free(m
->unit_path_cache
);
1668 m
->unit_path_cache
= NULL
;
1670 manager_check_finished(m
);
1672 /* There might still be some zombies hanging around from
1673 * before we were exec()'ed. Let's reap them. */
1674 r
= manager_dispatch_sigchld(m
);
1678 while (m
->exit_code
== MANAGER_RUNNING
) {
1681 if (m
->runtime_watchdog
> 0 && m
->running_as
== SYSTEMD_SYSTEM
)
1684 if (!ratelimit_test(&rl
)) {
1685 /* Yay, something is going seriously wrong, pause a little */
1686 log_warning("Looping too fast. Throttling execution a little.");
1691 if (manager_dispatch_load_queue(m
) > 0)
1694 if (manager_dispatch_gc_queue(m
) > 0)
1697 if (manager_dispatch_cleanup_queue(m
) > 0)
1700 if (manager_dispatch_cgroup_queue(m
) > 0)
1703 if (manager_dispatch_dbus_queue(m
) > 0)
1706 /* Sleep for half the watchdog time */
1707 if (m
->runtime_watchdog
> 0 && m
->running_as
== SYSTEMD_SYSTEM
) {
1708 wait_usec
= m
->runtime_watchdog
/ 2;
1712 wait_usec
= (usec_t
) -1;
1714 r
= sd_event_run(m
->event
, wait_usec
);
1716 log_error("Failed to run event loop: %s", strerror(-r
));
1721 return m
->exit_code
;
1724 int manager_load_unit_from_dbus_path(Manager
*m
, const char *s
, sd_bus_error
*e
, Unit
**_u
) {
1725 _cleanup_free_
char *n
= NULL
;
1733 r
= unit_name_from_dbus_path(s
, &n
);
1737 r
= manager_load_unit(m
, n
, NULL
, e
, &u
);
1746 int manager_get_job_from_dbus_path(Manager
*m
, const char *s
, Job
**_j
) {
1756 p
= startswith(s
, "/org/freedesktop/systemd1/job/");
1760 r
= safe_atou(p
, &id
);
1764 j
= manager_get_job(m
, id
);
1773 void manager_send_unit_audit(Manager
*m
, Unit
*u
, int type
, bool success
) {
1779 audit_fd
= get_audit_fd();
1783 /* Don't generate audit events if the service was already
1784 * started and we're just deserializing */
1785 if (m
->n_reloading
> 0)
1788 if (m
->running_as
!= SYSTEMD_SYSTEM
)
1791 if (u
->type
!= UNIT_SERVICE
)
1794 p
= unit_name_to_prefix_and_instance(u
->id
);
1796 log_error_unit(u
->id
,
1797 "Failed to allocate unit name for audit message: %s", strerror(ENOMEM
));
1801 if (audit_log_user_comm_message(audit_fd
, type
, "", p
, NULL
, NULL
, NULL
, success
) < 0) {
1802 if (errno
== EPERM
) {
1803 /* We aren't allowed to send audit messages?
1804 * Then let's not retry again. */
1807 log_warning("Failed to send audit message: %m");
1815 void manager_send_unit_plymouth(Manager
*m
, Unit
*u
) {
1817 union sockaddr_union sa
;
1819 char *message
= NULL
;
1821 /* Don't generate plymouth events if the service was already
1822 * started and we're just deserializing */
1823 if (m
->n_reloading
> 0)
1826 if (m
->running_as
!= SYSTEMD_SYSTEM
)
1829 if (detect_container(NULL
) > 0)
1832 if (u
->type
!= UNIT_SERVICE
&&
1833 u
->type
!= UNIT_MOUNT
&&
1834 u
->type
!= UNIT_SWAP
)
1837 /* We set SOCK_NONBLOCK here so that we rather drop the
1838 * message then wait for plymouth */
1839 fd
= socket(AF_UNIX
, SOCK_STREAM
|SOCK_CLOEXEC
|SOCK_NONBLOCK
, 0);
1841 log_error("socket() failed: %m");
1846 sa
.sa
.sa_family
= AF_UNIX
;
1847 strncpy(sa
.un
.sun_path
+1, "/org/freedesktop/plymouthd", sizeof(sa
.un
.sun_path
)-1);
1848 if (connect(fd
, &sa
.sa
, offsetof(struct sockaddr_un
, sun_path
) + 1 + strlen(sa
.un
.sun_path
+1)) < 0) {
1850 if (errno
!= EPIPE
&&
1853 errno
!= ECONNREFUSED
&&
1854 errno
!= ECONNRESET
&&
1855 errno
!= ECONNABORTED
)
1856 log_error("connect() failed: %m");
1861 if (asprintf(&message
, "U\002%c%s%n", (int) (strlen(u
->id
) + 1), u
->id
, &n
) < 0) {
1867 if (write(fd
, message
, n
+ 1) != n
+ 1) {
1869 if (errno
!= EPIPE
&&
1872 errno
!= ECONNREFUSED
&&
1873 errno
!= ECONNRESET
&&
1874 errno
!= ECONNABORTED
)
1875 log_error("Failed to write Plymouth message: %m");
1882 close_nointr_nofail(fd
);
1887 void manager_dispatch_bus_name_owner_changed(
1890 const char* old_owner
,
1891 const char *new_owner
) {
1898 u
= hashmap_get(m
->watch_bus
, name
);
1902 UNIT_VTABLE(u
)->bus_name_owner_change(u
, name
, old_owner
, new_owner
);
1905 int manager_open_serialization(Manager
*m
, FILE **_f
) {
1912 if (m
->running_as
== SYSTEMD_SYSTEM
)
1913 asprintf(&path
, "/run/systemd/dump-%lu-XXXXXX", (unsigned long) getpid());
1915 asprintf(&path
, "/tmp/systemd-dump-%lu-XXXXXX", (unsigned long) getpid());
1920 RUN_WITH_UMASK(0077) {
1921 fd
= mkostemp(path
, O_RDWR
|O_CLOEXEC
);
1931 log_debug("Serializing state to %s", path
);
1934 f
= fdopen(fd
, "w+");
1943 int manager_serialize(Manager
*m
, FILE *f
, FDSet
*fds
, bool switching_root
) {
1956 fprintf(f
, "current-job-id=%i\n", m
->current_job_id
);
1957 fprintf(f
, "taint-usr=%s\n", yes_no(m
->taint_usr
));
1958 fprintf(f
, "n-installed-jobs=%u\n", m
->n_installed_jobs
);
1959 fprintf(f
, "n-failed-jobs=%u\n", m
->n_failed_jobs
);
1961 dual_timestamp_serialize(f
, "firmware-timestamp", &m
->firmware_timestamp
);
1962 dual_timestamp_serialize(f
, "loader-timestamp", &m
->loader_timestamp
);
1963 dual_timestamp_serialize(f
, "kernel-timestamp", &m
->kernel_timestamp
);
1964 dual_timestamp_serialize(f
, "initrd-timestamp", &m
->initrd_timestamp
);
1967 dual_timestamp_serialize(f
, "userspace-timestamp", &m
->userspace_timestamp
);
1968 dual_timestamp_serialize(f
, "finish-timestamp", &m
->finish_timestamp
);
1969 dual_timestamp_serialize(f
, "security-start-timestamp", &m
->security_start_timestamp
);
1970 dual_timestamp_serialize(f
, "security-finish-timestamp", &m
->security_finish_timestamp
);
1971 dual_timestamp_serialize(f
, "generators-start-timestamp", &m
->generators_start_timestamp
);
1972 dual_timestamp_serialize(f
, "generators-finish-timestamp", &m
->generators_finish_timestamp
);
1973 dual_timestamp_serialize(f
, "units-load-start-timestamp", &m
->units_load_start_timestamp
);
1974 dual_timestamp_serialize(f
, "units-load-finish-timestamp", &m
->units_load_finish_timestamp
);
1977 if (!switching_root
) {
1978 STRV_FOREACH(e
, m
->environment
) {
1979 _cleanup_free_
char *ce
;
1983 fprintf(f
, "env=%s\n", *e
);
1987 bus_serialize(m
, f
);
1991 HASHMAP_FOREACH_KEY(u
, t
, m
->units
, i
) {
1995 if (!unit_can_serialize(u
))
2002 r
= unit_serialize(u
, f
, fds
, !switching_root
);
2009 assert(m
->n_reloading
> 0);
2015 r
= bus_fdset_add_all(m
, fds
);
2022 int manager_deserialize(Manager
*m
, FILE *f
, FDSet
*fds
) {
2028 log_debug("Deserializing state...");
2033 char line
[LINE_MAX
], *l
;
2035 if (!fgets(line
, sizeof(line
), f
)) {
2050 if (startswith(l
, "current-job-id=")) {
2053 if (safe_atou32(l
+15, &id
) < 0)
2054 log_debug("Failed to parse current job id value %s", l
+15);
2056 m
->current_job_id
= MAX(m
->current_job_id
, id
);
2058 } else if (startswith(l
, "n-installed-jobs=")) {
2061 if (safe_atou32(l
+17, &n
) < 0)
2062 log_debug("Failed to parse installed jobs counter %s", l
+17);
2064 m
->n_installed_jobs
+= n
;
2066 } else if (startswith(l
, "n-failed-jobs=")) {
2069 if (safe_atou32(l
+14, &n
) < 0)
2070 log_debug("Failed to parse failed jobs counter %s", l
+14);
2072 m
->n_failed_jobs
+= n
;
2074 } else if (startswith(l
, "taint-usr=")) {
2077 if ((b
= parse_boolean(l
+10)) < 0)
2078 log_debug("Failed to parse taint /usr flag %s", l
+10);
2080 m
->taint_usr
= m
->taint_usr
|| b
;
2082 } else if (startswith(l
, "firmware-timestamp="))
2083 dual_timestamp_deserialize(l
+19, &m
->firmware_timestamp
);
2084 else if (startswith(l
, "loader-timestamp="))
2085 dual_timestamp_deserialize(l
+17, &m
->loader_timestamp
);
2086 else if (startswith(l
, "kernel-timestamp="))
2087 dual_timestamp_deserialize(l
+17, &m
->kernel_timestamp
);
2088 else if (startswith(l
, "initrd-timestamp="))
2089 dual_timestamp_deserialize(l
+17, &m
->initrd_timestamp
);
2090 else if (startswith(l
, "userspace-timestamp="))
2091 dual_timestamp_deserialize(l
+20, &m
->userspace_timestamp
);
2092 else if (startswith(l
, "finish-timestamp="))
2093 dual_timestamp_deserialize(l
+17, &m
->finish_timestamp
);
2094 else if (startswith(l
, "security-start-timestamp="))
2095 dual_timestamp_deserialize(l
+25, &m
->security_start_timestamp
);
2096 else if (startswith(l
, "security-finish-timestamp="))
2097 dual_timestamp_deserialize(l
+26, &m
->security_finish_timestamp
);
2098 else if (startswith(l
, "generators-start-timestamp="))
2099 dual_timestamp_deserialize(l
+27, &m
->generators_start_timestamp
);
2100 else if (startswith(l
, "generators-finish-timestamp="))
2101 dual_timestamp_deserialize(l
+28, &m
->generators_finish_timestamp
);
2102 else if (startswith(l
, "units-load-start-timestamp="))
2103 dual_timestamp_deserialize(l
+27, &m
->units_load_start_timestamp
);
2104 else if (startswith(l
, "units-load-finish-timestamp="))
2105 dual_timestamp_deserialize(l
+28, &m
->units_load_finish_timestamp
);
2106 else if (startswith(l
, "env=")) {
2107 _cleanup_free_
char *uce
= NULL
;
2110 uce
= cunescape(l
+4);
2116 e
= strv_env_set(m
->environment
, uce
);
2122 strv_free(m
->environment
);
2124 } else if (bus_deserialize_item(m
, l
) == 0)
2125 log_debug("Unknown serialization item '%s'", l
);
2130 char name
[UNIT_NAME_MAX
+2];
2133 if (!fgets(name
, sizeof(name
), f
)) {
2144 r
= manager_load_unit(m
, strstrip(name
), NULL
, NULL
, &u
);
2148 r
= unit_deserialize(u
, f
, fds
);
2159 assert(m
->n_reloading
> 0);
2165 int manager_reload(Manager
*m
) {
2167 _cleanup_fclose_
FILE *f
= NULL
;
2168 _cleanup_fdset_free_ FDSet
*fds
= NULL
;
2172 r
= manager_open_serialization(m
, &f
);
2177 bus_manager_send_reloading(m
, true);
2185 r
= manager_serialize(m
, f
, fds
, false);
2191 if (fseeko(f
, 0, SEEK_SET
) < 0) {
2196 /* From here on there is no way back. */
2197 manager_clear_jobs_and_units(m
);
2198 manager_undo_generators(m
);
2199 lookup_paths_free(&m
->lookup_paths
);
2201 /* Find new unit paths */
2202 manager_run_generators(m
);
2204 q
= lookup_paths_init(
2205 &m
->lookup_paths
, m
->running_as
, true,
2206 m
->generator_unit_path
,
2207 m
->generator_unit_path_early
,
2208 m
->generator_unit_path_late
);
2212 manager_build_unit_path_cache(m
);
2214 /* First, enumerate what we can from all config files */
2215 q
= manager_enumerate(m
);
2219 /* Second, deserialize our stored data */
2220 q
= manager_deserialize(m
, f
, fds
);
2227 /* Third, fire things up! */
2228 q
= manager_coldplug(m
);
2232 assert(m
->n_reloading
> 0);
2235 m
->send_reloading_done
= true;
2240 static bool manager_is_booting_or_shutting_down(Manager
*m
) {
2245 /* Is the initial job still around? */
2246 if (manager_get_job(m
, m
->default_unit_job_id
))
2249 /* Is there a job for the shutdown target? */
2250 u
= manager_get_unit(m
, SPECIAL_SHUTDOWN_TARGET
);
2257 bool manager_is_reloading_or_reexecuting(Manager
*m
) {
2260 return m
->n_reloading
!= 0;
2263 void manager_reset_failed(Manager
*m
) {
2269 HASHMAP_FOREACH(u
, m
->units
, i
)
2270 unit_reset_failed(u
);
2273 bool manager_unit_inactive_or_pending(Manager
*m
, const char *name
) {
2279 /* Returns true if the unit is inactive or going down */
2280 u
= manager_get_unit(m
, name
);
2284 return unit_inactive_or_pending(u
);
2287 void manager_check_finished(Manager
*m
) {
2288 char userspace
[FORMAT_TIMESPAN_MAX
], initrd
[FORMAT_TIMESPAN_MAX
], kernel
[FORMAT_TIMESPAN_MAX
], sum
[FORMAT_TIMESPAN_MAX
];
2289 usec_t firmware_usec
, loader_usec
, kernel_usec
, initrd_usec
, userspace_usec
, total_usec
;
2293 if (m
->n_running_jobs
== 0)
2294 m
->jobs_in_progress_event_source
= sd_event_source_unref(m
->jobs_in_progress_event_source
);
2296 if (hashmap_size(m
->jobs
) > 0) {
2297 if (m
->jobs_in_progress_event_source
)
2298 sd_event_source_set_time(m
->jobs_in_progress_event_source
, JOBS_IN_PROGRESS_PERIOD_SEC
);
2302 /* Notify Type=idle units that we are done now */
2303 m
->idle_pipe_event_source
= sd_event_source_unref(m
->idle_pipe_event_source
);
2304 manager_close_idle_pipe(m
);
2306 /* Turn off confirm spawn now */
2307 m
->confirm_spawn
= false;
2309 if (dual_timestamp_is_set(&m
->finish_timestamp
))
2312 dual_timestamp_get(&m
->finish_timestamp
);
2314 if (m
->running_as
== SYSTEMD_SYSTEM
&& detect_container(NULL
) <= 0) {
2316 /* Note that m->kernel_usec.monotonic is always at 0,
2317 * and m->firmware_usec.monotonic and
2318 * m->loader_usec.monotonic should be considered
2319 * negative values. */
2321 firmware_usec
= m
->firmware_timestamp
.monotonic
- m
->loader_timestamp
.monotonic
;
2322 loader_usec
= m
->loader_timestamp
.monotonic
- m
->kernel_timestamp
.monotonic
;
2323 userspace_usec
= m
->finish_timestamp
.monotonic
- m
->userspace_timestamp
.monotonic
;
2324 total_usec
= m
->firmware_timestamp
.monotonic
+ m
->finish_timestamp
.monotonic
;
2326 if (dual_timestamp_is_set(&m
->initrd_timestamp
)) {
2328 kernel_usec
= m
->initrd_timestamp
.monotonic
- m
->kernel_timestamp
.monotonic
;
2329 initrd_usec
= m
->userspace_timestamp
.monotonic
- m
->initrd_timestamp
.monotonic
;
2331 if (!log_on_console())
2332 log_struct(LOG_INFO
,
2333 MESSAGE_ID(SD_MESSAGE_STARTUP_FINISHED
),
2334 "KERNEL_USEC=%llu", (unsigned long long) kernel_usec
,
2335 "INITRD_USEC=%llu", (unsigned long long) initrd_usec
,
2336 "USERSPACE_USEC=%llu", (unsigned long long) userspace_usec
,
2337 "MESSAGE=Startup finished in %s (kernel) + %s (initrd) + %s (userspace) = %s.",
2338 format_timespan(kernel
, sizeof(kernel
), kernel_usec
, USEC_PER_MSEC
),
2339 format_timespan(initrd
, sizeof(initrd
), initrd_usec
, USEC_PER_MSEC
),
2340 format_timespan(userspace
, sizeof(userspace
), userspace_usec
, USEC_PER_MSEC
),
2341 format_timespan(sum
, sizeof(sum
), total_usec
, USEC_PER_MSEC
),
2344 kernel_usec
= m
->userspace_timestamp
.monotonic
- m
->kernel_timestamp
.monotonic
;
2347 if (!log_on_console())
2348 log_struct(LOG_INFO
,
2349 MESSAGE_ID(SD_MESSAGE_STARTUP_FINISHED
),
2350 "KERNEL_USEC=%llu", (unsigned long long) kernel_usec
,
2351 "USERSPACE_USEC=%llu", (unsigned long long) userspace_usec
,
2352 "MESSAGE=Startup finished in %s (kernel) + %s (userspace) = %s.",
2353 format_timespan(kernel
, sizeof(kernel
), kernel_usec
, USEC_PER_MSEC
),
2354 format_timespan(userspace
, sizeof(userspace
), userspace_usec
, USEC_PER_MSEC
),
2355 format_timespan(sum
, sizeof(sum
), total_usec
, USEC_PER_MSEC
),
2359 firmware_usec
= loader_usec
= initrd_usec
= kernel_usec
= 0;
2360 total_usec
= userspace_usec
= m
->finish_timestamp
.monotonic
- m
->userspace_timestamp
.monotonic
;
2362 if (!log_on_console())
2363 log_struct(LOG_INFO
,
2364 MESSAGE_ID(SD_MESSAGE_STARTUP_FINISHED
),
2365 "USERSPACE_USEC=%llu", (unsigned long long) userspace_usec
,
2366 "MESSAGE=Startup finished in %s.",
2367 format_timespan(sum
, sizeof(sum
), total_usec
, USEC_PER_MSEC
),
2371 bus_manager_send_finished(m
, firmware_usec
, loader_usec
, kernel_usec
, initrd_usec
, userspace_usec
, total_usec
);
2374 "READY=1\nSTATUS=Startup finished in %s.",
2375 format_timespan(sum
, sizeof(sum
), total_usec
, USEC_PER_MSEC
));
2378 static int create_generator_dir(Manager
*m
, char **generator
, const char *name
) {
2389 if (m
->running_as
== SYSTEMD_SYSTEM
&& getpid() == 1) {
2391 p
= strappend("/run/systemd/", name
);
2395 r
= mkdir_p_label(p
, 0755);
2397 log_error("Failed to create generator directory %s: %s",
2403 p
= strjoin("/tmp/systemd-", name
, ".XXXXXX", NULL
);
2408 log_error("Failed to create generator directory %s: %m",
2419 static void trim_generator_dir(Manager
*m
, char **generator
) {
2426 if (rmdir(*generator
) >= 0) {
2434 void manager_run_generators(Manager
*m
) {
2435 _cleanup_closedir_
DIR *d
= NULL
;
2436 const char *generator_path
;
2437 const char *argv
[5];
2442 generator_path
= m
->running_as
== SYSTEMD_SYSTEM
? SYSTEM_GENERATOR_PATH
: USER_GENERATOR_PATH
;
2443 d
= opendir(generator_path
);
2445 if (errno
== ENOENT
)
2448 log_error("Failed to enumerate generator directory %s: %m",
2453 r
= create_generator_dir(m
, &m
->generator_unit_path
, "generator");
2457 r
= create_generator_dir(m
, &m
->generator_unit_path_early
, "generator.early");
2461 r
= create_generator_dir(m
, &m
->generator_unit_path_late
, "generator.late");
2465 argv
[0] = NULL
; /* Leave this empty, execute_directory() will fill something in */
2466 argv
[1] = m
->generator_unit_path
;
2467 argv
[2] = m
->generator_unit_path_early
;
2468 argv
[3] = m
->generator_unit_path_late
;
2471 RUN_WITH_UMASK(0022)
2472 execute_directory(generator_path
, d
, (char**) argv
);
2475 trim_generator_dir(m
, &m
->generator_unit_path
);
2476 trim_generator_dir(m
, &m
->generator_unit_path_early
);
2477 trim_generator_dir(m
, &m
->generator_unit_path_late
);
2480 static void remove_generator_dir(Manager
*m
, char **generator
) {
2487 strv_remove(m
->lookup_paths
.unit_path
, *generator
);
2488 rm_rf(*generator
, false, true, false);
2494 void manager_undo_generators(Manager
*m
) {
2497 remove_generator_dir(m
, &m
->generator_unit_path
);
2498 remove_generator_dir(m
, &m
->generator_unit_path_early
);
2499 remove_generator_dir(m
, &m
->generator_unit_path_late
);
2502 int manager_environment_add(Manager
*m
, char **minus
, char **plus
) {
2503 char **a
= NULL
, **b
= NULL
, **l
;
2508 if (!strv_isempty(minus
)) {
2509 a
= strv_env_delete(l
, 1, minus
);
2516 if (!strv_isempty(plus
)) {
2517 b
= strv_env_merge(2, l
, plus
);
2524 if (m
->environment
!= l
)
2525 strv_free(m
->environment
);
2531 m
->environment
= strv_sort(l
);
2535 int manager_set_default_rlimits(Manager
*m
, struct rlimit
**default_rlimit
) {
2540 for (i
= 0; i
< RLIMIT_NLIMITS
; i
++) {
2541 if (!default_rlimit
[i
])
2544 m
->rlimit
[i
] = newdup(struct rlimit
, default_rlimit
[i
], 1);
2552 void manager_recheck_journal(Manager
*m
) {
2557 if (m
->running_as
!= SYSTEMD_SYSTEM
)
2560 u
= manager_get_unit(m
, SPECIAL_JOURNALD_SOCKET
);
2561 if (u
&& SOCKET(u
)->state
!= SOCKET_RUNNING
) {
2562 log_close_journal();
2566 u
= manager_get_unit(m
, SPECIAL_JOURNALD_SERVICE
);
2567 if (u
&& SERVICE(u
)->state
!= SERVICE_RUNNING
) {
2568 log_close_journal();
2572 /* Hmm, OK, so the socket is fully up and the service is up
2573 * too, then let's make use of the thing. */
2577 void manager_set_show_status(Manager
*m
, bool b
) {
2580 if (m
->running_as
!= SYSTEMD_SYSTEM
)
2586 touch("/run/systemd/show-status");
2588 unlink("/run/systemd/show-status");
2591 static bool manager_get_show_status(Manager
*m
) {
2594 if (m
->running_as
!= SYSTEMD_SYSTEM
)
2597 if (m
->no_console_output
)
2603 /* If Plymouth is running make sure we show the status, so
2604 * that there's something nice to see when people press Esc */
2606 return plymouth_running();
2609 void manager_status_printf(Manager
*m
, bool ephemeral
, const char *status
, const char *format
, ...) {
2612 if (!manager_get_show_status(m
))
2615 /* XXX We should totally drop the check for ephemeral here
2616 * and thus effectively make 'Type=idle' pointless. */
2617 if (ephemeral
&& m
->n_on_console
> 0)
2620 if (!manager_is_booting_or_shutting_down(m
))
2623 va_start(ap
, format
);
2624 status_vprintf(status
, true, ephemeral
, format
, ap
);
2628 int manager_get_unit_by_path(Manager
*m
, const char *path
, const char *suffix
, Unit
**_found
) {
2629 _cleanup_free_
char *p
= NULL
;
2637 p
= unit_name_from_path(path
, suffix
);
2641 found
= manager_get_unit(m
, p
);
2651 Set
*manager_get_units_requiring_mounts_for(Manager
*m
, const char *path
) {
2652 char p
[strlen(path
)+1];
2658 path_kill_slashes(p
);
2660 return hashmap_get(m
->units_requiring_mounts_for
, streq(p
, "/") ? "" : p
);