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 "systemd/sd-daemon.h"
46 #include "systemd/sd-id128.h"
47 #include "systemd/sd-messages.h"
50 #include "transaction.h"
57 #include "ratelimit.h"
59 #include "mount-setup.h"
60 #include "unit-name.h"
61 #include "dbus-unit.h"
64 #include "path-lookup.h"
66 #include "bus-errors.h"
67 #include "exit-status.h"
70 #include "cgroup-util.h"
71 #include "path-util.h"
76 /* As soon as 16 units are in our GC queue, make sure to run a gc sweep */
77 #define GC_QUEUE_ENTRIES_MAX 16
79 /* As soon as 5s passed since a unit was added to our GC queue, make sure to run a gc sweep */
80 #define GC_QUEUE_USEC_MAX (10*USEC_PER_SEC)
82 /* Initial delay and the interval for printing status messages about running jobs */
83 #define JOBS_IN_PROGRESS_WAIT_SEC 5
84 #define JOBS_IN_PROGRESS_PERIOD_SEC 1
85 #define JOBS_IN_PROGRESS_PERIOD_DIVISOR 3
87 /* Where clients shall send notification messages to */
88 #define NOTIFY_SOCKET "@/org/freedesktop/systemd1/notify"
90 #define TIME_T_MAX (time_t)((1UL << ((sizeof(time_t) << 3) - 1)) - 1)
92 static int manager_setup_notify(Manager
*m
) {
95 struct sockaddr_un un
;
97 .sa
.sa_family
= AF_UNIX
,
99 struct epoll_event ev
= {
101 .data
.ptr
= &m
->notify_watch
,
105 m
->notify_watch
.type
= WATCH_NOTIFY
;
106 m
->notify_watch
.fd
= socket(AF_UNIX
, SOCK_DGRAM
|SOCK_CLOEXEC
|SOCK_NONBLOCK
, 0);
107 if (m
->notify_watch
.fd
< 0) {
108 log_error("Failed to allocate notification socket: %m");
112 if (getpid() != 1 || detect_container(NULL
) > 0)
113 snprintf(sa
.un
.sun_path
, sizeof(sa
.un
.sun_path
), NOTIFY_SOCKET
"/%llu", random_ull());
115 strncpy(sa
.un
.sun_path
, NOTIFY_SOCKET
, sizeof(sa
.un
.sun_path
));
117 sa
.un
.sun_path
[0] = 0;
119 r
= bind(m
->notify_watch
.fd
, &sa
.sa
,
120 offsetof(struct sockaddr_un
, sun_path
) + 1 + strlen(sa
.un
.sun_path
+1));
122 log_error("bind() failed: %m");
126 r
= setsockopt(m
->notify_watch
.fd
, SOL_SOCKET
, SO_PASSCRED
, &one
, sizeof(one
));
128 log_error("SO_PASSCRED failed: %m");
132 r
= epoll_ctl(m
->epoll_fd
, EPOLL_CTL_ADD
, m
->notify_watch
.fd
, &ev
);
134 log_error("Failed to add notification socket fd to epoll: %m");
138 sa
.un
.sun_path
[0] = '@';
139 m
->notify_socket
= strdup(sa
.un
.sun_path
);
140 if (!m
->notify_socket
)
143 log_debug("Using notification socket %s", m
->notify_socket
);
148 static int manager_jobs_in_progress_mod_timer(Manager
*m
) {
149 struct itimerspec its
= {
150 .it_value
.tv_sec
= JOBS_IN_PROGRESS_WAIT_SEC
,
151 .it_interval
.tv_sec
= JOBS_IN_PROGRESS_PERIOD_SEC
,
154 if (m
->jobs_in_progress_watch
.type
!= WATCH_JOBS_IN_PROGRESS
)
157 if (timerfd_settime(m
->jobs_in_progress_watch
.fd
, 0, &its
, NULL
) < 0)
163 static int manager_watch_jobs_in_progress(Manager
*m
) {
164 struct epoll_event ev
= {
166 .data
.ptr
= &m
->jobs_in_progress_watch
,
170 if (m
->jobs_in_progress_watch
.type
!= WATCH_INVALID
)
173 m
->jobs_in_progress_watch
.type
= WATCH_JOBS_IN_PROGRESS
;
174 m
->jobs_in_progress_watch
.fd
= timerfd_create(CLOCK_MONOTONIC
, TFD_NONBLOCK
|TFD_CLOEXEC
);
175 if (m
->jobs_in_progress_watch
.fd
< 0) {
176 log_error("Failed to create timerfd: %m");
181 r
= manager_jobs_in_progress_mod_timer(m
);
183 log_error("Failed to set up timer for jobs progress watch: %s", strerror(-r
));
187 if (epoll_ctl(m
->epoll_fd
, EPOLL_CTL_ADD
, m
->jobs_in_progress_watch
.fd
, &ev
) < 0) {
188 log_error("Failed to add jobs progress timer fd to epoll: %m");
193 log_debug("Set up jobs progress timerfd.");
198 if (m
->jobs_in_progress_watch
.fd
>= 0)
199 close_nointr_nofail(m
->jobs_in_progress_watch
.fd
);
200 watch_init(&m
->jobs_in_progress_watch
);
204 static void manager_unwatch_jobs_in_progress(Manager
*m
) {
205 if (m
->jobs_in_progress_watch
.type
!= WATCH_JOBS_IN_PROGRESS
)
208 assert_se(epoll_ctl(m
->epoll_fd
, EPOLL_CTL_DEL
, m
->jobs_in_progress_watch
.fd
, NULL
) >= 0);
209 close_nointr_nofail(m
->jobs_in_progress_watch
.fd
);
210 watch_init(&m
->jobs_in_progress_watch
);
211 m
->jobs_in_progress_iteration
= 0;
213 log_debug("Closed jobs progress timerfd.");
216 #define CYLON_BUFFER_EXTRA (2*strlen(ANSI_RED_ON) + strlen(ANSI_HIGHLIGHT_RED_ON) + 2*strlen(ANSI_HIGHLIGHT_OFF))
217 static void draw_cylon(char buffer
[], size_t buflen
, unsigned width
, unsigned pos
) {
220 assert(buflen
>= CYLON_BUFFER_EXTRA
+ width
+ 1);
221 assert(pos
<= width
+1); /* 0 or width+1 mean that the center light is behind the corner */
225 p
= mempset(p
, ' ', pos
-2);
226 p
= stpcpy(p
, ANSI_RED_ON
);
230 if (pos
> 0 && pos
<= width
) {
231 p
= stpcpy(p
, ANSI_HIGHLIGHT_RED_ON
);
235 p
= stpcpy(p
, ANSI_HIGHLIGHT_OFF
);
238 p
= stpcpy(p
, ANSI_RED_ON
);
241 p
= mempset(p
, ' ', width
-1-pos
);
242 p
= stpcpy(p
, ANSI_HIGHLIGHT_OFF
);
246 static void manager_print_jobs_in_progress(Manager
*m
) {
249 char *job_of_n
= NULL
;
250 unsigned counter
= 0, print_nr
;
251 char cylon
[6 + CYLON_BUFFER_EXTRA
+ 1];
254 print_nr
= (m
->jobs_in_progress_iteration
/ JOBS_IN_PROGRESS_PERIOD_DIVISOR
) % m
->n_running_jobs
;
256 HASHMAP_FOREACH(j
, m
->jobs
, i
)
257 if (j
->state
== JOB_RUNNING
&& counter
++ == print_nr
)
260 /* m->n_running_jobs must be consistent with the contents of m->jobs,
261 * so the above loop must have succeeded in finding j. */
262 assert(counter
== print_nr
+ 1);
264 cylon_pos
= m
->jobs_in_progress_iteration
% 14;
266 cylon_pos
= 14 - cylon_pos
;
267 draw_cylon(cylon
, sizeof(cylon
), 6, cylon_pos
);
269 if (m
->n_running_jobs
> 1)
270 if (asprintf(&job_of_n
, "(%u of %u) ", counter
, m
->n_running_jobs
) < 0)
273 manager_status_printf(m
, true, cylon
, "%sA %s job is running for %s",
274 strempty(job_of_n
), job_type_to_string(j
->type
), unit_description(j
->unit
));
277 m
->jobs_in_progress_iteration
++;
280 static int manager_setup_time_change(Manager
*m
) {
281 struct epoll_event ev
= {
283 .data
.ptr
= &m
->time_change_watch
,
286 /* We only care for the cancellation event, hence we set the
287 * timeout to the latest possible value. */
288 struct itimerspec its
= {
289 .it_value
.tv_sec
= TIME_T_MAX
,
291 assert_cc(sizeof(time_t) == sizeof(TIME_T_MAX
));
293 assert(m
->time_change_watch
.type
== WATCH_INVALID
);
295 /* Uses TFD_TIMER_CANCEL_ON_SET to get notifications whenever
296 * CLOCK_REALTIME makes a jump relative to CLOCK_MONOTONIC */
298 m
->time_change_watch
.type
= WATCH_TIME_CHANGE
;
299 m
->time_change_watch
.fd
= timerfd_create(CLOCK_REALTIME
, TFD_NONBLOCK
|TFD_CLOEXEC
);
300 if (m
->time_change_watch
.fd
< 0) {
301 log_error("Failed to create timerfd: %m");
305 if (timerfd_settime(m
->time_change_watch
.fd
, TFD_TIMER_ABSTIME
|TFD_TIMER_CANCEL_ON_SET
, &its
, NULL
) < 0) {
306 log_debug("Failed to set up TFD_TIMER_CANCEL_ON_SET, ignoring: %m");
307 close_nointr_nofail(m
->time_change_watch
.fd
);
308 watch_init(&m
->time_change_watch
);
312 if (epoll_ctl(m
->epoll_fd
, EPOLL_CTL_ADD
, m
->time_change_watch
.fd
, &ev
) < 0) {
313 log_error("Failed to add timer change fd to epoll: %m");
317 log_debug("Set up TFD_TIMER_CANCEL_ON_SET timerfd.");
322 static int enable_special_signals(Manager
*m
) {
327 /* Enable that we get SIGINT on control-alt-del. In containers
328 * this will fail with EPERM (older) or EINVAL (newer), so
330 if (reboot(RB_DISABLE_CAD
) < 0 && errno
!= EPERM
&& errno
!= EINVAL
)
331 log_warning("Failed to enable ctrl-alt-del handling: %m");
333 fd
= open_terminal("/dev/tty0", O_RDWR
|O_NOCTTY
|O_CLOEXEC
);
335 /* Support systems without virtual console */
337 log_warning("Failed to open /dev/tty0: %m");
339 /* Enable that we get SIGWINCH on kbrequest */
340 if (ioctl(fd
, KDSIGACCEPT
, SIGWINCH
) < 0)
341 log_warning("Failed to enable kbrequest handling: %s", strerror(errno
));
343 close_nointr_nofail(fd
);
349 static int manager_setup_signals(Manager
*m
) {
351 struct epoll_event ev
= {
353 .data
.ptr
= &m
->signal_watch
,
355 struct sigaction sa
= {
356 .sa_handler
= SIG_DFL
,
357 .sa_flags
= SA_NOCLDSTOP
|SA_RESTART
,
362 /* We are not interested in SIGSTOP and friends. */
363 assert_se(sigaction(SIGCHLD
, &sa
, NULL
) == 0);
365 assert_se(sigemptyset(&mask
) == 0);
367 sigset_add_many(&mask
,
368 SIGCHLD
, /* Child died */
369 SIGTERM
, /* Reexecute daemon */
370 SIGHUP
, /* Reload configuration */
371 SIGUSR1
, /* systemd/upstart: reconnect to D-Bus */
372 SIGUSR2
, /* systemd: dump status */
373 SIGINT
, /* Kernel sends us this on control-alt-del */
374 SIGWINCH
, /* Kernel sends us this on kbrequest (alt-arrowup) */
375 SIGPWR
, /* Some kernel drivers and upsd send us this on power failure */
376 SIGRTMIN
+0, /* systemd: start default.target */
377 SIGRTMIN
+1, /* systemd: isolate rescue.target */
378 SIGRTMIN
+2, /* systemd: isolate emergency.target */
379 SIGRTMIN
+3, /* systemd: start halt.target */
380 SIGRTMIN
+4, /* systemd: start poweroff.target */
381 SIGRTMIN
+5, /* systemd: start reboot.target */
382 SIGRTMIN
+6, /* systemd: start kexec.target */
383 SIGRTMIN
+13, /* systemd: Immediate halt */
384 SIGRTMIN
+14, /* systemd: Immediate poweroff */
385 SIGRTMIN
+15, /* systemd: Immediate reboot */
386 SIGRTMIN
+16, /* systemd: Immediate kexec */
387 SIGRTMIN
+20, /* systemd: enable status messages */
388 SIGRTMIN
+21, /* systemd: disable status messages */
389 SIGRTMIN
+22, /* systemd: set log level to LOG_DEBUG */
390 SIGRTMIN
+23, /* systemd: set log level to LOG_INFO */
391 SIGRTMIN
+24, /* systemd: Immediate exit (--user only) */
392 SIGRTMIN
+26, /* systemd: set log target to journal-or-kmsg */
393 SIGRTMIN
+27, /* systemd: set log target to console */
394 SIGRTMIN
+28, /* systemd: set log target to kmsg */
395 SIGRTMIN
+29, /* systemd: set log target to syslog-or-kmsg */
397 assert_se(sigprocmask(SIG_SETMASK
, &mask
, NULL
) == 0);
399 m
->signal_watch
.type
= WATCH_SIGNAL
;
400 m
->signal_watch
.fd
= signalfd(-1, &mask
, SFD_NONBLOCK
|SFD_CLOEXEC
);
401 if (m
->signal_watch
.fd
< 0)
404 if (epoll_ctl(m
->epoll_fd
, EPOLL_CTL_ADD
, m
->signal_watch
.fd
, &ev
) < 0)
407 if (m
->running_as
== SYSTEMD_SYSTEM
)
408 return enable_special_signals(m
);
413 static void manager_strip_environment(Manager
*m
) {
416 /* Remove variables from the inherited set that are part of
417 * the container interface:
418 * http://www.freedesktop.org/wiki/Software/systemd/ContainerInterface */
419 strv_remove_prefix(m
->environment
, "container=");
420 strv_remove_prefix(m
->environment
, "container_");
422 /* Remove variables from the inherited set that are part of
423 * the initrd interface:
424 * http://www.freedesktop.org/wiki/Software/systemd/InitrdInterface */
425 strv_remove_prefix(m
->environment
, "RD_");
427 /* Drop invalid entries */
428 strv_env_clean(m
->environment
);
431 int manager_new(SystemdRunningAs running_as
, Manager
**_m
) {
436 assert(running_as
>= 0);
437 assert(running_as
< _SYSTEMD_RUNNING_AS_MAX
);
439 m
= new0(Manager
, 1);
444 if (detect_container(NULL
) <= 0)
445 efi_get_boot_timestamps(&m
->userspace_timestamp
, &m
->firmware_timestamp
, &m
->loader_timestamp
);
448 m
->running_as
= running_as
;
449 m
->name_data_slot
= m
->conn_data_slot
= m
->subscribed_data_slot
= -1;
450 m
->exit_code
= _MANAGER_EXIT_CODE_INVALID
;
451 m
->pin_cgroupfs_fd
= -1;
452 m
->idle_pipe
[0] = m
->idle_pipe
[1] = -1;
454 watch_init(&m
->signal_watch
);
455 watch_init(&m
->mount_watch
);
456 watch_init(&m
->swap_watch
);
457 watch_init(&m
->udev_watch
);
458 watch_init(&m
->time_change_watch
);
459 watch_init(&m
->jobs_in_progress_watch
);
461 m
->epoll_fd
= m
->dev_autofs_fd
= -1;
462 m
->current_job_id
= 1; /* start as id #1, so that we can leave #0 around as "null-like" value */
464 m
->environment
= strv_copy(environ
);
468 manager_strip_environment(m
);
470 if (running_as
== SYSTEMD_SYSTEM
) {
471 m
->default_controllers
= strv_new("cpu", NULL
);
472 if (!m
->default_controllers
)
476 if (!(m
->units
= hashmap_new(string_hash_func
, string_compare_func
)))
479 if (!(m
->jobs
= hashmap_new(trivial_hash_func
, trivial_compare_func
)))
482 if (!(m
->watch_pids
= hashmap_new(trivial_hash_func
, trivial_compare_func
)))
485 if (!(m
->cgroup_bondings
= hashmap_new(string_hash_func
, string_compare_func
)))
488 if (!(m
->watch_bus
= hashmap_new(string_hash_func
, string_compare_func
)))
491 m
->epoll_fd
= epoll_create1(EPOLL_CLOEXEC
);
495 r
= manager_setup_signals(m
);
499 r
= manager_setup_cgroup(m
);
503 r
= manager_setup_notify(m
);
507 r
= manager_setup_time_change(m
);
511 /* Try to connect to the busses, if possible. */
512 r
= bus_init(m
, running_as
!= SYSTEMD_SYSTEM
);
516 m
->taint_usr
= dir_is_empty("/usr") > 0;
526 static unsigned manager_dispatch_cleanup_queue(Manager
*m
) {
532 while ((u
= m
->cleanup_queue
)) {
533 assert(u
->in_cleanup_queue
);
543 GC_OFFSET_IN_PATH
, /* This one is on the path we were traveling */
544 GC_OFFSET_UNSURE
, /* No clue */
545 GC_OFFSET_GOOD
, /* We still need this unit */
546 GC_OFFSET_BAD
, /* We don't need this unit anymore */
550 static void unit_gc_sweep(Unit
*u
, unsigned gc_marker
) {
557 if (u
->gc_marker
== gc_marker
+ GC_OFFSET_GOOD
||
558 u
->gc_marker
== gc_marker
+ GC_OFFSET_BAD
||
559 u
->gc_marker
== gc_marker
+ GC_OFFSET_IN_PATH
)
562 if (u
->in_cleanup_queue
)
565 if (unit_check_gc(u
))
568 u
->gc_marker
= gc_marker
+ GC_OFFSET_IN_PATH
;
572 SET_FOREACH(other
, u
->dependencies
[UNIT_REFERENCED_BY
], i
) {
573 unit_gc_sweep(other
, gc_marker
);
575 if (other
->gc_marker
== gc_marker
+ GC_OFFSET_GOOD
)
578 if (other
->gc_marker
!= gc_marker
+ GC_OFFSET_BAD
)
585 /* We were unable to find anything out about this entry, so
586 * let's investigate it later */
587 u
->gc_marker
= gc_marker
+ GC_OFFSET_UNSURE
;
588 unit_add_to_gc_queue(u
);
592 /* We definitely know that this one is not useful anymore, so
593 * let's mark it for deletion */
594 u
->gc_marker
= gc_marker
+ GC_OFFSET_BAD
;
595 unit_add_to_cleanup_queue(u
);
599 u
->gc_marker
= gc_marker
+ GC_OFFSET_GOOD
;
602 static unsigned manager_dispatch_gc_queue(Manager
*m
) {
609 if ((m
->n_in_gc_queue
< GC_QUEUE_ENTRIES_MAX
) &&
610 (m
->gc_queue_timestamp
<= 0 ||
611 (m
->gc_queue_timestamp
+ GC_QUEUE_USEC_MAX
) > now(CLOCK_MONOTONIC
)))
614 log_debug("Running GC...");
616 m
->gc_marker
+= _GC_OFFSET_MAX
;
617 if (m
->gc_marker
+ _GC_OFFSET_MAX
<= _GC_OFFSET_MAX
)
620 gc_marker
= m
->gc_marker
;
622 while ((u
= m
->gc_queue
)) {
623 assert(u
->in_gc_queue
);
625 unit_gc_sweep(u
, gc_marker
);
627 LIST_REMOVE(Unit
, gc_queue
, m
->gc_queue
, u
);
628 u
->in_gc_queue
= false;
632 if (u
->gc_marker
== gc_marker
+ GC_OFFSET_BAD
||
633 u
->gc_marker
== gc_marker
+ GC_OFFSET_UNSURE
) {
634 log_debug_unit(u
->id
, "Collecting %s", u
->id
);
635 u
->gc_marker
= gc_marker
+ GC_OFFSET_BAD
;
636 unit_add_to_cleanup_queue(u
);
640 m
->n_in_gc_queue
= 0;
641 m
->gc_queue_timestamp
= 0;
646 static void manager_clear_jobs_and_units(Manager
*m
) {
651 while ((u
= hashmap_first(m
->units
)))
654 manager_dispatch_cleanup_queue(m
);
656 assert(!m
->load_queue
);
657 assert(!m
->run_queue
);
658 assert(!m
->dbus_unit_queue
);
659 assert(!m
->dbus_job_queue
);
660 assert(!m
->cleanup_queue
);
661 assert(!m
->gc_queue
);
663 assert(hashmap_isempty(m
->jobs
));
664 assert(hashmap_isempty(m
->units
));
667 m
->n_running_jobs
= 0;
670 void manager_free(Manager
*m
) {
676 manager_clear_jobs_and_units(m
);
678 for (c
= 0; c
< _UNIT_TYPE_MAX
; c
++)
679 if (unit_vtable
[c
]->shutdown
)
680 unit_vtable
[c
]->shutdown(m
);
682 /* If we reexecute ourselves, we keep the root cgroup
684 manager_shutdown_cgroup(m
, m
->exit_code
!= MANAGER_REEXECUTE
);
686 manager_undo_generators(m
);
690 hashmap_free(m
->units
);
691 hashmap_free(m
->jobs
);
692 hashmap_free(m
->watch_pids
);
693 hashmap_free(m
->watch_bus
);
695 if (m
->epoll_fd
>= 0)
696 close_nointr_nofail(m
->epoll_fd
);
697 if (m
->signal_watch
.fd
>= 0)
698 close_nointr_nofail(m
->signal_watch
.fd
);
699 if (m
->notify_watch
.fd
>= 0)
700 close_nointr_nofail(m
->notify_watch
.fd
);
701 if (m
->time_change_watch
.fd
>= 0)
702 close_nointr_nofail(m
->time_change_watch
.fd
);
703 if (m
->jobs_in_progress_watch
.fd
>= 0)
704 close_nointr_nofail(m
->jobs_in_progress_watch
.fd
);
706 free(m
->notify_socket
);
708 lookup_paths_free(&m
->lookup_paths
);
709 strv_free(m
->environment
);
711 strv_free(m
->default_controllers
);
713 hashmap_free(m
->cgroup_bondings
);
714 set_free_free(m
->unit_path_cache
);
716 close_pipe(m
->idle_pipe
);
718 free(m
->switch_root
);
719 free(m
->switch_root_init
);
721 for (i
= 0; i
< RLIMIT_NLIMITS
; i
++)
727 int manager_enumerate(Manager
*m
) {
733 /* Let's ask every type to load all units from disk/kernel
734 * that it might know */
735 for (c
= 0; c
< _UNIT_TYPE_MAX
; c
++)
736 if (unit_vtable
[c
]->enumerate
)
737 if ((q
= unit_vtable
[c
]->enumerate(m
)) < 0)
740 manager_dispatch_load_queue(m
);
744 int manager_coldplug(Manager
*m
) {
752 /* Then, let's set up their initial state. */
753 HASHMAP_FOREACH_KEY(u
, k
, m
->units
, i
) {
759 if ((q
= unit_coldplug(u
)) < 0)
766 static void manager_build_unit_path_cache(Manager
*m
) {
768 _cleanup_free_
DIR *d
= NULL
;
773 set_free_free(m
->unit_path_cache
);
775 m
->unit_path_cache
= set_new(string_hash_func
, string_compare_func
);
776 if (!m
->unit_path_cache
) {
777 log_error("Failed to allocate unit path cache.");
781 /* This simply builds a list of files we know exist, so that
782 * we don't always have to go to disk */
784 STRV_FOREACH(i
, m
->lookup_paths
.unit_path
) {
790 log_error("Failed to open directory %s: %m", *i
);
794 while ((de
= readdir(d
))) {
797 if (ignore_file(de
->d_name
))
800 p
= strjoin(streq(*i
, "/") ? "" : *i
, "/", de
->d_name
, NULL
);
806 r
= set_consume(m
->unit_path_cache
, p
);
818 log_error("Failed to build unit path cache: %s", strerror(-r
));
820 set_free_free(m
->unit_path_cache
);
821 m
->unit_path_cache
= NULL
;
824 int manager_startup(Manager
*m
, FILE *serialization
, FDSet
*fds
) {
829 dual_timestamp_get(&m
->generators_start_timestamp
);
830 manager_run_generators(m
);
831 dual_timestamp_get(&m
->generators_finish_timestamp
);
833 r
= lookup_paths_init(
834 &m
->lookup_paths
, m
->running_as
, true,
835 m
->generator_unit_path
,
836 m
->generator_unit_path_early
,
837 m
->generator_unit_path_late
);
841 manager_build_unit_path_cache(m
);
843 /* If we will deserialize make sure that during enumeration
844 * this is already known, so we increase the counter here
849 /* First, enumerate what we can from all config files */
850 dual_timestamp_get(&m
->unitsload_start_timestamp
);
851 r
= manager_enumerate(m
);
852 dual_timestamp_get(&m
->unitsload_finish_timestamp
);
854 /* Second, deserialize if there is something to deserialize */
856 q
= manager_deserialize(m
, serialization
, fds
);
861 /* Any fds left? Find some unit which wants them. This is
862 * useful to allow container managers to pass some file
863 * descriptors to us pre-initialized. This enables
864 * socket-based activation of entire containers. */
865 if (fdset_size(fds
) > 0) {
866 q
= manager_distribute_fds(m
, fds
);
871 /* Third, fire things up! */
872 q
= manager_coldplug(m
);
877 assert(m
->n_reloading
> 0);
884 int manager_add_job(Manager
*m
, JobType type
, Unit
*unit
, JobMode mode
, bool override
, DBusError
*e
, Job
**_ret
) {
889 assert(type
< _JOB_TYPE_MAX
);
891 assert(mode
< _JOB_MODE_MAX
);
893 if (mode
== JOB_ISOLATE
&& type
!= JOB_START
) {
894 dbus_set_error(e
, BUS_ERROR_INVALID_JOB_MODE
, "Isolate is only valid for start.");
898 if (mode
== JOB_ISOLATE
&& !unit
->allow_isolate
) {
899 dbus_set_error(e
, BUS_ERROR_NO_ISOLATION
, "Operation refused, unit may not be isolated.");
903 log_debug_unit(unit
->id
,
904 "Trying to enqueue job %s/%s/%s", unit
->id
,
905 job_type_to_string(type
), job_mode_to_string(mode
));
907 job_type_collapse(&type
, unit
);
909 tr
= transaction_new(mode
== JOB_REPLACE_IRREVERSIBLY
);
913 r
= transaction_add_job_and_dependencies(tr
, type
, unit
, NULL
, true, override
, false,
914 mode
== JOB_IGNORE_DEPENDENCIES
|| mode
== JOB_IGNORE_REQUIREMENTS
,
915 mode
== JOB_IGNORE_DEPENDENCIES
, e
);
919 if (mode
== JOB_ISOLATE
) {
920 r
= transaction_add_isolate_jobs(tr
, m
);
925 r
= transaction_activate(tr
, m
, mode
, e
);
929 log_debug_unit(unit
->id
,
930 "Enqueued job %s/%s as %u", unit
->id
,
931 job_type_to_string(type
), (unsigned) tr
->anchor_job
->id
);
934 *_ret
= tr
->anchor_job
;
936 transaction_free(tr
);
940 transaction_abort(tr
);
941 transaction_free(tr
);
945 int manager_add_job_by_name(Manager
*m
, JobType type
, const char *name
, JobMode mode
, bool override
, DBusError
*e
, Job
**_ret
) {
950 assert(type
< _JOB_TYPE_MAX
);
952 assert(mode
< _JOB_MODE_MAX
);
954 r
= manager_load_unit(m
, name
, NULL
, NULL
, &unit
);
958 return manager_add_job(m
, type
, unit
, mode
, override
, e
, _ret
);
961 Job
*manager_get_job(Manager
*m
, uint32_t id
) {
964 return hashmap_get(m
->jobs
, UINT32_TO_PTR(id
));
967 Unit
*manager_get_unit(Manager
*m
, const char *name
) {
971 return hashmap_get(m
->units
, name
);
974 unsigned manager_dispatch_load_queue(Manager
*m
) {
980 /* Make sure we are not run recursively */
981 if (m
->dispatching_load_queue
)
984 m
->dispatching_load_queue
= true;
986 /* Dispatches the load queue. Takes a unit from the queue and
987 * tries to load its data until the queue is empty */
989 while ((u
= m
->load_queue
)) {
990 assert(u
->in_load_queue
);
996 m
->dispatching_load_queue
= false;
1000 int manager_load_unit_prepare(Manager
*m
, const char *name
, const char *path
, DBusError
*e
, Unit
**_ret
) {
1006 assert(name
|| path
);
1008 /* This will prepare the unit for loading, but not actually
1009 * load anything from disk. */
1011 if (path
&& !is_path(path
)) {
1012 dbus_set_error(e
, BUS_ERROR_INVALID_PATH
, "Path %s is not absolute.", path
);
1017 name
= path_get_file_name(path
);
1019 t
= unit_name_to_type(name
);
1021 if (t
== _UNIT_TYPE_INVALID
|| !unit_name_is_valid(name
, false)) {
1022 dbus_set_error(e
, BUS_ERROR_INVALID_NAME
, "Unit name %s is not valid.", name
);
1026 ret
= manager_get_unit(m
, name
);
1032 ret
= unit_new(m
, unit_vtable
[t
]->object_size
);
1037 ret
->fragment_path
= strdup(path
);
1038 if (!ret
->fragment_path
) {
1044 r
= unit_add_name(ret
, name
);
1050 unit_add_to_load_queue(ret
);
1051 unit_add_to_dbus_queue(ret
);
1052 unit_add_to_gc_queue(ret
);
1060 int manager_load_unit(Manager
*m
, const char *name
, const char *path
, DBusError
*e
, Unit
**_ret
) {
1065 /* This will load the service information files, but not actually
1066 * start any services or anything. */
1068 r
= manager_load_unit_prepare(m
, name
, path
, e
, _ret
);
1072 manager_dispatch_load_queue(m
);
1075 *_ret
= unit_follow_merge(*_ret
);
1080 void manager_dump_jobs(Manager
*s
, FILE *f
, const char *prefix
) {
1087 HASHMAP_FOREACH(j
, s
->jobs
, i
)
1088 job_dump(j
, f
, prefix
);
1091 void manager_dump_units(Manager
*s
, FILE *f
, const char *prefix
) {
1099 HASHMAP_FOREACH_KEY(u
, t
, s
->units
, i
)
1101 unit_dump(u
, f
, prefix
);
1104 void manager_clear_jobs(Manager
*m
) {
1109 while ((j
= hashmap_first(m
->jobs
)))
1110 /* No need to recurse. We're cancelling all jobs. */
1111 job_finish_and_invalidate(j
, JOB_CANCELED
, false);
1114 unsigned manager_dispatch_run_queue(Manager
*m
) {
1118 if (m
->dispatching_run_queue
)
1121 m
->dispatching_run_queue
= true;
1123 while ((j
= m
->run_queue
)) {
1124 assert(j
->installed
);
1125 assert(j
->in_run_queue
);
1127 job_run_and_invalidate(j
);
1131 m
->dispatching_run_queue
= false;
1133 if (m
->n_running_jobs
> 0)
1134 manager_watch_jobs_in_progress(m
);
1139 unsigned manager_dispatch_dbus_queue(Manager
*m
) {
1146 if (m
->dispatching_dbus_queue
)
1149 m
->dispatching_dbus_queue
= true;
1151 while ((u
= m
->dbus_unit_queue
)) {
1152 assert(u
->in_dbus_queue
);
1154 bus_unit_send_change_signal(u
);
1158 while ((j
= m
->dbus_job_queue
)) {
1159 assert(j
->in_dbus_queue
);
1161 bus_job_send_change_signal(j
);
1165 m
->dispatching_dbus_queue
= false;
1169 static int manager_process_notify_fd(Manager
*m
) {
1176 struct iovec iovec
= {
1178 .iov_len
= sizeof(buf
)-1,
1182 struct cmsghdr cmsghdr
;
1183 uint8_t buf
[CMSG_SPACE(sizeof(struct ucred
))];
1186 struct msghdr msghdr
= {
1189 .msg_control
= &control
,
1190 .msg_controllen
= sizeof(control
),
1192 struct ucred
*ucred
;
1194 _cleanup_strv_free_
char **tags
= NULL
;
1196 n
= recvmsg(m
->notify_watch
.fd
, &msghdr
, MSG_DONTWAIT
);
1201 if (errno
== EAGAIN
|| errno
== EINTR
)
1207 if (msghdr
.msg_controllen
< CMSG_LEN(sizeof(struct ucred
)) ||
1208 control
.cmsghdr
.cmsg_level
!= SOL_SOCKET
||
1209 control
.cmsghdr
.cmsg_type
!= SCM_CREDENTIALS
||
1210 control
.cmsghdr
.cmsg_len
!= CMSG_LEN(sizeof(struct ucred
))) {
1211 log_warning("Received notify message without credentials. Ignoring.");
1215 ucred
= (struct ucred
*) CMSG_DATA(&control
.cmsghdr
);
1217 u
= hashmap_get(m
->watch_pids
, LONG_TO_PTR(ucred
->pid
));
1219 u
= cgroup_unit_by_pid(m
, ucred
->pid
);
1221 log_warning("Cannot find unit for notify message of PID %lu.", (unsigned long) ucred
->pid
);
1226 assert((size_t) n
< sizeof(buf
));
1228 tags
= strv_split(buf
, "\n\r");
1232 log_debug_unit(u
->id
, "Got notification message for unit %s", u
->id
);
1234 if (UNIT_VTABLE(u
)->notify_message
)
1235 UNIT_VTABLE(u
)->notify_message(u
, ucred
->pid
, tags
);
1241 static int manager_dispatch_sigchld(Manager
*m
) {
1249 /* First we call waitd() for a PID and do not reap the
1250 * zombie. That way we can still access /proc/$PID for
1251 * it while it is a zombie. */
1252 if (waitid(P_ALL
, 0, &si
, WEXITED
|WNOHANG
|WNOWAIT
) < 0) {
1254 if (errno
== ECHILD
)
1266 if (si
.si_code
== CLD_EXITED
|| si
.si_code
== CLD_KILLED
|| si
.si_code
== CLD_DUMPED
) {
1267 _cleanup_free_
char *name
= NULL
;
1269 get_process_comm(si
.si_pid
, &name
);
1270 log_debug("Got SIGCHLD for process %lu (%s)", (unsigned long) si
.si_pid
, strna(name
));
1273 /* Let's flush any message the dying child might still
1274 * have queued for us. This ensures that the process
1275 * still exists in /proc so that we can figure out
1276 * which cgroup and hence unit it belongs to. */
1277 r
= manager_process_notify_fd(m
);
1281 /* And now figure out the unit this belongs to */
1282 u
= hashmap_get(m
->watch_pids
, LONG_TO_PTR(si
.si_pid
));
1284 u
= cgroup_unit_by_pid(m
, si
.si_pid
);
1286 /* And now, we actually reap the zombie. */
1287 if (waitid(P_PID
, si
.si_pid
, &si
, WEXITED
) < 0) {
1294 if (si
.si_code
!= CLD_EXITED
&& si
.si_code
!= CLD_KILLED
&& si
.si_code
!= CLD_DUMPED
)
1297 log_debug("Child %lu died (code=%s, status=%i/%s)",
1298 (long unsigned) si
.si_pid
,
1299 sigchld_code_to_string(si
.si_code
),
1301 strna(si
.si_code
== CLD_EXITED
1302 ? exit_status_to_string(si
.si_status
, EXIT_STATUS_FULL
)
1303 : signal_to_string(si
.si_status
)));
1308 log_debug_unit(u
->id
,
1309 "Child %lu belongs to %s", (long unsigned) si
.si_pid
, u
->id
);
1311 hashmap_remove(m
->watch_pids
, LONG_TO_PTR(si
.si_pid
));
1312 UNIT_VTABLE(u
)->sigchld_event(u
, si
.si_pid
, si
.si_code
, si
.si_status
);
1318 static int manager_start_target(Manager
*m
, const char *name
, JobMode mode
) {
1322 dbus_error_init(&error
);
1324 log_debug_unit(name
, "Activating special unit %s", name
);
1326 r
= manager_add_job_by_name(m
, JOB_START
, name
, mode
, true, &error
, NULL
);
1328 log_error_unit(name
,
1329 "Failed to enqueue %s job: %s", name
, bus_error(&error
, r
));
1331 dbus_error_free(&error
);
1336 static int manager_process_signal_fd(Manager
*m
) {
1338 struct signalfd_siginfo sfsi
;
1339 bool sigchld
= false;
1344 n
= read(m
->signal_watch
.fd
, &sfsi
, sizeof(sfsi
));
1345 if (n
!= sizeof(sfsi
)) {
1350 if (errno
== EINTR
|| errno
== EAGAIN
)
1356 if (sfsi
.ssi_pid
> 0) {
1359 get_process_comm(sfsi
.ssi_pid
, &p
);
1361 log_debug("Received SIG%s from PID %lu (%s).",
1362 signal_to_string(sfsi
.ssi_signo
),
1363 (unsigned long) sfsi
.ssi_pid
, strna(p
));
1366 log_debug("Received SIG%s.", signal_to_string(sfsi
.ssi_signo
));
1368 switch (sfsi
.ssi_signo
) {
1375 if (m
->running_as
== SYSTEMD_SYSTEM
) {
1376 /* This is for compatibility with the
1377 * original sysvinit */
1378 m
->exit_code
= MANAGER_REEXECUTE
;
1385 if (m
->running_as
== SYSTEMD_SYSTEM
) {
1386 manager_start_target(m
, SPECIAL_CTRL_ALT_DEL_TARGET
, JOB_REPLACE_IRREVERSIBLY
);
1390 /* Run the exit target if there is one, if not, just exit. */
1391 if (manager_start_target(m
, SPECIAL_EXIT_TARGET
, JOB_REPLACE
) < 0) {
1392 m
->exit_code
= MANAGER_EXIT
;
1399 if (m
->running_as
== SYSTEMD_SYSTEM
)
1400 manager_start_target(m
, SPECIAL_KBREQUEST_TARGET
, JOB_REPLACE
);
1402 /* This is a nop on non-init */
1406 if (m
->running_as
== SYSTEMD_SYSTEM
)
1407 manager_start_target(m
, SPECIAL_SIGPWR_TARGET
, JOB_REPLACE
);
1409 /* This is a nop on non-init */
1415 u
= manager_get_unit(m
, SPECIAL_DBUS_SERVICE
);
1417 if (!u
|| UNIT_IS_ACTIVE_OR_RELOADING(unit_active_state(u
))) {
1418 log_info("Trying to reconnect to bus...");
1422 if (!u
|| !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u
))) {
1423 log_info("Loading D-Bus service...");
1424 manager_start_target(m
, SPECIAL_DBUS_SERVICE
, JOB_REPLACE
);
1435 if (!(f
= open_memstream(&dump
, &size
))) {
1436 log_warning("Failed to allocate memory stream.");
1440 manager_dump_units(m
, f
, "\t");
1441 manager_dump_jobs(m
, f
, "\t");
1446 log_warning("Failed to write status stream");
1451 log_dump(LOG_INFO
, dump
);
1458 m
->exit_code
= MANAGER_RELOAD
;
1463 /* Starting SIGRTMIN+0 */
1464 static const char * const target_table
[] = {
1465 [0] = SPECIAL_DEFAULT_TARGET
,
1466 [1] = SPECIAL_RESCUE_TARGET
,
1467 [2] = SPECIAL_EMERGENCY_TARGET
,
1468 [3] = SPECIAL_HALT_TARGET
,
1469 [4] = SPECIAL_POWEROFF_TARGET
,
1470 [5] = SPECIAL_REBOOT_TARGET
,
1471 [6] = SPECIAL_KEXEC_TARGET
1474 /* Starting SIGRTMIN+13, so that target halt and system halt are 10 apart */
1475 static const ManagerExitCode code_table
[] = {
1477 [1] = MANAGER_POWEROFF
,
1478 [2] = MANAGER_REBOOT
,
1482 if ((int) sfsi
.ssi_signo
>= SIGRTMIN
+0 &&
1483 (int) sfsi
.ssi_signo
< SIGRTMIN
+(int) ELEMENTSOF(target_table
)) {
1484 int idx
= (int) sfsi
.ssi_signo
- SIGRTMIN
;
1485 manager_start_target(m
, target_table
[idx
],
1486 (idx
== 1 || idx
== 2) ? JOB_ISOLATE
: JOB_REPLACE
);
1490 if ((int) sfsi
.ssi_signo
>= SIGRTMIN
+13 &&
1491 (int) sfsi
.ssi_signo
< SIGRTMIN
+13+(int) ELEMENTSOF(code_table
)) {
1492 m
->exit_code
= code_table
[sfsi
.ssi_signo
- SIGRTMIN
- 13];
1496 switch (sfsi
.ssi_signo
- SIGRTMIN
) {
1499 log_debug("Enabling showing of status.");
1500 manager_set_show_status(m
, true);
1504 log_debug("Disabling showing of status.");
1505 manager_set_show_status(m
, false);
1509 log_set_max_level(LOG_DEBUG
);
1510 log_notice("Setting log level to debug.");
1514 log_set_max_level(LOG_INFO
);
1515 log_notice("Setting log level to info.");
1519 if (m
->running_as
== SYSTEMD_USER
) {
1520 m
->exit_code
= MANAGER_EXIT
;
1524 /* This is a nop on init */
1528 log_set_target(LOG_TARGET_JOURNAL_OR_KMSG
);
1529 log_notice("Setting log target to journal-or-kmsg.");
1533 log_set_target(LOG_TARGET_CONSOLE
);
1534 log_notice("Setting log target to console.");
1538 log_set_target(LOG_TARGET_KMSG
);
1539 log_notice("Setting log target to kmsg.");
1543 log_set_target(LOG_TARGET_SYSLOG_OR_KMSG
);
1544 log_notice("Setting log target to syslog-or-kmsg.");
1548 log_warning("Got unhandled signal <%s>.", signal_to_string(sfsi
.ssi_signo
));
1555 return manager_dispatch_sigchld(m
);
1560 static int process_event(Manager
*m
, struct epoll_event
*ev
) {
1567 assert_se(w
= ev
->data
.ptr
);
1569 if (w
->type
== WATCH_INVALID
)
1576 /* An incoming signal? */
1577 if (ev
->events
!= EPOLLIN
)
1580 if ((r
= manager_process_signal_fd(m
)) < 0)
1587 /* An incoming daemon notification event? */
1588 if (ev
->events
!= EPOLLIN
)
1591 if ((r
= manager_process_notify_fd(m
)) < 0)
1598 /* Some fd event, to be dispatched to the units */
1599 UNIT_VTABLE(w
->data
.unit
)->fd_event(w
->data
.unit
, w
->fd
, ev
->events
, w
);
1602 case WATCH_UNIT_TIMER
:
1603 case WATCH_JOB_TIMER
: {
1607 /* Some timer event, to be dispatched to the units */
1608 k
= read(w
->fd
, &v
, sizeof(v
));
1609 if (k
!= sizeof(v
)) {
1611 if (k
< 0 && (errno
== EINTR
|| errno
== EAGAIN
))
1614 log_error("Failed to read timer event counter: %s", k
< 0 ? strerror(-k
) : "Short read");
1615 return k
< 0 ? -errno
: -EIO
;
1618 if (w
->type
== WATCH_UNIT_TIMER
)
1619 UNIT_VTABLE(w
->data
.unit
)->timer_event(w
->data
.unit
, v
, w
);
1621 job_timer_event(w
->data
.job
, v
, w
);
1626 /* Some mount table change, intended for the mount subsystem */
1627 mount_fd_event(m
, ev
->events
);
1631 /* Some swap table change, intended for the swap subsystem */
1632 swap_fd_event(m
, ev
->events
);
1636 /* Some notification from udev, intended for the device subsystem */
1637 device_fd_event(m
, ev
->events
);
1640 case WATCH_DBUS_WATCH
:
1641 bus_watch_event(m
, w
, ev
->events
);
1644 case WATCH_DBUS_TIMEOUT
:
1645 bus_timeout_event(m
, w
, ev
->events
);
1648 case WATCH_TIME_CHANGE
: {
1652 log_struct(LOG_INFO
,
1653 MESSAGE_ID(SD_MESSAGE_TIME_CHANGE
),
1654 "MESSAGE=Time has been changed",
1657 /* Restart the watch */
1658 epoll_ctl(m
->epoll_fd
, EPOLL_CTL_DEL
, m
->time_change_watch
.fd
,
1660 close_nointr_nofail(m
->time_change_watch
.fd
);
1661 watch_init(&m
->time_change_watch
);
1662 manager_setup_time_change(m
);
1664 HASHMAP_FOREACH(u
, m
->units
, i
) {
1665 if (UNIT_VTABLE(u
)->time_change
)
1666 UNIT_VTABLE(u
)->time_change(u
);
1672 case WATCH_JOBS_IN_PROGRESS
: {
1675 /* not interested in the data */
1676 read(w
->fd
, &v
, sizeof(v
));
1678 manager_print_jobs_in_progress(m
);
1683 log_error("event type=%i", w
->type
);
1684 assert_not_reached("Unknown epoll event type.");
1690 int manager_loop(Manager
*m
) {
1693 RATELIMIT_DEFINE(rl
, 1*USEC_PER_SEC
, 50000);
1696 m
->exit_code
= MANAGER_RUNNING
;
1698 /* Release the path cache */
1699 set_free_free(m
->unit_path_cache
);
1700 m
->unit_path_cache
= NULL
;
1702 manager_check_finished(m
);
1704 /* There might still be some zombies hanging around from
1705 * before we were exec()'ed. Leat's reap them */
1706 r
= manager_dispatch_sigchld(m
);
1710 while (m
->exit_code
== MANAGER_RUNNING
) {
1711 struct epoll_event event
;
1715 if (m
->runtime_watchdog
> 0 && m
->running_as
== SYSTEMD_SYSTEM
)
1718 if (!ratelimit_test(&rl
)) {
1719 /* Yay, something is going seriously wrong, pause a little */
1720 log_warning("Looping too fast. Throttling execution a little.");
1725 if (manager_dispatch_load_queue(m
) > 0)
1728 if (manager_dispatch_run_queue(m
) > 0)
1731 if (bus_dispatch(m
) > 0)
1734 if (manager_dispatch_cleanup_queue(m
) > 0)
1737 if (manager_dispatch_gc_queue(m
) > 0)
1740 if (manager_dispatch_dbus_queue(m
) > 0)
1743 if (swap_dispatch_reload(m
) > 0)
1746 /* Sleep for half the watchdog time */
1747 if (m
->runtime_watchdog
> 0 && m
->running_as
== SYSTEMD_SYSTEM
) {
1748 wait_msec
= (int) (m
->runtime_watchdog
/ 2 / USEC_PER_MSEC
);
1754 n
= epoll_wait(m
->epoll_fd
, &event
, 1, wait_msec
);
1766 r
= process_event(m
, &event
);
1771 return m
->exit_code
;
1774 int manager_load_unit_from_dbus_path(Manager
*m
, const char *s
, DBusError
*e
, Unit
**_u
) {
1783 if (!startswith(s
, "/org/freedesktop/systemd1/unit/"))
1786 n
= bus_path_unescape(s
+31);
1790 r
= manager_load_unit(m
, n
, NULL
, e
, &u
);
1801 int manager_get_job_from_dbus_path(Manager
*m
, const char *s
, Job
**_j
) {
1810 if (!startswith(s
, "/org/freedesktop/systemd1/job/"))
1813 r
= safe_atou(s
+ 30, &id
);
1817 j
= manager_get_job(m
, id
);
1826 void manager_send_unit_audit(Manager
*m
, Unit
*u
, int type
, bool success
) {
1832 audit_fd
= get_audit_fd();
1836 /* Don't generate audit events if the service was already
1837 * started and we're just deserializing */
1838 if (m
->n_reloading
> 0)
1841 if (m
->running_as
!= SYSTEMD_SYSTEM
)
1844 if (u
->type
!= UNIT_SERVICE
)
1847 p
= unit_name_to_prefix_and_instance(u
->id
);
1849 log_error_unit(u
->id
,
1850 "Failed to allocate unit name for audit message: %s", strerror(ENOMEM
));
1854 if (audit_log_user_comm_message(audit_fd
, type
, "", p
, NULL
, NULL
, NULL
, success
) < 0) {
1855 if (errno
== EPERM
) {
1856 /* We aren't allowed to send audit messages?
1857 * Then let's not retry again. */
1860 log_warning("Failed to send audit message: %m");
1868 void manager_send_unit_plymouth(Manager
*m
, Unit
*u
) {
1870 union sockaddr_union sa
;
1872 char *message
= NULL
;
1874 /* Don't generate plymouth events if the service was already
1875 * started and we're just deserializing */
1876 if (m
->n_reloading
> 0)
1879 if (m
->running_as
!= SYSTEMD_SYSTEM
)
1882 if (u
->type
!= UNIT_SERVICE
&&
1883 u
->type
!= UNIT_MOUNT
&&
1884 u
->type
!= UNIT_SWAP
)
1887 /* We set SOCK_NONBLOCK here so that we rather drop the
1888 * message then wait for plymouth */
1889 fd
= socket(AF_UNIX
, SOCK_STREAM
|SOCK_CLOEXEC
|SOCK_NONBLOCK
, 0);
1891 log_error("socket() failed: %m");
1896 sa
.sa
.sa_family
= AF_UNIX
;
1897 strncpy(sa
.un
.sun_path
+1, "/org/freedesktop/plymouthd", sizeof(sa
.un
.sun_path
)-1);
1898 if (connect(fd
, &sa
.sa
, offsetof(struct sockaddr_un
, sun_path
) + 1 + strlen(sa
.un
.sun_path
+1)) < 0) {
1900 if (errno
!= EPIPE
&&
1903 errno
!= ECONNREFUSED
&&
1904 errno
!= ECONNRESET
&&
1905 errno
!= ECONNABORTED
)
1906 log_error("connect() failed: %m");
1911 if (asprintf(&message
, "U\002%c%s%n", (int) (strlen(u
->id
) + 1), u
->id
, &n
) < 0) {
1917 if (write(fd
, message
, n
+ 1) != n
+ 1) {
1919 if (errno
!= EPIPE
&&
1922 errno
!= ECONNREFUSED
&&
1923 errno
!= ECONNRESET
&&
1924 errno
!= ECONNABORTED
)
1925 log_error("Failed to write Plymouth message: %m");
1932 close_nointr_nofail(fd
);
1937 void manager_dispatch_bus_name_owner_changed(
1940 const char* old_owner
,
1941 const char *new_owner
) {
1948 if (!(u
= hashmap_get(m
->watch_bus
, name
)))
1951 UNIT_VTABLE(u
)->bus_name_owner_change(u
, name
, old_owner
, new_owner
);
1954 void manager_dispatch_bus_query_pid_done(
1965 if (!(u
= hashmap_get(m
->watch_bus
, name
)))
1968 UNIT_VTABLE(u
)->bus_query_pid_done(u
, name
, pid
);
1971 int manager_open_serialization(Manager
*m
, FILE **_f
) {
1978 if (m
->running_as
== SYSTEMD_SYSTEM
)
1979 asprintf(&path
, "/run/systemd/dump-%lu-XXXXXX", (unsigned long) getpid());
1981 asprintf(&path
, "/tmp/systemd-dump-%lu-XXXXXX", (unsigned long) getpid());
1986 RUN_WITH_UMASK(0077) {
1987 fd
= mkostemp(path
, O_RDWR
|O_CLOEXEC
);
1997 log_debug("Serializing state to %s", path
);
2000 f
= fdopen(fd
, "w+");
2009 int manager_serialize(Manager
*m
, FILE *f
, FDSet
*fds
, bool switching_root
) {
2022 fprintf(f
, "current-job-id=%i\n", m
->current_job_id
);
2023 fprintf(f
, "taint-usr=%s\n", yes_no(m
->taint_usr
));
2024 fprintf(f
, "n-installed-jobs=%u\n", m
->n_installed_jobs
);
2025 fprintf(f
, "n-failed-jobs=%u\n", m
->n_failed_jobs
);
2027 dual_timestamp_serialize(f
, "firmware-timestamp", &m
->firmware_timestamp
);
2028 dual_timestamp_serialize(f
, "kernel-timestamp", &m
->kernel_timestamp
);
2029 dual_timestamp_serialize(f
, "loader-timestamp", &m
->loader_timestamp
);
2030 dual_timestamp_serialize(f
, "initrd-timestamp", &m
->initrd_timestamp
);
2033 dual_timestamp_serialize(f
, "userspace-timestamp", &m
->userspace_timestamp
);
2034 dual_timestamp_serialize(f
, "finish-timestamp", &m
->finish_timestamp
);
2037 if (!switching_root
) {
2038 STRV_FOREACH(e
, m
->environment
) {
2039 _cleanup_free_
char *ce
;
2043 fprintf(f
, "env=%s\n", *e
);
2049 HASHMAP_FOREACH_KEY(u
, t
, m
->units
, i
) {
2053 if (!unit_can_serialize(u
))
2060 if ((r
= unit_serialize(u
, f
, fds
, !switching_root
)) < 0) {
2066 assert(m
->n_reloading
> 0);
2072 r
= bus_fdset_add_all(m
, fds
);
2079 int manager_deserialize(Manager
*m
, FILE *f
, FDSet
*fds
) {
2085 log_debug("Deserializing state...");
2090 char line
[LINE_MAX
], *l
;
2092 if (!fgets(line
, sizeof(line
), f
)) {
2107 if (startswith(l
, "current-job-id=")) {
2110 if (safe_atou32(l
+15, &id
) < 0)
2111 log_debug("Failed to parse current job id value %s", l
+15);
2113 m
->current_job_id
= MAX(m
->current_job_id
, id
);
2114 } else if (startswith(l
, "n-installed-jobs=")) {
2117 if (safe_atou32(l
+17, &n
) < 0)
2118 log_debug("Failed to parse installed jobs counter %s", l
+17);
2120 m
->n_installed_jobs
+= n
;
2121 } else if (startswith(l
, "n-failed-jobs=")) {
2124 if (safe_atou32(l
+14, &n
) < 0)
2125 log_debug("Failed to parse failed jobs counter %s", l
+14);
2127 m
->n_failed_jobs
+= n
;
2128 } else if (startswith(l
, "taint-usr=")) {
2131 if ((b
= parse_boolean(l
+10)) < 0)
2132 log_debug("Failed to parse taint /usr flag %s", l
+10);
2134 m
->taint_usr
= m
->taint_usr
|| b
;
2135 } else if (startswith(l
, "firmware-timestamp="))
2136 dual_timestamp_deserialize(l
+19, &m
->firmware_timestamp
);
2137 else if (startswith(l
, "loader-timestamp="))
2138 dual_timestamp_deserialize(l
+17, &m
->loader_timestamp
);
2139 else if (startswith(l
, "kernel-timestamp="))
2140 dual_timestamp_deserialize(l
+17, &m
->kernel_timestamp
);
2141 else if (startswith(l
, "initrd-timestamp="))
2142 dual_timestamp_deserialize(l
+17, &m
->initrd_timestamp
);
2143 else if (startswith(l
, "userspace-timestamp="))
2144 dual_timestamp_deserialize(l
+20, &m
->userspace_timestamp
);
2145 else if (startswith(l
, "finish-timestamp="))
2146 dual_timestamp_deserialize(l
+17, &m
->finish_timestamp
);
2147 else if (startswith(l
, "env=")) {
2148 _cleanup_free_
char *uce
= NULL
;
2151 uce
= cunescape(l
+4);
2157 e
= strv_env_set(m
->environment
, uce
);
2163 strv_free(m
->environment
);
2166 log_debug("Unknown serialization item '%s'", l
);
2171 char name
[UNIT_NAME_MAX
+2];
2174 if (!fgets(name
, sizeof(name
), f
)) {
2185 r
= manager_load_unit(m
, strstrip(name
), NULL
, NULL
, &u
);
2189 r
= unit_deserialize(u
, f
, fds
);
2200 assert(m
->n_reloading
> 0);
2206 int manager_distribute_fds(Manager
*m
, FDSet
*fds
) {
2213 HASHMAP_FOREACH(u
, m
->units
, i
) {
2215 if (fdset_size(fds
) <= 0)
2218 if (UNIT_VTABLE(u
)->distribute_fds
) {
2219 r
= UNIT_VTABLE(u
)->distribute_fds(u
, fds
);
2228 int manager_reload(Manager
*m
) {
2235 r
= manager_open_serialization(m
, &f
);
2248 r
= manager_serialize(m
, f
, fds
, false);
2254 if (fseeko(f
, 0, SEEK_SET
) < 0) {
2260 /* From here on there is no way back. */
2261 manager_clear_jobs_and_units(m
);
2262 manager_undo_generators(m
);
2263 lookup_paths_free(&m
->lookup_paths
);
2265 /* Find new unit paths */
2266 manager_run_generators(m
);
2268 q
= lookup_paths_init(
2269 &m
->lookup_paths
, m
->running_as
, true,
2270 m
->generator_unit_path
,
2271 m
->generator_unit_path_early
,
2272 m
->generator_unit_path_late
);
2276 manager_build_unit_path_cache(m
);
2278 /* First, enumerate what we can from all config files */
2279 q
= manager_enumerate(m
);
2283 /* Second, deserialize our stored data */
2284 q
= manager_deserialize(m
, f
, fds
);
2291 /* Third, fire things up! */
2292 q
= manager_coldplug(m
);
2296 assert(m
->n_reloading
> 0);
2309 static bool manager_is_booting_or_shutting_down(Manager
*m
) {
2314 /* Is the initial job still around? */
2315 if (manager_get_job(m
, m
->default_unit_job_id
))
2318 /* Is there a job for the shutdown target? */
2319 u
= manager_get_unit(m
, SPECIAL_SHUTDOWN_TARGET
);
2326 bool manager_is_reloading_or_reexecuting(Manager
*m
) {
2329 return m
->n_reloading
!= 0;
2332 void manager_reset_failed(Manager
*m
) {
2338 HASHMAP_FOREACH(u
, m
->units
, i
)
2339 unit_reset_failed(u
);
2342 bool manager_unit_inactive_or_pending(Manager
*m
, const char *name
) {
2348 /* Returns true if the unit is inactive or going down */
2349 u
= manager_get_unit(m
, name
);
2353 return unit_inactive_or_pending(u
);
2356 void manager_check_finished(Manager
*m
) {
2357 char userspace
[FORMAT_TIMESPAN_MAX
], initrd
[FORMAT_TIMESPAN_MAX
], kernel
[FORMAT_TIMESPAN_MAX
], sum
[FORMAT_TIMESPAN_MAX
];
2358 usec_t firmware_usec
, loader_usec
, kernel_usec
, initrd_usec
, userspace_usec
, total_usec
;
2362 if (m
->n_running_jobs
== 0)
2363 manager_unwatch_jobs_in_progress(m
);
2365 if (hashmap_size(m
->jobs
) > 0) {
2366 manager_jobs_in_progress_mod_timer(m
);
2370 /* Notify Type=idle units that we are done now */
2371 close_pipe(m
->idle_pipe
);
2373 /* Turn off confirm spawn now */
2374 m
->confirm_spawn
= false;
2376 if (dual_timestamp_is_set(&m
->finish_timestamp
))
2379 dual_timestamp_get(&m
->finish_timestamp
);
2381 if (m
->running_as
== SYSTEMD_SYSTEM
&& detect_container(NULL
) <= 0) {
2383 /* Note that m->kernel_usec.monotonic is always at 0,
2384 * and m->firmware_usec.monotonic and
2385 * m->loader_usec.monotonic should be considered
2386 * negative values. */
2388 firmware_usec
= m
->firmware_timestamp
.monotonic
- m
->loader_timestamp
.monotonic
;
2389 loader_usec
= m
->loader_timestamp
.monotonic
- m
->kernel_timestamp
.monotonic
;
2390 userspace_usec
= m
->finish_timestamp
.monotonic
- m
->userspace_timestamp
.monotonic
;
2391 total_usec
= m
->firmware_timestamp
.monotonic
+ m
->finish_timestamp
.monotonic
;
2393 if (dual_timestamp_is_set(&m
->initrd_timestamp
)) {
2395 kernel_usec
= m
->initrd_timestamp
.monotonic
- m
->kernel_timestamp
.monotonic
;
2396 initrd_usec
= m
->userspace_timestamp
.monotonic
- m
->initrd_timestamp
.monotonic
;
2398 if (!log_on_console())
2399 log_struct(LOG_INFO
,
2400 MESSAGE_ID(SD_MESSAGE_STARTUP_FINISHED
),
2401 "KERNEL_USEC=%llu", (unsigned long long) kernel_usec
,
2402 "INITRD_USEC=%llu", (unsigned long long) initrd_usec
,
2403 "USERSPACE_USEC=%llu", (unsigned long long) userspace_usec
,
2404 "MESSAGE=Startup finished in %s (kernel) + %s (initrd) + %s (userspace) = %s.",
2405 format_timespan(kernel
, sizeof(kernel
), kernel_usec
, USEC_PER_MSEC
),
2406 format_timespan(initrd
, sizeof(initrd
), initrd_usec
, USEC_PER_MSEC
),
2407 format_timespan(userspace
, sizeof(userspace
), userspace_usec
, USEC_PER_MSEC
),
2408 format_timespan(sum
, sizeof(sum
), total_usec
, USEC_PER_MSEC
),
2411 kernel_usec
= m
->userspace_timestamp
.monotonic
- m
->kernel_timestamp
.monotonic
;
2414 if (!log_on_console())
2415 log_struct(LOG_INFO
,
2416 MESSAGE_ID(SD_MESSAGE_STARTUP_FINISHED
),
2417 "KERNEL_USEC=%llu", (unsigned long long) kernel_usec
,
2418 "USERSPACE_USEC=%llu", (unsigned long long) userspace_usec
,
2419 "MESSAGE=Startup finished in %s (kernel) + %s (userspace) = %s.",
2420 format_timespan(kernel
, sizeof(kernel
), kernel_usec
, USEC_PER_MSEC
),
2421 format_timespan(userspace
, sizeof(userspace
), userspace_usec
, USEC_PER_MSEC
),
2422 format_timespan(sum
, sizeof(sum
), total_usec
, USEC_PER_MSEC
),
2426 firmware_usec
= loader_usec
= initrd_usec
= kernel_usec
= 0;
2427 total_usec
= userspace_usec
= m
->finish_timestamp
.monotonic
- m
->userspace_timestamp
.monotonic
;
2429 if (!log_on_console())
2430 log_struct(LOG_INFO
,
2431 MESSAGE_ID(SD_MESSAGE_STARTUP_FINISHED
),
2432 "USERSPACE_USEC=%llu", (unsigned long long) userspace_usec
,
2433 "MESSAGE=Startup finished in %s.",
2434 format_timespan(sum
, sizeof(sum
), total_usec
, USEC_PER_MSEC
),
2438 bus_broadcast_finished(m
, firmware_usec
, loader_usec
, kernel_usec
, initrd_usec
, userspace_usec
, total_usec
);
2441 "READY=1\nSTATUS=Startup finished in %s.",
2442 format_timespan(sum
, sizeof(sum
), total_usec
, USEC_PER_MSEC
));
2445 static int create_generator_dir(Manager
*m
, char **generator
, const char *name
) {
2456 if (m
->running_as
== SYSTEMD_SYSTEM
&& getpid() == 1) {
2458 p
= strappend("/run/systemd/", name
);
2462 r
= mkdir_p_label(p
, 0755);
2464 log_error("Failed to create generator directory %s: %s",
2470 p
= strjoin("/tmp/systemd-", name
, ".XXXXXX", NULL
);
2475 log_error("Failed to create generator directory %s: %m",
2486 static void trim_generator_dir(Manager
*m
, char **generator
) {
2493 if (rmdir(*generator
) >= 0) {
2501 void manager_run_generators(Manager
*m
) {
2503 const char *generator_path
;
2504 const char *argv
[5];
2509 generator_path
= m
->running_as
== SYSTEMD_SYSTEM
? SYSTEM_GENERATOR_PATH
: USER_GENERATOR_PATH
;
2510 d
= opendir(generator_path
);
2512 if (errno
== ENOENT
)
2515 log_error("Failed to enumerate generator directory %s: %m",
2520 r
= create_generator_dir(m
, &m
->generator_unit_path
, "generator");
2524 r
= create_generator_dir(m
, &m
->generator_unit_path_early
, "generator.early");
2528 r
= create_generator_dir(m
, &m
->generator_unit_path_late
, "generator.late");
2532 argv
[0] = NULL
; /* Leave this empty, execute_directory() will fill something in */
2533 argv
[1] = m
->generator_unit_path
;
2534 argv
[2] = m
->generator_unit_path_early
;
2535 argv
[3] = m
->generator_unit_path_late
;
2538 RUN_WITH_UMASK(0022) {
2539 execute_directory(generator_path
, d
, (char**) argv
);
2542 trim_generator_dir(m
, &m
->generator_unit_path
);
2543 trim_generator_dir(m
, &m
->generator_unit_path_early
);
2544 trim_generator_dir(m
, &m
->generator_unit_path_late
);
2551 static void remove_generator_dir(Manager
*m
, char **generator
) {
2558 strv_remove(m
->lookup_paths
.unit_path
, *generator
);
2559 rm_rf(*generator
, false, true, false);
2565 void manager_undo_generators(Manager
*m
) {
2568 remove_generator_dir(m
, &m
->generator_unit_path
);
2569 remove_generator_dir(m
, &m
->generator_unit_path_early
);
2570 remove_generator_dir(m
, &m
->generator_unit_path_late
);
2573 int manager_set_default_environment(Manager
*m
, char **environment
) {
2577 e
= strv_env_merge(2, m
->environment
, environment
);
2580 strv_free(m
->environment
);
2585 int manager_set_default_controllers(Manager
*m
, char **controllers
) {
2590 l
= strv_copy(controllers
);
2594 strv_free(m
->default_controllers
);
2595 m
->default_controllers
= l
;
2597 cg_shorten_controllers(m
->default_controllers
);
2602 int manager_set_default_rlimits(Manager
*m
, struct rlimit
**default_rlimit
) {
2607 for (i
= 0; i
< RLIMIT_NLIMITS
; i
++) {
2608 if (!default_rlimit
[i
])
2611 m
->rlimit
[i
] = newdup(struct rlimit
, default_rlimit
[i
], 1);
2619 void manager_recheck_journal(Manager
*m
) {
2624 if (m
->running_as
!= SYSTEMD_SYSTEM
)
2627 u
= manager_get_unit(m
, SPECIAL_JOURNALD_SOCKET
);
2628 if (u
&& SOCKET(u
)->state
!= SOCKET_RUNNING
) {
2629 log_close_journal();
2633 u
= manager_get_unit(m
, SPECIAL_JOURNALD_SERVICE
);
2634 if (u
&& SERVICE(u
)->state
!= SERVICE_RUNNING
) {
2635 log_close_journal();
2639 /* Hmm, OK, so the socket is fully up and the service is up
2640 * too, then let's make use of the thing. */
2644 void manager_set_show_status(Manager
*m
, bool b
) {
2647 if (m
->running_as
!= SYSTEMD_SYSTEM
)
2653 touch("/run/systemd/show-status");
2655 unlink("/run/systemd/show-status");
2658 static bool manager_get_show_status(Manager
*m
) {
2661 if (m
->running_as
!= SYSTEMD_SYSTEM
)
2667 /* If Plymouth is running make sure we show the status, so
2668 * that there's something nice to see when people press Esc */
2670 return plymouth_running();
2673 void manager_status_printf(Manager
*m
, bool ephemeral
, const char *status
, const char *format
, ...) {
2676 if (!manager_get_show_status(m
))
2679 /* XXX We should totally drop the check for ephemeral here
2680 * and thus effectively make 'Type=idle' pointless. */
2681 if (ephemeral
&& m
->n_on_console
> 0)
2684 if (!manager_is_booting_or_shutting_down(m
))
2687 va_start(ap
, format
);
2688 status_vprintf(status
, true, ephemeral
, format
, ap
);
2692 void watch_init(Watch
*w
) {
2695 w
->type
= WATCH_INVALID
;