manager.c revision 80fbf05e75b75b7dd342ec844275efae90c479ec
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering This file is part of systemd.
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering Copyright 2010 Lennart Poettering
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering systemd is free software; you can redistribute it and/or modify it
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering under the terms of the GNU Lesser General Public License as published by
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering the Free Software Foundation; either version 2.1 of the License, or
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering (at your option) any later version.
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering systemd is distributed in the hope that it will be useful, but
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering WITHOUT ANY WARRANTY; without even the implied warranty of
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering Lesser General Public License for more details.
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering You should have received a copy of the GNU Lesser General Public License
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering along with systemd; If not, see <http://www.gnu.org/licenses/>.
6f717d0817573a76c3e586eae02793d8b23a0581Lennart Poettering/* As soon as 16 units are in our GC queue, make sure to run a gc sweep */
8730bccfc59fe507bd3e0a3abcf411b497ac4f0eLennart Poettering/* As soon as 5s passed since a unit was added to our GC queue, make sure to run a gc sweep */
8730bccfc59fe507bd3e0a3abcf411b497ac4f0eLennart Poettering#define GC_QUEUE_USEC_MAX (10*USEC_PER_SEC)
d15ad74251454d55b715958d8e6f50f45195904aLennart Poettering/* Where clients shall send notification messages to */
d15ad74251454d55b715958d8e6f50f45195904aLennart Poettering#define NOTIFY_SOCKET_SYSTEM "/run/systemd/notify"
d15ad74251454d55b715958d8e6f50f45195904aLennart Poettering#define NOTIFY_SOCKET_USER "@/org/freedesktop/systemd1/notify"
d15ad74251454d55b715958d8e6f50f45195904aLennart Poetteringstatic int manager_setup_notify(Manager *m) {
1b4f6e79ec51a57003896a0b605fba427b4a98d2Lennart Poettering if ((m->notify_watch.fd = socket(AF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0)) < 0) {
1b4f6e79ec51a57003896a0b605fba427b4a98d2Lennart Poettering log_error("Failed to allocate notification socket: %m");
1b4f6e79ec51a57003896a0b605fba427b4a98d2Lennart Poettering snprintf(sa.un.sun_path, sizeof(sa.un.sun_path), NOTIFY_SOCKET_USER "/%llu", random_ull());
2001c80560e3dae69e14fd994d3978c187af48b8Lennart Poettering strncpy(sa.un.sun_path, NOTIFY_SOCKET_SYSTEM, sizeof(sa.un.sun_path));
97c67192eadaffe67b803ec5b991a92bb1137d0bLennart Poettering r = bind(m->notify_watch.fd, &sa.sa, offsetof(struct sockaddr_un, sun_path) + 1 + strlen(sa.un.sun_path+1));
97c67192eadaffe67b803ec5b991a92bb1137d0bLennart Poettering if (setsockopt(m->notify_watch.fd, SOL_SOCKET, SO_PASSCRED, &one, sizeof(one)) < 0) {
97c67192eadaffe67b803ec5b991a92bb1137d0bLennart Poettering if (epoll_ctl(m->epoll_fd, EPOLL_CTL_ADD, m->notify_watch.fd, &ev) < 0)
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering if (!(m->notify_socket = strdup(sa.un.sun_path)))
9c92ce6d67f88beb31dd6555d12ae3f632218a39Lennart Poettering log_debug("Using notification socket %s", m->notify_socket);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringstatic int enable_special_signals(Manager *m) {
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering /* Enable that we get SIGINT on control-alt-del. In containers
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering * this will fail with EPERM, so ignore that. */
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering if (reboot(RB_DISABLE_CAD) < 0 && errno != EPERM)
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering log_warning("Failed to enable ctrl-alt-del handling: %m");
2001c80560e3dae69e14fd994d3978c187af48b8Lennart Poettering fd = open_terminal("/dev/tty0", O_RDWR|O_NOCTTY|O_CLOEXEC);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering /* Support systems without virtual console */
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering log_warning("Failed to open /dev/tty0: %m");
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering /* Enable that we get SIGWINCH on kbrequest */
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering if (ioctl(fd, KDSIGACCEPT, SIGWINCH) < 0)
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering log_warning("Failed to enable kbrequest handling: %s", strerror(errno));
7e8e0422aeb16f2a09a40546c61df753d10029b6Lennart Poetteringstatic int manager_setup_signals(Manager *m) {
946c70944ebdf428ffeb9991a7449edbd4011461Zbigniew Jędrzejewski-Szmek /* We are not interested in SIGSTOP and friends. */
0dae31d468b1a0e22d98921f7b0dbd92fd217167Zbigniew Jędrzejewski-Szmek assert_se(sigaction(SIGCHLD, &sa, NULL) == 0);
0dae31d468b1a0e22d98921f7b0dbd92fd217167Zbigniew Jędrzejewski-Szmek assert_se(sigemptyset(&mask) == 0);
0dae31d468b1a0e22d98921f7b0dbd92fd217167Zbigniew Jędrzejewski-Szmek SIGTERM, /* Reexecute daemon */
0dae31d468b1a0e22d98921f7b0dbd92fd217167Zbigniew Jędrzejewski-Szmek SIGHUP, /* Reload configuration */
0dae31d468b1a0e22d98921f7b0dbd92fd217167Zbigniew Jędrzejewski-Szmek SIGUSR1, /* systemd/upstart: reconnect to D-Bus */
549c1a2564b56f2bb38f1203d59c747ea15817f3Tom Gundersen SIGINT, /* Kernel sends us this on control-alt-del */
42cc2eebb01056beb7acd3ecfe8e533558237f84Lennart Poettering SIGWINCH, /* Kernel sends us this on kbrequest (alt-arrowup) */
42cc2eebb01056beb7acd3ecfe8e533558237f84Lennart Poettering SIGPWR, /* Some kernel drivers and upsd send us this on power failure */
42cc2eebb01056beb7acd3ecfe8e533558237f84Lennart Poettering SIGRTMIN+0, /* systemd: start default.target */
549c1a2564b56f2bb38f1203d59c747ea15817f3Tom Gundersen SIGRTMIN+1, /* systemd: isolate rescue.target */
549c1a2564b56f2bb38f1203d59c747ea15817f3Tom Gundersen SIGRTMIN+2, /* systemd: isolate emergency.target */
42cc2eebb01056beb7acd3ecfe8e533558237f84Lennart Poettering SIGRTMIN+3, /* systemd: start halt.target */
8db0d2f5c37e7e8f5bfce016cfdad7947a3ea939Zbigniew Jędrzejewski-Szmek SIGRTMIN+4, /* systemd: start poweroff.target */
8db0d2f5c37e7e8f5bfce016cfdad7947a3ea939Zbigniew Jędrzejewski-Szmek SIGRTMIN+5, /* systemd: start reboot.target */
8db0d2f5c37e7e8f5bfce016cfdad7947a3ea939Zbigniew Jędrzejewski-Szmek SIGRTMIN+6, /* systemd: start kexec.target */
f91dc2400dc33e9a0745ecaaef7489af116dca38Lennart Poettering SIGRTMIN+13, /* systemd: Immediate halt */
f91dc2400dc33e9a0745ecaaef7489af116dca38Lennart Poettering SIGRTMIN+14, /* systemd: Immediate poweroff */
8db0d2f5c37e7e8f5bfce016cfdad7947a3ea939Zbigniew Jędrzejewski-Szmek SIGRTMIN+15, /* systemd: Immediate reboot */
8db0d2f5c37e7e8f5bfce016cfdad7947a3ea939Zbigniew Jędrzejewski-Szmek SIGRTMIN+16, /* systemd: Immediate kexec */
8db0d2f5c37e7e8f5bfce016cfdad7947a3ea939Zbigniew Jędrzejewski-Szmek SIGRTMIN+20, /* systemd: enable status messages */
8db0d2f5c37e7e8f5bfce016cfdad7947a3ea939Zbigniew Jędrzejewski-Szmek SIGRTMIN+21, /* systemd: disable status messages */
151226ab4bf276d60d51864330a99f886b923697Zbigniew Jędrzejewski-Szmek SIGRTMIN+22, /* systemd: set log level to LOG_DEBUG */
151226ab4bf276d60d51864330a99f886b923697Zbigniew Jędrzejewski-Szmek SIGRTMIN+23, /* systemd: set log level to LOG_INFO */
151226ab4bf276d60d51864330a99f886b923697Zbigniew Jędrzejewski-Szmek SIGRTMIN+26, /* systemd: set log target to journal-or-kmsg */
151226ab4bf276d60d51864330a99f886b923697Zbigniew Jędrzejewski-Szmek SIGRTMIN+27, /* systemd: set log target to console */
151226ab4bf276d60d51864330a99f886b923697Zbigniew Jędrzejewski-Szmek SIGRTMIN+28, /* systemd: set log target to kmsg */
151226ab4bf276d60d51864330a99f886b923697Zbigniew Jędrzejewski-Szmek SIGRTMIN+29, /* systemd: set log target to syslog-or-kmsg */
151226ab4bf276d60d51864330a99f886b923697Zbigniew Jędrzejewski-Szmek assert_se(sigprocmask(SIG_SETMASK, &mask, NULL) == 0);
151226ab4bf276d60d51864330a99f886b923697Zbigniew Jędrzejewski-Szmek m->signal_watch.type = WATCH_SIGNAL;
151226ab4bf276d60d51864330a99f886b923697Zbigniew Jędrzejewski-Szmek if ((m->signal_watch.fd = signalfd(-1, &mask, SFD_NONBLOCK|SFD_CLOEXEC)) < 0)
50f1e641a93cacfc693b0c3d300bee5df0c8c460Tom Gundersen if (epoll_ctl(m->epoll_fd, EPOLL_CTL_ADD, m->signal_watch.fd, &ev) < 0)
6af47493de0ef2b66d4c3fbcdd4a2e12fec4bfbaLennart Poetteringstatic void manager_strip_environment(Manager *m) {
6af47493de0ef2b66d4c3fbcdd4a2e12fec4bfbaLennart Poettering /* Remove variables from the inherited set that are part of
5d45a8808431987c370706d365fb0cc95cf03d52Tom Gundersen * the container interface:
5d45a8808431987c370706d365fb0cc95cf03d52Tom Gundersen * http://www.freedesktop.org/wiki/Software/systemd/ContainerInterface */
5d45a8808431987c370706d365fb0cc95cf03d52Tom Gundersen strv_remove_prefix(m->environment, "container=");
5d45a8808431987c370706d365fb0cc95cf03d52Tom Gundersen strv_remove_prefix(m->environment, "container_");
5d45a8808431987c370706d365fb0cc95cf03d52Tom Gundersen /* Remove variables from the inherited set that are part of
5d45a8808431987c370706d365fb0cc95cf03d52Tom Gundersen * the initrd interface:
5d45a8808431987c370706d365fb0cc95cf03d52Tom Gundersen * http://www.freedesktop.org/wiki/Software/systemd/InitrdInterface */
48d45d2b49d2adb870cd5f1bc7cb389b33655f1cZbigniew Jędrzejewski-Szmekint manager_new(ManagerRunningAs running_as, Manager **_m) {
48d45d2b49d2adb870cd5f1bc7cb389b33655f1cZbigniew Jędrzejewski-Szmek assert(running_as < _MANAGER_RUNNING_AS_MAX);
faa133f3aa7a18f26563dc5d6b95898cb315c37aLennart Poettering dual_timestamp_get(&m->startup_timestamp);
faa133f3aa7a18f26563dc5d6b95898cb315c37aLennart Poettering m->name_data_slot = m->conn_data_slot = m->subscribed_data_slot = -1;
faa133f3aa7a18f26563dc5d6b95898cb315c37aLennart Poettering m->exit_code = _MANAGER_EXIT_CODE_INVALID;
85aeaccc10b111e8d16d3879b7c30a219ee6e10aLennart Poettering m->signal_watch.fd = m->mount_watch.fd = m->udev_watch.fd = m->epoll_fd = m->dev_autofs_fd = m->swap_watch.fd = -1;
85aeaccc10b111e8d16d3879b7c30a219ee6e10aLennart Poettering m->current_job_id = 1; /* start as id #1, so that we can leave #0 around as "null-like" value */
85aeaccc10b111e8d16d3879b7c30a219ee6e10aLennart Poettering m->default_controllers = strv_new("cpu", NULL);
85aeaccc10b111e8d16d3879b7c30a219ee6e10aLennart Poettering if (!(m->units = hashmap_new(string_hash_func, string_compare_func)))
85aeaccc10b111e8d16d3879b7c30a219ee6e10aLennart Poettering if (!(m->jobs = hashmap_new(trivial_hash_func, trivial_compare_func)))
801ad6a6a9cd8fbd58b9f9c27f20dbb3c87d47ddLennart Poettering if (!(m->watch_pids = hashmap_new(trivial_hash_func, trivial_compare_func)))
faa133f3aa7a18f26563dc5d6b95898cb315c37aLennart Poettering if (!(m->cgroup_bondings = hashmap_new(string_hash_func, string_compare_func)))
105e151299dc1208855380be2b22d0db2d66ebc6Lennart Poettering if (!(m->watch_bus = hashmap_new(string_hash_func, string_compare_func)))
2d4c5cbc0ed3ccb09dc086a040088b454c22c644Lennart Poettering if ((m->epoll_fd = epoll_create1(EPOLL_CLOEXEC)) < 0)
7778dffff3d8bd7438fe19a248c16203668324c9Daniel Mack if ((r = lookup_paths_init(&m->lookup_paths, m->running_as, true)) < 0)
7778dffff3d8bd7438fe19a248c16203668324c9Daniel Mack if ((r = manager_setup_signals(m)) < 0)
322345fdb9865ef2477fba8e4bdde0e1183ef505Lennart Poettering /* Try to connect to the busses, if possible. */
7b50eb2efa122200e39646c19a29abab302f7d24Lennart Poettering if ((r = bus_init(m, running_as != MANAGER_SYSTEM)) < 0)
97c67192eadaffe67b803ec5b991a92bb1137d0bLennart Poettering /* If the kernel lacks netlink or audit support,
97c67192eadaffe67b803ec5b991a92bb1137d0bLennart Poettering * don't worry about it. */
97c67192eadaffe67b803ec5b991a92bb1137d0bLennart Poettering errno != EAFNOSUPPORT && errno != EPROTONOSUPPORT)
ab481675f98d3d3f12e7e48ba6d2159123b9c7bfLennart Poettering log_error("Failed to connect to audit log: %m");
Unit *u;
assert(m);
while ((u = m->cleanup_queue)) {
unit_free(u);
Iterator i;
bool is_bad;
assert(u);
if (u->in_cleanup_queue)
goto bad;
if (unit_check_gc(u))
goto good;
is_bad = true;
goto good;
is_bad = false;
if (is_bad)
goto bad;
bad:
good:
Unit *u;
unsigned gc_marker;
assert(m);
(m->gc_queue_timestamp <= 0 ||
while ((u = m->gc_queue)) {
u->in_gc_queue = false;
m->n_in_gc_queue = 0;
m->gc_queue_timestamp = 0;
Unit *u;
assert(m);
unit_free(u);
UnitType c;
assert(m);
for (c = 0; c < _UNIT_TYPE_MAX; c++)
bus_done(m);
if (m->epoll_fd >= 0)
#ifdef HAVE_AUDIT
if (m->audit_fd >= 0)
free(m);
UnitType c;
assert(m);
for (c = 0; c < _UNIT_TYPE_MAX; c++)
Iterator i;
Unit *u;
assert(m);
if (u->id != k)
if ((q = unit_coldplug(u)) < 0)
assert(m);
if (!(d = opendir(*i))) {
r = -ENOMEM;
goto fail;
free(p);
goto fail;
closedir(d);
d = NULL;
fail:
closedir(d);
assert(m);
if (serialization)
m->n_reloading ++;
r = manager_enumerate(m);
if (serialization)
if ((q = manager_coldplug(m)) < 0)
if (serialization) {
m->n_reloading --;
int manager_add_job(Manager *m, JobType type, Unit *unit, JobMode mode, bool override, DBusError *e, Job **_ret) {
assert(m);
return -EINVAL;
return -EPERM;
log_debug("Trying to enqueue job %s/%s/%s", unit->id, job_type_to_string(type), job_mode_to_string(mode));
if (!tr)
return -ENOMEM;
goto tr_abort;
goto tr_abort;
goto tr_abort;
log_debug("Enqueued job %s/%s as %u", unit->id, job_type_to_string(type), (unsigned) tr->anchor_job->id);
if (_ret)
int manager_add_job_by_name(Manager *m, JobType type, const char *name, JobMode mode, bool override, DBusError *e, Job **_ret) {
assert(m);
assert(m);
assert(m);
Unit *u;
assert(m);
if (m->dispatching_load_queue)
m->dispatching_load_queue = true;
while ((u = m->load_queue)) {
unit_load(u);
m->dispatching_load_queue = false;
int manager_load_unit_prepare(Manager *m, const char *name, const char *path, DBusError *e, Unit **_ret) {
UnitType t;
assert(m);
return -EINVAL;
if (!name)
return -EINVAL;
if (ret) {
if (!ret)
return -ENOMEM;
if (path) {
return -ENOMEM;
if (_ret)
assert(m);
if (_ret)
Iterator i;
Job *j;
assert(s);
assert(f);
Iterator i;
Unit *u;
assert(s);
assert(f);
if (u->id == t)
Job *j;
assert(m);
Job *j;
if (m->dispatching_run_queue)
m->dispatching_run_queue = true;
while ((j = m->run_queue)) {
m->dispatching_run_queue = false;
Job *j;
Unit *u;
assert(m);
if (m->dispatching_dbus_queue)
m->dispatching_dbus_queue = true;
while ((u = m->dbus_unit_queue)) {
while ((j = m->dbus_job_queue)) {
m->dispatching_dbus_queue = false;
ssize_t n;
assert(m);
} control;
Unit *u;
char **tags;
return -EIO;
return -errno;
buf[n] = 0;
return -ENOMEM;
assert(m);
Unit *u;
return -errno;
if ((r = manager_process_notify_fd(m)) < 0)
return -errno;
ssize_t n;
bool sigchld = false;
assert(m);
return -EIO;
return -errno;
char *p = NULL;
free(p);
case SIGCHLD:
sigchld = true;
case SIGTERM:
case SIGINT:
case SIGWINCH:
case SIGPWR:
case SIGUSR1: {
Unit *u;
bus_init(m, true);
case SIGUSR2: {
FILE *f;
if (ferror(f)) {
fclose(f);
fclose(f);
case SIGHUP:
static const char * const target_table[] = {
[0] = SPECIAL_DEFAULT_TARGET,
[0] = MANAGER_HALT,
manager_set_show_status(m, true);
manager_set_show_status(m, false);
if (sigchld)
return manager_dispatch_sigchld(m);
Watch *w;
assert(m);
switch (w->type) {
case WATCH_SIGNAL:
return -EINVAL;
if ((r = manager_process_signal_fd(m)) < 0)
case WATCH_NOTIFY:
return -EINVAL;
if ((r = manager_process_notify_fd(m)) < 0)
case WATCH_FD:
case WATCH_UNIT_TIMER:
case WATCH_JOB_TIMER: {
uint64_t v;
ssize_t k;
case WATCH_MOUNT:
case WATCH_SWAP:
case WATCH_UDEV:
case WATCH_DBUS_WATCH:
case WATCH_DBUS_TIMEOUT:
assert(m);
r = manager_dispatch_sigchld(m);
if (manager_dispatch_load_queue(m) > 0)
if (manager_dispatch_run_queue(m) > 0)
if (bus_dispatch(m) > 0)
if (manager_dispatch_cleanup_queue(m) > 0)
if (manager_dispatch_gc_queue(m) > 0)
if (manager_dispatch_dbus_queue(m) > 0)
if (swap_dispatch_reload(m) > 0)
if (wait_msec <= 0)
return -errno;
return m->exit_code;
Unit *u;
assert(m);
assert(s);
return -EINVAL;
return -ENOMEM;
free(n);
*_u = u;
Job *j;
unsigned id;
assert(m);
assert(s);
return -EINVAL;
return -ENOENT;
*_j = j;
#ifdef HAVE_AUDIT
if (m->audit_fd < 0)
if (m->n_reloading > 0)
free(p);
if (m->n_reloading > 0)
if (connect(fd, &sa.sa, offsetof(struct sockaddr_un, sun_path) + 1 + strlen(sa.un.sun_path+1)) < 0) {
goto finish;
goto finish;
errno = 0;
goto finish;
if (fd >= 0)
Manager *m,
const char *name,
const char* old_owner,
const char *new_owner) {
Unit *u;
assert(m);
Manager *m,
const char *name,
Unit *u;
assert(m);
int fd;
FILE *f;
if (!path)
return -ENOMEM;
if (fd < 0) {
return -errno;
return -errno;
*_f = f;
Iterator i;
Unit *u;
assert(m);
assert(f);
m->n_reloading ++;
if (u->id != t)
if (!unit_can_serialize(u))
m->n_reloading --;
m->n_reloading --;
if (ferror(f))
return -EIO;
assert(m);
assert(f);
m->n_reloading ++;
if (feof(f))
r = -errno;
goto finish;
Unit *u;
if (feof(f))
r = -errno;
goto finish;
goto finish;
goto finish;
if (ferror(f)) {
r = -EIO;
goto finish;
m->n_reloading --;
FILE *f;
assert(m);
if ((r = manager_open_serialization(m, &f)) < 0)
m->n_reloading ++;
m->n_reloading --;
r = -ENOMEM;
goto finish;
m->n_reloading --;
goto finish;
m->n_reloading --;
r = -errno;
goto finish;
if ((q = manager_enumerate(m)) < 0)
fclose(f);
f = NULL;
if ((q = manager_coldplug(m)) < 0)
m->n_reloading--;
fclose(f);
if (fds)
Unit *u;
assert(m);
return !!u->job;
Unit *u;
Iterator i;
assert(m);
Unit *u;
assert(m);
return unit_pending_inactive(u);
char userspace[FORMAT_TIMESPAN_MAX], initrd[FORMAT_TIMESPAN_MAX], kernel[FORMAT_TIMESPAN_MAX], sum[FORMAT_TIMESPAN_MAX];
assert(m);
initrd_usec = 0;
sd_notifyf(false,
const char *generator_path;
mode_t u;
assert(m);
if (!m->generator_unit_path) {
goto finish;
goto finish;
goto finish;
umask(u);
goto finish;
goto finish;
closedir(d);
assert(m);
if (!m->generator_unit_path)
assert(m);
return -ENOMEM;
m->default_controllers = l;
Unit *u;
assert(m);
log_open();
assert(m);
m->show_status = b;
assert(m);
if (m->show_status)
return plymouth_running();