~ubuntu-branches/ubuntu/trusty/systemd/trusty

« back to all changes in this revision

Viewing changes to .pc/debian-changes/src/core/manager.c

  • Committer: Package Import Robot
  • Author(s): Michael Biebl, Michael Biebl, Michael Stapelberg, Daniel Schaal, Ondrej Balaz
  • Date: 2013-09-12 00:13:11 UTC
  • mfrom: (1.1.11) (9.1.2 experimental)
  • mto: This revision was merged to the branch mainline in revision 53.
  • Revision ID: package-import@ubuntu.com-20130912001311-dz35it34wr2lbday
Tags: 204-3
[ Michael Biebl ]
* Upload to unstable.
* Use /bin/bash in debug-shell.service as Debian doesn't have /sbin/sushell.
* Only import net.ifaces cmdline property for network devices.
* Generate strict dependencies between the binary packages using a
  shlibs.local file and add an explicit versioned dependency on
  libsystemd-login0 to systemd to ensure packages are upgraded in sync.
  Closes: #719444
* Drop obsolete Replaces: libudev0 from udev package.
* Use correct paths for various binaries, like /sbin/quotaon, which are
  installed in / and not /usr in Debian.  Closes: #721347
* Don't install kernel-install(8) man page since we don't install the
  corresponding binary either.  Closes: #722180
* Cherry-pick upstream fixes to make switching runlevels and starting
  reboot via ctrl-alt-del more robust.
* Cherry-pick upstream fix to properly apply ACLs to Journal files.

[ Michael Stapelberg ]
* Make systemctl enable|disable call update-rc.d for SysV init scripts.
  Closes: #709780
* Don't mount /tmp as tmpfs by default and make it possible to enable this
  feature via "systemctl enable tmp.mount".

[ Daniel Schaal ]
* Add bug-script to systemd and udev.  Closes: #711245

[ Ondrej Balaz ]
* Recognize discard option in /etc/crypttab.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
 
2
 
 
3
/***
 
4
  This file is part of systemd.
 
5
 
 
6
  Copyright 2010 Lennart Poettering
 
7
 
 
8
  systemd is free software; you can redistribute it and/or modify it
 
9
  under the terms of the GNU Lesser General Public License as published by
 
10
  the Free Software Foundation; either version 2.1 of the License, or
 
11
  (at your option) any later version.
 
12
 
 
13
  systemd is distributed in the hope that it will be useful, but
 
14
  WITHOUT ANY WARRANTY; without even the implied warranty of
 
15
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 
16
  Lesser General Public License for more details.
 
17
 
 
18
  You should have received a copy of the GNU Lesser General Public License
 
19
  along with systemd; If not, see <http://www.gnu.org/licenses/>.
 
20
***/
 
21
 
 
22
#include <assert.h>
 
23
#include <errno.h>
 
24
#include <string.h>
 
25
#include <sys/epoll.h>
 
26
#include <signal.h>
 
27
#include <sys/signalfd.h>
 
28
#include <sys/wait.h>
 
29
#include <unistd.h>
 
30
#include <sys/poll.h>
 
31
#include <sys/reboot.h>
 
32
#include <sys/ioctl.h>
 
33
#include <linux/kd.h>
 
34
#include <termios.h>
 
35
#include <fcntl.h>
 
36
#include <sys/types.h>
 
37
#include <sys/stat.h>
 
38
#include <dirent.h>
 
39
#include <sys/timerfd.h>
 
40
 
 
41
#ifdef HAVE_AUDIT
 
42
#include <libaudit.h>
 
43
#endif
 
44
 
 
45
#include "systemd/sd-daemon.h"
 
46
#include "systemd/sd-id128.h"
 
47
#include "systemd/sd-messages.h"
 
48
 
 
49
#include "manager.h"
 
50
#include "transaction.h"
 
51
#include "hashmap.h"
 
52
#include "macro.h"
 
53
#include "strv.h"
 
54
#include "log.h"
 
55
#include "util.h"
 
56
#include "mkdir.h"
 
57
#include "ratelimit.h"
 
58
#include "cgroup.h"
 
59
#include "mount-setup.h"
 
60
#include "unit-name.h"
 
61
#include "dbus-unit.h"
 
62
#include "dbus-job.h"
 
63
#include "missing.h"
 
64
#include "path-lookup.h"
 
65
#include "special.h"
 
66
#include "bus-errors.h"
 
67
#include "exit-status.h"
 
68
#include "virt.h"
 
69
#include "watchdog.h"
 
70
#include "cgroup-util.h"
 
71
#include "path-util.h"
 
72
#include "audit-fd.h"
 
73
#include "env-util.h"
 
74
 
 
75
/* As soon as 16 units are in our GC queue, make sure to run a gc sweep */
 
76
#define GC_QUEUE_ENTRIES_MAX 16
 
77
 
 
78
/* As soon as 5s passed since a unit was added to our GC queue, make sure to run a gc sweep */
 
79
#define GC_QUEUE_USEC_MAX (10*USEC_PER_SEC)
 
80
 
 
81
/* Initial delay and the interval for printing status messages about running jobs */
 
82
#define JOBS_IN_PROGRESS_WAIT_SEC 5
 
83
#define JOBS_IN_PROGRESS_PERIOD_SEC 1
 
84
#define JOBS_IN_PROGRESS_PERIOD_DIVISOR 3
 
85
 
 
86
/* Where clients shall send notification messages to */
 
87
#define NOTIFY_SOCKET "@/org/freedesktop/systemd1/notify"
 
88
 
 
89
#define TIME_T_MAX (time_t)((1UL << ((sizeof(time_t) << 3) - 1)) - 1)
 
90
 
 
91
static int manager_setup_notify(Manager *m) {
 
92
        union {
 
93
                struct sockaddr sa;
 
94
                struct sockaddr_un un;
 
95
        } sa = {
 
96
                .sa.sa_family = AF_UNIX,
 
97
        };
 
98
        struct epoll_event ev = {
 
99
                .events = EPOLLIN,
 
100
                .data.ptr = &m->notify_watch,
 
101
        };
 
102
        int one = 1, r;
 
103
 
 
104
        m->notify_watch.type = WATCH_NOTIFY;
 
105
        m->notify_watch.fd = socket(AF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
 
106
        if (m->notify_watch.fd < 0) {
 
107
                log_error("Failed to allocate notification socket: %m");
 
108
                return -errno;
 
109
        }
 
110
 
 
111
        if (getpid() != 1 || detect_container(NULL) > 0)
 
112
                snprintf(sa.un.sun_path, sizeof(sa.un.sun_path), NOTIFY_SOCKET "/%llu", random_ull());
 
113
        else
 
114
                strncpy(sa.un.sun_path, NOTIFY_SOCKET, sizeof(sa.un.sun_path));
 
115
 
 
116
        sa.un.sun_path[0] = 0;
 
117
 
 
118
        r = bind(m->notify_watch.fd, &sa.sa,
 
119
                 offsetof(struct sockaddr_un, sun_path) + 1 + strlen(sa.un.sun_path+1));
 
120
        if (r < 0) {
 
121
                log_error("bind() failed: %m");
 
122
                return -errno;
 
123
        }
 
124
 
 
125
        r = setsockopt(m->notify_watch.fd, SOL_SOCKET, SO_PASSCRED, &one, sizeof(one));
 
126
        if (r < 0) {
 
127
                log_error("SO_PASSCRED failed: %m");
 
128
                return -errno;
 
129
        }
 
130
 
 
131
        r = epoll_ctl(m->epoll_fd, EPOLL_CTL_ADD, m->notify_watch.fd, &ev);
 
132
        if (r < 0) {
 
133
                log_error("Failed to add notification socket fd to epoll: %m");
 
134
                return -errno;
 
135
        }
 
136
 
 
137
        sa.un.sun_path[0] = '@';
 
138
        m->notify_socket = strdup(sa.un.sun_path);
 
139
        if (!m->notify_socket)
 
140
                return log_oom();
 
141
 
 
142
        log_debug("Using notification socket %s", m->notify_socket);
 
143
 
 
144
        return 0;
 
145
}
 
146
 
 
147
static int manager_jobs_in_progress_mod_timer(Manager *m) {
 
148
        struct itimerspec its = {
 
149
                .it_value.tv_sec = JOBS_IN_PROGRESS_WAIT_SEC,
 
150
                .it_interval.tv_sec = JOBS_IN_PROGRESS_PERIOD_SEC,
 
151
        };
 
152
 
 
153
        if (m->jobs_in_progress_watch.type != WATCH_JOBS_IN_PROGRESS)
 
154
                return 0;
 
155
 
 
156
        if (timerfd_settime(m->jobs_in_progress_watch.fd, 0, &its, NULL) < 0)
 
157
                return -errno;
 
158
 
 
159
        return 0;
 
160
}
 
161
 
 
162
static int manager_watch_jobs_in_progress(Manager *m) {
 
163
        struct epoll_event ev = {
 
164
                .events = EPOLLIN,
 
165
                .data.ptr = &m->jobs_in_progress_watch,
 
166
        };
 
167
        int r;
 
168
 
 
169
        if (m->jobs_in_progress_watch.type != WATCH_INVALID)
 
170
                return 0;
 
171
 
 
172
        m->jobs_in_progress_watch.type = WATCH_JOBS_IN_PROGRESS;
 
173
        m->jobs_in_progress_watch.fd = timerfd_create(CLOCK_MONOTONIC, TFD_NONBLOCK|TFD_CLOEXEC);
 
174
        if (m->jobs_in_progress_watch.fd < 0) {
 
175
                log_error("Failed to create timerfd: %m");
 
176
                r = -errno;
 
177
                goto err;
 
178
        }
 
179
 
 
180
        r = manager_jobs_in_progress_mod_timer(m);
 
181
        if (r < 0) {
 
182
                log_error("Failed to set up timer for jobs progress watch: %s", strerror(-r));
 
183
                goto err;
 
184
        }
 
185
 
 
186
        if (epoll_ctl(m->epoll_fd, EPOLL_CTL_ADD, m->jobs_in_progress_watch.fd, &ev) < 0) {
 
187
                log_error("Failed to add jobs progress timer fd to epoll: %m");
 
188
                r = -errno;
 
189
                goto err;
 
190
        }
 
191
 
 
192
        log_debug("Set up jobs progress timerfd.");
 
193
 
 
194
        return 0;
 
195
 
 
196
err:
 
197
        if (m->jobs_in_progress_watch.fd >= 0)
 
198
                close_nointr_nofail(m->jobs_in_progress_watch.fd);
 
199
        watch_init(&m->jobs_in_progress_watch);
 
200
        return r;
 
201
}
 
202
 
 
203
static void manager_unwatch_jobs_in_progress(Manager *m) {
 
204
        if (m->jobs_in_progress_watch.type != WATCH_JOBS_IN_PROGRESS)
 
205
                return;
 
206
 
 
207
        assert_se(epoll_ctl(m->epoll_fd, EPOLL_CTL_DEL, m->jobs_in_progress_watch.fd, NULL) >= 0);
 
208
        close_nointr_nofail(m->jobs_in_progress_watch.fd);
 
209
        watch_init(&m->jobs_in_progress_watch);
 
210
        m->jobs_in_progress_iteration = 0;
 
211
 
 
212
        log_debug("Closed jobs progress timerfd.");
 
213
}
 
214
 
 
215
#define CYLON_BUFFER_EXTRA (2*strlen(ANSI_RED_ON) + strlen(ANSI_HIGHLIGHT_RED_ON) + 2*strlen(ANSI_HIGHLIGHT_OFF))
 
216
static void draw_cylon(char buffer[], size_t buflen, unsigned width, unsigned pos) {
 
217
        char *p = buffer;
 
218
 
 
219
        assert(buflen >= CYLON_BUFFER_EXTRA + width + 1);
 
220
        assert(pos <= width+1); /* 0 or width+1 mean that the center light is behind the corner */
 
221
 
 
222
        if (pos > 1) {
 
223
                if (pos > 2)
 
224
                        p = mempset(p, ' ', pos-2);
 
225
                p = stpcpy(p, ANSI_RED_ON);
 
226
                *p++ = '*';
 
227
        }
 
228
 
 
229
        if (pos > 0 && pos <= width) {
 
230
                p = stpcpy(p, ANSI_HIGHLIGHT_RED_ON);
 
231
                *p++ = '*';
 
232
        }
 
233
 
 
234
        p = stpcpy(p, ANSI_HIGHLIGHT_OFF);
 
235
 
 
236
        if (pos < width) {
 
237
                p = stpcpy(p, ANSI_RED_ON);
 
238
                *p++ = '*';
 
239
                if (pos < width-1)
 
240
                        p = mempset(p, ' ', width-1-pos);
 
241
                p = stpcpy(p, ANSI_HIGHLIGHT_OFF);
 
242
        }
 
243
}
 
244
 
 
245
static void manager_print_jobs_in_progress(Manager *m) {
 
246
        Iterator i;
 
247
        Job *j;
 
248
        char *job_of_n = NULL;
 
249
        unsigned counter = 0, print_nr;
 
250
        char cylon[6 + CYLON_BUFFER_EXTRA + 1];
 
251
        unsigned cylon_pos;
 
252
 
 
253
        print_nr = (m->jobs_in_progress_iteration / JOBS_IN_PROGRESS_PERIOD_DIVISOR) % m->n_running_jobs;
 
254
 
 
255
        HASHMAP_FOREACH(j, m->jobs, i)
 
256
                if (j->state == JOB_RUNNING && counter++ == print_nr)
 
257
                        break;
 
258
 
 
259
        /* m->n_running_jobs must be consistent with the contents of m->jobs,
 
260
         * so the above loop must have succeeded in finding j. */
 
261
        assert(counter == print_nr + 1);
 
262
 
 
263
        cylon_pos = m->jobs_in_progress_iteration % 14;
 
264
        if (cylon_pos >= 8)
 
265
                cylon_pos = 14 - cylon_pos;
 
266
        draw_cylon(cylon, sizeof(cylon), 6, cylon_pos);
 
267
 
 
268
        if (m->n_running_jobs > 1)
 
269
                if (asprintf(&job_of_n, "(%u of %u) ", counter, m->n_running_jobs) < 0)
 
270
                        job_of_n = NULL;
 
271
 
 
272
        manager_status_printf(m, true, cylon, "%sA %s job is running for %s",
 
273
                              strempty(job_of_n), job_type_to_string(j->type), unit_description(j->unit));
 
274
        free(job_of_n);
 
275
 
 
276
        m->jobs_in_progress_iteration++;
 
277
}
 
278
 
 
279
static int manager_setup_time_change(Manager *m) {
 
280
        struct epoll_event ev = {
 
281
                .events = EPOLLIN,
 
282
                .data.ptr = &m->time_change_watch,
 
283
        };
 
284
 
 
285
        /* We only care for the cancellation event, hence we set the
 
286
         * timeout to the latest possible value. */
 
287
        struct itimerspec its = {
 
288
                .it_value.tv_sec = TIME_T_MAX,
 
289
        };
 
290
        assert_cc(sizeof(time_t) == sizeof(TIME_T_MAX));
 
291
 
 
292
        assert(m->time_change_watch.type == WATCH_INVALID);
 
293
 
 
294
        /* Uses TFD_TIMER_CANCEL_ON_SET to get notifications whenever
 
295
         * CLOCK_REALTIME makes a jump relative to CLOCK_MONOTONIC */
 
296
 
 
297
        m->time_change_watch.type = WATCH_TIME_CHANGE;
 
298
        m->time_change_watch.fd = timerfd_create(CLOCK_REALTIME, TFD_NONBLOCK|TFD_CLOEXEC);
 
299
        if (m->time_change_watch.fd < 0) {
 
300
                log_error("Failed to create timerfd: %m");
 
301
                return -errno;
 
302
        }
 
303
 
 
304
        if (timerfd_settime(m->time_change_watch.fd, TFD_TIMER_ABSTIME|TFD_TIMER_CANCEL_ON_SET, &its, NULL) < 0) {
 
305
                log_debug("Failed to set up TFD_TIMER_CANCEL_ON_SET, ignoring: %m");
 
306
                close_nointr_nofail(m->time_change_watch.fd);
 
307
                watch_init(&m->time_change_watch);
 
308
                return 0;
 
309
        }
 
310
 
 
311
        if (epoll_ctl(m->epoll_fd, EPOLL_CTL_ADD, m->time_change_watch.fd, &ev) < 0) {
 
312
                log_error("Failed to add timer change fd to epoll: %m");
 
313
                return -errno;
 
314
        }
 
315
 
 
316
        log_debug("Set up TFD_TIMER_CANCEL_ON_SET timerfd.");
 
317
 
 
318
        return 0;
 
319
}
 
320
 
 
321
static int enable_special_signals(Manager *m) {
 
322
        int fd;
 
323
 
 
324
        assert(m);
 
325
 
 
326
        /* Enable that we get SIGINT on control-alt-del. In containers
 
327
         * this will fail with EPERM (older) or EINVAL (newer), so
 
328
         * ignore that. */
 
329
        if (reboot(RB_DISABLE_CAD) < 0 && errno != EPERM && errno != EINVAL)
 
330
                log_warning("Failed to enable ctrl-alt-del handling: %m");
 
331
 
 
332
        fd = open_terminal("/dev/tty0", O_RDWR|O_NOCTTY|O_CLOEXEC);
 
333
        if (fd < 0) {
 
334
                /* Support systems without virtual console */
 
335
                if (fd != -ENOENT)
 
336
                        log_warning("Failed to open /dev/tty0: %m");
 
337
        } else {
 
338
                /* Enable that we get SIGWINCH on kbrequest */
 
339
                if (ioctl(fd, KDSIGACCEPT, SIGWINCH) < 0)
 
340
                        log_warning("Failed to enable kbrequest handling: %s", strerror(errno));
 
341
 
 
342
                close_nointr_nofail(fd);
 
343
        }
 
344
 
 
345
        return 0;
 
346
}
 
347
 
 
348
static int manager_setup_signals(Manager *m) {
 
349
        sigset_t mask;
 
350
        struct epoll_event ev = {
 
351
                .events = EPOLLIN,
 
352
                .data.ptr = &m->signal_watch,
 
353
        };
 
354
        struct sigaction sa = {
 
355
                .sa_handler = SIG_DFL,
 
356
                .sa_flags = SA_NOCLDSTOP|SA_RESTART,
 
357
        };
 
358
 
 
359
        assert(m);
 
360
 
 
361
        /* We are not interested in SIGSTOP and friends. */
 
362
        assert_se(sigaction(SIGCHLD, &sa, NULL) == 0);
 
363
 
 
364
        assert_se(sigemptyset(&mask) == 0);
 
365
 
 
366
        sigset_add_many(&mask,
 
367
                        SIGCHLD,     /* Child died */
 
368
                        SIGTERM,     /* Reexecute daemon */
 
369
                        SIGHUP,      /* Reload configuration */
 
370
                        SIGUSR1,     /* systemd/upstart: reconnect to D-Bus */
 
371
                        SIGUSR2,     /* systemd: dump status */
 
372
                        SIGINT,      /* Kernel sends us this on control-alt-del */
 
373
                        SIGWINCH,    /* Kernel sends us this on kbrequest (alt-arrowup) */
 
374
                        SIGPWR,      /* Some kernel drivers and upsd send us this on power failure */
 
375
                        SIGRTMIN+0,  /* systemd: start default.target */
 
376
                        SIGRTMIN+1,  /* systemd: isolate rescue.target */
 
377
                        SIGRTMIN+2,  /* systemd: isolate emergency.target */
 
378
                        SIGRTMIN+3,  /* systemd: start halt.target */
 
379
                        SIGRTMIN+4,  /* systemd: start poweroff.target */
 
380
                        SIGRTMIN+5,  /* systemd: start reboot.target */
 
381
                        SIGRTMIN+6,  /* systemd: start kexec.target */
 
382
                        SIGRTMIN+13, /* systemd: Immediate halt */
 
383
                        SIGRTMIN+14, /* systemd: Immediate poweroff */
 
384
                        SIGRTMIN+15, /* systemd: Immediate reboot */
 
385
                        SIGRTMIN+16, /* systemd: Immediate kexec */
 
386
                        SIGRTMIN+20, /* systemd: enable status messages */
 
387
                        SIGRTMIN+21, /* systemd: disable status messages */
 
388
                        SIGRTMIN+22, /* systemd: set log level to LOG_DEBUG */
 
389
                        SIGRTMIN+23, /* systemd: set log level to LOG_INFO */
 
390
                        SIGRTMIN+24, /* systemd: Immediate exit (--user only) */
 
391
                        SIGRTMIN+26, /* systemd: set log target to journal-or-kmsg */
 
392
                        SIGRTMIN+27, /* systemd: set log target to console */
 
393
                        SIGRTMIN+28, /* systemd: set log target to kmsg */
 
394
                        SIGRTMIN+29, /* systemd: set log target to syslog-or-kmsg */
 
395
                        -1);
 
396
        assert_se(sigprocmask(SIG_SETMASK, &mask, NULL) == 0);
 
397
 
 
398
        m->signal_watch.type = WATCH_SIGNAL;
 
399
        m->signal_watch.fd = signalfd(-1, &mask, SFD_NONBLOCK|SFD_CLOEXEC);
 
400
        if (m->signal_watch.fd < 0)
 
401
                return -errno;
 
402
 
 
403
        if (epoll_ctl(m->epoll_fd, EPOLL_CTL_ADD, m->signal_watch.fd, &ev) < 0)
 
404
                return -errno;
 
405
 
 
406
        if (m->running_as == SYSTEMD_SYSTEM)
 
407
                return enable_special_signals(m);
 
408
 
 
409
        return 0;
 
410
}
 
411
 
 
412
static void manager_strip_environment(Manager *m) {
 
413
        assert(m);
 
414
 
 
415
        /* Remove variables from the inherited set that are part of
 
416
         * the container interface:
 
417
         * http://www.freedesktop.org/wiki/Software/systemd/ContainerInterface */
 
418
        strv_remove_prefix(m->environment, "container=");
 
419
        strv_remove_prefix(m->environment, "container_");
 
420
 
 
421
        /* Remove variables from the inherited set that are part of
 
422
         * the initrd interface:
 
423
         * http://www.freedesktop.org/wiki/Software/systemd/InitrdInterface */
 
424
        strv_remove_prefix(m->environment, "RD_");
 
425
 
 
426
        /* Drop invalid entries */
 
427
        strv_env_clean(m->environment);
 
428
}
 
429
 
 
430
int manager_new(SystemdRunningAs running_as, Manager **_m) {
 
431
        Manager *m;
 
432
        int r = -ENOMEM;
 
433
 
 
434
        assert(_m);
 
435
        assert(running_as >= 0);
 
436
        assert(running_as < _SYSTEMD_RUNNING_AS_MAX);
 
437
 
 
438
        m = new0(Manager, 1);
 
439
        if (!m)
 
440
                return -ENOMEM;
 
441
 
 
442
        m->running_as = running_as;
 
443
        m->name_data_slot = m->conn_data_slot = m->subscribed_data_slot = -1;
 
444
        m->exit_code = _MANAGER_EXIT_CODE_INVALID;
 
445
        m->pin_cgroupfs_fd = -1;
 
446
        m->idle_pipe[0] = m->idle_pipe[1] = -1;
 
447
 
 
448
        watch_init(&m->signal_watch);
 
449
        watch_init(&m->mount_watch);
 
450
        watch_init(&m->swap_watch);
 
451
        watch_init(&m->udev_watch);
 
452
        watch_init(&m->time_change_watch);
 
453
        watch_init(&m->jobs_in_progress_watch);
 
454
 
 
455
        m->epoll_fd = m->dev_autofs_fd = -1;
 
456
        m->current_job_id = 1; /* start as id #1, so that we can leave #0 around as "null-like" value */
 
457
 
 
458
        m->environment = strv_copy(environ);
 
459
        if (!m->environment)
 
460
                goto fail;
 
461
 
 
462
        manager_strip_environment(m);
 
463
 
 
464
        if (running_as == SYSTEMD_SYSTEM) {
 
465
                m->default_controllers = strv_new("cpu", NULL);
 
466
                if (!m->default_controllers)
 
467
                        goto fail;
 
468
        }
 
469
 
 
470
        if (!(m->units = hashmap_new(string_hash_func, string_compare_func)))
 
471
                goto fail;
 
472
 
 
473
        if (!(m->jobs = hashmap_new(trivial_hash_func, trivial_compare_func)))
 
474
                goto fail;
 
475
 
 
476
        if (!(m->watch_pids = hashmap_new(trivial_hash_func, trivial_compare_func)))
 
477
                goto fail;
 
478
 
 
479
        if (!(m->cgroup_bondings = hashmap_new(string_hash_func, string_compare_func)))
 
480
                goto fail;
 
481
 
 
482
        if (!(m->watch_bus = hashmap_new(string_hash_func, string_compare_func)))
 
483
                goto fail;
 
484
 
 
485
        m->epoll_fd = epoll_create1(EPOLL_CLOEXEC);
 
486
        if (m->epoll_fd < 0)
 
487
                goto fail;
 
488
 
 
489
        r = manager_setup_signals(m);
 
490
        if (r < 0)
 
491
                goto fail;
 
492
 
 
493
        r = manager_setup_cgroup(m);
 
494
        if (r < 0)
 
495
                goto fail;
 
496
 
 
497
        r = manager_setup_notify(m);
 
498
        if (r < 0)
 
499
                goto fail;
 
500
 
 
501
        r = manager_setup_time_change(m);
 
502
        if (r < 0)
 
503
                goto fail;
 
504
 
 
505
        /* Try to connect to the busses, if possible. */
 
506
        r = bus_init(m, running_as != SYSTEMD_SYSTEM);
 
507
        if (r < 0)
 
508
                goto fail;
 
509
 
 
510
        m->taint_usr = dir_is_empty("/usr") > 0;
 
511
 
 
512
        *_m = m;
 
513
        return 0;
 
514
 
 
515
fail:
 
516
        manager_free(m);
 
517
        return r;
 
518
}
 
519
 
 
520
static unsigned manager_dispatch_cleanup_queue(Manager *m) {
 
521
        Unit *u;
 
522
        unsigned n = 0;
 
523
 
 
524
        assert(m);
 
525
 
 
526
        while ((u = m->cleanup_queue)) {
 
527
                assert(u->in_cleanup_queue);
 
528
 
 
529
                unit_free(u);
 
530
                n++;
 
531
        }
 
532
 
 
533
        return n;
 
534
}
 
535
 
 
536
enum {
 
537
        GC_OFFSET_IN_PATH,  /* This one is on the path we were traveling */
 
538
        GC_OFFSET_UNSURE,   /* No clue */
 
539
        GC_OFFSET_GOOD,     /* We still need this unit */
 
540
        GC_OFFSET_BAD,      /* We don't need this unit anymore */
 
541
        _GC_OFFSET_MAX
 
542
};
 
543
 
 
544
static void unit_gc_sweep(Unit *u, unsigned gc_marker) {
 
545
        Iterator i;
 
546
        Unit *other;
 
547
        bool is_bad;
 
548
 
 
549
        assert(u);
 
550
 
 
551
        if (u->gc_marker == gc_marker + GC_OFFSET_GOOD ||
 
552
            u->gc_marker == gc_marker + GC_OFFSET_BAD ||
 
553
            u->gc_marker == gc_marker + GC_OFFSET_IN_PATH)
 
554
                return;
 
555
 
 
556
        if (u->in_cleanup_queue)
 
557
                goto bad;
 
558
 
 
559
        if (unit_check_gc(u))
 
560
                goto good;
 
561
 
 
562
        u->gc_marker = gc_marker + GC_OFFSET_IN_PATH;
 
563
 
 
564
        is_bad = true;
 
565
 
 
566
        SET_FOREACH(other, u->dependencies[UNIT_REFERENCED_BY], i) {
 
567
                unit_gc_sweep(other, gc_marker);
 
568
 
 
569
                if (other->gc_marker == gc_marker + GC_OFFSET_GOOD)
 
570
                        goto good;
 
571
 
 
572
                if (other->gc_marker != gc_marker + GC_OFFSET_BAD)
 
573
                        is_bad = false;
 
574
        }
 
575
 
 
576
        if (is_bad)
 
577
                goto bad;
 
578
 
 
579
        /* We were unable to find anything out about this entry, so
 
580
         * let's investigate it later */
 
581
        u->gc_marker = gc_marker + GC_OFFSET_UNSURE;
 
582
        unit_add_to_gc_queue(u);
 
583
        return;
 
584
 
 
585
bad:
 
586
        /* We definitely know that this one is not useful anymore, so
 
587
         * let's mark it for deletion */
 
588
        u->gc_marker = gc_marker + GC_OFFSET_BAD;
 
589
        unit_add_to_cleanup_queue(u);
 
590
        return;
 
591
 
 
592
good:
 
593
        u->gc_marker = gc_marker + GC_OFFSET_GOOD;
 
594
}
 
595
 
 
596
static unsigned manager_dispatch_gc_queue(Manager *m) {
 
597
        Unit *u;
 
598
        unsigned n = 0;
 
599
        unsigned gc_marker;
 
600
 
 
601
        assert(m);
 
602
 
 
603
        if ((m->n_in_gc_queue < GC_QUEUE_ENTRIES_MAX) &&
 
604
            (m->gc_queue_timestamp <= 0 ||
 
605
             (m->gc_queue_timestamp + GC_QUEUE_USEC_MAX) > now(CLOCK_MONOTONIC)))
 
606
                return 0;
 
607
 
 
608
        log_debug("Running GC...");
 
609
 
 
610
        m->gc_marker += _GC_OFFSET_MAX;
 
611
        if (m->gc_marker + _GC_OFFSET_MAX <= _GC_OFFSET_MAX)
 
612
                m->gc_marker = 1;
 
613
 
 
614
        gc_marker = m->gc_marker;
 
615
 
 
616
        while ((u = m->gc_queue)) {
 
617
                assert(u->in_gc_queue);
 
618
 
 
619
                unit_gc_sweep(u, gc_marker);
 
620
 
 
621
                LIST_REMOVE(Unit, gc_queue, m->gc_queue, u);
 
622
                u->in_gc_queue = false;
 
623
 
 
624
                n++;
 
625
 
 
626
                if (u->gc_marker == gc_marker + GC_OFFSET_BAD ||
 
627
                    u->gc_marker == gc_marker + GC_OFFSET_UNSURE) {
 
628
                        log_debug_unit(u->id, "Collecting %s", u->id);
 
629
                        u->gc_marker = gc_marker + GC_OFFSET_BAD;
 
630
                        unit_add_to_cleanup_queue(u);
 
631
                }
 
632
        }
 
633
 
 
634
        m->n_in_gc_queue = 0;
 
635
        m->gc_queue_timestamp = 0;
 
636
 
 
637
        return n;
 
638
}
 
639
 
 
640
static void manager_clear_jobs_and_units(Manager *m) {
 
641
        Unit *u;
 
642
 
 
643
        assert(m);
 
644
 
 
645
        while ((u = hashmap_first(m->units)))
 
646
                unit_free(u);
 
647
 
 
648
        manager_dispatch_cleanup_queue(m);
 
649
 
 
650
        assert(!m->load_queue);
 
651
        assert(!m->run_queue);
 
652
        assert(!m->dbus_unit_queue);
 
653
        assert(!m->dbus_job_queue);
 
654
        assert(!m->cleanup_queue);
 
655
        assert(!m->gc_queue);
 
656
 
 
657
        assert(hashmap_isempty(m->jobs));
 
658
        assert(hashmap_isempty(m->units));
 
659
 
 
660
        m->n_on_console = 0;
 
661
        m->n_running_jobs = 0;
 
662
}
 
663
 
 
664
void manager_free(Manager *m) {
 
665
        UnitType c;
 
666
        int i;
 
667
 
 
668
        assert(m);
 
669
 
 
670
        manager_clear_jobs_and_units(m);
 
671
 
 
672
        for (c = 0; c < _UNIT_TYPE_MAX; c++)
 
673
                if (unit_vtable[c]->shutdown)
 
674
                        unit_vtable[c]->shutdown(m);
 
675
 
 
676
        /* If we reexecute ourselves, we keep the root cgroup
 
677
         * around */
 
678
        manager_shutdown_cgroup(m, m->exit_code != MANAGER_REEXECUTE);
 
679
 
 
680
        manager_undo_generators(m);
 
681
 
 
682
        bus_done(m);
 
683
 
 
684
        hashmap_free(m->units);
 
685
        hashmap_free(m->jobs);
 
686
        hashmap_free(m->watch_pids);
 
687
        hashmap_free(m->watch_bus);
 
688
 
 
689
        if (m->epoll_fd >= 0)
 
690
                close_nointr_nofail(m->epoll_fd);
 
691
        if (m->signal_watch.fd >= 0)
 
692
                close_nointr_nofail(m->signal_watch.fd);
 
693
        if (m->notify_watch.fd >= 0)
 
694
                close_nointr_nofail(m->notify_watch.fd);
 
695
        if (m->time_change_watch.fd >= 0)
 
696
                close_nointr_nofail(m->time_change_watch.fd);
 
697
        if (m->jobs_in_progress_watch.fd >= 0)
 
698
                close_nointr_nofail(m->jobs_in_progress_watch.fd);
 
699
 
 
700
        free(m->notify_socket);
 
701
 
 
702
        lookup_paths_free(&m->lookup_paths);
 
703
        strv_free(m->environment);
 
704
 
 
705
        strv_free(m->default_controllers);
 
706
 
 
707
        hashmap_free(m->cgroup_bondings);
 
708
        set_free_free(m->unit_path_cache);
 
709
 
 
710
        close_pipe(m->idle_pipe);
 
711
 
 
712
        free(m->switch_root);
 
713
        free(m->switch_root_init);
 
714
 
 
715
        for (i = 0; i < RLIMIT_NLIMITS; i++)
 
716
                free(m->rlimit[i]);
 
717
 
 
718
        free(m);
 
719
}
 
720
 
 
721
int manager_enumerate(Manager *m) {
 
722
        int r = 0, q;
 
723
        UnitType c;
 
724
 
 
725
        assert(m);
 
726
 
 
727
        /* Let's ask every type to load all units from disk/kernel
 
728
         * that it might know */
 
729
        for (c = 0; c < _UNIT_TYPE_MAX; c++)
 
730
                if (unit_vtable[c]->enumerate)
 
731
                        if ((q = unit_vtable[c]->enumerate(m)) < 0)
 
732
                                r = q;
 
733
 
 
734
        manager_dispatch_load_queue(m);
 
735
        return r;
 
736
}
 
737
 
 
738
int manager_coldplug(Manager *m) {
 
739
        int r = 0, q;
 
740
        Iterator i;
 
741
        Unit *u;
 
742
        char *k;
 
743
 
 
744
        assert(m);
 
745
 
 
746
        /* Then, let's set up their initial state. */
 
747
        HASHMAP_FOREACH_KEY(u, k, m->units, i) {
 
748
 
 
749
                /* ignore aliases */
 
750
                if (u->id != k)
 
751
                        continue;
 
752
 
 
753
                if ((q = unit_coldplug(u)) < 0)
 
754
                        r = q;
 
755
        }
 
756
 
 
757
        return r;
 
758
}
 
759
 
 
760
static void manager_build_unit_path_cache(Manager *m) {
 
761
        char **i;
 
762
        _cleanup_free_ DIR *d = NULL;
 
763
        int r;
 
764
 
 
765
        assert(m);
 
766
 
 
767
        set_free_free(m->unit_path_cache);
 
768
 
 
769
        m->unit_path_cache = set_new(string_hash_func, string_compare_func);
 
770
        if (!m->unit_path_cache) {
 
771
                log_error("Failed to allocate unit path cache.");
 
772
                return;
 
773
        }
 
774
 
 
775
        /* This simply builds a list of files we know exist, so that
 
776
         * we don't always have to go to disk */
 
777
 
 
778
        STRV_FOREACH(i, m->lookup_paths.unit_path) {
 
779
                struct dirent *de;
 
780
 
 
781
                d = opendir(*i);
 
782
                if (!d) {
 
783
                        if (errno != ENOENT)
 
784
                                log_error("Failed to open directory %s: %m", *i);
 
785
                        continue;
 
786
                }
 
787
 
 
788
                while ((de = readdir(d))) {
 
789
                        char *p;
 
790
 
 
791
                        if (ignore_file(de->d_name))
 
792
                                continue;
 
793
 
 
794
                        p = strjoin(streq(*i, "/") ? "" : *i, "/", de->d_name, NULL);
 
795
                        if (!p) {
 
796
                                r = -ENOMEM;
 
797
                                goto fail;
 
798
                        }
 
799
 
 
800
                        r = set_consume(m->unit_path_cache, p);
 
801
                        if (r < 0)
 
802
                                goto fail;
 
803
                }
 
804
 
 
805
                closedir(d);
 
806
                d = NULL;
 
807
        }
 
808
 
 
809
        return;
 
810
 
 
811
fail:
 
812
        log_error("Failed to build unit path cache: %s", strerror(-r));
 
813
 
 
814
        set_free_free(m->unit_path_cache);
 
815
        m->unit_path_cache = NULL;
 
816
}
 
817
 
 
818
int manager_startup(Manager *m, FILE *serialization, FDSet *fds) {
 
819
        int r, q;
 
820
 
 
821
        assert(m);
 
822
 
 
823
        manager_run_generators(m);
 
824
 
 
825
        r = lookup_paths_init(
 
826
                        &m->lookup_paths, m->running_as, true,
 
827
                        m->generator_unit_path,
 
828
                        m->generator_unit_path_early,
 
829
                        m->generator_unit_path_late);
 
830
        if (r < 0)
 
831
                return r;
 
832
 
 
833
        manager_build_unit_path_cache(m);
 
834
 
 
835
        /* If we will deserialize make sure that during enumeration
 
836
         * this is already known, so we increase the counter here
 
837
         * already */
 
838
        if (serialization)
 
839
                m->n_reloading ++;
 
840
 
 
841
        /* First, enumerate what we can from all config files */
 
842
        r = manager_enumerate(m);
 
843
 
 
844
        /* Second, deserialize if there is something to deserialize */
 
845
        if (serialization) {
 
846
                q = manager_deserialize(m, serialization, fds);
 
847
                if (q < 0)
 
848
                        r = q;
 
849
        }
 
850
 
 
851
        /* Any fds left? Find some unit which wants them. This is
 
852
         * useful to allow container managers to pass some file
 
853
         * descriptors to us pre-initialized. This enables
 
854
         * socket-based activation of entire containers. */
 
855
        if (fdset_size(fds) > 0) {
 
856
                q = manager_distribute_fds(m, fds);
 
857
                if (q < 0)
 
858
                        r = q;
 
859
        }
 
860
 
 
861
        /* Third, fire things up! */
 
862
        q = manager_coldplug(m);
 
863
        if (q < 0)
 
864
                r = q;
 
865
 
 
866
        if (serialization) {
 
867
                assert(m->n_reloading > 0);
 
868
                m->n_reloading --;
 
869
        }
 
870
 
 
871
        return r;
 
872
}
 
873
 
 
874
int manager_add_job(Manager *m, JobType type, Unit *unit, JobMode mode, bool override, DBusError *e, Job **_ret) {
 
875
        int r;
 
876
        Transaction *tr;
 
877
 
 
878
        assert(m);
 
879
        assert(type < _JOB_TYPE_MAX);
 
880
        assert(unit);
 
881
        assert(mode < _JOB_MODE_MAX);
 
882
 
 
883
        if (mode == JOB_ISOLATE && type != JOB_START) {
 
884
                dbus_set_error(e, BUS_ERROR_INVALID_JOB_MODE, "Isolate is only valid for start.");
 
885
                return -EINVAL;
 
886
        }
 
887
 
 
888
        if (mode == JOB_ISOLATE && !unit->allow_isolate) {
 
889
                dbus_set_error(e, BUS_ERROR_NO_ISOLATION, "Operation refused, unit may not be isolated.");
 
890
                return -EPERM;
 
891
        }
 
892
 
 
893
        log_debug_unit(unit->id,
 
894
                       "Trying to enqueue job %s/%s/%s", unit->id,
 
895
                       job_type_to_string(type), job_mode_to_string(mode));
 
896
 
 
897
        job_type_collapse(&type, unit);
 
898
 
 
899
        tr = transaction_new(mode == JOB_REPLACE_IRREVERSIBLY);
 
900
        if (!tr)
 
901
                return -ENOMEM;
 
902
 
 
903
        r = transaction_add_job_and_dependencies(tr, type, unit, NULL, true, override, false,
 
904
                                                 mode == JOB_IGNORE_DEPENDENCIES || mode == JOB_IGNORE_REQUIREMENTS,
 
905
                                                 mode == JOB_IGNORE_DEPENDENCIES, e);
 
906
        if (r < 0)
 
907
                goto tr_abort;
 
908
 
 
909
        if (mode == JOB_ISOLATE) {
 
910
                r = transaction_add_isolate_jobs(tr, m);
 
911
                if (r < 0)
 
912
                        goto tr_abort;
 
913
        }
 
914
 
 
915
        r = transaction_activate(tr, m, mode, e);
 
916
        if (r < 0)
 
917
                goto tr_abort;
 
918
 
 
919
        log_debug_unit(unit->id,
 
920
                       "Enqueued job %s/%s as %u", unit->id,
 
921
                       job_type_to_string(type), (unsigned) tr->anchor_job->id);
 
922
 
 
923
        if (_ret)
 
924
                *_ret = tr->anchor_job;
 
925
 
 
926
        transaction_free(tr);
 
927
        return 0;
 
928
 
 
929
tr_abort:
 
930
        transaction_abort(tr);
 
931
        transaction_free(tr);
 
932
        return r;
 
933
}
 
934
 
 
935
int manager_add_job_by_name(Manager *m, JobType type, const char *name, JobMode mode, bool override, DBusError *e, Job **_ret) {
 
936
        Unit *unit;
 
937
        int r;
 
938
 
 
939
        assert(m);
 
940
        assert(type < _JOB_TYPE_MAX);
 
941
        assert(name);
 
942
        assert(mode < _JOB_MODE_MAX);
 
943
 
 
944
        r = manager_load_unit(m, name, NULL, NULL, &unit);
 
945
        if (r < 0)
 
946
                return r;
 
947
 
 
948
        return manager_add_job(m, type, unit, mode, override, e, _ret);
 
949
}
 
950
 
 
951
Job *manager_get_job(Manager *m, uint32_t id) {
 
952
        assert(m);
 
953
 
 
954
        return hashmap_get(m->jobs, UINT32_TO_PTR(id));
 
955
}
 
956
 
 
957
Unit *manager_get_unit(Manager *m, const char *name) {
 
958
        assert(m);
 
959
        assert(name);
 
960
 
 
961
        return hashmap_get(m->units, name);
 
962
}
 
963
 
 
964
unsigned manager_dispatch_load_queue(Manager *m) {
 
965
        Unit *u;
 
966
        unsigned n = 0;
 
967
 
 
968
        assert(m);
 
969
 
 
970
        /* Make sure we are not run recursively */
 
971
        if (m->dispatching_load_queue)
 
972
                return 0;
 
973
 
 
974
        m->dispatching_load_queue = true;
 
975
 
 
976
        /* Dispatches the load queue. Takes a unit from the queue and
 
977
         * tries to load its data until the queue is empty */
 
978
 
 
979
        while ((u = m->load_queue)) {
 
980
                assert(u->in_load_queue);
 
981
 
 
982
                unit_load(u);
 
983
                n++;
 
984
        }
 
985
 
 
986
        m->dispatching_load_queue = false;
 
987
        return n;
 
988
}
 
989
 
 
990
int manager_load_unit_prepare(Manager *m, const char *name, const char *path, DBusError *e, Unit **_ret) {
 
991
        Unit *ret;
 
992
        UnitType t;
 
993
        int r;
 
994
 
 
995
        assert(m);
 
996
        assert(name || path);
 
997
 
 
998
        /* This will prepare the unit for loading, but not actually
 
999
         * load anything from disk. */
 
1000
 
 
1001
        if (path && !is_path(path)) {
 
1002
                dbus_set_error(e, BUS_ERROR_INVALID_PATH, "Path %s is not absolute.", path);
 
1003
                return -EINVAL;
 
1004
        }
 
1005
 
 
1006
        if (!name)
 
1007
                name = path_get_file_name(path);
 
1008
 
 
1009
        t = unit_name_to_type(name);
 
1010
 
 
1011
        if (t == _UNIT_TYPE_INVALID || !unit_name_is_valid(name, false)) {
 
1012
                dbus_set_error(e, BUS_ERROR_INVALID_NAME, "Unit name %s is not valid.", name);
 
1013
                return -EINVAL;
 
1014
        }
 
1015
 
 
1016
        ret = manager_get_unit(m, name);
 
1017
        if (ret) {
 
1018
                *_ret = ret;
 
1019
                return 1;
 
1020
        }
 
1021
 
 
1022
        ret = unit_new(m, unit_vtable[t]->object_size);
 
1023
        if (!ret)
 
1024
                return -ENOMEM;
 
1025
 
 
1026
        if (path) {
 
1027
                ret->fragment_path = strdup(path);
 
1028
                if (!ret->fragment_path) {
 
1029
                        unit_free(ret);
 
1030
                        return -ENOMEM;
 
1031
                }
 
1032
        }
 
1033
 
 
1034
        if ((r = unit_add_name(ret, name)) < 0) {
 
1035
                unit_free(ret);
 
1036
                return r;
 
1037
        }
 
1038
 
 
1039
        unit_add_to_load_queue(ret);
 
1040
        unit_add_to_dbus_queue(ret);
 
1041
        unit_add_to_gc_queue(ret);
 
1042
 
 
1043
        if (_ret)
 
1044
                *_ret = ret;
 
1045
 
 
1046
        return 0;
 
1047
}
 
1048
 
 
1049
int manager_load_unit(Manager *m, const char *name, const char *path, DBusError *e, Unit **_ret) {
 
1050
        int r;
 
1051
 
 
1052
        assert(m);
 
1053
 
 
1054
        /* This will load the service information files, but not actually
 
1055
         * start any services or anything. */
 
1056
 
 
1057
        r = manager_load_unit_prepare(m, name, path, e, _ret);
 
1058
        if (r != 0)
 
1059
                return r;
 
1060
 
 
1061
        manager_dispatch_load_queue(m);
 
1062
 
 
1063
        if (_ret)
 
1064
                *_ret = unit_follow_merge(*_ret);
 
1065
 
 
1066
        return 0;
 
1067
}
 
1068
 
 
1069
void manager_dump_jobs(Manager *s, FILE *f, const char *prefix) {
 
1070
        Iterator i;
 
1071
        Job *j;
 
1072
 
 
1073
        assert(s);
 
1074
        assert(f);
 
1075
 
 
1076
        HASHMAP_FOREACH(j, s->jobs, i)
 
1077
                job_dump(j, f, prefix);
 
1078
}
 
1079
 
 
1080
void manager_dump_units(Manager *s, FILE *f, const char *prefix) {
 
1081
        Iterator i;
 
1082
        Unit *u;
 
1083
        const char *t;
 
1084
 
 
1085
        assert(s);
 
1086
        assert(f);
 
1087
 
 
1088
        HASHMAP_FOREACH_KEY(u, t, s->units, i)
 
1089
                if (u->id == t)
 
1090
                        unit_dump(u, f, prefix);
 
1091
}
 
1092
 
 
1093
void manager_clear_jobs(Manager *m) {
 
1094
        Job *j;
 
1095
 
 
1096
        assert(m);
 
1097
 
 
1098
        while ((j = hashmap_first(m->jobs)))
 
1099
                /* No need to recurse. We're cancelling all jobs. */
 
1100
                job_finish_and_invalidate(j, JOB_CANCELED, false);
 
1101
}
 
1102
 
 
1103
unsigned manager_dispatch_run_queue(Manager *m) {
 
1104
        Job *j;
 
1105
        unsigned n = 0;
 
1106
 
 
1107
        if (m->dispatching_run_queue)
 
1108
                return 0;
 
1109
 
 
1110
        m->dispatching_run_queue = true;
 
1111
 
 
1112
        while ((j = m->run_queue)) {
 
1113
                assert(j->installed);
 
1114
                assert(j->in_run_queue);
 
1115
 
 
1116
                job_run_and_invalidate(j);
 
1117
                n++;
 
1118
        }
 
1119
 
 
1120
        m->dispatching_run_queue = false;
 
1121
 
 
1122
        if (m->n_running_jobs > 0)
 
1123
                manager_watch_jobs_in_progress(m);
 
1124
 
 
1125
        return n;
 
1126
}
 
1127
 
 
1128
unsigned manager_dispatch_dbus_queue(Manager *m) {
 
1129
        Job *j;
 
1130
        Unit *u;
 
1131
        unsigned n = 0;
 
1132
 
 
1133
        assert(m);
 
1134
 
 
1135
        if (m->dispatching_dbus_queue)
 
1136
                return 0;
 
1137
 
 
1138
        m->dispatching_dbus_queue = true;
 
1139
 
 
1140
        while ((u = m->dbus_unit_queue)) {
 
1141
                assert(u->in_dbus_queue);
 
1142
 
 
1143
                bus_unit_send_change_signal(u);
 
1144
                n++;
 
1145
        }
 
1146
 
 
1147
        while ((j = m->dbus_job_queue)) {
 
1148
                assert(j->in_dbus_queue);
 
1149
 
 
1150
                bus_job_send_change_signal(j);
 
1151
                n++;
 
1152
        }
 
1153
 
 
1154
        m->dispatching_dbus_queue = false;
 
1155
        return n;
 
1156
}
 
1157
 
 
1158
static int manager_process_notify_fd(Manager *m) {
 
1159
        ssize_t n;
 
1160
 
 
1161
        assert(m);
 
1162
 
 
1163
        for (;;) {
 
1164
                char buf[4096];
 
1165
                struct iovec iovec = {
 
1166
                        .iov_base = buf,
 
1167
                        .iov_len = sizeof(buf)-1,
 
1168
                };
 
1169
 
 
1170
                union {
 
1171
                        struct cmsghdr cmsghdr;
 
1172
                        uint8_t buf[CMSG_SPACE(sizeof(struct ucred))];
 
1173
                } control = {};
 
1174
 
 
1175
                struct msghdr msghdr = {
 
1176
                        .msg_iov = &iovec,
 
1177
                        .msg_iovlen = 1,
 
1178
                        .msg_control = &control,
 
1179
                        .msg_controllen = sizeof(control),
 
1180
                };
 
1181
                struct ucred *ucred;
 
1182
                Unit *u;
 
1183
                _cleanup_strv_free_ char **tags = NULL;
 
1184
 
 
1185
                n = recvmsg(m->notify_watch.fd, &msghdr, MSG_DONTWAIT);
 
1186
                if (n <= 0) {
 
1187
                        if (n == 0)
 
1188
                                return -EIO;
 
1189
 
 
1190
                        if (errno == EAGAIN || errno == EINTR)
 
1191
                                break;
 
1192
 
 
1193
                        return -errno;
 
1194
                }
 
1195
 
 
1196
                if (msghdr.msg_controllen < CMSG_LEN(sizeof(struct ucred)) ||
 
1197
                    control.cmsghdr.cmsg_level != SOL_SOCKET ||
 
1198
                    control.cmsghdr.cmsg_type != SCM_CREDENTIALS ||
 
1199
                    control.cmsghdr.cmsg_len != CMSG_LEN(sizeof(struct ucred))) {
 
1200
                        log_warning("Received notify message without credentials. Ignoring.");
 
1201
                        continue;
 
1202
                }
 
1203
 
 
1204
                ucred = (struct ucred*) CMSG_DATA(&control.cmsghdr);
 
1205
 
 
1206
                u = hashmap_get(m->watch_pids, LONG_TO_PTR(ucred->pid));
 
1207
                if (!u) {
 
1208
                        u = cgroup_unit_by_pid(m, ucred->pid);
 
1209
                        if (!u) {
 
1210
                                log_warning("Cannot find unit for notify message of PID %lu.", (unsigned long) ucred->pid);
 
1211
                                continue;
 
1212
                        }
 
1213
                }
 
1214
 
 
1215
                assert((size_t) n < sizeof(buf));
 
1216
                buf[n] = 0;
 
1217
                tags = strv_split(buf, "\n\r");
 
1218
                if (!tags)
 
1219
                        return log_oom();
 
1220
 
 
1221
                log_debug_unit(u->id, "Got notification message for unit %s", u->id);
 
1222
 
 
1223
                if (UNIT_VTABLE(u)->notify_message)
 
1224
                        UNIT_VTABLE(u)->notify_message(u, ucred->pid, tags);
 
1225
        }
 
1226
 
 
1227
        return 0;
 
1228
}
 
1229
 
 
1230
static int manager_dispatch_sigchld(Manager *m) {
 
1231
        assert(m);
 
1232
 
 
1233
        for (;;) {
 
1234
                siginfo_t si = {};
 
1235
                Unit *u;
 
1236
                int r;
 
1237
 
 
1238
                /* First we call waitd() for a PID and do not reap the
 
1239
                 * zombie. That way we can still access /proc/$PID for
 
1240
                 * it while it is a zombie. */
 
1241
                if (waitid(P_ALL, 0, &si, WEXITED|WNOHANG|WNOWAIT) < 0) {
 
1242
 
 
1243
                        if (errno == ECHILD)
 
1244
                                break;
 
1245
 
 
1246
                        if (errno == EINTR)
 
1247
                                continue;
 
1248
 
 
1249
                        return -errno;
 
1250
                }
 
1251
 
 
1252
                if (si.si_pid <= 0)
 
1253
                        break;
 
1254
 
 
1255
                if (si.si_code == CLD_EXITED || si.si_code == CLD_KILLED || si.si_code == CLD_DUMPED) {
 
1256
                        _cleanup_free_ char *name = NULL;
 
1257
 
 
1258
                        get_process_comm(si.si_pid, &name);
 
1259
                        log_debug("Got SIGCHLD for process %lu (%s)", (unsigned long) si.si_pid, strna(name));
 
1260
                }
 
1261
 
 
1262
                /* Let's flush any message the dying child might still
 
1263
                 * have queued for us. This ensures that the process
 
1264
                 * still exists in /proc so that we can figure out
 
1265
                 * which cgroup and hence unit it belongs to. */
 
1266
                r = manager_process_notify_fd(m);
 
1267
                if (r < 0)
 
1268
                        return r;
 
1269
 
 
1270
                /* And now figure out the unit this belongs to */
 
1271
                u = hashmap_get(m->watch_pids, LONG_TO_PTR(si.si_pid));
 
1272
                if (!u)
 
1273
                        u = cgroup_unit_by_pid(m, si.si_pid);
 
1274
 
 
1275
                /* And now, we actually reap the zombie. */
 
1276
                if (waitid(P_PID, si.si_pid, &si, WEXITED) < 0) {
 
1277
                        if (errno == EINTR)
 
1278
                                continue;
 
1279
 
 
1280
                        return -errno;
 
1281
                }
 
1282
 
 
1283
                if (si.si_code != CLD_EXITED && si.si_code != CLD_KILLED && si.si_code != CLD_DUMPED)
 
1284
                        continue;
 
1285
 
 
1286
                log_debug("Child %lu died (code=%s, status=%i/%s)",
 
1287
                          (long unsigned) si.si_pid,
 
1288
                          sigchld_code_to_string(si.si_code),
 
1289
                          si.si_status,
 
1290
                          strna(si.si_code == CLD_EXITED
 
1291
                                ? exit_status_to_string(si.si_status, EXIT_STATUS_FULL)
 
1292
                                : signal_to_string(si.si_status)));
 
1293
 
 
1294
                if (!u)
 
1295
                        continue;
 
1296
 
 
1297
                log_debug_unit(u->id,
 
1298
                               "Child %lu belongs to %s", (long unsigned) si.si_pid, u->id);
 
1299
 
 
1300
                hashmap_remove(m->watch_pids, LONG_TO_PTR(si.si_pid));
 
1301
                UNIT_VTABLE(u)->sigchld_event(u, si.si_pid, si.si_code, si.si_status);
 
1302
        }
 
1303
 
 
1304
        return 0;
 
1305
}
 
1306
 
 
1307
static int manager_start_target(Manager *m, const char *name, JobMode mode) {
 
1308
        int r;
 
1309
        DBusError error;
 
1310
 
 
1311
        dbus_error_init(&error);
 
1312
 
 
1313
        log_debug_unit(name, "Activating special unit %s", name);
 
1314
 
 
1315
        r = manager_add_job_by_name(m, JOB_START, name, mode, true, &error, NULL);
 
1316
        if (r < 0)
 
1317
                log_error_unit(name,
 
1318
                               "Failed to enqueue %s job: %s", name, bus_error(&error, r));
 
1319
 
 
1320
        dbus_error_free(&error);
 
1321
 
 
1322
        return r;
 
1323
}
 
1324
 
 
1325
static int manager_process_signal_fd(Manager *m) {
 
1326
        ssize_t n;
 
1327
        struct signalfd_siginfo sfsi;
 
1328
        bool sigchld = false;
 
1329
 
 
1330
        assert(m);
 
1331
 
 
1332
        for (;;) {
 
1333
                n = read(m->signal_watch.fd, &sfsi, sizeof(sfsi));
 
1334
                if (n != sizeof(sfsi)) {
 
1335
 
 
1336
                        if (n >= 0)
 
1337
                                return -EIO;
 
1338
 
 
1339
                        if (errno == EINTR || errno == EAGAIN)
 
1340
                                break;
 
1341
 
 
1342
                        return -errno;
 
1343
                }
 
1344
 
 
1345
                if (sfsi.ssi_pid > 0) {
 
1346
                        char *p = NULL;
 
1347
 
 
1348
                        get_process_comm(sfsi.ssi_pid, &p);
 
1349
 
 
1350
                        log_debug("Received SIG%s from PID %lu (%s).",
 
1351
                                  signal_to_string(sfsi.ssi_signo),
 
1352
                                  (unsigned long) sfsi.ssi_pid, strna(p));
 
1353
                        free(p);
 
1354
                } else
 
1355
                        log_debug("Received SIG%s.", signal_to_string(sfsi.ssi_signo));
 
1356
 
 
1357
                switch (sfsi.ssi_signo) {
 
1358
 
 
1359
                case SIGCHLD:
 
1360
                        sigchld = true;
 
1361
                        break;
 
1362
 
 
1363
                case SIGTERM:
 
1364
                        if (m->running_as == SYSTEMD_SYSTEM) {
 
1365
                                /* This is for compatibility with the
 
1366
                                 * original sysvinit */
 
1367
                                m->exit_code = MANAGER_REEXECUTE;
 
1368
                                break;
 
1369
                        }
 
1370
 
 
1371
                        /* Fall through */
 
1372
 
 
1373
                case SIGINT:
 
1374
                        if (m->running_as == SYSTEMD_SYSTEM) {
 
1375
                                manager_start_target(m, SPECIAL_CTRL_ALT_DEL_TARGET, JOB_REPLACE_IRREVERSIBLY);
 
1376
                                break;
 
1377
                        }
 
1378
 
 
1379
                        /* Run the exit target if there is one, if not, just exit. */
 
1380
                        if (manager_start_target(m, SPECIAL_EXIT_TARGET, JOB_REPLACE) < 0) {
 
1381
                                m->exit_code = MANAGER_EXIT;
 
1382
                                return 0;
 
1383
                        }
 
1384
 
 
1385
                        break;
 
1386
 
 
1387
                case SIGWINCH:
 
1388
                        if (m->running_as == SYSTEMD_SYSTEM)
 
1389
                                manager_start_target(m, SPECIAL_KBREQUEST_TARGET, JOB_REPLACE);
 
1390
 
 
1391
                        /* This is a nop on non-init */
 
1392
                        break;
 
1393
 
 
1394
                case SIGPWR:
 
1395
                        if (m->running_as == SYSTEMD_SYSTEM)
 
1396
                                manager_start_target(m, SPECIAL_SIGPWR_TARGET, JOB_REPLACE);
 
1397
 
 
1398
                        /* This is a nop on non-init */
 
1399
                        break;
 
1400
 
 
1401
                case SIGUSR1: {
 
1402
                        Unit *u;
 
1403
 
 
1404
                        u = manager_get_unit(m, SPECIAL_DBUS_SERVICE);
 
1405
 
 
1406
                        if (!u || UNIT_IS_ACTIVE_OR_RELOADING(unit_active_state(u))) {
 
1407
                                log_info("Trying to reconnect to bus...");
 
1408
                                bus_init(m, true);
 
1409
                        }
 
1410
 
 
1411
                        if (!u || !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u))) {
 
1412
                                log_info("Loading D-Bus service...");
 
1413
                                manager_start_target(m, SPECIAL_DBUS_SERVICE, JOB_REPLACE);
 
1414
                        }
 
1415
 
 
1416
                        break;
 
1417
                }
 
1418
 
 
1419
                case SIGUSR2: {
 
1420
                        FILE *f;
 
1421
                        char *dump = NULL;
 
1422
                        size_t size;
 
1423
 
 
1424
                        if (!(f = open_memstream(&dump, &size))) {
 
1425
                                log_warning("Failed to allocate memory stream.");
 
1426
                                break;
 
1427
                        }
 
1428
 
 
1429
                        manager_dump_units(m, f, "\t");
 
1430
                        manager_dump_jobs(m, f, "\t");
 
1431
 
 
1432
                        if (ferror(f)) {
 
1433
                                fclose(f);
 
1434
                                free(dump);
 
1435
                                log_warning("Failed to write status stream");
 
1436
                                break;
 
1437
                        }
 
1438
 
 
1439
                        fclose(f);
 
1440
                        log_dump(LOG_INFO, dump);
 
1441
                        free(dump);
 
1442
 
 
1443
                        break;
 
1444
                }
 
1445
 
 
1446
                case SIGHUP:
 
1447
                        m->exit_code = MANAGER_RELOAD;
 
1448
                        break;
 
1449
 
 
1450
                default: {
 
1451
 
 
1452
                        /* Starting SIGRTMIN+0 */
 
1453
                        static const char * const target_table[] = {
 
1454
                                [0] = SPECIAL_DEFAULT_TARGET,
 
1455
                                [1] = SPECIAL_RESCUE_TARGET,
 
1456
                                [2] = SPECIAL_EMERGENCY_TARGET,
 
1457
                                [3] = SPECIAL_HALT_TARGET,
 
1458
                                [4] = SPECIAL_POWEROFF_TARGET,
 
1459
                                [5] = SPECIAL_REBOOT_TARGET,
 
1460
                                [6] = SPECIAL_KEXEC_TARGET
 
1461
                        };
 
1462
 
 
1463
                        /* Starting SIGRTMIN+13, so that target halt and system halt are 10 apart */
 
1464
                        static const ManagerExitCode code_table[] = {
 
1465
                                [0] = MANAGER_HALT,
 
1466
                                [1] = MANAGER_POWEROFF,
 
1467
                                [2] = MANAGER_REBOOT,
 
1468
                                [3] = MANAGER_KEXEC
 
1469
                        };
 
1470
 
 
1471
                        if ((int) sfsi.ssi_signo >= SIGRTMIN+0 &&
 
1472
                            (int) sfsi.ssi_signo < SIGRTMIN+(int) ELEMENTSOF(target_table)) {
 
1473
                                int idx = (int) sfsi.ssi_signo - SIGRTMIN;
 
1474
                                manager_start_target(m, target_table[idx],
 
1475
                                                     (idx == 1 || idx == 2) ? JOB_ISOLATE : JOB_REPLACE);
 
1476
                                break;
 
1477
                        }
 
1478
 
 
1479
                        if ((int) sfsi.ssi_signo >= SIGRTMIN+13 &&
 
1480
                            (int) sfsi.ssi_signo < SIGRTMIN+13+(int) ELEMENTSOF(code_table)) {
 
1481
                                m->exit_code = code_table[sfsi.ssi_signo - SIGRTMIN - 13];
 
1482
                                break;
 
1483
                        }
 
1484
 
 
1485
                        switch (sfsi.ssi_signo - SIGRTMIN) {
 
1486
 
 
1487
                        case 20:
 
1488
                                log_debug("Enabling showing of status.");
 
1489
                                manager_set_show_status(m, true);
 
1490
                                break;
 
1491
 
 
1492
                        case 21:
 
1493
                                log_debug("Disabling showing of status.");
 
1494
                                manager_set_show_status(m, false);
 
1495
                                break;
 
1496
 
 
1497
                        case 22:
 
1498
                                log_set_max_level(LOG_DEBUG);
 
1499
                                log_notice("Setting log level to debug.");
 
1500
                                break;
 
1501
 
 
1502
                        case 23:
 
1503
                                log_set_max_level(LOG_INFO);
 
1504
                                log_notice("Setting log level to info.");
 
1505
                                break;
 
1506
 
 
1507
                        case 24:
 
1508
                                if (m->running_as == SYSTEMD_USER) {
 
1509
                                        m->exit_code = MANAGER_EXIT;
 
1510
                                        return 0;
 
1511
                                }
 
1512
 
 
1513
                                /* This is a nop on init */
 
1514
                                break;
 
1515
 
 
1516
                        case 26:
 
1517
                                log_set_target(LOG_TARGET_JOURNAL_OR_KMSG);
 
1518
                                log_notice("Setting log target to journal-or-kmsg.");
 
1519
                                break;
 
1520
 
 
1521
                        case 27:
 
1522
                                log_set_target(LOG_TARGET_CONSOLE);
 
1523
                                log_notice("Setting log target to console.");
 
1524
                                break;
 
1525
 
 
1526
                        case 28:
 
1527
                                log_set_target(LOG_TARGET_KMSG);
 
1528
                                log_notice("Setting log target to kmsg.");
 
1529
                                break;
 
1530
 
 
1531
                        case 29:
 
1532
                                log_set_target(LOG_TARGET_SYSLOG_OR_KMSG);
 
1533
                                log_notice("Setting log target to syslog-or-kmsg.");
 
1534
                                break;
 
1535
 
 
1536
                        default:
 
1537
                                log_warning("Got unhandled signal <%s>.", signal_to_string(sfsi.ssi_signo));
 
1538
                        }
 
1539
                }
 
1540
                }
 
1541
        }
 
1542
 
 
1543
        if (sigchld)
 
1544
                return manager_dispatch_sigchld(m);
 
1545
 
 
1546
        return 0;
 
1547
}
 
1548
 
 
1549
static int process_event(Manager *m, struct epoll_event *ev) {
 
1550
        int r;
 
1551
        Watch *w;
 
1552
 
 
1553
        assert(m);
 
1554
        assert(ev);
 
1555
 
 
1556
        assert_se(w = ev->data.ptr);
 
1557
 
 
1558
        if (w->type == WATCH_INVALID)
 
1559
                return 0;
 
1560
 
 
1561
        switch (w->type) {
 
1562
 
 
1563
        case WATCH_SIGNAL:
 
1564
 
 
1565
                /* An incoming signal? */
 
1566
                if (ev->events != EPOLLIN)
 
1567
                        return -EINVAL;
 
1568
 
 
1569
                if ((r = manager_process_signal_fd(m)) < 0)
 
1570
                        return r;
 
1571
 
 
1572
                break;
 
1573
 
 
1574
        case WATCH_NOTIFY:
 
1575
 
 
1576
                /* An incoming daemon notification event? */
 
1577
                if (ev->events != EPOLLIN)
 
1578
                        return -EINVAL;
 
1579
 
 
1580
                if ((r = manager_process_notify_fd(m)) < 0)
 
1581
                        return r;
 
1582
 
 
1583
                break;
 
1584
 
 
1585
        case WATCH_FD:
 
1586
 
 
1587
                /* Some fd event, to be dispatched to the units */
 
1588
                UNIT_VTABLE(w->data.unit)->fd_event(w->data.unit, w->fd, ev->events, w);
 
1589
                break;
 
1590
 
 
1591
        case WATCH_UNIT_TIMER:
 
1592
        case WATCH_JOB_TIMER: {
 
1593
                uint64_t v;
 
1594
                ssize_t k;
 
1595
 
 
1596
                /* Some timer event, to be dispatched to the units */
 
1597
                k = read(w->fd, &v, sizeof(v));
 
1598
                if (k != sizeof(v)) {
 
1599
 
 
1600
                        if (k < 0 && (errno == EINTR || errno == EAGAIN))
 
1601
                                break;
 
1602
 
 
1603
                        log_error("Failed to read timer event counter: %s", k < 0 ? strerror(-k) : "Short read");
 
1604
                        return k < 0 ? -errno : -EIO;
 
1605
                }
 
1606
 
 
1607
                if (w->type == WATCH_UNIT_TIMER)
 
1608
                        UNIT_VTABLE(w->data.unit)->timer_event(w->data.unit, v, w);
 
1609
                else
 
1610
                        job_timer_event(w->data.job, v, w);
 
1611
                break;
 
1612
        }
 
1613
 
 
1614
        case WATCH_MOUNT:
 
1615
                /* Some mount table change, intended for the mount subsystem */
 
1616
                mount_fd_event(m, ev->events);
 
1617
                break;
 
1618
 
 
1619
        case WATCH_SWAP:
 
1620
                /* Some swap table change, intended for the swap subsystem */
 
1621
                swap_fd_event(m, ev->events);
 
1622
                break;
 
1623
 
 
1624
        case WATCH_UDEV:
 
1625
                /* Some notification from udev, intended for the device subsystem */
 
1626
                device_fd_event(m, ev->events);
 
1627
                break;
 
1628
 
 
1629
        case WATCH_DBUS_WATCH:
 
1630
                bus_watch_event(m, w, ev->events);
 
1631
                break;
 
1632
 
 
1633
        case WATCH_DBUS_TIMEOUT:
 
1634
                bus_timeout_event(m, w, ev->events);
 
1635
                break;
 
1636
 
 
1637
        case WATCH_TIME_CHANGE: {
 
1638
                Unit *u;
 
1639
                Iterator i;
 
1640
 
 
1641
                log_struct(LOG_INFO,
 
1642
                           MESSAGE_ID(SD_MESSAGE_TIME_CHANGE),
 
1643
                           "MESSAGE=Time has been changed",
 
1644
                           NULL);
 
1645
 
 
1646
                /* Restart the watch */
 
1647
                epoll_ctl(m->epoll_fd, EPOLL_CTL_DEL, m->time_change_watch.fd,
 
1648
                          NULL);
 
1649
                close_nointr_nofail(m->time_change_watch.fd);
 
1650
                watch_init(&m->time_change_watch);
 
1651
                manager_setup_time_change(m);
 
1652
 
 
1653
                HASHMAP_FOREACH(u, m->units, i) {
 
1654
                        if (UNIT_VTABLE(u)->time_change)
 
1655
                                UNIT_VTABLE(u)->time_change(u);
 
1656
                }
 
1657
 
 
1658
                break;
 
1659
        }
 
1660
 
 
1661
        case WATCH_JOBS_IN_PROGRESS: {
 
1662
                uint64_t v;
 
1663
 
 
1664
                /* not interested in the data */
 
1665
                read(w->fd, &v, sizeof(v));
 
1666
 
 
1667
                manager_print_jobs_in_progress(m);
 
1668
                break;
 
1669
        }
 
1670
 
 
1671
        default:
 
1672
                log_error("event type=%i", w->type);
 
1673
                assert_not_reached("Unknown epoll event type.");
 
1674
        }
 
1675
 
 
1676
        return 0;
 
1677
}
 
1678
 
 
1679
int manager_loop(Manager *m) {
 
1680
        int r;
 
1681
 
 
1682
        RATELIMIT_DEFINE(rl, 1*USEC_PER_SEC, 50000);
 
1683
 
 
1684
        assert(m);
 
1685
        m->exit_code = MANAGER_RUNNING;
 
1686
 
 
1687
        /* Release the path cache */
 
1688
        set_free_free(m->unit_path_cache);
 
1689
        m->unit_path_cache = NULL;
 
1690
 
 
1691
        manager_check_finished(m);
 
1692
 
 
1693
        /* There might still be some zombies hanging around from
 
1694
         * before we were exec()'ed. Leat's reap them */
 
1695
        r = manager_dispatch_sigchld(m);
 
1696
        if (r < 0)
 
1697
                return r;
 
1698
 
 
1699
        while (m->exit_code == MANAGER_RUNNING) {
 
1700
                struct epoll_event event;
 
1701
                int n;
 
1702
                int wait_msec = -1;
 
1703
 
 
1704
                if (m->runtime_watchdog > 0 && m->running_as == SYSTEMD_SYSTEM)
 
1705
                        watchdog_ping();
 
1706
 
 
1707
                if (!ratelimit_test(&rl)) {
 
1708
                        /* Yay, something is going seriously wrong, pause a little */
 
1709
                        log_warning("Looping too fast. Throttling execution a little.");
 
1710
                        sleep(1);
 
1711
                        continue;
 
1712
                }
 
1713
 
 
1714
                if (manager_dispatch_load_queue(m) > 0)
 
1715
                        continue;
 
1716
 
 
1717
                if (manager_dispatch_run_queue(m) > 0)
 
1718
                        continue;
 
1719
 
 
1720
                if (bus_dispatch(m) > 0)
 
1721
                        continue;
 
1722
 
 
1723
                if (manager_dispatch_cleanup_queue(m) > 0)
 
1724
                        continue;
 
1725
 
 
1726
                if (manager_dispatch_gc_queue(m) > 0)
 
1727
                        continue;
 
1728
 
 
1729
                if (manager_dispatch_dbus_queue(m) > 0)
 
1730
                        continue;
 
1731
 
 
1732
                if (swap_dispatch_reload(m) > 0)
 
1733
                        continue;
 
1734
 
 
1735
                /* Sleep for half the watchdog time */
 
1736
                if (m->runtime_watchdog > 0 && m->running_as == SYSTEMD_SYSTEM) {
 
1737
                        wait_msec = (int) (m->runtime_watchdog / 2 / USEC_PER_MSEC);
 
1738
                        if (wait_msec <= 0)
 
1739
                                wait_msec = 1;
 
1740
                } else
 
1741
                        wait_msec = -1;
 
1742
 
 
1743
                n = epoll_wait(m->epoll_fd, &event, 1, wait_msec);
 
1744
                if (n < 0) {
 
1745
 
 
1746
                        if (errno == EINTR)
 
1747
                                continue;
 
1748
 
 
1749
                        return -errno;
 
1750
                } else if (n == 0)
 
1751
                        continue;
 
1752
 
 
1753
                assert(n == 1);
 
1754
 
 
1755
                r = process_event(m, &event);
 
1756
                if (r < 0)
 
1757
                        return r;
 
1758
        }
 
1759
 
 
1760
        return m->exit_code;
 
1761
}
 
1762
 
 
1763
int manager_load_unit_from_dbus_path(Manager *m, const char *s, DBusError *e, Unit **_u) {
 
1764
        char *n;
 
1765
        Unit *u;
 
1766
        int r;
 
1767
 
 
1768
        assert(m);
 
1769
        assert(s);
 
1770
        assert(_u);
 
1771
 
 
1772
        if (!startswith(s, "/org/freedesktop/systemd1/unit/"))
 
1773
                return -EINVAL;
 
1774
 
 
1775
        n = bus_path_unescape(s+31);
 
1776
        if (!n)
 
1777
                return -ENOMEM;
 
1778
 
 
1779
        r = manager_load_unit(m, n, NULL, e, &u);
 
1780
        free(n);
 
1781
 
 
1782
        if (r < 0)
 
1783
                return r;
 
1784
 
 
1785
        *_u = u;
 
1786
 
 
1787
        return 0;
 
1788
}
 
1789
 
 
1790
int manager_get_job_from_dbus_path(Manager *m, const char *s, Job **_j) {
 
1791
        Job *j;
 
1792
        unsigned id;
 
1793
        int r;
 
1794
 
 
1795
        assert(m);
 
1796
        assert(s);
 
1797
        assert(_j);
 
1798
 
 
1799
        if (!startswith(s, "/org/freedesktop/systemd1/job/"))
 
1800
                return -EINVAL;
 
1801
 
 
1802
        r = safe_atou(s + 30, &id);
 
1803
        if (r < 0)
 
1804
                return r;
 
1805
 
 
1806
        j = manager_get_job(m, id);
 
1807
        if (!j)
 
1808
                return -ENOENT;
 
1809
 
 
1810
        *_j = j;
 
1811
 
 
1812
        return 0;
 
1813
}
 
1814
 
 
1815
void manager_send_unit_audit(Manager *m, Unit *u, int type, bool success) {
 
1816
 
 
1817
#ifdef HAVE_AUDIT
 
1818
        char *p;
 
1819
        int audit_fd;
 
1820
 
 
1821
        audit_fd = get_audit_fd();
 
1822
        if (audit_fd < 0)
 
1823
                return;
 
1824
 
 
1825
        /* Don't generate audit events if the service was already
 
1826
         * started and we're just deserializing */
 
1827
        if (m->n_reloading > 0)
 
1828
                return;
 
1829
 
 
1830
        if (m->running_as != SYSTEMD_SYSTEM)
 
1831
                return;
 
1832
 
 
1833
        if (u->type != UNIT_SERVICE)
 
1834
                return;
 
1835
 
 
1836
        p = unit_name_to_prefix_and_instance(u->id);
 
1837
        if (!p) {
 
1838
                log_error_unit(u->id,
 
1839
                               "Failed to allocate unit name for audit message: %s", strerror(ENOMEM));
 
1840
                return;
 
1841
        }
 
1842
 
 
1843
        if (audit_log_user_comm_message(audit_fd, type, "", p, NULL, NULL, NULL, success) < 0) {
 
1844
                if (errno == EPERM) {
 
1845
                        /* We aren't allowed to send audit messages?
 
1846
                         * Then let's not retry again. */
 
1847
                        close_audit_fd();
 
1848
                } else
 
1849
                        log_warning("Failed to send audit message: %m");
 
1850
        }
 
1851
 
 
1852
        free(p);
 
1853
#endif
 
1854
 
 
1855
}
 
1856
 
 
1857
void manager_send_unit_plymouth(Manager *m, Unit *u) {
 
1858
        int fd = -1;
 
1859
        union sockaddr_union sa;
 
1860
        int n = 0;
 
1861
        char *message = NULL;
 
1862
 
 
1863
        /* Don't generate plymouth events if the service was already
 
1864
         * started and we're just deserializing */
 
1865
        if (m->n_reloading > 0)
 
1866
                return;
 
1867
 
 
1868
        if (m->running_as != SYSTEMD_SYSTEM)
 
1869
                return;
 
1870
 
 
1871
        if (u->type != UNIT_SERVICE &&
 
1872
            u->type != UNIT_MOUNT &&
 
1873
            u->type != UNIT_SWAP)
 
1874
                return;
 
1875
 
 
1876
        /* We set SOCK_NONBLOCK here so that we rather drop the
 
1877
         * message then wait for plymouth */
 
1878
        fd = socket(AF_UNIX, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
 
1879
        if (fd < 0) {
 
1880
                log_error("socket() failed: %m");
 
1881
                return;
 
1882
        }
 
1883
 
 
1884
        zero(sa);
 
1885
        sa.sa.sa_family = AF_UNIX;
 
1886
        strncpy(sa.un.sun_path+1, "/org/freedesktop/plymouthd", sizeof(sa.un.sun_path)-1);
 
1887
        if (connect(fd, &sa.sa, offsetof(struct sockaddr_un, sun_path) + 1 + strlen(sa.un.sun_path+1)) < 0) {
 
1888
 
 
1889
                if (errno != EPIPE &&
 
1890
                    errno != EAGAIN &&
 
1891
                    errno != ENOENT &&
 
1892
                    errno != ECONNREFUSED &&
 
1893
                    errno != ECONNRESET &&
 
1894
                    errno != ECONNABORTED)
 
1895
                        log_error("connect() failed: %m");
 
1896
 
 
1897
                goto finish;
 
1898
        }
 
1899
 
 
1900
        if (asprintf(&message, "U\002%c%s%n", (int) (strlen(u->id) + 1), u->id, &n) < 0) {
 
1901
                log_oom();
 
1902
                goto finish;
 
1903
        }
 
1904
 
 
1905
        errno = 0;
 
1906
        if (write(fd, message, n + 1) != n + 1) {
 
1907
 
 
1908
                if (errno != EPIPE &&
 
1909
                    errno != EAGAIN &&
 
1910
                    errno != ENOENT &&
 
1911
                    errno != ECONNREFUSED &&
 
1912
                    errno != ECONNRESET &&
 
1913
                    errno != ECONNABORTED)
 
1914
                        log_error("Failed to write Plymouth message: %m");
 
1915
 
 
1916
                goto finish;
 
1917
        }
 
1918
 
 
1919
finish:
 
1920
        if (fd >= 0)
 
1921
                close_nointr_nofail(fd);
 
1922
 
 
1923
        free(message);
 
1924
}
 
1925
 
 
1926
void manager_dispatch_bus_name_owner_changed(
 
1927
                Manager *m,
 
1928
                const char *name,
 
1929
                const char* old_owner,
 
1930
                const char *new_owner) {
 
1931
 
 
1932
        Unit *u;
 
1933
 
 
1934
        assert(m);
 
1935
        assert(name);
 
1936
 
 
1937
        if (!(u = hashmap_get(m->watch_bus, name)))
 
1938
                return;
 
1939
 
 
1940
        UNIT_VTABLE(u)->bus_name_owner_change(u, name, old_owner, new_owner);
 
1941
}
 
1942
 
 
1943
void manager_dispatch_bus_query_pid_done(
 
1944
                Manager *m,
 
1945
                const char *name,
 
1946
                pid_t pid) {
 
1947
 
 
1948
        Unit *u;
 
1949
 
 
1950
        assert(m);
 
1951
        assert(name);
 
1952
        assert(pid >= 1);
 
1953
 
 
1954
        if (!(u = hashmap_get(m->watch_bus, name)))
 
1955
                return;
 
1956
 
 
1957
        UNIT_VTABLE(u)->bus_query_pid_done(u, name, pid);
 
1958
}
 
1959
 
 
1960
int manager_open_serialization(Manager *m, FILE **_f) {
 
1961
        char *path = NULL;
 
1962
        int fd;
 
1963
        FILE *f;
 
1964
 
 
1965
        assert(_f);
 
1966
 
 
1967
        if (m->running_as == SYSTEMD_SYSTEM)
 
1968
                asprintf(&path, "/run/systemd/dump-%lu-XXXXXX", (unsigned long) getpid());
 
1969
        else
 
1970
                asprintf(&path, "/tmp/systemd-dump-%lu-XXXXXX", (unsigned long) getpid());
 
1971
 
 
1972
        if (!path)
 
1973
                return -ENOMEM;
 
1974
 
 
1975
        RUN_WITH_UMASK(0077) {
 
1976
                fd = mkostemp(path, O_RDWR|O_CLOEXEC);
 
1977
        }
 
1978
 
 
1979
        if (fd < 0) {
 
1980
                free(path);
 
1981
                return -errno;
 
1982
        }
 
1983
 
 
1984
        unlink(path);
 
1985
 
 
1986
        log_debug("Serializing state to %s", path);
 
1987
        free(path);
 
1988
 
 
1989
        f = fdopen(fd, "w+");
 
1990
        if (!f)
 
1991
                return -errno;
 
1992
 
 
1993
        *_f = f;
 
1994
 
 
1995
        return 0;
 
1996
}
 
1997
 
 
1998
int manager_serialize(Manager *m, FILE *f, FDSet *fds, bool switching_root) {
 
1999
        Iterator i;
 
2000
        Unit *u;
 
2001
        const char *t;
 
2002
        char **e;
 
2003
        int r;
 
2004
 
 
2005
        assert(m);
 
2006
        assert(f);
 
2007
        assert(fds);
 
2008
 
 
2009
        m->n_reloading ++;
 
2010
 
 
2011
        fprintf(f, "current-job-id=%i\n", m->current_job_id);
 
2012
        fprintf(f, "taint-usr=%s\n", yes_no(m->taint_usr));
 
2013
        fprintf(f, "n-installed-jobs=%u\n", m->n_installed_jobs);
 
2014
        fprintf(f, "n-failed-jobs=%u\n", m->n_failed_jobs);
 
2015
 
 
2016
        dual_timestamp_serialize(f, "firmware-timestamp", &m->firmware_timestamp);
 
2017
        dual_timestamp_serialize(f, "kernel-timestamp", &m->kernel_timestamp);
 
2018
        dual_timestamp_serialize(f, "loader-timestamp", &m->loader_timestamp);
 
2019
        dual_timestamp_serialize(f, "initrd-timestamp", &m->initrd_timestamp);
 
2020
 
 
2021
        if (!in_initrd()) {
 
2022
                dual_timestamp_serialize(f, "userspace-timestamp", &m->userspace_timestamp);
 
2023
                dual_timestamp_serialize(f, "finish-timestamp", &m->finish_timestamp);
 
2024
        }
 
2025
 
 
2026
        if (!switching_root) {
 
2027
                STRV_FOREACH(e, m->environment) {
 
2028
                        _cleanup_free_ char *ce;
 
2029
 
 
2030
                        ce = cescape(*e);
 
2031
                        if (ce)
 
2032
                                fprintf(f, "env=%s\n", *e);
 
2033
                }
 
2034
        }
 
2035
 
 
2036
        fputc('\n', f);
 
2037
 
 
2038
        HASHMAP_FOREACH_KEY(u, t, m->units, i) {
 
2039
                if (u->id != t)
 
2040
                        continue;
 
2041
 
 
2042
                if (!unit_can_serialize(u))
 
2043
                        continue;
 
2044
 
 
2045
                /* Start marker */
 
2046
                fputs(u->id, f);
 
2047
                fputc('\n', f);
 
2048
 
 
2049
                if ((r = unit_serialize(u, f, fds, !switching_root)) < 0) {
 
2050
                        m->n_reloading --;
 
2051
                        return r;
 
2052
                }
 
2053
        }
 
2054
 
 
2055
        assert(m->n_reloading > 0);
 
2056
        m->n_reloading --;
 
2057
 
 
2058
        if (ferror(f))
 
2059
                return -EIO;
 
2060
 
 
2061
        r = bus_fdset_add_all(m, fds);
 
2062
        if (r < 0)
 
2063
                return r;
 
2064
 
 
2065
        return 0;
 
2066
}
 
2067
 
 
2068
int manager_deserialize(Manager *m, FILE *f, FDSet *fds) {
 
2069
        int r = 0;
 
2070
 
 
2071
        assert(m);
 
2072
        assert(f);
 
2073
 
 
2074
        log_debug("Deserializing state...");
 
2075
 
 
2076
        m->n_reloading ++;
 
2077
 
 
2078
        for (;;) {
 
2079
                char line[LINE_MAX], *l;
 
2080
 
 
2081
                if (!fgets(line, sizeof(line), f)) {
 
2082
                        if (feof(f))
 
2083
                                r = 0;
 
2084
                        else
 
2085
                                r = -errno;
 
2086
 
 
2087
                        goto finish;
 
2088
                }
 
2089
 
 
2090
                char_array_0(line);
 
2091
                l = strstrip(line);
 
2092
 
 
2093
                if (l[0] == 0)
 
2094
                        break;
 
2095
 
 
2096
                if (startswith(l, "current-job-id=")) {
 
2097
                        uint32_t id;
 
2098
 
 
2099
                        if (safe_atou32(l+15, &id) < 0)
 
2100
                                log_debug("Failed to parse current job id value %s", l+15);
 
2101
                        else
 
2102
                                m->current_job_id = MAX(m->current_job_id, id);
 
2103
                } else if (startswith(l, "n-installed-jobs=")) {
 
2104
                        uint32_t n;
 
2105
 
 
2106
                        if (safe_atou32(l+17, &n) < 0)
 
2107
                                log_debug("Failed to parse installed jobs counter %s", l+17);
 
2108
                        else
 
2109
                                m->n_installed_jobs += n;
 
2110
                } else if (startswith(l, "n-failed-jobs=")) {
 
2111
                        uint32_t n;
 
2112
 
 
2113
                        if (safe_atou32(l+14, &n) < 0)
 
2114
                                log_debug("Failed to parse failed jobs counter %s", l+14);
 
2115
                        else
 
2116
                                m->n_failed_jobs += n;
 
2117
                } else if (startswith(l, "taint-usr=")) {
 
2118
                        int b;
 
2119
 
 
2120
                        if ((b = parse_boolean(l+10)) < 0)
 
2121
                                log_debug("Failed to parse taint /usr flag %s", l+10);
 
2122
                        else
 
2123
                                m->taint_usr = m->taint_usr || b;
 
2124
                } else if (startswith(l, "firmware-timestamp="))
 
2125
                        dual_timestamp_deserialize(l+19, &m->firmware_timestamp);
 
2126
                else if (startswith(l, "loader-timestamp="))
 
2127
                        dual_timestamp_deserialize(l+17, &m->loader_timestamp);
 
2128
                else if (startswith(l, "kernel-timestamp="))
 
2129
                        dual_timestamp_deserialize(l+17, &m->kernel_timestamp);
 
2130
                else if (startswith(l, "initrd-timestamp="))
 
2131
                        dual_timestamp_deserialize(l+17, &m->initrd_timestamp);
 
2132
                else if (startswith(l, "userspace-timestamp="))
 
2133
                        dual_timestamp_deserialize(l+20, &m->userspace_timestamp);
 
2134
                else if (startswith(l, "finish-timestamp="))
 
2135
                        dual_timestamp_deserialize(l+17, &m->finish_timestamp);
 
2136
                else if (startswith(l, "env=")) {
 
2137
                        _cleanup_free_ char *uce = NULL;
 
2138
                        char **e;
 
2139
 
 
2140
                        uce = cunescape(l+4);
 
2141
                        if (!uce) {
 
2142
                                r = -ENOMEM;
 
2143
                                goto finish;
 
2144
                        }
 
2145
 
 
2146
                        e = strv_env_set(m->environment, uce);
 
2147
                        if (!e) {
 
2148
                                r = -ENOMEM;
 
2149
                                goto finish;
 
2150
                        }
 
2151
 
 
2152
                        strv_free(m->environment);
 
2153
                        m->environment = e;
 
2154
                } else
 
2155
                        log_debug("Unknown serialization item '%s'", l);
 
2156
        }
 
2157
 
 
2158
        for (;;) {
 
2159
                Unit *u;
 
2160
                char name[UNIT_NAME_MAX+2];
 
2161
 
 
2162
                /* Start marker */
 
2163
                if (!fgets(name, sizeof(name), f)) {
 
2164
                        if (feof(f))
 
2165
                                r = 0;
 
2166
                        else
 
2167
                                r = -errno;
 
2168
 
 
2169
                        goto finish;
 
2170
                }
 
2171
 
 
2172
                char_array_0(name);
 
2173
 
 
2174
                r = manager_load_unit(m, strstrip(name), NULL, NULL, &u);
 
2175
                if (r < 0)
 
2176
                        goto finish;
 
2177
 
 
2178
                r = unit_deserialize(u, f, fds);
 
2179
                if (r < 0)
 
2180
                        goto finish;
 
2181
        }
 
2182
 
 
2183
finish:
 
2184
        if (ferror(f)) {
 
2185
                r = -EIO;
 
2186
                goto finish;
 
2187
        }
 
2188
 
 
2189
        assert(m->n_reloading > 0);
 
2190
        m->n_reloading --;
 
2191
 
 
2192
        return r;
 
2193
}
 
2194
 
 
2195
int manager_distribute_fds(Manager *m, FDSet *fds) {
 
2196
        Unit *u;
 
2197
        Iterator i;
 
2198
        int r;
 
2199
 
 
2200
        assert(m);
 
2201
 
 
2202
        HASHMAP_FOREACH(u, m->units, i) {
 
2203
 
 
2204
                if (fdset_size(fds) <= 0)
 
2205
                        break;
 
2206
 
 
2207
                if (UNIT_VTABLE(u)->distribute_fds) {
 
2208
                        r = UNIT_VTABLE(u)->distribute_fds(u, fds);
 
2209
                        if (r < 0)
 
2210
                                return r;
 
2211
                }
 
2212
        }
 
2213
 
 
2214
        return 0;
 
2215
}
 
2216
 
 
2217
int manager_reload(Manager *m) {
 
2218
        int r, q;
 
2219
        FILE *f;
 
2220
        FDSet *fds;
 
2221
 
 
2222
        assert(m);
 
2223
 
 
2224
        r = manager_open_serialization(m, &f);
 
2225
        if (r < 0)
 
2226
                return r;
 
2227
 
 
2228
        m->n_reloading ++;
 
2229
 
 
2230
        fds = fdset_new();
 
2231
        if (!fds) {
 
2232
                m->n_reloading --;
 
2233
                r = -ENOMEM;
 
2234
                goto finish;
 
2235
        }
 
2236
 
 
2237
        r = manager_serialize(m, f, fds, false);
 
2238
        if (r < 0) {
 
2239
                m->n_reloading --;
 
2240
                goto finish;
 
2241
        }
 
2242
 
 
2243
        if (fseeko(f, 0, SEEK_SET) < 0) {
 
2244
                m->n_reloading --;
 
2245
                r = -errno;
 
2246
                goto finish;
 
2247
        }
 
2248
 
 
2249
        /* From here on there is no way back. */
 
2250
        manager_clear_jobs_and_units(m);
 
2251
        manager_undo_generators(m);
 
2252
        lookup_paths_free(&m->lookup_paths);
 
2253
 
 
2254
        /* Find new unit paths */
 
2255
        manager_run_generators(m);
 
2256
 
 
2257
        q = lookup_paths_init(
 
2258
                        &m->lookup_paths, m->running_as, true,
 
2259
                        m->generator_unit_path,
 
2260
                        m->generator_unit_path_early,
 
2261
                        m->generator_unit_path_late);
 
2262
        if (q < 0)
 
2263
                r = q;
 
2264
 
 
2265
        manager_build_unit_path_cache(m);
 
2266
 
 
2267
        /* First, enumerate what we can from all config files */
 
2268
        q = manager_enumerate(m);
 
2269
        if (q < 0)
 
2270
                r = q;
 
2271
 
 
2272
        /* Second, deserialize our stored data */
 
2273
        q = manager_deserialize(m, f, fds);
 
2274
        if (q < 0)
 
2275
                r = q;
 
2276
 
 
2277
        fclose(f);
 
2278
        f = NULL;
 
2279
 
 
2280
        /* Third, fire things up! */
 
2281
        q = manager_coldplug(m);
 
2282
        if (q < 0)
 
2283
                r = q;
 
2284
 
 
2285
        assert(m->n_reloading > 0);
 
2286
        m->n_reloading--;
 
2287
 
 
2288
finish:
 
2289
        if (f)
 
2290
                fclose(f);
 
2291
 
 
2292
        if (fds)
 
2293
                fdset_free(fds);
 
2294
 
 
2295
        return r;
 
2296
}
 
2297
 
 
2298
static bool manager_is_booting_or_shutting_down(Manager *m) {
 
2299
        Unit *u;
 
2300
 
 
2301
        assert(m);
 
2302
 
 
2303
        /* Is the initial job still around? */
 
2304
        if (manager_get_job(m, m->default_unit_job_id))
 
2305
                return true;
 
2306
 
 
2307
        /* Is there a job for the shutdown target? */
 
2308
        u = manager_get_unit(m, SPECIAL_SHUTDOWN_TARGET);
 
2309
        if (u)
 
2310
                return !!u->job;
 
2311
 
 
2312
        return false;
 
2313
}
 
2314
 
 
2315
bool manager_is_reloading_or_reexecuting(Manager *m) {
 
2316
        assert(m);
 
2317
 
 
2318
        return m->n_reloading != 0;
 
2319
}
 
2320
 
 
2321
void manager_reset_failed(Manager *m) {
 
2322
        Unit *u;
 
2323
        Iterator i;
 
2324
 
 
2325
        assert(m);
 
2326
 
 
2327
        HASHMAP_FOREACH(u, m->units, i)
 
2328
                unit_reset_failed(u);
 
2329
}
 
2330
 
 
2331
bool manager_unit_inactive_or_pending(Manager *m, const char *name) {
 
2332
        Unit *u;
 
2333
 
 
2334
        assert(m);
 
2335
        assert(name);
 
2336
 
 
2337
        /* Returns true if the unit is inactive or going down */
 
2338
        u = manager_get_unit(m, name);
 
2339
        if (!u)
 
2340
                return true;
 
2341
 
 
2342
        return unit_inactive_or_pending(u);
 
2343
}
 
2344
 
 
2345
void manager_check_finished(Manager *m) {
 
2346
        char userspace[FORMAT_TIMESPAN_MAX], initrd[FORMAT_TIMESPAN_MAX], kernel[FORMAT_TIMESPAN_MAX], sum[FORMAT_TIMESPAN_MAX];
 
2347
        usec_t firmware_usec, loader_usec, kernel_usec, initrd_usec, userspace_usec, total_usec;
 
2348
 
 
2349
        assert(m);
 
2350
 
 
2351
        if (m->n_running_jobs == 0)
 
2352
                manager_unwatch_jobs_in_progress(m);
 
2353
 
 
2354
        if (hashmap_size(m->jobs) > 0) {
 
2355
                manager_jobs_in_progress_mod_timer(m);
 
2356
                return;
 
2357
        }
 
2358
 
 
2359
        /* Notify Type=idle units that we are done now */
 
2360
        close_pipe(m->idle_pipe);
 
2361
 
 
2362
        /* Turn off confirm spawn now */
 
2363
        m->confirm_spawn = false;
 
2364
 
 
2365
        if (dual_timestamp_is_set(&m->finish_timestamp))
 
2366
                return;
 
2367
 
 
2368
        dual_timestamp_get(&m->finish_timestamp);
 
2369
 
 
2370
        if (m->running_as == SYSTEMD_SYSTEM && detect_container(NULL) <= 0) {
 
2371
 
 
2372
                /* Note that m->kernel_usec.monotonic is always at 0,
 
2373
                 * and m->firmware_usec.monotonic and
 
2374
                 * m->loader_usec.monotonic should be considered
 
2375
                 * negative values. */
 
2376
 
 
2377
                firmware_usec = m->firmware_timestamp.monotonic - m->loader_timestamp.monotonic;
 
2378
                loader_usec = m->loader_timestamp.monotonic - m->kernel_timestamp.monotonic;
 
2379
                userspace_usec = m->finish_timestamp.monotonic - m->userspace_timestamp.monotonic;
 
2380
                total_usec = m->firmware_timestamp.monotonic + m->finish_timestamp.monotonic;
 
2381
 
 
2382
                if (dual_timestamp_is_set(&m->initrd_timestamp)) {
 
2383
 
 
2384
                        kernel_usec = m->initrd_timestamp.monotonic - m->kernel_timestamp.monotonic;
 
2385
                        initrd_usec = m->userspace_timestamp.monotonic - m->initrd_timestamp.monotonic;
 
2386
 
 
2387
                        if (!log_on_console())
 
2388
                                log_struct(LOG_INFO,
 
2389
                                           MESSAGE_ID(SD_MESSAGE_STARTUP_FINISHED),
 
2390
                                           "KERNEL_USEC=%llu", (unsigned long long) kernel_usec,
 
2391
                                           "INITRD_USEC=%llu", (unsigned long long) initrd_usec,
 
2392
                                           "USERSPACE_USEC=%llu", (unsigned long long) userspace_usec,
 
2393
                                           "MESSAGE=Startup finished in %s (kernel) + %s (initrd) + %s (userspace) = %s.",
 
2394
                                           format_timespan(kernel, sizeof(kernel), kernel_usec, USEC_PER_MSEC),
 
2395
                                           format_timespan(initrd, sizeof(initrd), initrd_usec, USEC_PER_MSEC),
 
2396
                                           format_timespan(userspace, sizeof(userspace), userspace_usec, USEC_PER_MSEC),
 
2397
                                           format_timespan(sum, sizeof(sum), total_usec, USEC_PER_MSEC),
 
2398
                                           NULL);
 
2399
                } else {
 
2400
                        kernel_usec = m->userspace_timestamp.monotonic - m->kernel_timestamp.monotonic;
 
2401
                        initrd_usec = 0;
 
2402
 
 
2403
                        if (!log_on_console())
 
2404
                                log_struct(LOG_INFO,
 
2405
                                           MESSAGE_ID(SD_MESSAGE_STARTUP_FINISHED),
 
2406
                                           "KERNEL_USEC=%llu", (unsigned long long) kernel_usec,
 
2407
                                           "USERSPACE_USEC=%llu", (unsigned long long) userspace_usec,
 
2408
                                           "MESSAGE=Startup finished in %s (kernel) + %s (userspace) = %s.",
 
2409
                                           format_timespan(kernel, sizeof(kernel), kernel_usec, USEC_PER_MSEC),
 
2410
                                           format_timespan(userspace, sizeof(userspace), userspace_usec, USEC_PER_MSEC),
 
2411
                                           format_timespan(sum, sizeof(sum), total_usec, USEC_PER_MSEC),
 
2412
                                           NULL);
 
2413
                }
 
2414
        } else {
 
2415
                firmware_usec = loader_usec = initrd_usec = kernel_usec = 0;
 
2416
                total_usec = userspace_usec = m->finish_timestamp.monotonic - m->userspace_timestamp.monotonic;
 
2417
 
 
2418
                if (!log_on_console())
 
2419
                        log_struct(LOG_INFO,
 
2420
                                   MESSAGE_ID(SD_MESSAGE_STARTUP_FINISHED),
 
2421
                                   "USERSPACE_USEC=%llu", (unsigned long long) userspace_usec,
 
2422
                                   "MESSAGE=Startup finished in %s.",
 
2423
                                   format_timespan(sum, sizeof(sum), total_usec, USEC_PER_MSEC),
 
2424
                                   NULL);
 
2425
        }
 
2426
 
 
2427
        bus_broadcast_finished(m, firmware_usec, loader_usec, kernel_usec, initrd_usec, userspace_usec, total_usec);
 
2428
 
 
2429
        sd_notifyf(false,
 
2430
                   "READY=1\nSTATUS=Startup finished in %s.",
 
2431
                   format_timespan(sum, sizeof(sum), total_usec, USEC_PER_MSEC));
 
2432
}
 
2433
 
 
2434
static int create_generator_dir(Manager *m, char **generator, const char *name) {
 
2435
        char *p;
 
2436
        int r;
 
2437
 
 
2438
        assert(m);
 
2439
        assert(generator);
 
2440
        assert(name);
 
2441
 
 
2442
        if (*generator)
 
2443
                return 0;
 
2444
 
 
2445
        if (m->running_as == SYSTEMD_SYSTEM && getpid() == 1) {
 
2446
 
 
2447
                p = strappend("/run/systemd/", name);
 
2448
                if (!p)
 
2449
                        return log_oom();
 
2450
 
 
2451
                r = mkdir_p_label(p, 0755);
 
2452
                if (r < 0) {
 
2453
                        log_error("Failed to create generator directory %s: %s",
 
2454
                                  p, strerror(-r));
 
2455
                        free(p);
 
2456
                        return r;
 
2457
                }
 
2458
        } else {
 
2459
                p = strjoin("/tmp/systemd-", name, ".XXXXXX", NULL);
 
2460
                if (!p)
 
2461
                        return log_oom();
 
2462
 
 
2463
                if (!mkdtemp(p)) {
 
2464
                        log_error("Failed to create generator directory %s: %m",
 
2465
                                  p);
 
2466
                        free(p);
 
2467
                        return -errno;
 
2468
                }
 
2469
        }
 
2470
 
 
2471
        *generator = p;
 
2472
        return 0;
 
2473
}
 
2474
 
 
2475
static void trim_generator_dir(Manager *m, char **generator) {
 
2476
        assert(m);
 
2477
        assert(generator);
 
2478
 
 
2479
        if (!*generator)
 
2480
                return;
 
2481
 
 
2482
        if (rmdir(*generator) >= 0) {
 
2483
                free(*generator);
 
2484
                *generator = NULL;
 
2485
        }
 
2486
 
 
2487
        return;
 
2488
}
 
2489
 
 
2490
void manager_run_generators(Manager *m) {
 
2491
        DIR *d = NULL;
 
2492
        const char *generator_path;
 
2493
        const char *argv[5];
 
2494
        int r;
 
2495
 
 
2496
        assert(m);
 
2497
 
 
2498
        generator_path = m->running_as == SYSTEMD_SYSTEM ? SYSTEM_GENERATOR_PATH : USER_GENERATOR_PATH;
 
2499
        d = opendir(generator_path);
 
2500
        if (!d) {
 
2501
                if (errno == ENOENT)
 
2502
                        return;
 
2503
 
 
2504
                log_error("Failed to enumerate generator directory %s: %m",
 
2505
                          generator_path);
 
2506
                return;
 
2507
        }
 
2508
 
 
2509
        r = create_generator_dir(m, &m->generator_unit_path, "generator");
 
2510
        if (r < 0)
 
2511
                goto finish;
 
2512
 
 
2513
        r = create_generator_dir(m, &m->generator_unit_path_early, "generator.early");
 
2514
        if (r < 0)
 
2515
                goto finish;
 
2516
 
 
2517
        r = create_generator_dir(m, &m->generator_unit_path_late, "generator.late");
 
2518
        if (r < 0)
 
2519
                goto finish;
 
2520
 
 
2521
        argv[0] = NULL; /* Leave this empty, execute_directory() will fill something in */
 
2522
        argv[1] = m->generator_unit_path;
 
2523
        argv[2] = m->generator_unit_path_early;
 
2524
        argv[3] = m->generator_unit_path_late;
 
2525
        argv[4] = NULL;
 
2526
 
 
2527
        RUN_WITH_UMASK(0022) {
 
2528
                execute_directory(generator_path, d, (char**) argv);
 
2529
        }
 
2530
 
 
2531
        trim_generator_dir(m, &m->generator_unit_path);
 
2532
        trim_generator_dir(m, &m->generator_unit_path_early);
 
2533
        trim_generator_dir(m, &m->generator_unit_path_late);
 
2534
 
 
2535
finish:
 
2536
        if (d)
 
2537
                closedir(d);
 
2538
}
 
2539
 
 
2540
static void remove_generator_dir(Manager *m, char **generator) {
 
2541
        assert(m);
 
2542
        assert(generator);
 
2543
 
 
2544
        if (!*generator)
 
2545
                return;
 
2546
 
 
2547
        strv_remove(m->lookup_paths.unit_path, *generator);
 
2548
        rm_rf(*generator, false, true, false);
 
2549
 
 
2550
        free(*generator);
 
2551
        *generator = NULL;
 
2552
}
 
2553
 
 
2554
void manager_undo_generators(Manager *m) {
 
2555
        assert(m);
 
2556
 
 
2557
        remove_generator_dir(m, &m->generator_unit_path);
 
2558
        remove_generator_dir(m, &m->generator_unit_path_early);
 
2559
        remove_generator_dir(m, &m->generator_unit_path_late);
 
2560
}
 
2561
 
 
2562
int manager_set_default_controllers(Manager *m, char **controllers) {
 
2563
        char **l;
 
2564
 
 
2565
        assert(m);
 
2566
 
 
2567
        l = strv_copy(controllers);
 
2568
        if (!l)
 
2569
                return -ENOMEM;
 
2570
 
 
2571
        strv_free(m->default_controllers);
 
2572
        m->default_controllers = l;
 
2573
 
 
2574
        cg_shorten_controllers(m->default_controllers);
 
2575
 
 
2576
        return 0;
 
2577
}
 
2578
 
 
2579
int manager_set_default_rlimits(Manager *m, struct rlimit **default_rlimit) {
 
2580
        int i;
 
2581
 
 
2582
        assert(m);
 
2583
 
 
2584
        for (i = 0; i < RLIMIT_NLIMITS; i++) {
 
2585
                if (!default_rlimit[i])
 
2586
                        continue;
 
2587
 
 
2588
                m->rlimit[i] = newdup(struct rlimit, default_rlimit[i], 1);
 
2589
                if (!m->rlimit[i])
 
2590
                        return -ENOMEM;
 
2591
        }
 
2592
 
 
2593
        return 0;
 
2594
}
 
2595
 
 
2596
void manager_recheck_journal(Manager *m) {
 
2597
        Unit *u;
 
2598
 
 
2599
        assert(m);
 
2600
 
 
2601
        if (m->running_as != SYSTEMD_SYSTEM)
 
2602
                return;
 
2603
 
 
2604
        u = manager_get_unit(m, SPECIAL_JOURNALD_SOCKET);
 
2605
        if (u && SOCKET(u)->state != SOCKET_RUNNING) {
 
2606
                log_close_journal();
 
2607
                return;
 
2608
        }
 
2609
 
 
2610
        u = manager_get_unit(m, SPECIAL_JOURNALD_SERVICE);
 
2611
        if (u && SERVICE(u)->state != SERVICE_RUNNING) {
 
2612
                log_close_journal();
 
2613
                return;
 
2614
        }
 
2615
 
 
2616
        /* Hmm, OK, so the socket is fully up and the service is up
 
2617
         * too, then let's make use of the thing. */
 
2618
        log_open();
 
2619
}
 
2620
 
 
2621
void manager_set_show_status(Manager *m, bool b) {
 
2622
        assert(m);
 
2623
 
 
2624
        if (m->running_as != SYSTEMD_SYSTEM)
 
2625
                return;
 
2626
 
 
2627
        m->show_status = b;
 
2628
 
 
2629
        if (b)
 
2630
                touch("/run/systemd/show-status");
 
2631
        else
 
2632
                unlink("/run/systemd/show-status");
 
2633
}
 
2634
 
 
2635
static bool manager_get_show_status(Manager *m) {
 
2636
        assert(m);
 
2637
 
 
2638
        if (m->running_as != SYSTEMD_SYSTEM)
 
2639
                return false;
 
2640
 
 
2641
        if (m->show_status)
 
2642
                return true;
 
2643
 
 
2644
        /* If Plymouth is running make sure we show the status, so
 
2645
         * that there's something nice to see when people press Esc */
 
2646
 
 
2647
        return plymouth_running();
 
2648
}
 
2649
 
 
2650
void manager_status_printf(Manager *m, bool ephemeral, const char *status, const char *format, ...) {
 
2651
        va_list ap;
 
2652
 
 
2653
        if (!manager_get_show_status(m))
 
2654
                return;
 
2655
 
 
2656
        /* XXX We should totally drop the check for ephemeral here
 
2657
         * and thus effectively make 'Type=idle' pointless. */
 
2658
        if (ephemeral && m->n_on_console > 0)
 
2659
                return;
 
2660
 
 
2661
        if (!manager_is_booting_or_shutting_down(m))
 
2662
                return;
 
2663
 
 
2664
        va_start(ap, format);
 
2665
        status_vprintf(status, true, ephemeral, format, ap);
 
2666
        va_end(ap);
 
2667
}
 
2668
 
 
2669
void watch_init(Watch *w) {
 
2670
        assert(w);
 
2671
 
 
2672
        w->type = WATCH_INVALID;
 
2673
        w->fd = -1;
 
2674
}