1 /* SPDX-License-Identifier: LGPL-2.1+ */
3 This file is part of systemd.
5 Copyright 2010 Lennart Poettering
7 systemd is free software; you can redistribute it and/or modify it
8 under the terms of the GNU Lesser General Public License as published by
9 the Free Software Foundation; either version 2.1 of the License, or
10 (at your option) any later version.
12 systemd is distributed in the hope that it will be useful, but
13 WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 Lesser General Public License for more details.
17 You should have received a copy of the GNU Lesser General Public License
18 along with systemd; If not, see <http://www.gnu.org/licenses/>.
25 #include <stdio_ext.h>
27 #include <sys/epoll.h>
28 #include <sys/inotify.h>
29 #include <sys/ioctl.h>
30 #include <sys/reboot.h>
31 #include <sys/timerfd.h>
39 #include "sd-daemon.h"
40 #include "sd-messages.h"
43 #include "alloc-util.h"
45 #include "boot-timestamps.h"
46 #include "bus-common-errors.h"
47 #include "bus-error.h"
48 #include "bus-kernel.h"
50 #include "clean-ipc.h"
51 #include "clock-util.h"
53 #include "dbus-manager.h"
54 #include "dbus-unit.h"
56 #include "dirent-util.h"
59 #include "exec-util.h"
61 #include "exit-status.h"
68 #include "locale-setup.h"
74 #include "parse-util.h"
75 #include "path-lookup.h"
76 #include "path-util.h"
77 #include "process-util.h"
78 #include "ratelimit.h"
80 #include "signal-util.h"
82 #include "stat-util.h"
83 #include "string-table.h"
84 #include "string-util.h"
86 #include "terminal-util.h"
87 #include "time-util.h"
88 #include "transaction.h"
89 #include "umask-util.h"
90 #include "unit-name.h"
91 #include "user-util.h"
96 #define NOTIFY_RCVBUF_SIZE (8*1024*1024)
97 #define CGROUPS_AGENT_RCVBUF_SIZE (8*1024*1024)
99 /* Initial delay and the interval for printing status messages about running jobs */
100 #define JOBS_IN_PROGRESS_WAIT_USEC (5*USEC_PER_SEC)
101 #define JOBS_IN_PROGRESS_PERIOD_USEC (USEC_PER_SEC / 3)
102 #define JOBS_IN_PROGRESS_PERIOD_DIVISOR 3
104 static int manager_dispatch_notify_fd(sd_event_source
*source
, int fd
, uint32_t revents
, void *userdata
);
105 static int manager_dispatch_cgroups_agent_fd(sd_event_source
*source
, int fd
, uint32_t revents
, void *userdata
);
106 static int manager_dispatch_signal_fd(sd_event_source
*source
, int fd
, uint32_t revents
, void *userdata
);
107 static int manager_dispatch_time_change_fd(sd_event_source
*source
, int fd
, uint32_t revents
, void *userdata
);
108 static int manager_dispatch_idle_pipe_fd(sd_event_source
*source
, int fd
, uint32_t revents
, void *userdata
);
109 static int manager_dispatch_user_lookup_fd(sd_event_source
*source
, int fd
, uint32_t revents
, void *userdata
);
110 static int manager_dispatch_jobs_in_progress(sd_event_source
*source
, usec_t usec
, void *userdata
);
111 static int manager_dispatch_run_queue(sd_event_source
*source
, void *userdata
);
112 static int manager_run_environment_generators(Manager
*m
);
113 static int manager_run_generators(Manager
*m
);
115 static void manager_watch_jobs_in_progress(Manager
*m
) {
121 /* We do not want to show the cylon animation if the user
122 * needs to confirm service executions otherwise confirmation
123 * messages will be screwed by the cylon animation. */
124 if (!manager_is_confirm_spawn_disabled(m
))
127 if (m
->jobs_in_progress_event_source
)
130 next
= now(CLOCK_MONOTONIC
) + JOBS_IN_PROGRESS_WAIT_USEC
;
131 r
= sd_event_add_time(
133 &m
->jobs_in_progress_event_source
,
136 manager_dispatch_jobs_in_progress
, m
);
140 (void) sd_event_source_set_description(m
->jobs_in_progress_event_source
, "manager-jobs-in-progress");
143 #define CYLON_BUFFER_EXTRA (2*(sizeof(ANSI_RED)-1) + sizeof(ANSI_HIGHLIGHT_RED)-1 + 2*(sizeof(ANSI_NORMAL)-1))
145 static void draw_cylon(char buffer
[], size_t buflen
, unsigned width
, unsigned pos
) {
148 assert(buflen
>= CYLON_BUFFER_EXTRA
+ width
+ 1);
149 assert(pos
<= width
+1); /* 0 or width+1 mean that the center light is behind the corner */
153 p
= mempset(p
, ' ', pos
-2);
154 if (log_get_show_color())
155 p
= stpcpy(p
, ANSI_RED
);
159 if (pos
> 0 && pos
<= width
) {
160 if (log_get_show_color())
161 p
= stpcpy(p
, ANSI_HIGHLIGHT_RED
);
165 if (log_get_show_color())
166 p
= stpcpy(p
, ANSI_NORMAL
);
169 if (log_get_show_color())
170 p
= stpcpy(p
, ANSI_RED
);
173 p
= mempset(p
, ' ', width
-1-pos
);
174 if (log_get_show_color())
175 strcpy(p
, ANSI_NORMAL
);
179 void manager_flip_auto_status(Manager
*m
, bool enable
) {
183 if (m
->show_status
== SHOW_STATUS_AUTO
)
184 manager_set_show_status(m
, SHOW_STATUS_TEMPORARY
);
186 if (m
->show_status
== SHOW_STATUS_TEMPORARY
)
187 manager_set_show_status(m
, SHOW_STATUS_AUTO
);
191 static void manager_print_jobs_in_progress(Manager
*m
) {
192 _cleanup_free_
char *job_of_n
= NULL
;
195 unsigned counter
= 0, print_nr
;
196 char cylon
[6 + CYLON_BUFFER_EXTRA
+ 1];
198 char time
[FORMAT_TIMESPAN_MAX
], limit
[FORMAT_TIMESPAN_MAX
] = "no limit";
202 assert(m
->n_running_jobs
> 0);
204 manager_flip_auto_status(m
, true);
206 print_nr
= (m
->jobs_in_progress_iteration
/ JOBS_IN_PROGRESS_PERIOD_DIVISOR
) % m
->n_running_jobs
;
208 HASHMAP_FOREACH(j
, m
->jobs
, i
)
209 if (j
->state
== JOB_RUNNING
&& counter
++ == print_nr
)
212 /* m->n_running_jobs must be consistent with the contents of m->jobs,
213 * so the above loop must have succeeded in finding j. */
214 assert(counter
== print_nr
+ 1);
217 cylon_pos
= m
->jobs_in_progress_iteration
% 14;
219 cylon_pos
= 14 - cylon_pos
;
220 draw_cylon(cylon
, sizeof(cylon
), 6, cylon_pos
);
222 m
->jobs_in_progress_iteration
++;
224 if (m
->n_running_jobs
> 1) {
225 if (asprintf(&job_of_n
, "(%u of %u) ", counter
, m
->n_running_jobs
) < 0)
229 format_timespan(time
, sizeof(time
), now(CLOCK_MONOTONIC
) - j
->begin_usec
, 1*USEC_PER_SEC
);
230 if (job_get_timeout(j
, &x
) > 0)
231 format_timespan(limit
, sizeof(limit
), x
- j
->begin_usec
, 1*USEC_PER_SEC
);
233 manager_status_printf(m
, STATUS_TYPE_EPHEMERAL
, cylon
,
234 "%sA %s job is running for %s (%s / %s)",
236 job_type_to_string(j
->type
),
237 unit_description(j
->unit
),
241 static int have_ask_password(void) {
242 _cleanup_closedir_
DIR *dir
;
245 dir
= opendir("/run/systemd/ask-password");
253 FOREACH_DIRENT_ALL(de
, dir
, return -errno
) {
254 if (startswith(de
->d_name
, "ask."))
260 static int manager_dispatch_ask_password_fd(sd_event_source
*source
,
261 int fd
, uint32_t revents
, void *userdata
) {
262 Manager
*m
= userdata
;
268 m
->have_ask_password
= have_ask_password();
269 if (m
->have_ask_password
< 0)
270 /* Log error but continue. Negative have_ask_password
271 * is treated as unknown status. */
272 log_error_errno(m
->have_ask_password
, "Failed to list /run/systemd/ask-password: %m");
277 static void manager_close_ask_password(Manager
*m
) {
280 m
->ask_password_event_source
= sd_event_source_unref(m
->ask_password_event_source
);
281 m
->ask_password_inotify_fd
= safe_close(m
->ask_password_inotify_fd
);
282 m
->have_ask_password
= -EINVAL
;
285 static int manager_check_ask_password(Manager
*m
) {
290 if (!m
->ask_password_event_source
) {
291 assert(m
->ask_password_inotify_fd
< 0);
293 mkdir_p_label("/run/systemd/ask-password", 0755);
295 m
->ask_password_inotify_fd
= inotify_init1(IN_NONBLOCK
|IN_CLOEXEC
);
296 if (m
->ask_password_inotify_fd
< 0)
297 return log_error_errno(errno
, "inotify_init1() failed: %m");
299 if (inotify_add_watch(m
->ask_password_inotify_fd
, "/run/systemd/ask-password", IN_CREATE
|IN_DELETE
|IN_MOVE
) < 0) {
300 log_error_errno(errno
, "Failed to add watch on /run/systemd/ask-password: %m");
301 manager_close_ask_password(m
);
305 r
= sd_event_add_io(m
->event
, &m
->ask_password_event_source
,
306 m
->ask_password_inotify_fd
, EPOLLIN
,
307 manager_dispatch_ask_password_fd
, m
);
309 log_error_errno(errno
, "Failed to add event source for /run/systemd/ask-password: %m");
310 manager_close_ask_password(m
);
314 (void) sd_event_source_set_description(m
->ask_password_event_source
, "manager-ask-password");
316 /* Queries might have been added meanwhile... */
317 manager_dispatch_ask_password_fd(m
->ask_password_event_source
,
318 m
->ask_password_inotify_fd
, EPOLLIN
, m
);
321 return m
->have_ask_password
;
324 static int manager_watch_idle_pipe(Manager
*m
) {
329 if (m
->idle_pipe_event_source
)
332 if (m
->idle_pipe
[2] < 0)
335 r
= sd_event_add_io(m
->event
, &m
->idle_pipe_event_source
, m
->idle_pipe
[2], EPOLLIN
, manager_dispatch_idle_pipe_fd
, m
);
337 return log_error_errno(r
, "Failed to watch idle pipe: %m");
339 (void) sd_event_source_set_description(m
->idle_pipe_event_source
, "manager-idle-pipe");
344 static void manager_close_idle_pipe(Manager
*m
) {
347 m
->idle_pipe_event_source
= sd_event_source_unref(m
->idle_pipe_event_source
);
349 safe_close_pair(m
->idle_pipe
);
350 safe_close_pair(m
->idle_pipe
+ 2);
353 static int manager_setup_time_change(Manager
*m
) {
356 /* We only care for the cancellation event, hence we set the
357 * timeout to the latest possible value. */
358 struct itimerspec its
= {
359 .it_value
.tv_sec
= TIME_T_MAX
,
363 assert_cc(sizeof(time_t) == sizeof(TIME_T_MAX
));
365 if (m
->test_run_flags
)
368 /* Uses TFD_TIMER_CANCEL_ON_SET to get notifications whenever
369 * CLOCK_REALTIME makes a jump relative to CLOCK_MONOTONIC */
371 m
->time_change_fd
= timerfd_create(CLOCK_REALTIME
, TFD_NONBLOCK
|TFD_CLOEXEC
);
372 if (m
->time_change_fd
< 0)
373 return log_error_errno(errno
, "Failed to create timerfd: %m");
375 if (timerfd_settime(m
->time_change_fd
, TFD_TIMER_ABSTIME
|TFD_TIMER_CANCEL_ON_SET
, &its
, NULL
) < 0) {
376 log_debug_errno(errno
, "Failed to set up TFD_TIMER_CANCEL_ON_SET, ignoring: %m");
377 m
->time_change_fd
= safe_close(m
->time_change_fd
);
381 r
= sd_event_add_io(m
->event
, &m
->time_change_event_source
, m
->time_change_fd
, EPOLLIN
, manager_dispatch_time_change_fd
, m
);
383 return log_error_errno(r
, "Failed to create time change event source: %m");
385 (void) sd_event_source_set_description(m
->time_change_event_source
, "manager-time-change");
387 log_debug("Set up TFD_TIMER_CANCEL_ON_SET timerfd.");
392 static int enable_special_signals(Manager
*m
) {
393 _cleanup_close_
int fd
= -1;
397 if (m
->test_run_flags
)
400 /* Enable that we get SIGINT on control-alt-del. In containers
401 * this will fail with EPERM (older) or EINVAL (newer), so
403 if (reboot(RB_DISABLE_CAD
) < 0 && !IN_SET(errno
, EPERM
, EINVAL
))
404 log_warning_errno(errno
, "Failed to enable ctrl-alt-del handling: %m");
406 fd
= open_terminal("/dev/tty0", O_RDWR
|O_NOCTTY
|O_CLOEXEC
);
408 /* Support systems without virtual console */
410 log_warning_errno(errno
, "Failed to open /dev/tty0: %m");
412 /* Enable that we get SIGWINCH on kbrequest */
413 if (ioctl(fd
, KDSIGACCEPT
, SIGWINCH
) < 0)
414 log_warning_errno(errno
, "Failed to enable kbrequest handling: %m");
420 static int manager_setup_signals(Manager
*m
) {
421 struct sigaction sa
= {
422 .sa_handler
= SIG_DFL
,
423 .sa_flags
= SA_NOCLDSTOP
|SA_RESTART
,
430 assert_se(sigaction(SIGCHLD
, &sa
, NULL
) == 0);
432 /* We make liberal use of realtime signals here. On
433 * Linux/glibc we have 30 of them (with the exception of Linux
434 * on hppa, see below), between SIGRTMIN+0 ... SIGRTMIN+30
437 assert_se(sigemptyset(&mask
) == 0);
438 sigset_add_many(&mask
,
439 SIGCHLD
, /* Child died */
440 SIGTERM
, /* Reexecute daemon */
441 SIGHUP
, /* Reload configuration */
442 SIGUSR1
, /* systemd/upstart: reconnect to D-Bus */
443 SIGUSR2
, /* systemd: dump status */
444 SIGINT
, /* Kernel sends us this on control-alt-del */
445 SIGWINCH
, /* Kernel sends us this on kbrequest (alt-arrowup) */
446 SIGPWR
, /* Some kernel drivers and upsd send us this on power failure */
448 SIGRTMIN
+0, /* systemd: start default.target */
449 SIGRTMIN
+1, /* systemd: isolate rescue.target */
450 SIGRTMIN
+2, /* systemd: isolate emergency.target */
451 SIGRTMIN
+3, /* systemd: start halt.target */
452 SIGRTMIN
+4, /* systemd: start poweroff.target */
453 SIGRTMIN
+5, /* systemd: start reboot.target */
454 SIGRTMIN
+6, /* systemd: start kexec.target */
456 /* ... space for more special targets ... */
458 SIGRTMIN
+13, /* systemd: Immediate halt */
459 SIGRTMIN
+14, /* systemd: Immediate poweroff */
460 SIGRTMIN
+15, /* systemd: Immediate reboot */
461 SIGRTMIN
+16, /* systemd: Immediate kexec */
463 /* ... space for more immediate system state changes ... */
465 SIGRTMIN
+20, /* systemd: enable status messages */
466 SIGRTMIN
+21, /* systemd: disable status messages */
467 SIGRTMIN
+22, /* systemd: set log level to LOG_DEBUG */
468 SIGRTMIN
+23, /* systemd: set log level to LOG_INFO */
469 SIGRTMIN
+24, /* systemd: Immediate exit (--user only) */
471 /* .. one free signal here ... */
473 #if !defined(__hppa64__) && !defined(__hppa__)
474 /* Apparently Linux on hppa has fewer RT
475 * signals (SIGRTMAX is SIGRTMIN+25 there),
476 * hence let's not try to make use of them
477 * here. Since these commands are accessible
478 * by different means and only really a safety
479 * net, the missing functionality on hppa
480 * shouldn't matter. */
482 SIGRTMIN
+26, /* systemd: set log target to journal-or-kmsg */
483 SIGRTMIN
+27, /* systemd: set log target to console */
484 SIGRTMIN
+28, /* systemd: set log target to kmsg */
485 SIGRTMIN
+29, /* systemd: set log target to syslog-or-kmsg (obsolete) */
487 /* ... one free signal here SIGRTMIN+30 ... */
490 assert_se(sigprocmask(SIG_SETMASK
, &mask
, NULL
) == 0);
492 m
->signal_fd
= signalfd(-1, &mask
, SFD_NONBLOCK
|SFD_CLOEXEC
);
493 if (m
->signal_fd
< 0)
496 r
= sd_event_add_io(m
->event
, &m
->signal_event_source
, m
->signal_fd
, EPOLLIN
, manager_dispatch_signal_fd
, m
);
500 (void) sd_event_source_set_description(m
->signal_event_source
, "manager-signal");
502 /* Process signals a bit earlier than the rest of things, but later than notify_fd processing, so that the
503 * notify processing can still figure out to which process/service a message belongs, before we reap the
504 * process. Also, process this before handling cgroup notifications, so that we always collect child exit
505 * status information before detecting that there's no process in a cgroup. */
506 r
= sd_event_source_set_priority(m
->signal_event_source
, SD_EVENT_PRIORITY_NORMAL
-6);
510 if (MANAGER_IS_SYSTEM(m
))
511 return enable_special_signals(m
);
516 static void manager_clean_environment(Manager
*m
) {
519 /* Let's remove some environment variables that we
520 * need ourselves to communicate with our clients */
535 static int manager_default_environment(Manager
*m
) {
538 if (MANAGER_IS_SYSTEM(m
)) {
539 /* The system manager always starts with a clean
540 * environment for its children. It does not import
541 * the kernel's or the parents' exported variables.
543 * The initial passed environment is untouched to keep
544 * /proc/self/environ valid; it is used for tagging
545 * the init process inside containers. */
546 m
->environment
= strv_new("PATH=" DEFAULT_PATH
,
549 /* Import locale variables LC_*= from configuration */
550 locale_setup(&m
->environment
);
552 /* The user manager passes its own environment
553 * along to its children. */
554 m
->environment
= strv_copy(environ
);
559 manager_clean_environment(m
);
560 strv_sort(m
->environment
);
565 static int manager_setup_prefix(Manager
*m
) {
571 static const struct table_entry paths_system
[_EXEC_DIRECTORY_TYPE_MAX
] = {
572 [EXEC_DIRECTORY_RUNTIME
] = { SD_PATH_SYSTEM_RUNTIME
, NULL
},
573 [EXEC_DIRECTORY_STATE
] = { SD_PATH_SYSTEM_STATE_PRIVATE
, NULL
},
574 [EXEC_DIRECTORY_CACHE
] = { SD_PATH_SYSTEM_STATE_CACHE
, NULL
},
575 [EXEC_DIRECTORY_LOGS
] = { SD_PATH_SYSTEM_STATE_LOGS
, NULL
},
576 [EXEC_DIRECTORY_CONFIGURATION
] = { SD_PATH_SYSTEM_CONFIGURATION
, NULL
},
579 static const struct table_entry paths_user
[_EXEC_DIRECTORY_TYPE_MAX
] = {
580 [EXEC_DIRECTORY_RUNTIME
] = { SD_PATH_USER_RUNTIME
, NULL
},
581 [EXEC_DIRECTORY_STATE
] = { SD_PATH_USER_CONFIGURATION
, NULL
},
582 [EXEC_DIRECTORY_CACHE
] = { SD_PATH_USER_STATE_CACHE
, NULL
},
583 [EXEC_DIRECTORY_LOGS
] = { SD_PATH_USER_CONFIGURATION
, "log" },
584 [EXEC_DIRECTORY_CONFIGURATION
] = { SD_PATH_USER_CONFIGURATION
, NULL
},
587 const struct table_entry
*p
;
593 if (MANAGER_IS_SYSTEM(m
))
598 for (i
= 0; i
< _EXEC_DIRECTORY_TYPE_MAX
; i
++) {
599 r
= sd_path_home(p
[i
].type
, p
[i
].suffix
, &m
->prefix
[i
]);
607 static int manager_setup_run_queue(Manager
*m
) {
611 assert(!m
->run_queue_event_source
);
613 r
= sd_event_add_defer(m
->event
, &m
->run_queue_event_source
, manager_dispatch_run_queue
, m
);
617 r
= sd_event_source_set_priority(m
->run_queue_event_source
, SD_EVENT_PRIORITY_IDLE
);
621 r
= sd_event_source_set_enabled(m
->run_queue_event_source
, SD_EVENT_OFF
);
625 (void) sd_event_source_set_description(m
->run_queue_event_source
, "manager-run-queue");
630 int manager_new(UnitFileScope scope
, unsigned test_run_flags
, Manager
**_m
) {
635 assert(IN_SET(scope
, UNIT_FILE_SYSTEM
, UNIT_FILE_USER
));
637 m
= new0(Manager
, 1);
641 m
->unit_file_scope
= scope
;
642 m
->exit_code
= _MANAGER_EXIT_CODE_INVALID
;
643 m
->default_timer_accuracy_usec
= USEC_PER_MINUTE
;
644 m
->default_tasks_accounting
= true;
645 m
->default_tasks_max
= UINT64_MAX
;
646 m
->default_timeout_start_usec
= DEFAULT_TIMEOUT_USEC
;
647 m
->default_timeout_stop_usec
= DEFAULT_TIMEOUT_USEC
;
648 m
->default_restart_usec
= DEFAULT_RESTART_USEC
;
651 if (MANAGER_IS_SYSTEM(m
) && detect_container() <= 0)
652 boot_timestamps(m
->timestamps
+ MANAGER_TIMESTAMP_USERSPACE
,
653 m
->timestamps
+ MANAGER_TIMESTAMP_FIRMWARE
,
654 m
->timestamps
+ MANAGER_TIMESTAMP_LOADER
);
657 /* Prepare log fields we can use for structured logging */
658 if (MANAGER_IS_SYSTEM(m
)) {
659 m
->unit_log_field
= "UNIT=";
660 m
->unit_log_format_string
= "UNIT=%s";
662 m
->invocation_log_field
= "INVOCATION_ID=";
663 m
->invocation_log_format_string
= "INVOCATION_ID=%s";
665 m
->unit_log_field
= "USER_UNIT=";
666 m
->unit_log_format_string
= "USER_UNIT=%s";
668 m
->invocation_log_field
= "USER_INVOCATION_ID=";
669 m
->invocation_log_format_string
= "USER_INVOCATION_ID=%s";
672 m
->idle_pipe
[0] = m
->idle_pipe
[1] = m
->idle_pipe
[2] = m
->idle_pipe
[3] = -1;
674 m
->pin_cgroupfs_fd
= m
->notify_fd
= m
->cgroups_agent_fd
= m
->signal_fd
= m
->time_change_fd
=
675 m
->dev_autofs_fd
= m
->private_listen_fd
= m
->cgroup_inotify_fd
=
676 m
->ask_password_inotify_fd
= -1;
678 m
->user_lookup_fds
[0] = m
->user_lookup_fds
[1] = -1;
680 m
->current_job_id
= 1; /* start as id #1, so that we can leave #0 around as "null-like" value */
682 m
->have_ask_password
= -EINVAL
; /* we don't know */
685 m
->test_run_flags
= test_run_flags
;
687 /* Reboot immediately if the user hits C-A-D more often than 7x per 2s */
688 RATELIMIT_INIT(m
->ctrl_alt_del_ratelimit
, 2 * USEC_PER_SEC
, 7);
690 r
= manager_default_environment(m
);
694 r
= hashmap_ensure_allocated(&m
->units
, &string_hash_ops
);
698 r
= hashmap_ensure_allocated(&m
->jobs
, NULL
);
702 r
= hashmap_ensure_allocated(&m
->cgroup_unit
, &string_hash_ops
);
706 r
= hashmap_ensure_allocated(&m
->watch_bus
, &string_hash_ops
);
710 r
= sd_event_default(&m
->event
);
714 r
= manager_setup_run_queue(m
);
718 r
= manager_setup_signals(m
);
722 r
= manager_setup_cgroup(m
);
726 r
= manager_setup_time_change(m
);
730 m
->udev
= udev_new();
736 r
= manager_setup_prefix(m
);
740 if (MANAGER_IS_SYSTEM(m
) && test_run_flags
== 0) {
741 r
= mkdir_label("/run/systemd/units", 0755);
742 if (r
< 0 && r
!= -EEXIST
)
748 dir_is_empty("/usr") > 0;
750 /* Note that we do not set up the notify fd here. We do that after deserialization,
751 * since they might have gotten serialized across the reexec. */
761 static int manager_setup_notify(Manager
*m
) {
764 if (m
->test_run_flags
)
767 if (m
->notify_fd
< 0) {
768 _cleanup_close_
int fd
= -1;
769 union sockaddr_union sa
= {
770 .sa
.sa_family
= AF_UNIX
,
772 static const int one
= 1;
774 /* First free all secondary fields */
775 m
->notify_socket
= mfree(m
->notify_socket
);
776 m
->notify_event_source
= sd_event_source_unref(m
->notify_event_source
);
778 fd
= socket(AF_UNIX
, SOCK_DGRAM
|SOCK_CLOEXEC
|SOCK_NONBLOCK
, 0);
780 return log_error_errno(errno
, "Failed to allocate notification socket: %m");
782 fd_inc_rcvbuf(fd
, NOTIFY_RCVBUF_SIZE
);
784 m
->notify_socket
= strappend(m
->prefix
[EXEC_DIRECTORY_RUNTIME
], "/systemd/notify");
785 if (!m
->notify_socket
)
788 (void) mkdir_parents_label(m
->notify_socket
, 0755);
789 (void) unlink(m
->notify_socket
);
791 strncpy(sa
.un
.sun_path
, m
->notify_socket
, sizeof(sa
.un
.sun_path
)-1);
792 r
= bind(fd
, &sa
.sa
, SOCKADDR_UN_LEN(sa
.un
));
794 return log_error_errno(errno
, "bind(%s) failed: %m", sa
.un
.sun_path
);
796 r
= setsockopt(fd
, SOL_SOCKET
, SO_PASSCRED
, &one
, sizeof(one
));
798 return log_error_errno(errno
, "SO_PASSCRED failed: %m");
803 log_debug("Using notification socket %s", m
->notify_socket
);
806 if (!m
->notify_event_source
) {
807 r
= sd_event_add_io(m
->event
, &m
->notify_event_source
, m
->notify_fd
, EPOLLIN
, manager_dispatch_notify_fd
, m
);
809 return log_error_errno(r
, "Failed to allocate notify event source: %m");
811 /* Process notification messages a bit earlier than SIGCHLD, so that we can still identify to which
812 * service an exit message belongs. */
813 r
= sd_event_source_set_priority(m
->notify_event_source
, SD_EVENT_PRIORITY_NORMAL
-7);
815 return log_error_errno(r
, "Failed to set priority of notify event source: %m");
817 (void) sd_event_source_set_description(m
->notify_event_source
, "manager-notify");
823 static int manager_setup_cgroups_agent(Manager
*m
) {
825 static const union sockaddr_union sa
= {
826 .un
.sun_family
= AF_UNIX
,
827 .un
.sun_path
= "/run/systemd/cgroups-agent",
831 /* This creates a listening socket we receive cgroups agent messages on. We do not use D-Bus for delivering
832 * these messages from the cgroups agent binary to PID 1, as the cgroups agent binary is very short-living, and
833 * each instance of it needs a new D-Bus connection. Since D-Bus connections are SOCK_STREAM/AF_UNIX, on
834 * overloaded systems the backlog of the D-Bus socket becomes relevant, as not more than the configured number
835 * of D-Bus connections may be queued until the kernel will start dropping further incoming connections,
836 * possibly resulting in lost cgroups agent messages. To avoid this, we'll use a private SOCK_DGRAM/AF_UNIX
837 * socket, where no backlog is relevant as communication may take place without an actual connect() cycle, and
838 * we thus won't lose messages.
840 * Note that PID 1 will forward the agent message to system bus, so that the user systemd instance may listen
841 * to it. The system instance hence listens on this special socket, but the user instances listen on the system
842 * bus for these messages. */
844 if (m
->test_run_flags
)
847 if (!MANAGER_IS_SYSTEM(m
))
850 r
= cg_unified_controller(SYSTEMD_CGROUP_CONTROLLER
);
852 return log_error_errno(r
, "Failed to determine whether unified cgroups hierarchy is used: %m");
853 if (r
> 0) /* We don't need this anymore on the unified hierarchy */
856 if (m
->cgroups_agent_fd
< 0) {
857 _cleanup_close_
int fd
= -1;
859 /* First free all secondary fields */
860 m
->cgroups_agent_event_source
= sd_event_source_unref(m
->cgroups_agent_event_source
);
862 fd
= socket(AF_UNIX
, SOCK_DGRAM
|SOCK_CLOEXEC
|SOCK_NONBLOCK
, 0);
864 return log_error_errno(errno
, "Failed to allocate cgroups agent socket: %m");
866 fd_inc_rcvbuf(fd
, CGROUPS_AGENT_RCVBUF_SIZE
);
868 (void) unlink(sa
.un
.sun_path
);
870 /* Only allow root to connect to this socket */
872 r
= bind(fd
, &sa
.sa
, SOCKADDR_UN_LEN(sa
.un
));
874 return log_error_errno(errno
, "bind(%s) failed: %m", sa
.un
.sun_path
);
876 m
->cgroups_agent_fd
= fd
;
880 if (!m
->cgroups_agent_event_source
) {
881 r
= sd_event_add_io(m
->event
, &m
->cgroups_agent_event_source
, m
->cgroups_agent_fd
, EPOLLIN
, manager_dispatch_cgroups_agent_fd
, m
);
883 return log_error_errno(r
, "Failed to allocate cgroups agent event source: %m");
885 /* Process cgroups notifications early, but after having processed service notification messages or
886 * SIGCHLD signals, so that a cgroup running empty is always just the last safety net of notification,
887 * and we collected the metadata the notification and SIGCHLD stuff offers first. Also see handling of
888 * cgroup inotify for the unified cgroup stuff. */
889 r
= sd_event_source_set_priority(m
->cgroups_agent_event_source
, SD_EVENT_PRIORITY_NORMAL
-4);
891 return log_error_errno(r
, "Failed to set priority of cgroups agent event source: %m");
893 (void) sd_event_source_set_description(m
->cgroups_agent_event_source
, "manager-cgroups-agent");
899 static int manager_setup_user_lookup_fd(Manager
*m
) {
904 /* Set up the socket pair used for passing UID/GID resolution results from forked off processes to PID
905 * 1. Background: we can't do name lookups (NSS) from PID 1, since it might involve IPC and thus activation,
906 * and we might hence deadlock on ourselves. Hence we do all user/group lookups asynchronously from the forked
907 * off processes right before executing the binaries to start. In order to be able to clean up any IPC objects
908 * created by a unit (see RemoveIPC=) we need to know in PID 1 the used UID/GID of the executed processes,
909 * hence we establish this communication channel so that forked off processes can pass their UID/GID
910 * information back to PID 1. The forked off processes send their resolved UID/GID to PID 1 in a simple
911 * datagram, along with their unit name, so that we can share one communication socket pair among all units for
914 * You might wonder why we need a communication channel for this that is independent of the usual notification
915 * socket scheme (i.e. $NOTIFY_SOCKET). The primary difference is about trust: data sent via the $NOTIFY_SOCKET
916 * channel is only accepted if it originates from the right unit and if reception was enabled for it. The user
917 * lookup socket OTOH is only accessible by PID 1 and its children until they exec(), and always available.
919 * Note that this function is called under two circumstances: when we first initialize (in which case we
920 * allocate both the socket pair and the event source to listen on it), and when we deserialize after a reload
921 * (in which case the socket pair already exists but we still need to allocate the event source for it). */
923 if (m
->user_lookup_fds
[0] < 0) {
925 /* Free all secondary fields */
926 safe_close_pair(m
->user_lookup_fds
);
927 m
->user_lookup_event_source
= sd_event_source_unref(m
->user_lookup_event_source
);
929 if (socketpair(AF_UNIX
, SOCK_DGRAM
|SOCK_CLOEXEC
, 0, m
->user_lookup_fds
) < 0)
930 return log_error_errno(errno
, "Failed to allocate user lookup socket: %m");
932 (void) fd_inc_rcvbuf(m
->user_lookup_fds
[0], NOTIFY_RCVBUF_SIZE
);
935 if (!m
->user_lookup_event_source
) {
936 r
= sd_event_add_io(m
->event
, &m
->user_lookup_event_source
, m
->user_lookup_fds
[0], EPOLLIN
, manager_dispatch_user_lookup_fd
, m
);
938 return log_error_errno(errno
, "Failed to allocate user lookup event source: %m");
940 /* Process even earlier than the notify event source, so that we always know first about valid UID/GID
942 r
= sd_event_source_set_priority(m
->user_lookup_event_source
, SD_EVENT_PRIORITY_NORMAL
-8);
944 return log_error_errno(errno
, "Failed to set priority ot user lookup event source: %m");
946 (void) sd_event_source_set_description(m
->user_lookup_event_source
, "user-lookup");
952 static int manager_connect_bus(Manager
*m
, bool reexecuting
) {
953 bool try_bus_connect
;
958 if (m
->test_run_flags
)
961 u
= manager_get_unit(m
, SPECIAL_DBUS_SERVICE
);
964 (u
&& SERVICE(u
)->deserialized_state
== SERVICE_RUNNING
) &&
966 (MANAGER_IS_USER(m
) && getenv("DBUS_SESSION_BUS_ADDRESS")));
968 /* Try to connect to the buses, if possible. */
969 return bus_init(m
, try_bus_connect
);
972 static unsigned manager_dispatch_cleanup_queue(Manager
*m
) {
978 while ((u
= m
->cleanup_queue
)) {
979 assert(u
->in_cleanup_queue
);
989 GC_OFFSET_IN_PATH
, /* This one is on the path we were traveling */
990 GC_OFFSET_UNSURE
, /* No clue */
991 GC_OFFSET_GOOD
, /* We still need this unit */
992 GC_OFFSET_BAD
, /* We don't need this unit anymore */
996 static void unit_gc_mark_good(Unit
*u
, unsigned gc_marker
) {
1001 u
->gc_marker
= gc_marker
+ GC_OFFSET_GOOD
;
1003 /* Recursively mark referenced units as GOOD as well */
1004 HASHMAP_FOREACH_KEY(v
, other
, u
->dependencies
[UNIT_REFERENCES
], i
)
1005 if (other
->gc_marker
== gc_marker
+ GC_OFFSET_UNSURE
)
1006 unit_gc_mark_good(other
, gc_marker
);
1009 static void unit_gc_sweep(Unit
*u
, unsigned gc_marker
) {
1017 if (IN_SET(u
->gc_marker
- gc_marker
,
1018 GC_OFFSET_GOOD
, GC_OFFSET_BAD
, GC_OFFSET_UNSURE
, GC_OFFSET_IN_PATH
))
1021 if (u
->in_cleanup_queue
)
1024 if (unit_check_gc(u
))
1027 u
->gc_marker
= gc_marker
+ GC_OFFSET_IN_PATH
;
1031 HASHMAP_FOREACH_KEY(v
, other
, u
->dependencies
[UNIT_REFERENCED_BY
], i
) {
1032 unit_gc_sweep(other
, gc_marker
);
1034 if (other
->gc_marker
== gc_marker
+ GC_OFFSET_GOOD
)
1037 if (other
->gc_marker
!= gc_marker
+ GC_OFFSET_BAD
)
1044 /* We were unable to find anything out about this entry, so
1045 * let's investigate it later */
1046 u
->gc_marker
= gc_marker
+ GC_OFFSET_UNSURE
;
1047 unit_add_to_gc_queue(u
);
1051 /* We definitely know that this one is not useful anymore, so
1052 * let's mark it for deletion */
1053 u
->gc_marker
= gc_marker
+ GC_OFFSET_BAD
;
1054 unit_add_to_cleanup_queue(u
);
1058 unit_gc_mark_good(u
, gc_marker
);
1061 static unsigned manager_dispatch_gc_unit_queue(Manager
*m
) {
1062 unsigned n
= 0, gc_marker
;
1067 /* log_debug("Running GC..."); */
1069 m
->gc_marker
+= _GC_OFFSET_MAX
;
1070 if (m
->gc_marker
+ _GC_OFFSET_MAX
<= _GC_OFFSET_MAX
)
1073 gc_marker
= m
->gc_marker
;
1075 while ((u
= m
->gc_unit_queue
)) {
1076 assert(u
->in_gc_queue
);
1078 unit_gc_sweep(u
, gc_marker
);
1080 LIST_REMOVE(gc_queue
, m
->gc_unit_queue
, u
);
1081 u
->in_gc_queue
= false;
1085 if (IN_SET(u
->gc_marker
- gc_marker
,
1086 GC_OFFSET_BAD
, GC_OFFSET_UNSURE
)) {
1088 log_unit_debug(u
, "Collecting.");
1089 u
->gc_marker
= gc_marker
+ GC_OFFSET_BAD
;
1090 unit_add_to_cleanup_queue(u
);
1097 static unsigned manager_dispatch_gc_job_queue(Manager
*m
) {
1103 while ((j
= m
->gc_job_queue
)) {
1104 assert(j
->in_gc_queue
);
1106 LIST_REMOVE(gc_queue
, m
->gc_job_queue
, j
);
1107 j
->in_gc_queue
= false;
1111 if (job_check_gc(j
))
1114 log_unit_debug(j
->unit
, "Collecting job.");
1115 (void) job_finish_and_invalidate(j
, JOB_COLLECTED
, false, false);
1121 static void manager_clear_jobs_and_units(Manager
*m
) {
1126 while ((u
= hashmap_first(m
->units
)))
1129 manager_dispatch_cleanup_queue(m
);
1131 assert(!m
->load_queue
);
1132 assert(!m
->run_queue
);
1133 assert(!m
->dbus_unit_queue
);
1134 assert(!m
->dbus_job_queue
);
1135 assert(!m
->cleanup_queue
);
1136 assert(!m
->gc_unit_queue
);
1137 assert(!m
->gc_job_queue
);
1139 assert(hashmap_isempty(m
->jobs
));
1140 assert(hashmap_isempty(m
->units
));
1142 m
->n_on_console
= 0;
1143 m
->n_running_jobs
= 0;
1146 Manager
* manager_free(Manager
*m
) {
1149 ExecDirectoryType dt
;
1154 manager_clear_jobs_and_units(m
);
1156 for (c
= 0; c
< _UNIT_TYPE_MAX
; c
++)
1157 if (unit_vtable
[c
]->shutdown
)
1158 unit_vtable
[c
]->shutdown(m
);
1160 /* If we reexecute ourselves, we keep the root cgroup around */
1161 manager_shutdown_cgroup(m
, m
->exit_code
!= MANAGER_REEXECUTE
);
1163 lookup_paths_flush_generator(&m
->lookup_paths
);
1167 dynamic_user_vacuum(m
, false);
1168 hashmap_free(m
->dynamic_users
);
1170 hashmap_free(m
->units
);
1171 hashmap_free(m
->units_by_invocation_id
);
1172 hashmap_free(m
->jobs
);
1173 hashmap_free(m
->watch_pids1
);
1174 hashmap_free(m
->watch_pids2
);
1175 hashmap_free(m
->watch_bus
);
1177 set_free(m
->startup_units
);
1178 set_free(m
->failed_units
);
1180 sd_event_source_unref(m
->signal_event_source
);
1181 sd_event_source_unref(m
->notify_event_source
);
1182 sd_event_source_unref(m
->cgroups_agent_event_source
);
1183 sd_event_source_unref(m
->time_change_event_source
);
1184 sd_event_source_unref(m
->jobs_in_progress_event_source
);
1185 sd_event_source_unref(m
->run_queue_event_source
);
1186 sd_event_source_unref(m
->user_lookup_event_source
);
1188 safe_close(m
->signal_fd
);
1189 safe_close(m
->notify_fd
);
1190 safe_close(m
->cgroups_agent_fd
);
1191 safe_close(m
->time_change_fd
);
1192 safe_close_pair(m
->user_lookup_fds
);
1194 manager_close_ask_password(m
);
1196 manager_close_idle_pipe(m
);
1198 udev_unref(m
->udev
);
1199 sd_event_unref(m
->event
);
1201 free(m
->notify_socket
);
1203 lookup_paths_free(&m
->lookup_paths
);
1204 strv_free(m
->environment
);
1206 hashmap_free(m
->cgroup_unit
);
1207 set_free_free(m
->unit_path_cache
);
1209 free(m
->switch_root
);
1210 free(m
->switch_root_init
);
1212 for (i
= 0; i
< _RLIMIT_MAX
; i
++)
1213 m
->rlimit
[i
] = mfree(m
->rlimit
[i
]);
1215 assert(hashmap_isempty(m
->units_requiring_mounts_for
));
1216 hashmap_free(m
->units_requiring_mounts_for
);
1218 hashmap_free(m
->uid_refs
);
1219 hashmap_free(m
->gid_refs
);
1221 for (dt
= 0; dt
< _EXEC_DIRECTORY_TYPE_MAX
; dt
++)
1222 m
->prefix
[dt
] = mfree(m
->prefix
[dt
]);
1227 void manager_enumerate(Manager
*m
) {
1232 /* Let's ask every type to load all units from disk/kernel
1233 * that it might know */
1234 for (c
= 0; c
< _UNIT_TYPE_MAX
; c
++) {
1235 if (!unit_type_supported(c
)) {
1236 log_debug("Unit type .%s is not supported on this system.", unit_type_to_string(c
));
1240 if (!unit_vtable
[c
]->enumerate
)
1243 unit_vtable
[c
]->enumerate(m
);
1246 manager_dispatch_load_queue(m
);
1249 static void manager_coldplug(Manager
*m
) {
1257 /* Then, let's set up their initial state. */
1258 HASHMAP_FOREACH_KEY(u
, k
, m
->units
, i
) {
1260 /* ignore aliases */
1264 r
= unit_coldplug(u
);
1266 log_warning_errno(r
, "We couldn't coldplug %s, proceeding anyway: %m", u
->id
);
1270 static void manager_build_unit_path_cache(Manager
*m
) {
1276 set_free_free(m
->unit_path_cache
);
1278 m
->unit_path_cache
= set_new(&string_hash_ops
);
1279 if (!m
->unit_path_cache
) {
1284 /* This simply builds a list of files we know exist, so that
1285 * we don't always have to go to disk */
1287 STRV_FOREACH(i
, m
->lookup_paths
.search_path
) {
1288 _cleanup_closedir_
DIR *d
= NULL
;
1293 if (errno
!= ENOENT
)
1294 log_warning_errno(errno
, "Failed to open directory %s, ignoring: %m", *i
);
1298 FOREACH_DIRENT(de
, d
, r
= -errno
; goto fail
) {
1301 p
= strjoin(streq(*i
, "/") ? "" : *i
, "/", de
->d_name
);
1307 r
= set_consume(m
->unit_path_cache
, p
);
1316 log_warning_errno(r
, "Failed to build unit path cache, proceeding without: %m");
1317 m
->unit_path_cache
= set_free_free(m
->unit_path_cache
);
1320 static void manager_distribute_fds(Manager
*m
, FDSet
*fds
) {
1326 HASHMAP_FOREACH(u
, m
->units
, i
) {
1328 if (fdset_size(fds
) <= 0)
1331 if (!UNIT_VTABLE(u
)->distribute_fds
)
1334 UNIT_VTABLE(u
)->distribute_fds(u
, fds
);
1338 int manager_startup(Manager
*m
, FILE *serialization
, FDSet
*fds
) {
1343 /* If we are running in test mode, we still want to run the generators,
1344 * but we should not touch the real generator directories. */
1345 r
= lookup_paths_init(&m
->lookup_paths
, m
->unit_file_scope
,
1346 m
->test_run_flags
? LOOKUP_PATHS_TEMPORARY_GENERATED
: 0,
1351 r
= manager_run_environment_generators(m
);
1355 dual_timestamp_get(m
->timestamps
+ MANAGER_TIMESTAMP_GENERATORS_START
);
1356 r
= manager_run_generators(m
);
1357 dual_timestamp_get(m
->timestamps
+ MANAGER_TIMESTAMP_GENERATORS_FINISH
);
1361 /* If this is the first boot, and we are in the host system, then preset everything */
1362 if (m
->first_boot
> 0 &&
1363 MANAGER_IS_SYSTEM(m
) &&
1364 !m
->test_run_flags
) {
1366 r
= unit_file_preset_all(UNIT_FILE_SYSTEM
, 0, NULL
, UNIT_FILE_PRESET_ENABLE_ONLY
, NULL
, 0);
1368 log_full_errno(r
== -EEXIST
? LOG_NOTICE
: LOG_WARNING
, r
,
1369 "Failed to populate /etc with preset unit settings, ignoring: %m");
1371 log_info("Populated /etc with preset unit settings.");
1374 lookup_paths_reduce(&m
->lookup_paths
);
1375 manager_build_unit_path_cache(m
);
1377 /* If we will deserialize make sure that during enumeration
1378 * this is already known, so we increase the counter here
1383 /* First, enumerate what we can from all config files */
1384 dual_timestamp_get(m
->timestamps
+ MANAGER_TIMESTAMP_UNITS_LOAD_START
);
1385 manager_enumerate(m
);
1386 dual_timestamp_get(m
->timestamps
+ MANAGER_TIMESTAMP_UNITS_LOAD_FINISH
);
1388 /* Second, deserialize if there is something to deserialize */
1389 if (serialization
) {
1390 r
= manager_deserialize(m
, serialization
, fds
);
1392 return log_error_errno(r
, "Deserialization failed: %m");
1395 /* Any fds left? Find some unit which wants them. This is
1396 * useful to allow container managers to pass some file
1397 * descriptors to us pre-initialized. This enables
1398 * socket-based activation of entire containers. */
1399 manager_distribute_fds(m
, fds
);
1401 /* We might have deserialized the notify fd, but if we didn't
1402 * then let's create the bus now */
1403 r
= manager_setup_notify(m
);
1405 /* No sense to continue without notifications, our children would fail anyway. */
1408 r
= manager_setup_cgroups_agent(m
);
1410 /* Likewise, no sense to continue without empty cgroup notifications. */
1413 r
= manager_setup_user_lookup_fd(m
);
1415 /* This shouldn't fail, except if things are really broken. */
1418 /* Let's connect to the bus now. */
1419 (void) manager_connect_bus(m
, !!serialization
);
1421 (void) bus_track_coldplug(m
, &m
->subscribed
, false, m
->deserialized_subscribed
);
1422 m
->deserialized_subscribed
= strv_free(m
->deserialized_subscribed
);
1424 /* Third, fire things up! */
1425 manager_coldplug(m
);
1427 /* Release any dynamic users no longer referenced */
1428 dynamic_user_vacuum(m
, true);
1430 /* Release any references to UIDs/GIDs no longer referenced, and destroy any IPC owned by them */
1431 manager_vacuum_uid_refs(m
);
1432 manager_vacuum_gid_refs(m
);
1434 if (serialization
) {
1435 assert(m
->n_reloading
> 0);
1438 /* Let's wait for the UnitNew/JobNew messages being
1439 * sent, before we notify that the reload is
1441 m
->send_reloading_done
= true;
1447 int manager_add_job(Manager
*m
, JobType type
, Unit
*unit
, JobMode mode
, sd_bus_error
*e
, Job
**_ret
) {
1452 assert(type
< _JOB_TYPE_MAX
);
1454 assert(mode
< _JOB_MODE_MAX
);
1456 if (mode
== JOB_ISOLATE
&& type
!= JOB_START
)
1457 return sd_bus_error_setf(e
, SD_BUS_ERROR_INVALID_ARGS
, "Isolate is only valid for start.");
1459 if (mode
== JOB_ISOLATE
&& !unit
->allow_isolate
)
1460 return sd_bus_error_setf(e
, BUS_ERROR_NO_ISOLATION
, "Operation refused, unit may not be isolated.");
1462 log_unit_debug(unit
, "Trying to enqueue job %s/%s/%s", unit
->id
, job_type_to_string(type
), job_mode_to_string(mode
));
1464 type
= job_type_collapse(type
, unit
);
1466 tr
= transaction_new(mode
== JOB_REPLACE_IRREVERSIBLY
);
1470 r
= transaction_add_job_and_dependencies(tr
, type
, unit
, NULL
, true, false,
1471 IN_SET(mode
, JOB_IGNORE_DEPENDENCIES
, JOB_IGNORE_REQUIREMENTS
),
1472 mode
== JOB_IGNORE_DEPENDENCIES
, e
);
1476 if (mode
== JOB_ISOLATE
) {
1477 r
= transaction_add_isolate_jobs(tr
, m
);
1482 r
= transaction_activate(tr
, m
, mode
, e
);
1486 log_unit_debug(unit
,
1487 "Enqueued job %s/%s as %u", unit
->id
,
1488 job_type_to_string(type
), (unsigned) tr
->anchor_job
->id
);
1491 *_ret
= tr
->anchor_job
;
1493 transaction_free(tr
);
1497 transaction_abort(tr
);
1498 transaction_free(tr
);
1502 int manager_add_job_by_name(Manager
*m
, JobType type
, const char *name
, JobMode mode
, sd_bus_error
*e
, Job
**ret
) {
1503 Unit
*unit
= NULL
; /* just to appease gcc, initialization is not really necessary */
1507 assert(type
< _JOB_TYPE_MAX
);
1509 assert(mode
< _JOB_MODE_MAX
);
1511 r
= manager_load_unit(m
, name
, NULL
, NULL
, &unit
);
1516 return manager_add_job(m
, type
, unit
, mode
, e
, ret
);
1519 int manager_add_job_by_name_and_warn(Manager
*m
, JobType type
, const char *name
, JobMode mode
, Job
**ret
) {
1520 _cleanup_(sd_bus_error_free
) sd_bus_error error
= SD_BUS_ERROR_NULL
;
1524 assert(type
< _JOB_TYPE_MAX
);
1526 assert(mode
< _JOB_MODE_MAX
);
1528 r
= manager_add_job_by_name(m
, type
, name
, mode
, &error
, ret
);
1530 return log_warning_errno(r
, "Failed to enqueue %s job for %s: %s", job_mode_to_string(mode
), name
, bus_error_message(&error
, r
));
1535 int manager_propagate_reload(Manager
*m
, Unit
*unit
, JobMode mode
, sd_bus_error
*e
) {
1541 assert(mode
< _JOB_MODE_MAX
);
1542 assert(mode
!= JOB_ISOLATE
); /* Isolate is only valid for start */
1544 tr
= transaction_new(mode
== JOB_REPLACE_IRREVERSIBLY
);
1548 /* We need an anchor job */
1549 r
= transaction_add_job_and_dependencies(tr
, JOB_NOP
, unit
, NULL
, false, false, true, true, e
);
1553 /* Failure in adding individual dependencies is ignored, so this always succeeds. */
1554 transaction_add_propagate_reload_jobs(tr
, unit
, tr
->anchor_job
, mode
== JOB_IGNORE_DEPENDENCIES
, e
);
1556 r
= transaction_activate(tr
, m
, mode
, e
);
1560 transaction_free(tr
);
1564 transaction_abort(tr
);
1565 transaction_free(tr
);
1569 Job
*manager_get_job(Manager
*m
, uint32_t id
) {
1572 return hashmap_get(m
->jobs
, UINT32_TO_PTR(id
));
1575 Unit
*manager_get_unit(Manager
*m
, const char *name
) {
1579 return hashmap_get(m
->units
, name
);
1582 unsigned manager_dispatch_load_queue(Manager
*m
) {
1588 /* Make sure we are not run recursively */
1589 if (m
->dispatching_load_queue
)
1592 m
->dispatching_load_queue
= true;
1594 /* Dispatches the load queue. Takes a unit from the queue and
1595 * tries to load its data until the queue is empty */
1597 while ((u
= m
->load_queue
)) {
1598 assert(u
->in_load_queue
);
1604 m
->dispatching_load_queue
= false;
1608 int manager_load_unit_prepare(
1620 assert(name
|| path
);
1623 /* This will prepare the unit for loading, but not actually
1624 * load anything from disk. */
1626 if (path
&& !is_path(path
))
1627 return sd_bus_error_setf(e
, SD_BUS_ERROR_INVALID_ARGS
, "Path %s is not absolute.", path
);
1630 name
= basename(path
);
1632 t
= unit_name_to_type(name
);
1634 if (t
== _UNIT_TYPE_INVALID
|| !unit_name_is_valid(name
, UNIT_NAME_PLAIN
|UNIT_NAME_INSTANCE
)) {
1635 if (unit_name_is_valid(name
, UNIT_NAME_TEMPLATE
))
1636 return sd_bus_error_setf(e
, SD_BUS_ERROR_INVALID_ARGS
, "Unit name %s is missing the instance name.", name
);
1638 return sd_bus_error_setf(e
, SD_BUS_ERROR_INVALID_ARGS
, "Unit name %s is not valid.", name
);
1641 ret
= manager_get_unit(m
, name
);
1647 ret
= unit_new(m
, unit_vtable
[t
]->object_size
);
1652 ret
->fragment_path
= strdup(path
);
1653 if (!ret
->fragment_path
) {
1659 r
= unit_add_name(ret
, name
);
1665 unit_add_to_load_queue(ret
);
1666 unit_add_to_dbus_queue(ret
);
1667 unit_add_to_gc_queue(ret
);
1674 int manager_load_unit(
1686 /* This will load the service information files, but not actually
1687 * start any services or anything. */
1689 r
= manager_load_unit_prepare(m
, name
, path
, e
, _ret
);
1693 manager_dispatch_load_queue(m
);
1695 *_ret
= unit_follow_merge(*_ret
);
1700 void manager_dump_jobs(Manager
*s
, FILE *f
, const char *prefix
) {
1707 HASHMAP_FOREACH(j
, s
->jobs
, i
)
1708 job_dump(j
, f
, prefix
);
1711 void manager_dump_units(Manager
*s
, FILE *f
, const char *prefix
) {
1719 HASHMAP_FOREACH_KEY(u
, t
, s
->units
, i
)
1721 unit_dump(u
, f
, prefix
);
1724 void manager_dump(Manager
*m
, FILE *f
, const char *prefix
) {
1730 for (q
= 0; q
< _MANAGER_TIMESTAMP_MAX
; q
++) {
1731 char buf
[FORMAT_TIMESTAMP_MAX
];
1733 if (dual_timestamp_is_set(m
->timestamps
+ q
))
1734 fprintf(f
, "%sTimestamp %s: %s\n",
1736 manager_timestamp_to_string(q
),
1737 format_timestamp(buf
, sizeof(buf
), m
->timestamps
[q
].realtime
));
1740 manager_dump_units(m
, f
, prefix
);
1741 manager_dump_jobs(m
, f
, prefix
);
1744 int manager_get_dump_string(Manager
*m
, char **ret
) {
1745 _cleanup_free_
char *dump
= NULL
;
1746 _cleanup_fclose_
FILE *f
= NULL
;
1753 f
= open_memstream(&dump
, &size
);
1757 __fsetlocking(f
, FSETLOCKING_BYCALLER
);
1759 manager_dump(m
, f
, NULL
);
1761 r
= fflush_and_check(f
);
1773 void manager_clear_jobs(Manager
*m
) {
1778 while ((j
= hashmap_first(m
->jobs
)))
1779 /* No need to recurse. We're cancelling all jobs. */
1780 job_finish_and_invalidate(j
, JOB_CANCELED
, false, false);
1783 static int manager_dispatch_run_queue(sd_event_source
*source
, void *userdata
) {
1784 Manager
*m
= userdata
;
1790 while ((j
= m
->run_queue
)) {
1791 assert(j
->installed
);
1792 assert(j
->in_run_queue
);
1794 job_run_and_invalidate(j
);
1797 if (m
->n_running_jobs
> 0)
1798 manager_watch_jobs_in_progress(m
);
1800 if (m
->n_on_console
> 0)
1801 manager_watch_idle_pipe(m
);
1806 static unsigned manager_dispatch_dbus_queue(Manager
*m
) {
1813 if (m
->dispatching_dbus_queue
)
1816 m
->dispatching_dbus_queue
= true;
1818 while ((u
= m
->dbus_unit_queue
)) {
1819 assert(u
->in_dbus_queue
);
1821 bus_unit_send_change_signal(u
);
1825 while ((j
= m
->dbus_job_queue
)) {
1826 assert(j
->in_dbus_queue
);
1828 bus_job_send_change_signal(j
);
1832 m
->dispatching_dbus_queue
= false;
1834 if (m
->send_reloading_done
) {
1835 m
->send_reloading_done
= false;
1837 bus_manager_send_reloading(m
, false);
1840 if (m
->queued_message
)
1841 bus_send_queued_message(m
);
1846 static int manager_dispatch_cgroups_agent_fd(sd_event_source
*source
, int fd
, uint32_t revents
, void *userdata
) {
1847 Manager
*m
= userdata
;
1848 char buf
[PATH_MAX
+1];
1851 n
= recv(fd
, buf
, sizeof(buf
), 0);
1853 return log_error_errno(errno
, "Failed to read cgroups agent message: %m");
1855 log_error("Got zero-length cgroups agent message, ignoring.");
1858 if ((size_t) n
>= sizeof(buf
)) {
1859 log_error("Got overly long cgroups agent message, ignoring.");
1863 if (memchr(buf
, 0, n
)) {
1864 log_error("Got cgroups agent message with embedded NUL byte, ignoring.");
1869 manager_notify_cgroup_empty(m
, buf
);
1870 (void) bus_forward_agent_released(m
, buf
);
1875 static void manager_invoke_notify_message(Manager
*m
, Unit
*u
, pid_t pid
, const char *buf
, FDSet
*fds
) {
1876 _cleanup_strv_free_
char **tags
= NULL
;
1882 tags
= strv_split(buf
, "\n\r");
1888 if (UNIT_VTABLE(u
)->notify_message
)
1889 UNIT_VTABLE(u
)->notify_message(u
, pid
, tags
, fds
);
1890 else if (_unlikely_(log_get_max_level() >= LOG_DEBUG
)) {
1891 _cleanup_free_
char *x
= NULL
, *y
= NULL
;
1895 y
= ellipsize(x
, 20, 90);
1896 log_unit_debug(u
, "Got notification message \"%s\", ignoring.", strnull(y
));
1900 static int manager_dispatch_notify_fd(sd_event_source
*source
, int fd
, uint32_t revents
, void *userdata
) {
1902 _cleanup_fdset_free_ FDSet
*fds
= NULL
;
1903 Manager
*m
= userdata
;
1904 char buf
[NOTIFY_BUFFER_MAX
+1];
1905 struct iovec iovec
= {
1907 .iov_len
= sizeof(buf
)-1,
1910 struct cmsghdr cmsghdr
;
1911 uint8_t buf
[CMSG_SPACE(sizeof(struct ucred
)) +
1912 CMSG_SPACE(sizeof(int) * NOTIFY_FD_MAX
)];
1914 struct msghdr msghdr
= {
1917 .msg_control
= &control
,
1918 .msg_controllen
= sizeof(control
),
1921 struct cmsghdr
*cmsg
;
1922 struct ucred
*ucred
= NULL
;
1924 int r
, *fd_array
= NULL
;
1929 assert(m
->notify_fd
== fd
);
1931 if (revents
!= EPOLLIN
) {
1932 log_warning("Got unexpected poll event for notify fd.");
1936 n
= recvmsg(m
->notify_fd
, &msghdr
, MSG_DONTWAIT
|MSG_CMSG_CLOEXEC
|MSG_TRUNC
);
1938 if (IN_SET(errno
, EAGAIN
, EINTR
))
1939 return 0; /* Spurious wakeup, try again */
1941 /* If this is any other, real error, then let's stop processing this socket. This of course means we
1942 * won't take notification messages anymore, but that's still better than busy looping around this:
1943 * being woken up over and over again but being unable to actually read the message off the socket. */
1944 return log_error_errno(errno
, "Failed to receive notification message: %m");
1947 CMSG_FOREACH(cmsg
, &msghdr
) {
1948 if (cmsg
->cmsg_level
== SOL_SOCKET
&& cmsg
->cmsg_type
== SCM_RIGHTS
) {
1950 fd_array
= (int*) CMSG_DATA(cmsg
);
1951 n_fds
= (cmsg
->cmsg_len
- CMSG_LEN(0)) / sizeof(int);
1953 } else if (cmsg
->cmsg_level
== SOL_SOCKET
&&
1954 cmsg
->cmsg_type
== SCM_CREDENTIALS
&&
1955 cmsg
->cmsg_len
== CMSG_LEN(sizeof(struct ucred
))) {
1957 ucred
= (struct ucred
*) CMSG_DATA(cmsg
);
1964 r
= fdset_new_array(&fds
, fd_array
, n_fds
);
1966 close_many(fd_array
, n_fds
);
1972 if (!ucred
|| ucred
->pid
<= 0) {
1973 log_warning("Received notify message without valid credentials. Ignoring.");
1977 if ((size_t) n
>= sizeof(buf
) || (msghdr
.msg_flags
& MSG_TRUNC
)) {
1978 log_warning("Received notify message exceeded maximum size. Ignoring.");
1982 /* As extra safety check, let's make sure the string we get doesn't contain embedded NUL bytes. We permit one
1983 * trailing NUL byte in the message, but don't expect it. */
1984 if (n
> 1 && memchr(buf
, 0, n
-1)) {
1985 log_warning("Received notify message with embedded NUL bytes. Ignoring.");
1989 /* Make sure it's NUL-terminated. */
1992 /* Notify every unit that might be interested, but try
1993 * to avoid notifying the same one multiple times. */
1994 u1
= manager_get_unit_by_pid_cgroup(m
, ucred
->pid
);
1996 manager_invoke_notify_message(m
, u1
, ucred
->pid
, buf
, fds
);
1998 u2
= hashmap_get(m
->watch_pids1
, PID_TO_PTR(ucred
->pid
));
2000 manager_invoke_notify_message(m
, u2
, ucred
->pid
, buf
, fds
);
2002 u3
= hashmap_get(m
->watch_pids2
, PID_TO_PTR(ucred
->pid
));
2003 if (u3
&& u3
!= u2
&& u3
!= u1
)
2004 manager_invoke_notify_message(m
, u3
, ucred
->pid
, buf
, fds
);
2006 if (!u1
&& !u2
&& !u3
)
2007 log_warning("Cannot find unit for notify message of PID "PID_FMT
".", ucred
->pid
);
2009 if (fdset_size(fds
) > 0)
2010 log_warning("Got extra auxiliary fds with notification message, closing them.");
2015 static void invoke_sigchld_event(Manager
*m
, Unit
*u
, const siginfo_t
*si
) {
2022 sd_event_get_iteration(m
->event
, &iteration
);
2024 log_unit_debug(u
, "Child "PID_FMT
" belongs to %s", si
->si_pid
, u
->id
);
2026 unit_unwatch_pid(u
, si
->si_pid
);
2028 if (UNIT_VTABLE(u
)->sigchld_event
) {
2029 if (set_size(u
->pids
) <= 1 ||
2030 iteration
!= u
->sigchldgen
||
2031 unit_main_pid(u
) == si
->si_pid
||
2032 unit_control_pid(u
) == si
->si_pid
) {
2033 UNIT_VTABLE(u
)->sigchld_event(u
, si
->si_pid
, si
->si_code
, si
->si_status
);
2034 u
->sigchldgen
= iteration
;
2036 log_debug("%s already issued a sigchld this iteration %" PRIu64
", skipping. Pids still being watched %d", u
->id
, iteration
, set_size(u
->pids
));
2040 static int manager_dispatch_sigchld(Manager
*m
) {
2046 /* First we call waitd() for a PID and do not reap the
2047 * zombie. That way we can still access /proc/$PID for
2048 * it while it is a zombie. */
2049 if (waitid(P_ALL
, 0, &si
, WEXITED
|WNOHANG
|WNOWAIT
) < 0) {
2051 if (errno
== ECHILD
)
2063 if (IN_SET(si
.si_code
, CLD_EXITED
, CLD_KILLED
, CLD_DUMPED
)) {
2064 _cleanup_free_
char *name
= NULL
;
2067 get_process_comm(si
.si_pid
, &name
);
2069 log_debug("Child "PID_FMT
" (%s) died (code=%s, status=%i/%s)",
2070 si
.si_pid
, strna(name
),
2071 sigchld_code_to_string(si
.si_code
),
2073 strna(si
.si_code
== CLD_EXITED
2074 ? exit_status_to_string(si
.si_status
, EXIT_STATUS_FULL
)
2075 : signal_to_string(si
.si_status
)));
2077 /* And now figure out the unit this belongs
2078 * to, it might be multiple... */
2079 u1
= manager_get_unit_by_pid_cgroup(m
, si
.si_pid
);
2081 invoke_sigchld_event(m
, u1
, &si
);
2082 u2
= hashmap_get(m
->watch_pids1
, PID_TO_PTR(si
.si_pid
));
2084 invoke_sigchld_event(m
, u2
, &si
);
2085 u3
= hashmap_get(m
->watch_pids2
, PID_TO_PTR(si
.si_pid
));
2086 if (u3
&& u3
!= u2
&& u3
!= u1
)
2087 invoke_sigchld_event(m
, u3
, &si
);
2090 /* And now, we actually reap the zombie. */
2091 if (waitid(P_PID
, si
.si_pid
, &si
, WEXITED
) < 0) {
2102 static void manager_start_target(Manager
*m
, const char *name
, JobMode mode
) {
2103 _cleanup_(sd_bus_error_free
) sd_bus_error error
= SD_BUS_ERROR_NULL
;
2106 log_debug("Activating special unit %s", name
);
2108 r
= manager_add_job_by_name(m
, JOB_START
, name
, mode
, &error
, NULL
);
2110 log_error("Failed to enqueue %s job: %s", name
, bus_error_message(&error
, r
));
2113 static void manager_handle_ctrl_alt_del(Manager
*m
) {
2114 /* If the user presses C-A-D more than
2115 * 7 times within 2s, we reboot/shutdown immediately,
2116 * unless it was disabled in system.conf */
2118 if (ratelimit_test(&m
->ctrl_alt_del_ratelimit
) || m
->cad_burst_action
== EMERGENCY_ACTION_NONE
)
2119 manager_start_target(m
, SPECIAL_CTRL_ALT_DEL_TARGET
, JOB_REPLACE_IRREVERSIBLY
);
2121 emergency_action(m
, m
->cad_burst_action
, NULL
,
2122 "Ctrl-Alt-Del was pressed more than 7 times within 2s");
2125 static int manager_dispatch_signal_fd(sd_event_source
*source
, int fd
, uint32_t revents
, void *userdata
) {
2126 Manager
*m
= userdata
;
2128 struct signalfd_siginfo sfsi
;
2129 bool sigchld
= false;
2133 assert(m
->signal_fd
== fd
);
2135 if (revents
!= EPOLLIN
) {
2136 log_warning("Got unexpected events from signal file descriptor.");
2141 n
= read(m
->signal_fd
, &sfsi
, sizeof(sfsi
));
2142 if (n
!= sizeof(sfsi
)) {
2144 log_warning("Truncated read from signal fd (%zu bytes)!", n
);
2148 if (IN_SET(errno
, EINTR
, EAGAIN
))
2151 /* We return an error here, which will kill this handler,
2152 * to avoid a busy loop on read error. */
2153 return log_error_errno(errno
, "Reading from signal fd failed: %m");
2156 log_received_signal(sfsi
.ssi_signo
== SIGCHLD
||
2157 (sfsi
.ssi_signo
== SIGTERM
&& MANAGER_IS_USER(m
))
2158 ? LOG_DEBUG
: LOG_INFO
,
2161 switch (sfsi
.ssi_signo
) {
2168 if (MANAGER_IS_SYSTEM(m
)) {
2169 /* This is for compatibility with the
2170 * original sysvinit */
2171 r
= verify_run_space_and_log("Refusing to reexecute");
2173 m
->exit_code
= MANAGER_REEXECUTE
;
2179 if (MANAGER_IS_SYSTEM(m
))
2180 manager_handle_ctrl_alt_del(m
);
2182 manager_start_target(m
, SPECIAL_EXIT_TARGET
,
2183 JOB_REPLACE_IRREVERSIBLY
);
2187 if (MANAGER_IS_SYSTEM(m
))
2188 manager_start_target(m
, SPECIAL_KBREQUEST_TARGET
, JOB_REPLACE
);
2190 /* This is a nop on non-init */
2194 if (MANAGER_IS_SYSTEM(m
))
2195 manager_start_target(m
, SPECIAL_SIGPWR_TARGET
, JOB_REPLACE
);
2197 /* This is a nop on non-init */
2203 u
= manager_get_unit(m
, SPECIAL_DBUS_SERVICE
);
2205 if (!u
|| UNIT_IS_ACTIVE_OR_RELOADING(unit_active_state(u
))) {
2206 log_info("Trying to reconnect to bus...");
2210 if (!u
|| !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u
))) {
2211 log_info("Loading D-Bus service...");
2212 manager_start_target(m
, SPECIAL_DBUS_SERVICE
, JOB_REPLACE
);
2219 _cleanup_free_
char *dump
= NULL
;
2221 r
= manager_get_dump_string(m
, &dump
);
2223 log_warning_errno(errno
, "Failed to acquire manager dump: %m");
2227 log_dump(LOG_INFO
, dump
);
2232 r
= verify_run_space_and_log("Refusing to reload");
2234 m
->exit_code
= MANAGER_RELOAD
;
2239 /* Starting SIGRTMIN+0 */
2240 static const struct {
2243 } target_table
[] = {
2244 [0] = { SPECIAL_DEFAULT_TARGET
, JOB_ISOLATE
},
2245 [1] = { SPECIAL_RESCUE_TARGET
, JOB_ISOLATE
},
2246 [2] = { SPECIAL_EMERGENCY_TARGET
, JOB_ISOLATE
},
2247 [3] = { SPECIAL_HALT_TARGET
, JOB_REPLACE_IRREVERSIBLY
},
2248 [4] = { SPECIAL_POWEROFF_TARGET
, JOB_REPLACE_IRREVERSIBLY
},
2249 [5] = { SPECIAL_REBOOT_TARGET
, JOB_REPLACE_IRREVERSIBLY
},
2250 [6] = { SPECIAL_KEXEC_TARGET
, JOB_REPLACE_IRREVERSIBLY
}
2253 /* Starting SIGRTMIN+13, so that target halt and system halt are 10 apart */
2254 static const ManagerExitCode code_table
[] = {
2256 [1] = MANAGER_POWEROFF
,
2257 [2] = MANAGER_REBOOT
,
2261 if ((int) sfsi
.ssi_signo
>= SIGRTMIN
+0 &&
2262 (int) sfsi
.ssi_signo
< SIGRTMIN
+(int) ELEMENTSOF(target_table
)) {
2263 int idx
= (int) sfsi
.ssi_signo
- SIGRTMIN
;
2264 manager_start_target(m
, target_table
[idx
].target
,
2265 target_table
[idx
].mode
);
2269 if ((int) sfsi
.ssi_signo
>= SIGRTMIN
+13 &&
2270 (int) sfsi
.ssi_signo
< SIGRTMIN
+13+(int) ELEMENTSOF(code_table
)) {
2271 m
->exit_code
= code_table
[sfsi
.ssi_signo
- SIGRTMIN
- 13];
2275 switch (sfsi
.ssi_signo
- SIGRTMIN
) {
2278 manager_set_show_status(m
, SHOW_STATUS_YES
);
2282 manager_set_show_status(m
, SHOW_STATUS_NO
);
2286 log_set_max_level(LOG_DEBUG
);
2287 log_info("Setting log level to debug.");
2291 log_set_max_level(LOG_INFO
);
2292 log_info("Setting log level to info.");
2296 if (MANAGER_IS_USER(m
)) {
2297 m
->exit_code
= MANAGER_EXIT
;
2301 /* This is a nop on init */
2305 case 29: /* compatibility: used to be mapped to LOG_TARGET_SYSLOG_OR_KMSG */
2306 log_set_target(LOG_TARGET_JOURNAL_OR_KMSG
);
2307 log_notice("Setting log target to journal-or-kmsg.");
2311 log_set_target(LOG_TARGET_CONSOLE
);
2312 log_notice("Setting log target to console.");
2316 log_set_target(LOG_TARGET_KMSG
);
2317 log_notice("Setting log target to kmsg.");
2321 log_warning("Got unhandled signal <%s>.", signal_to_string(sfsi
.ssi_signo
));
2328 manager_dispatch_sigchld(m
);
2333 static int manager_dispatch_time_change_fd(sd_event_source
*source
, int fd
, uint32_t revents
, void *userdata
) {
2334 Manager
*m
= userdata
;
2339 assert(m
->time_change_fd
== fd
);
2341 log_struct(LOG_DEBUG
,
2342 "MESSAGE_ID=" SD_MESSAGE_TIME_CHANGE_STR
,
2343 LOG_MESSAGE("Time has been changed"),
2346 /* Restart the watch */
2347 m
->time_change_event_source
= sd_event_source_unref(m
->time_change_event_source
);
2348 m
->time_change_fd
= safe_close(m
->time_change_fd
);
2350 manager_setup_time_change(m
);
2352 HASHMAP_FOREACH(u
, m
->units
, i
)
2353 if (UNIT_VTABLE(u
)->time_change
)
2354 UNIT_VTABLE(u
)->time_change(u
);
2359 static int manager_dispatch_idle_pipe_fd(sd_event_source
*source
, int fd
, uint32_t revents
, void *userdata
) {
2360 Manager
*m
= userdata
;
2363 assert(m
->idle_pipe
[2] == fd
);
2365 m
->no_console_output
= m
->n_on_console
> 0;
2367 manager_close_idle_pipe(m
);
2372 static int manager_dispatch_jobs_in_progress(sd_event_source
*source
, usec_t usec
, void *userdata
) {
2373 Manager
*m
= userdata
;
2380 manager_print_jobs_in_progress(m
);
2382 next
= now(CLOCK_MONOTONIC
) + JOBS_IN_PROGRESS_PERIOD_USEC
;
2383 r
= sd_event_source_set_time(source
, next
);
2387 return sd_event_source_set_enabled(source
, SD_EVENT_ONESHOT
);
2390 int manager_loop(Manager
*m
) {
2393 RATELIMIT_DEFINE(rl
, 1*USEC_PER_SEC
, 50000);
2396 m
->exit_code
= MANAGER_OK
;
2398 /* Release the path cache */
2399 m
->unit_path_cache
= set_free_free(m
->unit_path_cache
);
2401 manager_check_finished(m
);
2403 /* There might still be some zombies hanging around from
2404 * before we were exec()'ed. Let's reap them. */
2405 r
= manager_dispatch_sigchld(m
);
2409 while (m
->exit_code
== MANAGER_OK
) {
2412 if (m
->runtime_watchdog
> 0 && m
->runtime_watchdog
!= USEC_INFINITY
&& MANAGER_IS_SYSTEM(m
))
2415 if (!ratelimit_test(&rl
)) {
2416 /* Yay, something is going seriously wrong, pause a little */
2417 log_warning("Looping too fast. Throttling execution a little.");
2421 if (manager_dispatch_load_queue(m
) > 0)
2424 if (manager_dispatch_gc_job_queue(m
) > 0)
2427 if (manager_dispatch_gc_unit_queue(m
) > 0)
2430 if (manager_dispatch_cleanup_queue(m
) > 0)
2433 if (manager_dispatch_cgroup_realize_queue(m
) > 0)
2436 if (manager_dispatch_dbus_queue(m
) > 0)
2439 /* Sleep for half the watchdog time */
2440 if (m
->runtime_watchdog
> 0 && m
->runtime_watchdog
!= USEC_INFINITY
&& MANAGER_IS_SYSTEM(m
)) {
2441 wait_usec
= m
->runtime_watchdog
/ 2;
2445 wait_usec
= USEC_INFINITY
;
2447 r
= sd_event_run(m
->event
, wait_usec
);
2449 return log_error_errno(r
, "Failed to run event loop: %m");
2452 return m
->exit_code
;
2455 int manager_load_unit_from_dbus_path(Manager
*m
, const char *s
, sd_bus_error
*e
, Unit
**_u
) {
2456 _cleanup_free_
char *n
= NULL
;
2457 sd_id128_t invocation_id
;
2465 r
= unit_name_from_dbus_path(s
, &n
);
2469 /* Permit addressing units by invocation ID: if the passed bus path is suffixed by a 128bit ID then we use it
2470 * as invocation ID. */
2471 r
= sd_id128_from_string(n
, &invocation_id
);
2473 u
= hashmap_get(m
->units_by_invocation_id
, &invocation_id
);
2479 return sd_bus_error_setf(e
, BUS_ERROR_NO_UNIT_FOR_INVOCATION_ID
, "No unit with the specified invocation ID " SD_ID128_FORMAT_STR
" known.", SD_ID128_FORMAT_VAL(invocation_id
));
2482 /* If this didn't work, we check if this is a unit name */
2483 if (!unit_name_is_valid(n
, UNIT_NAME_PLAIN
|UNIT_NAME_INSTANCE
))
2484 return sd_bus_error_setf(e
, SD_BUS_ERROR_INVALID_ARGS
, "Unit name %s is neither a valid invocation ID nor unit name.", n
);
2486 r
= manager_load_unit(m
, n
, NULL
, e
, &u
);
2494 int manager_get_job_from_dbus_path(Manager
*m
, const char *s
, Job
**_j
) {
2504 p
= startswith(s
, "/org/freedesktop/systemd1/job/");
2508 r
= safe_atou(p
, &id
);
2512 j
= manager_get_job(m
, id
);
2521 void manager_send_unit_audit(Manager
*m
, Unit
*u
, int type
, bool success
) {
2524 _cleanup_free_
char *p
= NULL
;
2528 if (!MANAGER_IS_SYSTEM(m
))
2531 audit_fd
= get_audit_fd();
2535 /* Don't generate audit events if the service was already
2536 * started and we're just deserializing */
2537 if (MANAGER_IS_RELOADING(m
))
2540 if (u
->type
!= UNIT_SERVICE
)
2543 r
= unit_name_to_prefix_and_instance(u
->id
, &p
);
2545 log_error_errno(r
, "Failed to extract prefix and instance of unit name: %m");
2549 msg
= strjoina("unit=", p
);
2550 if (audit_log_user_comm_message(audit_fd
, type
, msg
, "systemd", NULL
, NULL
, NULL
, success
) < 0) {
2552 /* We aren't allowed to send audit messages?
2553 * Then let's not retry again. */
2556 log_warning_errno(errno
, "Failed to send audit message: %m");
2562 void manager_send_unit_plymouth(Manager
*m
, Unit
*u
) {
2563 static const union sockaddr_union sa
= PLYMOUTH_SOCKET
;
2564 _cleanup_free_
char *message
= NULL
;
2565 _cleanup_close_
int fd
= -1;
2568 /* Don't generate plymouth events if the service was already
2569 * started and we're just deserializing */
2570 if (MANAGER_IS_RELOADING(m
))
2573 if (!MANAGER_IS_SYSTEM(m
))
2576 if (detect_container() > 0)
2579 if (!IN_SET(u
->type
, UNIT_SERVICE
, UNIT_MOUNT
, UNIT_SWAP
))
2582 /* We set SOCK_NONBLOCK here so that we rather drop the
2583 * message then wait for plymouth */
2584 fd
= socket(AF_UNIX
, SOCK_STREAM
|SOCK_CLOEXEC
|SOCK_NONBLOCK
, 0);
2586 log_error_errno(errno
, "socket() failed: %m");
2590 if (connect(fd
, &sa
.sa
, SOCKADDR_UN_LEN(sa
.un
)) < 0) {
2592 if (!IN_SET(errno
, EPIPE
, EAGAIN
, ENOENT
, ECONNREFUSED
, ECONNRESET
, ECONNABORTED
))
2593 log_error_errno(errno
, "connect() failed: %m");
2597 if (asprintf(&message
, "U\002%c%s%n", (int) (strlen(u
->id
) + 1), u
->id
, &n
) < 0) {
2603 if (write(fd
, message
, n
+ 1) != n
+ 1)
2604 if (!IN_SET(errno
, EPIPE
, EAGAIN
, ENOENT
, ECONNREFUSED
, ECONNRESET
, ECONNABORTED
))
2605 log_error_errno(errno
, "Failed to write Plymouth message: %m");
2608 int manager_open_serialization(Manager
*m
, FILE **_f
) {
2614 fd
= open_serialization_fd("systemd-state");
2618 f
= fdopen(fd
, "w+");
2628 int manager_serialize(Manager
*m
, FILE *f
, FDSet
*fds
, bool switching_root
) {
2641 fprintf(f
, "current-job-id=%"PRIu32
"\n", m
->current_job_id
);
2642 fprintf(f
, "n-installed-jobs=%u\n", m
->n_installed_jobs
);
2643 fprintf(f
, "n-failed-jobs=%u\n", m
->n_failed_jobs
);
2644 fprintf(f
, "taint-usr=%s\n", yes_no(m
->taint_usr
));
2645 fprintf(f
, "ready-sent=%s\n", yes_no(m
->ready_sent
));
2647 for (q
= 0; q
< _MANAGER_TIMESTAMP_MAX
; q
++) {
2648 /* The userspace and finish timestamps only apply to the host system, hence only serialize them there */
2649 if (in_initrd() && IN_SET(q
, MANAGER_TIMESTAMP_USERSPACE
, MANAGER_TIMESTAMP_FINISH
))
2652 t
= manager_timestamp_to_string(q
);
2654 char field
[strlen(t
) + strlen("-timestamp") + 1];
2655 strcpy(stpcpy(field
, t
), "-timestamp");
2656 dual_timestamp_serialize(f
, field
, m
->timestamps
+ q
);
2660 if (!switching_root
)
2661 (void) serialize_environment(f
, m
->environment
);
2663 if (m
->notify_fd
>= 0) {
2666 copy
= fdset_put_dup(fds
, m
->notify_fd
);
2670 fprintf(f
, "notify-fd=%i\n", copy
);
2671 fprintf(f
, "notify-socket=%s\n", m
->notify_socket
);
2674 if (m
->cgroups_agent_fd
>= 0) {
2677 copy
= fdset_put_dup(fds
, m
->cgroups_agent_fd
);
2681 fprintf(f
, "cgroups-agent-fd=%i\n", copy
);
2684 if (m
->user_lookup_fds
[0] >= 0) {
2687 copy0
= fdset_put_dup(fds
, m
->user_lookup_fds
[0]);
2691 copy1
= fdset_put_dup(fds
, m
->user_lookup_fds
[1]);
2695 fprintf(f
, "user-lookup=%i %i\n", copy0
, copy1
);
2698 bus_track_serialize(m
->subscribed
, f
, "subscribed");
2700 r
= dynamic_user_serialize(m
, f
, fds
);
2704 manager_serialize_uid_refs(m
, f
);
2705 manager_serialize_gid_refs(m
, f
);
2707 fputc_unlocked('\n', f
);
2709 HASHMAP_FOREACH_KEY(u
, t
, m
->units
, i
) {
2714 fputs_unlocked(u
->id
, f
);
2715 fputc_unlocked('\n', f
);
2717 r
= unit_serialize(u
, f
, fds
, !switching_root
);
2724 assert(m
->n_reloading
> 0);
2730 r
= bus_fdset_add_all(m
, fds
);
2737 int manager_deserialize(Manager
*m
, FILE *f
, FDSet
*fds
) {
2743 log_debug("Deserializing state...");
2748 char line
[LINE_MAX
];
2749 const char *val
, *l
;
2751 if (!fgets(line
, sizeof(line
), f
)) {
2766 if ((val
= startswith(l
, "current-job-id="))) {
2769 if (safe_atou32(val
, &id
) < 0)
2770 log_notice("Failed to parse current job id value %s", val
);
2772 m
->current_job_id
= MAX(m
->current_job_id
, id
);
2774 } else if ((val
= startswith(l
, "n-installed-jobs="))) {
2777 if (safe_atou32(val
, &n
) < 0)
2778 log_notice("Failed to parse installed jobs counter %s", val
);
2780 m
->n_installed_jobs
+= n
;
2782 } else if ((val
= startswith(l
, "n-failed-jobs="))) {
2785 if (safe_atou32(val
, &n
) < 0)
2786 log_notice("Failed to parse failed jobs counter %s", val
);
2788 m
->n_failed_jobs
+= n
;
2790 } else if ((val
= startswith(l
, "taint-usr="))) {
2793 b
= parse_boolean(val
);
2795 log_notice("Failed to parse taint /usr flag %s", val
);
2797 m
->taint_usr
= m
->taint_usr
|| b
;
2799 } else if ((val
= startswith(l
, "ready-sent="))) {
2802 b
= parse_boolean(val
);
2804 log_notice("Failed to parse ready-sent flag %s", val
);
2806 m
->ready_sent
= m
->ready_sent
|| b
;
2808 } else if (startswith(l
, "env=")) {
2809 r
= deserialize_environment(&m
->environment
, l
);
2813 log_notice_errno(r
, "Failed to parse environment entry: \"%s\": %m", l
);
2815 } else if ((val
= startswith(l
, "notify-fd="))) {
2818 if (safe_atoi(val
, &fd
) < 0 || fd
< 0 || !fdset_contains(fds
, fd
))
2819 log_notice("Failed to parse notify fd: \"%s\"", val
);
2821 m
->notify_event_source
= sd_event_source_unref(m
->notify_event_source
);
2822 safe_close(m
->notify_fd
);
2823 m
->notify_fd
= fdset_remove(fds
, fd
);
2826 } else if ((val
= startswith(l
, "notify-socket="))) {
2835 free(m
->notify_socket
);
2836 m
->notify_socket
= n
;
2838 } else if ((val
= startswith(l
, "cgroups-agent-fd="))) {
2841 if (safe_atoi(val
, &fd
) < 0 || fd
< 0 || !fdset_contains(fds
, fd
))
2842 log_notice("Failed to parse cgroups agent fd: %s", val
);
2844 m
->cgroups_agent_event_source
= sd_event_source_unref(m
->cgroups_agent_event_source
);
2845 safe_close(m
->cgroups_agent_fd
);
2846 m
->cgroups_agent_fd
= fdset_remove(fds
, fd
);
2849 } else if ((val
= startswith(l
, "user-lookup="))) {
2852 if (sscanf(val
, "%i %i", &fd0
, &fd1
) != 2 || fd0
< 0 || fd1
< 0 || fd0
== fd1
|| !fdset_contains(fds
, fd0
) || !fdset_contains(fds
, fd1
))
2853 log_notice("Failed to parse user lookup fd: %s", val
);
2855 m
->user_lookup_event_source
= sd_event_source_unref(m
->user_lookup_event_source
);
2856 safe_close_pair(m
->user_lookup_fds
);
2857 m
->user_lookup_fds
[0] = fdset_remove(fds
, fd0
);
2858 m
->user_lookup_fds
[1] = fdset_remove(fds
, fd1
);
2861 } else if ((val
= startswith(l
, "dynamic-user=")))
2862 dynamic_user_deserialize_one(m
, val
, fds
);
2863 else if ((val
= startswith(l
, "destroy-ipc-uid=")))
2864 manager_deserialize_uid_refs_one(m
, val
);
2865 else if ((val
= startswith(l
, "destroy-ipc-gid=")))
2866 manager_deserialize_gid_refs_one(m
, val
);
2867 else if ((val
= startswith(l
, "subscribed="))) {
2869 if (strv_extend(&m
->deserialized_subscribed
, val
) < 0)
2874 for (q
= 0; q
< _MANAGER_TIMESTAMP_MAX
; q
++) {
2875 val
= startswith(l
, manager_timestamp_to_string(q
));
2879 val
= startswith(val
, "-timestamp=");
2884 if (q
< _MANAGER_TIMESTAMP_MAX
) /* found it */
2885 dual_timestamp_deserialize(val
, m
->timestamps
+ q
);
2886 else if (!startswith(l
, "kdbus-fd=")) /* ignore kdbus */
2887 log_notice("Unknown serialization item '%s'", l
);
2893 char name
[UNIT_NAME_MAX
+2];
2894 const char* unit_name
;
2897 if (!fgets(name
, sizeof(name
), f
)) {
2907 unit_name
= strstrip(name
);
2909 r
= manager_load_unit(m
, unit_name
, NULL
, NULL
, &u
);
2911 log_notice_errno(r
, "Failed to load unit \"%s\", skipping deserialization: %m", unit_name
);
2914 unit_deserialize_skip(f
);
2918 r
= unit_deserialize(u
, f
, fds
);
2920 log_notice_errno(r
, "Failed to deserialize unit \"%s\": %m", unit_name
);
2930 assert(m
->n_reloading
> 0);
2936 int manager_reload(Manager
*m
) {
2938 _cleanup_fclose_
FILE *f
= NULL
;
2939 _cleanup_fdset_free_ FDSet
*fds
= NULL
;
2943 r
= manager_open_serialization(m
, &f
);
2948 bus_manager_send_reloading(m
, true);
2956 r
= manager_serialize(m
, f
, fds
, false);
2962 if (fseeko(f
, 0, SEEK_SET
) < 0) {
2967 /* From here on there is no way back. */
2968 manager_clear_jobs_and_units(m
);
2969 lookup_paths_flush_generator(&m
->lookup_paths
);
2970 lookup_paths_free(&m
->lookup_paths
);
2971 dynamic_user_vacuum(m
, false);
2972 m
->uid_refs
= hashmap_free(m
->uid_refs
);
2973 m
->gid_refs
= hashmap_free(m
->gid_refs
);
2975 q
= lookup_paths_init(&m
->lookup_paths
, m
->unit_file_scope
, 0, NULL
);
2976 if (q
< 0 && r
>= 0)
2979 q
= manager_run_environment_generators(m
);
2980 if (q
< 0 && r
>= 0)
2983 /* Find new unit paths */
2984 q
= manager_run_generators(m
);
2985 if (q
< 0 && r
>= 0)
2988 lookup_paths_reduce(&m
->lookup_paths
);
2989 manager_build_unit_path_cache(m
);
2991 /* First, enumerate what we can from all config files */
2992 manager_enumerate(m
);
2994 /* Second, deserialize our stored data */
2995 q
= manager_deserialize(m
, f
, fds
);
2997 log_error_errno(q
, "Deserialization failed: %m");
3006 /* Re-register notify_fd as event source */
3007 q
= manager_setup_notify(m
);
3008 if (q
< 0 && r
>= 0)
3011 q
= manager_setup_cgroups_agent(m
);
3012 if (q
< 0 && r
>= 0)
3015 q
= manager_setup_user_lookup_fd(m
);
3016 if (q
< 0 && r
>= 0)
3019 /* Third, fire things up! */
3020 manager_coldplug(m
);
3022 /* Release any dynamic users no longer referenced */
3023 dynamic_user_vacuum(m
, true);
3025 /* Release any references to UIDs/GIDs no longer referenced, and destroy any IPC owned by them */
3026 manager_vacuum_uid_refs(m
);
3027 manager_vacuum_gid_refs(m
);
3029 /* Sync current state of bus names with our set of listening units */
3031 manager_sync_bus_names(m
, m
->api_bus
);
3033 assert(m
->n_reloading
> 0);
3036 m
->send_reloading_done
= true;
3041 void manager_reset_failed(Manager
*m
) {
3047 HASHMAP_FOREACH(u
, m
->units
, i
)
3048 unit_reset_failed(u
);
3051 bool manager_unit_inactive_or_pending(Manager
*m
, const char *name
) {
3057 /* Returns true if the unit is inactive or going down */
3058 u
= manager_get_unit(m
, name
);
3062 return unit_inactive_or_pending(u
);
3065 static void manager_notify_finished(Manager
*m
) {
3066 char userspace
[FORMAT_TIMESPAN_MAX
], initrd
[FORMAT_TIMESPAN_MAX
], kernel
[FORMAT_TIMESPAN_MAX
], sum
[FORMAT_TIMESPAN_MAX
];
3067 usec_t firmware_usec
, loader_usec
, kernel_usec
, initrd_usec
, userspace_usec
, total_usec
;
3069 if (m
->test_run_flags
)
3072 if (MANAGER_IS_SYSTEM(m
) && detect_container() <= 0) {
3074 /* Note that MANAGER_TIMESTAMP_KERNEL's monotonic value is always at 0, and
3075 * MANAGER_TIMESTAMP_FIRMWARE's and MANAGER_TIMESTAMP_LOADER's monotonic value should be considered
3076 * negative values. */
3078 firmware_usec
= m
->timestamps
[MANAGER_TIMESTAMP_FIRMWARE
].monotonic
- m
->timestamps
[MANAGER_TIMESTAMP_LOADER
].monotonic
;
3079 loader_usec
= m
->timestamps
[MANAGER_TIMESTAMP_LOADER
].monotonic
- m
->timestamps
[MANAGER_TIMESTAMP_KERNEL
].monotonic
;
3080 userspace_usec
= m
->timestamps
[MANAGER_TIMESTAMP_FINISH
].monotonic
- m
->timestamps
[MANAGER_TIMESTAMP_USERSPACE
].monotonic
;
3081 total_usec
= m
->timestamps
[MANAGER_TIMESTAMP_FIRMWARE
].monotonic
+ m
->timestamps
[MANAGER_TIMESTAMP_FINISH
].monotonic
;
3083 if (dual_timestamp_is_set(&m
->timestamps
[MANAGER_TIMESTAMP_INITRD
])) {
3085 /* The initrd case on bare-metal*/
3086 kernel_usec
= m
->timestamps
[MANAGER_TIMESTAMP_INITRD
].monotonic
- m
->timestamps
[MANAGER_TIMESTAMP_KERNEL
].monotonic
;
3087 initrd_usec
= m
->timestamps
[MANAGER_TIMESTAMP_USERSPACE
].monotonic
- m
->timestamps
[MANAGER_TIMESTAMP_INITRD
].monotonic
;
3089 log_struct(LOG_INFO
,
3090 "MESSAGE_ID=" SD_MESSAGE_STARTUP_FINISHED_STR
,
3091 "KERNEL_USEC="USEC_FMT
, kernel_usec
,
3092 "INITRD_USEC="USEC_FMT
, initrd_usec
,
3093 "USERSPACE_USEC="USEC_FMT
, userspace_usec
,
3094 LOG_MESSAGE("Startup finished in %s (kernel) + %s (initrd) + %s (userspace) = %s.",
3095 format_timespan(kernel
, sizeof(kernel
), kernel_usec
, USEC_PER_MSEC
),
3096 format_timespan(initrd
, sizeof(initrd
), initrd_usec
, USEC_PER_MSEC
),
3097 format_timespan(userspace
, sizeof(userspace
), userspace_usec
, USEC_PER_MSEC
),
3098 format_timespan(sum
, sizeof(sum
), total_usec
, USEC_PER_MSEC
)),
3101 /* The initrd-less case on bare-metal*/
3103 kernel_usec
= m
->timestamps
[MANAGER_TIMESTAMP_USERSPACE
].monotonic
- m
->timestamps
[MANAGER_TIMESTAMP_KERNEL
].monotonic
;
3106 log_struct(LOG_INFO
,
3107 "MESSAGE_ID=" SD_MESSAGE_STARTUP_FINISHED_STR
,
3108 "KERNEL_USEC="USEC_FMT
, kernel_usec
,
3109 "USERSPACE_USEC="USEC_FMT
, userspace_usec
,
3110 LOG_MESSAGE("Startup finished in %s (kernel) + %s (userspace) = %s.",
3111 format_timespan(kernel
, sizeof(kernel
), kernel_usec
, USEC_PER_MSEC
),
3112 format_timespan(userspace
, sizeof(userspace
), userspace_usec
, USEC_PER_MSEC
),
3113 format_timespan(sum
, sizeof(sum
), total_usec
, USEC_PER_MSEC
)),
3117 /* The container case */
3118 firmware_usec
= loader_usec
= initrd_usec
= kernel_usec
= 0;
3119 total_usec
= userspace_usec
= m
->timestamps
[MANAGER_TIMESTAMP_FINISH
].monotonic
- m
->timestamps
[MANAGER_TIMESTAMP_USERSPACE
].monotonic
;
3121 log_struct(LOG_INFO
,
3122 "MESSAGE_ID=" SD_MESSAGE_USER_STARTUP_FINISHED_STR
,
3123 "USERSPACE_USEC="USEC_FMT
, userspace_usec
,
3124 LOG_MESSAGE("Startup finished in %s.",
3125 format_timespan(sum
, sizeof(sum
), total_usec
, USEC_PER_MSEC
)),
3129 bus_manager_send_finished(m
, firmware_usec
, loader_usec
, kernel_usec
, initrd_usec
, userspace_usec
, total_usec
);
3132 m
->ready_sent
? "STATUS=Startup finished in %s."
3134 "STATUS=Startup finished in %s.",
3135 format_timespan(sum
, sizeof(sum
), total_usec
, USEC_PER_MSEC
));
3136 m
->ready_sent
= true;
3139 void manager_check_finished(Manager
*m
) {
3142 if (MANAGER_IS_RELOADING(m
))
3145 /* Verify that we are actually running currently. Initially
3146 * the exit code is set to invalid, and during operation it is
3147 * then set to MANAGER_OK */
3148 if (m
->exit_code
!= MANAGER_OK
)
3151 /* For user managers, send out READY=1 as soon as we reach basic.target */
3152 if (MANAGER_IS_USER(m
) && !m
->ready_sent
) {
3155 u
= manager_get_unit(m
, SPECIAL_BASIC_TARGET
);
3159 "STATUS=Reached " SPECIAL_BASIC_TARGET
".");
3160 m
->ready_sent
= true;
3164 if (hashmap_size(m
->jobs
) > 0) {
3165 if (m
->jobs_in_progress_event_source
)
3166 /* Ignore any failure, this is only for feedback */
3167 (void) sd_event_source_set_time(m
->jobs_in_progress_event_source
, now(CLOCK_MONOTONIC
) + JOBS_IN_PROGRESS_WAIT_USEC
);
3172 manager_flip_auto_status(m
, false);
3174 /* Notify Type=idle units that we are done now */
3175 manager_close_idle_pipe(m
);
3177 /* Turn off confirm spawn now */
3178 m
->confirm_spawn
= NULL
;
3180 /* No need to update ask password status when we're going non-interactive */
3181 manager_close_ask_password(m
);
3183 /* This is no longer the first boot */
3184 manager_set_first_boot(m
, false);
3186 if (MANAGER_IS_FINISHED(m
))
3189 dual_timestamp_get(m
->timestamps
+ MANAGER_TIMESTAMP_FINISH
);
3191 manager_notify_finished(m
);
3193 manager_invalidate_startup_units(m
);
3196 static bool generator_path_any(const char* const* paths
) {
3200 /* Optimize by skipping the whole process by not creating output directories
3201 * if no generators are found. */
3202 STRV_FOREACH(path
, (char**) paths
)
3203 if (access(*path
, F_OK
) == 0)
3205 else if (errno
!= ENOENT
)
3206 log_warning_errno(errno
, "Failed to open generator directory %s: %m", *path
);
3211 static const char* system_env_generator_binary_paths
[] = {
3212 "/run/systemd/system-environment-generators",
3213 "/etc/systemd/system-environment-generators",
3214 "/usr/local/lib/systemd/system-environment-generators",
3215 SYSTEM_ENV_GENERATOR_PATH
,
3219 static const char* user_env_generator_binary_paths
[] = {
3220 "/run/systemd/user-environment-generators",
3221 "/etc/systemd/user-environment-generators",
3222 "/usr/local/lib/systemd/user-environment-generators",
3223 USER_ENV_GENERATOR_PATH
,
3227 static int manager_run_environment_generators(Manager
*m
) {
3228 char **tmp
= NULL
; /* this is only used in the forked process, no cleanup here */
3230 void* args
[] = {&tmp
, &tmp
, &m
->environment
};
3232 if (m
->test_run_flags
&& !(m
->test_run_flags
& MANAGER_TEST_RUN_ENV_GENERATORS
))
3235 paths
= MANAGER_IS_SYSTEM(m
) ? system_env_generator_binary_paths
: user_env_generator_binary_paths
;
3237 if (!generator_path_any(paths
))
3240 return execute_directories(paths
, DEFAULT_TIMEOUT_USEC
, gather_environment
, args
, NULL
);
3243 static int manager_run_generators(Manager
*m
) {
3244 _cleanup_strv_free_
char **paths
= NULL
;
3245 const char *argv
[5];
3250 if (m
->test_run_flags
&& !(m
->test_run_flags
& MANAGER_TEST_RUN_GENERATORS
))
3253 paths
= generator_binary_paths(m
->unit_file_scope
);
3257 if (!generator_path_any((const char* const*) paths
))
3260 r
= lookup_paths_mkdir_generator(&m
->lookup_paths
);
3264 argv
[0] = NULL
; /* Leave this empty, execute_directory() will fill something in */
3265 argv
[1] = m
->lookup_paths
.generator
;
3266 argv
[2] = m
->lookup_paths
.generator_early
;
3267 argv
[3] = m
->lookup_paths
.generator_late
;
3270 RUN_WITH_UMASK(0022)
3271 execute_directories((const char* const*) paths
, DEFAULT_TIMEOUT_USEC
,
3272 NULL
, NULL
, (char**) argv
);
3275 lookup_paths_trim_generator(&m
->lookup_paths
);
3279 int manager_environment_add(Manager
*m
, char **minus
, char **plus
) {
3280 char **a
= NULL
, **b
= NULL
, **l
;
3285 if (!strv_isempty(minus
)) {
3286 a
= strv_env_delete(l
, 1, minus
);
3293 if (!strv_isempty(plus
)) {
3294 b
= strv_env_merge(2, l
, plus
);
3303 if (m
->environment
!= l
)
3304 strv_free(m
->environment
);
3311 manager_clean_environment(m
);
3312 strv_sort(m
->environment
);
3317 int manager_set_default_rlimits(Manager
*m
, struct rlimit
**default_rlimit
) {
3322 for (i
= 0; i
< _RLIMIT_MAX
; i
++) {
3323 m
->rlimit
[i
] = mfree(m
->rlimit
[i
]);
3325 if (!default_rlimit
[i
])
3328 m
->rlimit
[i
] = newdup(struct rlimit
, default_rlimit
[i
], 1);
3336 void manager_recheck_journal(Manager
*m
) {
3341 if (!MANAGER_IS_SYSTEM(m
))
3344 u
= manager_get_unit(m
, SPECIAL_JOURNALD_SOCKET
);
3345 if (u
&& SOCKET(u
)->state
!= SOCKET_RUNNING
) {
3346 log_close_journal();
3350 u
= manager_get_unit(m
, SPECIAL_JOURNALD_SERVICE
);
3351 if (u
&& SERVICE(u
)->state
!= SERVICE_RUNNING
) {
3352 log_close_journal();
3356 /* Hmm, OK, so the socket is fully up and the service is up
3357 * too, then let's make use of the thing. */
3361 void manager_set_show_status(Manager
*m
, ShowStatus mode
) {
3363 assert(IN_SET(mode
, SHOW_STATUS_AUTO
, SHOW_STATUS_NO
, SHOW_STATUS_YES
, SHOW_STATUS_TEMPORARY
));
3365 if (!MANAGER_IS_SYSTEM(m
))
3368 if (m
->show_status
!= mode
)
3369 log_debug("%s showing of status.",
3370 mode
== SHOW_STATUS_NO
? "Disabling" : "Enabling");
3371 m
->show_status
= mode
;
3374 (void) touch("/run/systemd/show-status");
3376 (void) unlink("/run/systemd/show-status");
3379 static bool manager_get_show_status(Manager
*m
, StatusType type
) {
3382 if (!MANAGER_IS_SYSTEM(m
))
3385 if (m
->no_console_output
)
3388 if (!IN_SET(manager_state(m
), MANAGER_INITIALIZING
, MANAGER_STARTING
, MANAGER_STOPPING
))
3391 /* If we cannot find out the status properly, just proceed. */
3392 if (type
!= STATUS_TYPE_EMERGENCY
&& manager_check_ask_password(m
) > 0)
3395 if (m
->show_status
> 0)
3401 const char *manager_get_confirm_spawn(Manager
*m
) {
3402 static int last_errno
= 0;
3403 const char *vc
= m
->confirm_spawn
;
3407 /* Here's the deal: we want to test the validity of the console but don't want
3408 * PID1 to go through the whole console process which might block. But we also
3409 * want to warn the user only once if something is wrong with the console so we
3410 * cannot do the sanity checks after spawning our children. So here we simply do
3411 * really basic tests to hopefully trap common errors.
3413 * If the console suddenly disappear at the time our children will really it
3414 * then they will simply fail to acquire it and a positive answer will be
3415 * assumed. New children will fallback to /dev/console though.
3417 * Note: TTYs are devices that can come and go any time, and frequently aren't
3418 * available yet during early boot (consider a USB rs232 dongle...). If for any
3419 * reason the configured console is not ready, we fallback to the default
3422 if (!vc
|| path_equal(vc
, "/dev/console"))
3429 if (!S_ISCHR(st
.st_mode
)) {
3437 if (last_errno
!= errno
) {
3439 log_warning_errno(errno
, "Failed to open %s: %m, using default console", vc
);
3441 return "/dev/console";
3444 void manager_set_first_boot(Manager
*m
, bool b
) {
3447 if (!MANAGER_IS_SYSTEM(m
))
3450 if (m
->first_boot
!= (int) b
) {
3452 (void) touch("/run/systemd/first-boot");
3454 (void) unlink("/run/systemd/first-boot");
3460 void manager_disable_confirm_spawn(void) {
3461 (void) touch("/run/systemd/confirm_spawn_disabled");
3464 bool manager_is_confirm_spawn_disabled(Manager
*m
) {
3465 if (!m
->confirm_spawn
)
3468 return access("/run/systemd/confirm_spawn_disabled", F_OK
) >= 0;
3471 void manager_status_printf(Manager
*m
, StatusType type
, const char *status
, const char *format
, ...) {
3474 /* If m is NULL, assume we're after shutdown and let the messages through. */
3476 if (m
&& !manager_get_show_status(m
, type
))
3479 /* XXX We should totally drop the check for ephemeral here
3480 * and thus effectively make 'Type=idle' pointless. */
3481 if (type
== STATUS_TYPE_EPHEMERAL
&& m
&& m
->n_on_console
> 0)
3484 va_start(ap
, format
);
3485 status_vprintf(status
, true, type
== STATUS_TYPE_EPHEMERAL
, format
, ap
);
3489 Set
*manager_get_units_requiring_mounts_for(Manager
*m
, const char *path
) {
3490 char p
[strlen(path
)+1];
3496 path_kill_slashes(p
);
3498 return hashmap_get(m
->units_requiring_mounts_for
, streq(p
, "/") ? "" : p
);
3501 void manager_set_exec_params(Manager
*m
, ExecParameters
*p
) {
3505 p
->environment
= m
->environment
;
3506 p
->confirm_spawn
= manager_get_confirm_spawn(m
);
3507 p
->cgroup_supported
= m
->cgroup_supported
;
3508 p
->prefix
= m
->prefix
;
3510 SET_FLAG(p
->flags
, EXEC_PASS_LOG_UNIT
|EXEC_CHOWN_DIRECTORIES
, MANAGER_IS_SYSTEM(m
));
3513 int manager_update_failed_units(Manager
*m
, Unit
*u
, bool failed
) {
3518 assert(u
->manager
== m
);
3520 size
= set_size(m
->failed_units
);
3523 r
= set_ensure_allocated(&m
->failed_units
, NULL
);
3527 if (set_put(m
->failed_units
, u
) < 0)
3530 (void) set_remove(m
->failed_units
, u
);
3532 if (set_size(m
->failed_units
) != size
)
3533 bus_manager_send_change_signal(m
);
3538 ManagerState
manager_state(Manager
*m
) {
3543 /* Did we ever finish booting? If not then we are still starting up */
3544 if (!MANAGER_IS_FINISHED(m
)) {
3546 u
= manager_get_unit(m
, SPECIAL_BASIC_TARGET
);
3547 if (!u
|| !UNIT_IS_ACTIVE_OR_RELOADING(unit_active_state(u
)))
3548 return MANAGER_INITIALIZING
;
3550 return MANAGER_STARTING
;
3553 /* Is the special shutdown target active or queued? If so, we are in shutdown state */
3554 u
= manager_get_unit(m
, SPECIAL_SHUTDOWN_TARGET
);
3555 if (u
&& unit_active_or_pending(u
))
3556 return MANAGER_STOPPING
;
3558 if (MANAGER_IS_SYSTEM(m
)) {
3559 /* Are the rescue or emergency targets active or queued? If so we are in maintenance state */
3560 u
= manager_get_unit(m
, SPECIAL_RESCUE_TARGET
);
3561 if (u
&& unit_active_or_pending(u
))
3562 return MANAGER_MAINTENANCE
;
3564 u
= manager_get_unit(m
, SPECIAL_EMERGENCY_TARGET
);
3565 if (u
&& unit_active_or_pending(u
))
3566 return MANAGER_MAINTENANCE
;
3569 /* Are there any failed units? If so, we are in degraded mode */
3570 if (set_size(m
->failed_units
) > 0)
3571 return MANAGER_DEGRADED
;
3573 return MANAGER_RUNNING
;
3576 #define DESTROY_IPC_FLAG (UINT32_C(1) << 31)
3578 static void manager_unref_uid_internal(
3583 int (*_clean_ipc
)(uid_t uid
)) {
3589 assert(uid_is_valid(uid
));
3592 /* A generic implementation, covering both manager_unref_uid() and manager_unref_gid(), under the assumption
3593 * that uid_t and gid_t are actually defined the same way, with the same validity rules.
3595 * We store a hashmap where the UID/GID is they key and the value is a 32bit reference counter, whose highest
3596 * bit is used as flag for marking UIDs/GIDs whose IPC objects to remove when the last reference to the UID/GID
3597 * is dropped. The flag is set to on, once at least one reference from a unit where RemoveIPC= is set is added
3598 * on a UID/GID. It is reset when the UID's/GID's reference counter drops to 0 again. */
3600 assert_cc(sizeof(uid_t
) == sizeof(gid_t
));
3601 assert_cc(UID_INVALID
== (uid_t
) GID_INVALID
);
3603 if (uid
== 0) /* We don't keep track of root, and will never destroy it */
3606 c
= PTR_TO_UINT32(hashmap_get(*uid_refs
, UID_TO_PTR(uid
)));
3608 n
= c
& ~DESTROY_IPC_FLAG
;
3612 if (destroy_now
&& n
== 0) {
3613 hashmap_remove(*uid_refs
, UID_TO_PTR(uid
));
3615 if (c
& DESTROY_IPC_FLAG
) {
3616 log_debug("%s " UID_FMT
" is no longer referenced, cleaning up its IPC.",
3617 _clean_ipc
== clean_ipc_by_uid
? "UID" : "GID",
3619 (void) _clean_ipc(uid
);
3622 c
= n
| (c
& DESTROY_IPC_FLAG
);
3623 assert_se(hashmap_update(*uid_refs
, UID_TO_PTR(uid
), UINT32_TO_PTR(c
)) >= 0);
3627 void manager_unref_uid(Manager
*m
, uid_t uid
, bool destroy_now
) {
3628 manager_unref_uid_internal(m
, &m
->uid_refs
, uid
, destroy_now
, clean_ipc_by_uid
);
3631 void manager_unref_gid(Manager
*m
, gid_t gid
, bool destroy_now
) {
3632 manager_unref_uid_internal(m
, &m
->gid_refs
, (uid_t
) gid
, destroy_now
, clean_ipc_by_gid
);
3635 static int manager_ref_uid_internal(
3646 assert(uid_is_valid(uid
));
3648 /* A generic implementation, covering both manager_ref_uid() and manager_ref_gid(), under the assumption
3649 * that uid_t and gid_t are actually defined the same way, with the same validity rules. */
3651 assert_cc(sizeof(uid_t
) == sizeof(gid_t
));
3652 assert_cc(UID_INVALID
== (uid_t
) GID_INVALID
);
3654 if (uid
== 0) /* We don't keep track of root, and will never destroy it */
3657 r
= hashmap_ensure_allocated(uid_refs
, &trivial_hash_ops
);
3661 c
= PTR_TO_UINT32(hashmap_get(*uid_refs
, UID_TO_PTR(uid
)));
3663 n
= c
& ~DESTROY_IPC_FLAG
;
3666 if (n
& DESTROY_IPC_FLAG
) /* check for overflow */
3669 c
= n
| (c
& DESTROY_IPC_FLAG
) | (clean_ipc
? DESTROY_IPC_FLAG
: 0);
3671 return hashmap_replace(*uid_refs
, UID_TO_PTR(uid
), UINT32_TO_PTR(c
));
3674 int manager_ref_uid(Manager
*m
, uid_t uid
, bool clean_ipc
) {
3675 return manager_ref_uid_internal(m
, &m
->uid_refs
, uid
, clean_ipc
);
3678 int manager_ref_gid(Manager
*m
, gid_t gid
, bool clean_ipc
) {
3679 return manager_ref_uid_internal(m
, &m
->gid_refs
, (uid_t
) gid
, clean_ipc
);
3682 static void manager_vacuum_uid_refs_internal(
3685 int (*_clean_ipc
)(uid_t uid
)) {
3694 HASHMAP_FOREACH_KEY(p
, k
, *uid_refs
, i
) {
3698 uid
= PTR_TO_UID(k
);
3699 c
= PTR_TO_UINT32(p
);
3701 n
= c
& ~DESTROY_IPC_FLAG
;
3705 if (c
& DESTROY_IPC_FLAG
) {
3706 log_debug("Found unreferenced %s " UID_FMT
" after reload/reexec. Cleaning up.",
3707 _clean_ipc
== clean_ipc_by_uid
? "UID" : "GID",
3709 (void) _clean_ipc(uid
);
3712 assert_se(hashmap_remove(*uid_refs
, k
) == p
);
3716 void manager_vacuum_uid_refs(Manager
*m
) {
3717 manager_vacuum_uid_refs_internal(m
, &m
->uid_refs
, clean_ipc_by_uid
);
3720 void manager_vacuum_gid_refs(Manager
*m
) {
3721 manager_vacuum_uid_refs_internal(m
, &m
->gid_refs
, clean_ipc_by_gid
);
3724 static void manager_serialize_uid_refs_internal(
3728 const char *field_name
) {
3738 /* Serialize the UID reference table. Or actually, just the IPC destruction flag of it, as the actual counter
3739 * of it is better rebuild after a reload/reexec. */
3741 HASHMAP_FOREACH_KEY(p
, k
, *uid_refs
, i
) {
3745 uid
= PTR_TO_UID(k
);
3746 c
= PTR_TO_UINT32(p
);
3748 if (!(c
& DESTROY_IPC_FLAG
))
3751 fprintf(f
, "%s=" UID_FMT
"\n", field_name
, uid
);
3755 void manager_serialize_uid_refs(Manager
*m
, FILE *f
) {
3756 manager_serialize_uid_refs_internal(m
, f
, &m
->uid_refs
, "destroy-ipc-uid");
3759 void manager_serialize_gid_refs(Manager
*m
, FILE *f
) {
3760 manager_serialize_uid_refs_internal(m
, f
, &m
->gid_refs
, "destroy-ipc-gid");
3763 static void manager_deserialize_uid_refs_one_internal(
3766 const char *value
) {
3776 r
= parse_uid(value
, &uid
);
3777 if (r
< 0 || uid
== 0) {
3778 log_debug("Unable to parse UID reference serialization");
3782 r
= hashmap_ensure_allocated(uid_refs
, &trivial_hash_ops
);
3788 c
= PTR_TO_UINT32(hashmap_get(*uid_refs
, UID_TO_PTR(uid
)));
3789 if (c
& DESTROY_IPC_FLAG
)
3792 c
|= DESTROY_IPC_FLAG
;
3794 r
= hashmap_replace(*uid_refs
, UID_TO_PTR(uid
), UINT32_TO_PTR(c
));
3796 log_debug("Failed to add UID reference entry");
3801 void manager_deserialize_uid_refs_one(Manager
*m
, const char *value
) {
3802 manager_deserialize_uid_refs_one_internal(m
, &m
->uid_refs
, value
);
3805 void manager_deserialize_gid_refs_one(Manager
*m
, const char *value
) {
3806 manager_deserialize_uid_refs_one_internal(m
, &m
->gid_refs
, value
);
3809 int manager_dispatch_user_lookup_fd(sd_event_source
*source
, int fd
, uint32_t revents
, void *userdata
) {
3813 char unit_name
[UNIT_NAME_MAX
+1];
3816 Manager
*m
= userdata
;
3824 /* Invoked whenever a child process succeeded resolving its user/group to use and sent us the resulting UID/GID
3825 * in a datagram. We parse the datagram here and pass it off to the unit, so that it can add a reference to the
3826 * UID/GID so that it can destroy the UID/GID's IPC objects when the reference counter drops to 0. */
3828 l
= recv(fd
, &buffer
, sizeof(buffer
), MSG_DONTWAIT
);
3830 if (IN_SET(errno
, EINTR
, EAGAIN
))
3833 return log_error_errno(errno
, "Failed to read from user lookup fd: %m");
3836 if ((size_t) l
<= offsetof(struct buffer
, unit_name
)) {
3837 log_warning("Received too short user lookup message, ignoring.");
3841 if ((size_t) l
> offsetof(struct buffer
, unit_name
) + UNIT_NAME_MAX
) {
3842 log_warning("Received too long user lookup message, ignoring.");
3846 if (!uid_is_valid(buffer
.uid
) && !gid_is_valid(buffer
.gid
)) {
3847 log_warning("Got user lookup message with invalid UID/GID pair, ignoring.");
3851 n
= (size_t) l
- offsetof(struct buffer
, unit_name
);
3852 if (memchr(buffer
.unit_name
, 0, n
)) {
3853 log_warning("Received lookup message with embedded NUL character, ignoring.");
3857 buffer
.unit_name
[n
] = 0;
3858 u
= manager_get_unit(m
, buffer
.unit_name
);
3860 log_debug("Got user lookup message but unit doesn't exist, ignoring.");
3864 log_unit_debug(u
, "User lookup succeeded: uid=" UID_FMT
" gid=" GID_FMT
, buffer
.uid
, buffer
.gid
);
3866 unit_notify_user_lookup(u
, buffer
.uid
, buffer
.gid
);
3870 char *manager_taint_string(Manager
*m
) {
3871 _cleanup_free_
char *destination
= NULL
, *overflowuid
= NULL
, *overflowgid
= NULL
;
3875 /* Returns a "taint string", e.g. "local-hwclock:var-run-bad".
3876 * Only things that are detected at runtime should be tagged
3877 * here. For stuff that is set during compilation, emit a warning
3878 * in the configuration phase. */
3882 buf
= new(char, sizeof("split-usr:"
3886 "overflowuid-not-65534:"
3887 "overflowgid-not-65534:"));
3895 e
= stpcpy(e
, "split-usr:");
3897 if (access("/proc/cgroups", F_OK
) < 0)
3898 e
= stpcpy(e
, "cgroups-missing:");
3900 if (clock_is_localtime(NULL
) > 0)
3901 e
= stpcpy(e
, "local-hwclock:");
3903 r
= readlink_malloc("/var/run", &destination
);
3904 if (r
< 0 || !PATH_IN_SET(destination
, "../run", "/run"))
3905 e
= stpcpy(e
, "var-run-bad:");
3907 r
= read_one_line_file("/proc/sys/kernel/overflowuid", &overflowuid
);
3908 if (r
>= 0 && !streq(overflowuid
, "65534"))
3909 e
= stpcpy(e
, "overflowuid-not-65534:");
3911 r
= read_one_line_file("/proc/sys/kernel/overflowgid", &overflowgid
);
3912 if (r
>= 0 && !streq(overflowgid
, "65534"))
3913 e
= stpcpy(e
, "overflowgid-not-65534:");
3915 /* remove the last ':' */
3922 static const char *const manager_state_table
[_MANAGER_STATE_MAX
] = {
3923 [MANAGER_INITIALIZING
] = "initializing",
3924 [MANAGER_STARTING
] = "starting",
3925 [MANAGER_RUNNING
] = "running",
3926 [MANAGER_DEGRADED
] = "degraded",
3927 [MANAGER_MAINTENANCE
] = "maintenance",
3928 [MANAGER_STOPPING
] = "stopping",
3931 DEFINE_STRING_TABLE_LOOKUP(manager_state
, ManagerState
);
3933 static const char *const manager_timestamp_table
[_MANAGER_TIMESTAMP_MAX
] = {
3934 [MANAGER_TIMESTAMP_FIRMWARE
] = "firmware",
3935 [MANAGER_TIMESTAMP_LOADER
] = "loader",
3936 [MANAGER_TIMESTAMP_KERNEL
] = "kernel",
3937 [MANAGER_TIMESTAMP_INITRD
] = "initrd",
3938 [MANAGER_TIMESTAMP_USERSPACE
] = "userspace",
3939 [MANAGER_TIMESTAMP_FINISH
] = "finish",
3940 [MANAGER_TIMESTAMP_SECURITY_START
] = "security-start",
3941 [MANAGER_TIMESTAMP_SECURITY_FINISH
] = "security-finish",
3942 [MANAGER_TIMESTAMP_GENERATORS_START
] = "generators-start",
3943 [MANAGER_TIMESTAMP_GENERATORS_FINISH
] = "generators-finish",
3944 [MANAGER_TIMESTAMP_UNITS_LOAD_START
] = "units-load-start",
3945 [MANAGER_TIMESTAMP_UNITS_LOAD_FINISH
] = "units-load-finish",
3948 DEFINE_STRING_TABLE_LOOKUP(manager_timestamp
, ManagerTimestamp
);