chiark / gitweb /
a6013668b8a8221997cf92cda3f3430e506f4758
[elogind.git] / src / core / manager.c
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
40 #ifdef HAVE_AUDIT
41 #include <libaudit.h>
42 #endif
43
44 #include <systemd/sd-daemon.h>
45
46 #include "manager.h"
47 #include "transaction.h"
48 #include "hashmap.h"
49 #include "macro.h"
50 #include "strv.h"
51 #include "log.h"
52 #include "util.h"
53 #include "mkdir.h"
54 #include "ratelimit.h"
55 #include "cgroup.h"
56 #include "mount-setup.h"
57 #include "unit-name.h"
58 #include "dbus-unit.h"
59 #include "dbus-job.h"
60 #include "missing.h"
61 #include "path-lookup.h"
62 #include "special.h"
63 #include "bus-errors.h"
64 #include "exit-status.h"
65 #include "virt.h"
66 #include "watchdog.h"
67 #include "cgroup-util.h"
68
69 /* As soon as 16 units are in our GC queue, make sure to run a gc sweep */
70 #define GC_QUEUE_ENTRIES_MAX 16
71
72 /* As soon as 5s passed since a unit was added to our GC queue, make sure to run a gc sweep */
73 #define GC_QUEUE_USEC_MAX (10*USEC_PER_SEC)
74
75 /* Where clients shall send notification messages to */
76 #define NOTIFY_SOCKET_SYSTEM "/run/systemd/notify"
77 #define NOTIFY_SOCKET_USER "@/org/freedesktop/systemd1/notify"
78
79 static int manager_setup_notify(Manager *m) {
80         union {
81                 struct sockaddr sa;
82                 struct sockaddr_un un;
83         } sa;
84         struct epoll_event ev;
85         int one = 1, r;
86         mode_t u;
87
88         assert(m);
89
90         m->notify_watch.type = WATCH_NOTIFY;
91         if ((m->notify_watch.fd = socket(AF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0)) < 0) {
92                 log_error("Failed to allocate notification socket: %m");
93                 return -errno;
94         }
95
96         zero(sa);
97         sa.sa.sa_family = AF_UNIX;
98
99         if (getpid() != 1)
100                 snprintf(sa.un.sun_path, sizeof(sa.un.sun_path), NOTIFY_SOCKET_USER "/%llu", random_ull());
101         else {
102                 unlink(NOTIFY_SOCKET_SYSTEM);
103                 strncpy(sa.un.sun_path, NOTIFY_SOCKET_SYSTEM, sizeof(sa.un.sun_path));
104         }
105
106         if (sa.un.sun_path[0] == '@')
107                 sa.un.sun_path[0] = 0;
108
109         u = umask(0111);
110         r = bind(m->notify_watch.fd, &sa.sa, offsetof(struct sockaddr_un, sun_path) + 1 + strlen(sa.un.sun_path+1));
111         umask(u);
112
113         if (r < 0) {
114                 log_error("bind() failed: %m");
115                 return -errno;
116         }
117
118         if (setsockopt(m->notify_watch.fd, SOL_SOCKET, SO_PASSCRED, &one, sizeof(one)) < 0) {
119                 log_error("SO_PASSCRED failed: %m");
120                 return -errno;
121         }
122
123         zero(ev);
124         ev.events = EPOLLIN;
125         ev.data.ptr = &m->notify_watch;
126
127         if (epoll_ctl(m->epoll_fd, EPOLL_CTL_ADD, m->notify_watch.fd, &ev) < 0)
128                 return -errno;
129
130         if (sa.un.sun_path[0] == 0)
131                 sa.un.sun_path[0] = '@';
132
133         if (!(m->notify_socket = strdup(sa.un.sun_path)))
134                 return -ENOMEM;
135
136         log_debug("Using notification socket %s", m->notify_socket);
137
138         return 0;
139 }
140
141 static int enable_special_signals(Manager *m) {
142         int fd;
143
144         assert(m);
145
146         /* Enable that we get SIGINT on control-alt-del. In containers
147          * this will fail with EPERM, so ignore that. */
148         if (reboot(RB_DISABLE_CAD) < 0 && errno != EPERM)
149                 log_warning("Failed to enable ctrl-alt-del handling: %m");
150
151         fd = open_terminal("/dev/tty0", O_RDWR|O_NOCTTY|O_CLOEXEC);
152         if (fd < 0) {
153                 /* Support systems without virtual console */
154                 if (fd != -ENOENT)
155                         log_warning("Failed to open /dev/tty0: %m");
156         } else {
157                 /* Enable that we get SIGWINCH on kbrequest */
158                 if (ioctl(fd, KDSIGACCEPT, SIGWINCH) < 0)
159                         log_warning("Failed to enable kbrequest handling: %s", strerror(errno));
160
161                 close_nointr_nofail(fd);
162         }
163
164         return 0;
165 }
166
167 static int manager_setup_signals(Manager *m) {
168         sigset_t mask;
169         struct epoll_event ev;
170         struct sigaction sa;
171
172         assert(m);
173
174         /* We are not interested in SIGSTOP and friends. */
175         zero(sa);
176         sa.sa_handler = SIG_DFL;
177         sa.sa_flags = SA_NOCLDSTOP|SA_RESTART;
178         assert_se(sigaction(SIGCHLD, &sa, NULL) == 0);
179
180         assert_se(sigemptyset(&mask) == 0);
181
182         sigset_add_many(&mask,
183                         SIGCHLD,     /* Child died */
184                         SIGTERM,     /* Reexecute daemon */
185                         SIGHUP,      /* Reload configuration */
186                         SIGUSR1,     /* systemd/upstart: reconnect to D-Bus */
187                         SIGUSR2,     /* systemd: dump status */
188                         SIGINT,      /* Kernel sends us this on control-alt-del */
189                         SIGWINCH,    /* Kernel sends us this on kbrequest (alt-arrowup) */
190                         SIGPWR,      /* Some kernel drivers and upsd send us this on power failure */
191                         SIGRTMIN+0,  /* systemd: start default.target */
192                         SIGRTMIN+1,  /* systemd: isolate rescue.target */
193                         SIGRTMIN+2,  /* systemd: isolate emergency.target */
194                         SIGRTMIN+3,  /* systemd: start halt.target */
195                         SIGRTMIN+4,  /* systemd: start poweroff.target */
196                         SIGRTMIN+5,  /* systemd: start reboot.target */
197                         SIGRTMIN+6,  /* systemd: start kexec.target */
198                         SIGRTMIN+13, /* systemd: Immediate halt */
199                         SIGRTMIN+14, /* systemd: Immediate poweroff */
200                         SIGRTMIN+15, /* systemd: Immediate reboot */
201                         SIGRTMIN+16, /* systemd: Immediate kexec */
202                         SIGRTMIN+20, /* systemd: enable status messages */
203                         SIGRTMIN+21, /* systemd: disable status messages */
204                         SIGRTMIN+22, /* systemd: set log level to LOG_DEBUG */
205                         SIGRTMIN+23, /* systemd: set log level to LOG_INFO */
206                         SIGRTMIN+26, /* systemd: set log target to journal-or-kmsg */
207                         SIGRTMIN+27, /* systemd: set log target to console */
208                         SIGRTMIN+28, /* systemd: set log target to kmsg */
209                         SIGRTMIN+29, /* systemd: set log target to syslog-or-kmsg */
210                         -1);
211         assert_se(sigprocmask(SIG_SETMASK, &mask, NULL) == 0);
212
213         m->signal_watch.type = WATCH_SIGNAL;
214         if ((m->signal_watch.fd = signalfd(-1, &mask, SFD_NONBLOCK|SFD_CLOEXEC)) < 0)
215                 return -errno;
216
217         zero(ev);
218         ev.events = EPOLLIN;
219         ev.data.ptr = &m->signal_watch;
220
221         if (epoll_ctl(m->epoll_fd, EPOLL_CTL_ADD, m->signal_watch.fd, &ev) < 0)
222                 return -errno;
223
224         if (m->running_as == MANAGER_SYSTEM)
225                 return enable_special_signals(m);
226
227         return 0;
228 }
229
230 static void manager_strip_environment(Manager *m) {
231         assert(m);
232
233         /* Remove variables from the inherited set that are part of
234          * the container interface:
235          * http://www.freedesktop.org/wiki/Software/systemd/ContainerInterface */
236         strv_remove_prefix(m->environment, "container=");
237         strv_remove_prefix(m->environment, "container_");
238
239         /* Remove variables from the inherited set that are part of
240          * the initrd interface:
241          * http://www.freedesktop.org/wiki/Software/systemd/InitrdInterface */
242         strv_remove_prefix(m->environment, "RD_");
243 }
244
245 int manager_new(ManagerRunningAs running_as, Manager **_m) {
246         Manager *m;
247         int r = -ENOMEM;
248
249         assert(_m);
250         assert(running_as >= 0);
251         assert(running_as < _MANAGER_RUNNING_AS_MAX);
252
253         if (!(m = new0(Manager, 1)))
254                 return -ENOMEM;
255
256         dual_timestamp_get(&m->startup_timestamp);
257
258         m->running_as = running_as;
259         m->name_data_slot = m->conn_data_slot = m->subscribed_data_slot = -1;
260         m->exit_code = _MANAGER_EXIT_CODE_INVALID;
261         m->pin_cgroupfs_fd = -1;
262         m->idle_pipe[0] = m->idle_pipe[1] = -1;
263
264 #ifdef HAVE_AUDIT
265         m->audit_fd = -1;
266 #endif
267
268         m->signal_watch.fd = m->mount_watch.fd = m->udev_watch.fd = m->epoll_fd = m->dev_autofs_fd = m->swap_watch.fd = -1;
269         m->current_job_id = 1; /* start as id #1, so that we can leave #0 around as "null-like" value */
270
271         m->environment = strv_copy(environ);
272         if (!m->environment)
273                 goto fail;
274
275         manager_strip_environment(m);
276
277         if (running_as == MANAGER_SYSTEM) {
278                 m->default_controllers = strv_new("cpu", NULL);
279                 if (!m->default_controllers)
280                         goto fail;
281         }
282
283         if (!(m->units = hashmap_new(string_hash_func, string_compare_func)))
284                 goto fail;
285
286         if (!(m->jobs = hashmap_new(trivial_hash_func, trivial_compare_func)))
287                 goto fail;
288
289         if (!(m->watch_pids = hashmap_new(trivial_hash_func, trivial_compare_func)))
290                 goto fail;
291
292         if (!(m->cgroup_bondings = hashmap_new(string_hash_func, string_compare_func)))
293                 goto fail;
294
295         if (!(m->watch_bus = hashmap_new(string_hash_func, string_compare_func)))
296                 goto fail;
297
298         if ((m->epoll_fd = epoll_create1(EPOLL_CLOEXEC)) < 0)
299                 goto fail;
300
301         if ((r = lookup_paths_init(&m->lookup_paths, m->running_as, true)) < 0)
302                 goto fail;
303
304         if ((r = manager_setup_signals(m)) < 0)
305                 goto fail;
306
307         if ((r = manager_setup_cgroup(m)) < 0)
308                 goto fail;
309
310         if ((r = manager_setup_notify(m)) < 0)
311                 goto fail;
312
313         /* Try to connect to the busses, if possible. */
314         if ((r = bus_init(m, running_as != MANAGER_SYSTEM)) < 0)
315                 goto fail;
316
317 #ifdef HAVE_AUDIT
318         if ((m->audit_fd = audit_open()) < 0 &&
319             /* If the kernel lacks netlink or audit support,
320              * don't worry about it. */
321             errno != EAFNOSUPPORT && errno != EPROTONOSUPPORT)
322                 log_error("Failed to connect to audit log: %m");
323 #endif
324
325         m->taint_usr = dir_is_empty("/usr") > 0;
326
327         *_m = m;
328         return 0;
329
330 fail:
331         manager_free(m);
332         return r;
333 }
334
335 static unsigned manager_dispatch_cleanup_queue(Manager *m) {
336         Unit *u;
337         unsigned n = 0;
338
339         assert(m);
340
341         while ((u = m->cleanup_queue)) {
342                 assert(u->in_cleanup_queue);
343
344                 unit_free(u);
345                 n++;
346         }
347
348         return n;
349 }
350
351 enum {
352         GC_OFFSET_IN_PATH,  /* This one is on the path we were traveling */
353         GC_OFFSET_UNSURE,   /* No clue */
354         GC_OFFSET_GOOD,     /* We still need this unit */
355         GC_OFFSET_BAD,      /* We don't need this unit anymore */
356         _GC_OFFSET_MAX
357 };
358
359 static void unit_gc_sweep(Unit *u, unsigned gc_marker) {
360         Iterator i;
361         Unit *other;
362         bool is_bad;
363
364         assert(u);
365
366         if (u->gc_marker == gc_marker + GC_OFFSET_GOOD ||
367             u->gc_marker == gc_marker + GC_OFFSET_BAD ||
368             u->gc_marker == gc_marker + GC_OFFSET_IN_PATH)
369                 return;
370
371         if (u->in_cleanup_queue)
372                 goto bad;
373
374         if (unit_check_gc(u))
375                 goto good;
376
377         u->gc_marker = gc_marker + GC_OFFSET_IN_PATH;
378
379         is_bad = true;
380
381         SET_FOREACH(other, u->dependencies[UNIT_REFERENCED_BY], i) {
382                 unit_gc_sweep(other, gc_marker);
383
384                 if (other->gc_marker == gc_marker + GC_OFFSET_GOOD)
385                         goto good;
386
387                 if (other->gc_marker != gc_marker + GC_OFFSET_BAD)
388                         is_bad = false;
389         }
390
391         if (is_bad)
392                 goto bad;
393
394         /* We were unable to find anything out about this entry, so
395          * let's investigate it later */
396         u->gc_marker = gc_marker + GC_OFFSET_UNSURE;
397         unit_add_to_gc_queue(u);
398         return;
399
400 bad:
401         /* We definitely know that this one is not useful anymore, so
402          * let's mark it for deletion */
403         u->gc_marker = gc_marker + GC_OFFSET_BAD;
404         unit_add_to_cleanup_queue(u);
405         return;
406
407 good:
408         u->gc_marker = gc_marker + GC_OFFSET_GOOD;
409 }
410
411 static unsigned manager_dispatch_gc_queue(Manager *m) {
412         Unit *u;
413         unsigned n = 0;
414         unsigned gc_marker;
415
416         assert(m);
417
418         if ((m->n_in_gc_queue < GC_QUEUE_ENTRIES_MAX) &&
419             (m->gc_queue_timestamp <= 0 ||
420              (m->gc_queue_timestamp + GC_QUEUE_USEC_MAX) > now(CLOCK_MONOTONIC)))
421                 return 0;
422
423         log_debug("Running GC...");
424
425         m->gc_marker += _GC_OFFSET_MAX;
426         if (m->gc_marker + _GC_OFFSET_MAX <= _GC_OFFSET_MAX)
427                 m->gc_marker = 1;
428
429         gc_marker = m->gc_marker;
430
431         while ((u = m->gc_queue)) {
432                 assert(u->in_gc_queue);
433
434                 unit_gc_sweep(u, gc_marker);
435
436                 LIST_REMOVE(Unit, gc_queue, m->gc_queue, u);
437                 u->in_gc_queue = false;
438
439                 n++;
440
441                 if (u->gc_marker == gc_marker + GC_OFFSET_BAD ||
442                     u->gc_marker == gc_marker + GC_OFFSET_UNSURE) {
443                         log_debug("Collecting %s", u->id);
444                         u->gc_marker = gc_marker + GC_OFFSET_BAD;
445                         unit_add_to_cleanup_queue(u);
446                 }
447         }
448
449         m->n_in_gc_queue = 0;
450         m->gc_queue_timestamp = 0;
451
452         return n;
453 }
454
455 static void manager_clear_jobs_and_units(Manager *m) {
456         Unit *u;
457
458         assert(m);
459
460         while ((u = hashmap_first(m->units)))
461                 unit_free(u);
462
463         manager_dispatch_cleanup_queue(m);
464
465         assert(!m->load_queue);
466         assert(!m->run_queue);
467         assert(!m->dbus_unit_queue);
468         assert(!m->dbus_job_queue);
469         assert(!m->cleanup_queue);
470         assert(!m->gc_queue);
471
472         assert(hashmap_isempty(m->jobs));
473         assert(hashmap_isempty(m->units));
474 }
475
476 void manager_free(Manager *m) {
477         UnitType c;
478
479         assert(m);
480
481         manager_clear_jobs_and_units(m);
482
483         for (c = 0; c < _UNIT_TYPE_MAX; c++)
484                 if (unit_vtable[c]->shutdown)
485                         unit_vtable[c]->shutdown(m);
486
487         /* If we reexecute ourselves, we keep the root cgroup
488          * around */
489         manager_shutdown_cgroup(m, m->exit_code != MANAGER_REEXECUTE);
490
491         manager_undo_generators(m);
492
493         bus_done(m);
494
495         hashmap_free(m->units);
496         hashmap_free(m->jobs);
497         hashmap_free(m->watch_pids);
498         hashmap_free(m->watch_bus);
499
500         if (m->epoll_fd >= 0)
501                 close_nointr_nofail(m->epoll_fd);
502         if (m->signal_watch.fd >= 0)
503                 close_nointr_nofail(m->signal_watch.fd);
504         if (m->notify_watch.fd >= 0)
505                 close_nointr_nofail(m->notify_watch.fd);
506
507 #ifdef HAVE_AUDIT
508         if (m->audit_fd >= 0)
509                 audit_close(m->audit_fd);
510 #endif
511
512         free(m->notify_socket);
513
514         lookup_paths_free(&m->lookup_paths);
515         strv_free(m->environment);
516
517         strv_free(m->default_controllers);
518
519         hashmap_free(m->cgroup_bondings);
520         set_free_free(m->unit_path_cache);
521
522         close_pipe(m->idle_pipe);
523
524         free(m);
525 }
526
527 int manager_enumerate(Manager *m) {
528         int r = 0, q;
529         UnitType c;
530
531         assert(m);
532
533         /* Let's ask every type to load all units from disk/kernel
534          * that it might know */
535         for (c = 0; c < _UNIT_TYPE_MAX; c++)
536                 if (unit_vtable[c]->enumerate)
537                         if ((q = unit_vtable[c]->enumerate(m)) < 0)
538                                 r = q;
539
540         manager_dispatch_load_queue(m);
541         return r;
542 }
543
544 int manager_coldplug(Manager *m) {
545         int r = 0, q;
546         Iterator i;
547         Unit *u;
548         char *k;
549
550         assert(m);
551
552         /* Then, let's set up their initial state. */
553         HASHMAP_FOREACH_KEY(u, k, m->units, i) {
554
555                 /* ignore aliases */
556                 if (u->id != k)
557                         continue;
558
559                 if ((q = unit_coldplug(u)) < 0)
560                         r = q;
561         }
562
563         return r;
564 }
565
566 static void manager_build_unit_path_cache(Manager *m) {
567         char **i;
568         DIR *d = NULL;
569         int r;
570
571         assert(m);
572
573         set_free_free(m->unit_path_cache);
574
575         if (!(m->unit_path_cache = set_new(string_hash_func, string_compare_func))) {
576                 log_error("Failed to allocate unit path cache.");
577                 return;
578         }
579
580         /* This simply builds a list of files we know exist, so that
581          * we don't always have to go to disk */
582
583         STRV_FOREACH(i, m->lookup_paths.unit_path) {
584                 struct dirent *de;
585
586                 if (!(d = opendir(*i))) {
587                         log_error("Failed to open directory: %m");
588                         continue;
589                 }
590
591                 while ((de = readdir(d))) {
592                         char *p;
593
594                         if (ignore_file(de->d_name))
595                                 continue;
596
597                         p = join(streq(*i, "/") ? "" : *i, "/", de->d_name, NULL);
598                         if (!p) {
599                                 r = -ENOMEM;
600                                 goto fail;
601                         }
602
603                         if ((r = set_put(m->unit_path_cache, p)) < 0) {
604                                 free(p);
605                                 goto fail;
606                         }
607                 }
608
609                 closedir(d);
610                 d = NULL;
611         }
612
613         return;
614
615 fail:
616         log_error("Failed to build unit path cache: %s", strerror(-r));
617
618         set_free_free(m->unit_path_cache);
619         m->unit_path_cache = NULL;
620
621         if (d)
622                 closedir(d);
623 }
624
625 int manager_startup(Manager *m, FILE *serialization, FDSet *fds) {
626         int r, q;
627
628         assert(m);
629
630         manager_run_generators(m);
631
632         manager_build_unit_path_cache(m);
633
634         /* If we will deserialize make sure that during enumeration
635          * this is already known, so we increase the counter here
636          * already */
637         if (serialization)
638                 m->n_reloading ++;
639
640         /* First, enumerate what we can from all config files */
641         r = manager_enumerate(m);
642
643         /* Second, deserialize if there is something to deserialize */
644         if (serialization)
645                 if ((q = manager_deserialize(m, serialization, fds)) < 0)
646                         r = q;
647
648         /* Third, fire things up! */
649         if ((q = manager_coldplug(m)) < 0)
650                 r = q;
651
652         if (serialization) {
653                 assert(m->n_reloading > 0);
654                 m->n_reloading --;
655         }
656
657         return r;
658 }
659
660 int manager_add_job(Manager *m, JobType type, Unit *unit, JobMode mode, bool override, DBusError *e, Job **_ret) {
661         int r;
662         Transaction *tr;
663
664         assert(m);
665         assert(type < _JOB_TYPE_MAX);
666         assert(unit);
667         assert(mode < _JOB_MODE_MAX);
668
669         if (mode == JOB_ISOLATE && type != JOB_START) {
670                 dbus_set_error(e, BUS_ERROR_INVALID_JOB_MODE, "Isolate is only valid for start.");
671                 return -EINVAL;
672         }
673
674         if (mode == JOB_ISOLATE && !unit->allow_isolate) {
675                 dbus_set_error(e, BUS_ERROR_NO_ISOLATION, "Operation refused, unit may not be isolated.");
676                 return -EPERM;
677         }
678
679         log_debug("Trying to enqueue job %s/%s/%s", unit->id, job_type_to_string(type), job_mode_to_string(mode));
680
681         tr = transaction_new();
682         if (!tr)
683                 return -ENOMEM;
684
685         r = transaction_add_job_and_dependencies(tr, type, unit, NULL, true, override, false,
686                                                  mode == JOB_IGNORE_DEPENDENCIES || mode == JOB_IGNORE_REQUIREMENTS,
687                                                  mode == JOB_IGNORE_DEPENDENCIES, e);
688         if (r < 0)
689                 goto tr_abort;
690
691         if (mode == JOB_ISOLATE) {
692                 r = transaction_add_isolate_jobs(tr, m);
693                 if (r < 0)
694                         goto tr_abort;
695         }
696
697         r = transaction_activate(tr, m, mode, e);
698         if (r < 0)
699                 goto tr_abort;
700
701         log_debug("Enqueued job %s/%s as %u", unit->id, job_type_to_string(type), (unsigned) tr->anchor_job->id);
702
703         if (_ret)
704                 *_ret = tr->anchor_job;
705
706         transaction_free(tr);
707         return 0;
708
709 tr_abort:
710         transaction_abort(tr);
711         transaction_free(tr);
712         return r;
713 }
714
715 int manager_add_job_by_name(Manager *m, JobType type, const char *name, JobMode mode, bool override, DBusError *e, Job **_ret) {
716         Unit *unit;
717         int r;
718
719         assert(m);
720         assert(type < _JOB_TYPE_MAX);
721         assert(name);
722         assert(mode < _JOB_MODE_MAX);
723
724         if ((r = manager_load_unit(m, name, NULL, NULL, &unit)) < 0)
725                 return r;
726
727         return manager_add_job(m, type, unit, mode, override, e, _ret);
728 }
729
730 Job *manager_get_job(Manager *m, uint32_t id) {
731         assert(m);
732
733         return hashmap_get(m->jobs, UINT32_TO_PTR(id));
734 }
735
736 Unit *manager_get_unit(Manager *m, const char *name) {
737         assert(m);
738         assert(name);
739
740         return hashmap_get(m->units, name);
741 }
742
743 unsigned manager_dispatch_load_queue(Manager *m) {
744         Unit *u;
745         unsigned n = 0;
746
747         assert(m);
748
749         /* Make sure we are not run recursively */
750         if (m->dispatching_load_queue)
751                 return 0;
752
753         m->dispatching_load_queue = true;
754
755         /* Dispatches the load queue. Takes a unit from the queue and
756          * tries to load its data until the queue is empty */
757
758         while ((u = m->load_queue)) {
759                 assert(u->in_load_queue);
760
761                 unit_load(u);
762                 n++;
763         }
764
765         m->dispatching_load_queue = false;
766         return n;
767 }
768
769 int manager_load_unit_prepare(Manager *m, const char *name, const char *path, DBusError *e, Unit **_ret) {
770         Unit *ret;
771         UnitType t;
772         int r;
773
774         assert(m);
775         assert(name || path);
776
777         /* This will prepare the unit for loading, but not actually
778          * load anything from disk. */
779
780         if (path && !is_path(path)) {
781                 dbus_set_error(e, BUS_ERROR_INVALID_PATH, "Path %s is not absolute.", path);
782                 return -EINVAL;
783         }
784
785         if (!name)
786                 name = file_name_from_path(path);
787
788         t = unit_name_to_type(name);
789
790         if (t == _UNIT_TYPE_INVALID || !unit_name_is_valid_no_type(name, false)) {
791                 dbus_set_error(e, BUS_ERROR_INVALID_NAME, "Unit name %s is not valid.", name);
792                 return -EINVAL;
793         }
794
795         ret = manager_get_unit(m, name);
796         if (ret) {
797                 *_ret = ret;
798                 return 1;
799         }
800
801         ret = unit_new(m, unit_vtable[t]->object_size);
802         if (!ret)
803                 return -ENOMEM;
804
805         if (path) {
806                 ret->fragment_path = strdup(path);
807                 if (!ret->fragment_path) {
808                         unit_free(ret);
809                         return -ENOMEM;
810                 }
811         }
812
813         if ((r = unit_add_name(ret, name)) < 0) {
814                 unit_free(ret);
815                 return r;
816         }
817
818         unit_add_to_load_queue(ret);
819         unit_add_to_dbus_queue(ret);
820         unit_add_to_gc_queue(ret);
821
822         if (_ret)
823                 *_ret = ret;
824
825         return 0;
826 }
827
828 int manager_load_unit(Manager *m, const char *name, const char *path, DBusError *e, Unit **_ret) {
829         int r;
830
831         assert(m);
832
833         /* This will load the service information files, but not actually
834          * start any services or anything. */
835
836         if ((r = manager_load_unit_prepare(m, name, path, e, _ret)) != 0)
837                 return r;
838
839         manager_dispatch_load_queue(m);
840
841         if (_ret)
842                 *_ret = unit_follow_merge(*_ret);
843
844         return 0;
845 }
846
847 void manager_dump_jobs(Manager *s, FILE *f, const char *prefix) {
848         Iterator i;
849         Job *j;
850
851         assert(s);
852         assert(f);
853
854         HASHMAP_FOREACH(j, s->jobs, i)
855                 job_dump(j, f, prefix);
856 }
857
858 void manager_dump_units(Manager *s, FILE *f, const char *prefix) {
859         Iterator i;
860         Unit *u;
861         const char *t;
862
863         assert(s);
864         assert(f);
865
866         HASHMAP_FOREACH_KEY(u, t, s->units, i)
867                 if (u->id == t)
868                         unit_dump(u, f, prefix);
869 }
870
871 void manager_clear_jobs(Manager *m) {
872         Job *j;
873
874         assert(m);
875
876         while ((j = hashmap_first(m->jobs)))
877                 /* No need to recurse. We're cancelling all jobs. */
878                 job_finish_and_invalidate(j, JOB_CANCELED, false);
879 }
880
881 unsigned manager_dispatch_run_queue(Manager *m) {
882         Job *j;
883         unsigned n = 0;
884
885         if (m->dispatching_run_queue)
886                 return 0;
887
888         m->dispatching_run_queue = true;
889
890         while ((j = m->run_queue)) {
891                 assert(j->installed);
892                 assert(j->in_run_queue);
893
894                 job_run_and_invalidate(j);
895                 n++;
896         }
897
898         m->dispatching_run_queue = false;
899         return n;
900 }
901
902 unsigned manager_dispatch_dbus_queue(Manager *m) {
903         Job *j;
904         Unit *u;
905         unsigned n = 0;
906
907         assert(m);
908
909         if (m->dispatching_dbus_queue)
910                 return 0;
911
912         m->dispatching_dbus_queue = true;
913
914         while ((u = m->dbus_unit_queue)) {
915                 assert(u->in_dbus_queue);
916
917                 bus_unit_send_change_signal(u);
918                 n++;
919         }
920
921         while ((j = m->dbus_job_queue)) {
922                 assert(j->in_dbus_queue);
923
924                 bus_job_send_change_signal(j);
925                 n++;
926         }
927
928         m->dispatching_dbus_queue = false;
929         return n;
930 }
931
932 static int manager_process_notify_fd(Manager *m) {
933         ssize_t n;
934
935         assert(m);
936
937         for (;;) {
938                 char buf[4096];
939                 struct msghdr msghdr;
940                 struct iovec iovec;
941                 struct ucred *ucred;
942                 union {
943                         struct cmsghdr cmsghdr;
944                         uint8_t buf[CMSG_SPACE(sizeof(struct ucred))];
945                 } control;
946                 Unit *u;
947                 char **tags;
948
949                 zero(iovec);
950                 iovec.iov_base = buf;
951                 iovec.iov_len = sizeof(buf)-1;
952
953                 zero(control);
954                 zero(msghdr);
955                 msghdr.msg_iov = &iovec;
956                 msghdr.msg_iovlen = 1;
957                 msghdr.msg_control = &control;
958                 msghdr.msg_controllen = sizeof(control);
959
960                 if ((n = recvmsg(m->notify_watch.fd, &msghdr, MSG_DONTWAIT)) <= 0) {
961                         if (n >= 0)
962                                 return -EIO;
963
964                         if (errno == EAGAIN || errno == EINTR)
965                                 break;
966
967                         return -errno;
968                 }
969
970                 if (msghdr.msg_controllen < CMSG_LEN(sizeof(struct ucred)) ||
971                     control.cmsghdr.cmsg_level != SOL_SOCKET ||
972                     control.cmsghdr.cmsg_type != SCM_CREDENTIALS ||
973                     control.cmsghdr.cmsg_len != CMSG_LEN(sizeof(struct ucred))) {
974                         log_warning("Received notify message without credentials. Ignoring.");
975                         continue;
976                 }
977
978                 ucred = (struct ucred*) CMSG_DATA(&control.cmsghdr);
979
980                 if (!(u = hashmap_get(m->watch_pids, LONG_TO_PTR(ucred->pid))))
981                         if (!(u = cgroup_unit_by_pid(m, ucred->pid))) {
982                                 log_warning("Cannot find unit for notify message of PID %lu.", (unsigned long) ucred->pid);
983                                 continue;
984                         }
985
986                 assert((size_t) n < sizeof(buf));
987                 buf[n] = 0;
988                 if (!(tags = strv_split(buf, "\n\r")))
989                         return -ENOMEM;
990
991                 log_debug("Got notification message for unit %s", u->id);
992
993                 if (UNIT_VTABLE(u)->notify_message)
994                         UNIT_VTABLE(u)->notify_message(u, ucred->pid, tags);
995
996                 strv_free(tags);
997         }
998
999         return 0;
1000 }
1001
1002 static int manager_dispatch_sigchld(Manager *m) {
1003         assert(m);
1004
1005         for (;;) {
1006                 siginfo_t si;
1007                 Unit *u;
1008                 int r;
1009
1010                 zero(si);
1011
1012                 /* First we call waitd() for a PID and do not reap the
1013                  * zombie. That way we can still access /proc/$PID for
1014                  * it while it is a zombie. */
1015                 if (waitid(P_ALL, 0, &si, WEXITED|WNOHANG|WNOWAIT) < 0) {
1016
1017                         if (errno == ECHILD)
1018                                 break;
1019
1020                         if (errno == EINTR)
1021                                 continue;
1022
1023                         return -errno;
1024                 }
1025
1026                 if (si.si_pid <= 0)
1027                         break;
1028
1029                 if (si.si_code == CLD_EXITED || si.si_code == CLD_KILLED || si.si_code == CLD_DUMPED) {
1030                         char *name = NULL;
1031
1032                         get_process_comm(si.si_pid, &name);
1033                         log_debug("Got SIGCHLD for process %lu (%s)", (unsigned long) si.si_pid, strna(name));
1034                         free(name);
1035                 }
1036
1037                 /* Let's flush any message the dying child might still
1038                  * have queued for us. This ensures that the process
1039                  * still exists in /proc so that we can figure out
1040                  * which cgroup and hence unit it belongs to. */
1041                 if ((r = manager_process_notify_fd(m)) < 0)
1042                         return r;
1043
1044                 /* And now figure out the unit this belongs to */
1045                 if (!(u = hashmap_get(m->watch_pids, LONG_TO_PTR(si.si_pid))))
1046                         u = cgroup_unit_by_pid(m, si.si_pid);
1047
1048                 /* And now, we actually reap the zombie. */
1049                 if (waitid(P_PID, si.si_pid, &si, WEXITED) < 0) {
1050                         if (errno == EINTR)
1051                                 continue;
1052
1053                         return -errno;
1054                 }
1055
1056                 if (si.si_code != CLD_EXITED && si.si_code != CLD_KILLED && si.si_code != CLD_DUMPED)
1057                         continue;
1058
1059                 log_debug("Child %lu died (code=%s, status=%i/%s)",
1060                           (long unsigned) si.si_pid,
1061                           sigchld_code_to_string(si.si_code),
1062                           si.si_status,
1063                           strna(si.si_code == CLD_EXITED
1064                                 ? exit_status_to_string(si.si_status, EXIT_STATUS_FULL)
1065                                 : signal_to_string(si.si_status)));
1066
1067                 if (!u)
1068                         continue;
1069
1070                 log_debug("Child %lu belongs to %s", (long unsigned) si.si_pid, u->id);
1071
1072                 hashmap_remove(m->watch_pids, LONG_TO_PTR(si.si_pid));
1073                 UNIT_VTABLE(u)->sigchld_event(u, si.si_pid, si.si_code, si.si_status);
1074         }
1075
1076         return 0;
1077 }
1078
1079 static int manager_start_target(Manager *m, const char *name, JobMode mode) {
1080         int r;
1081         DBusError error;
1082
1083         dbus_error_init(&error);
1084
1085         log_debug("Activating special unit %s", name);
1086
1087         if ((r = manager_add_job_by_name(m, JOB_START, name, mode, true, &error, NULL)) < 0)
1088                 log_error("Failed to enqueue %s job: %s", name, bus_error(&error, r));
1089
1090         dbus_error_free(&error);
1091
1092         return r;
1093 }
1094
1095 static int manager_process_signal_fd(Manager *m) {
1096         ssize_t n;
1097         struct signalfd_siginfo sfsi;
1098         bool sigchld = false;
1099
1100         assert(m);
1101
1102         for (;;) {
1103                 if ((n = read(m->signal_watch.fd, &sfsi, sizeof(sfsi))) != sizeof(sfsi)) {
1104
1105                         if (n >= 0)
1106                                 return -EIO;
1107
1108                         if (errno == EINTR || errno == EAGAIN)
1109                                 break;
1110
1111                         return -errno;
1112                 }
1113
1114                 if (sfsi.ssi_pid > 0) {
1115                         char *p = NULL;
1116
1117                         get_process_comm(sfsi.ssi_pid, &p);
1118
1119                         log_debug("Received SIG%s from PID %lu (%s).",
1120                                   signal_to_string(sfsi.ssi_signo),
1121                                   (unsigned long) sfsi.ssi_pid, strna(p));
1122                         free(p);
1123                 } else
1124                         log_debug("Received SIG%s.", signal_to_string(sfsi.ssi_signo));
1125
1126                 switch (sfsi.ssi_signo) {
1127
1128                 case SIGCHLD:
1129                         sigchld = true;
1130                         break;
1131
1132                 case SIGTERM:
1133                         if (m->running_as == MANAGER_SYSTEM) {
1134                                 /* This is for compatibility with the
1135                                  * original sysvinit */
1136                                 m->exit_code = MANAGER_REEXECUTE;
1137                                 break;
1138                         }
1139
1140                         /* Fall through */
1141
1142                 case SIGINT:
1143                         if (m->running_as == MANAGER_SYSTEM) {
1144                                 manager_start_target(m, SPECIAL_CTRL_ALT_DEL_TARGET, JOB_REPLACE);
1145                                 break;
1146                         }
1147
1148                         /* Run the exit target if there is one, if not, just exit. */
1149                         if (manager_start_target(m, SPECIAL_EXIT_TARGET, JOB_REPLACE) < 0) {
1150                                 m->exit_code = MANAGER_EXIT;
1151                                 return 0;
1152                         }
1153
1154                         break;
1155
1156                 case SIGWINCH:
1157                         if (m->running_as == MANAGER_SYSTEM)
1158                                 manager_start_target(m, SPECIAL_KBREQUEST_TARGET, JOB_REPLACE);
1159
1160                         /* This is a nop on non-init */
1161                         break;
1162
1163                 case SIGPWR:
1164                         if (m->running_as == MANAGER_SYSTEM)
1165                                 manager_start_target(m, SPECIAL_SIGPWR_TARGET, JOB_REPLACE);
1166
1167                         /* This is a nop on non-init */
1168                         break;
1169
1170                 case SIGUSR1: {
1171                         Unit *u;
1172
1173                         u = manager_get_unit(m, SPECIAL_DBUS_SERVICE);
1174
1175                         if (!u || UNIT_IS_ACTIVE_OR_RELOADING(unit_active_state(u))) {
1176                                 log_info("Trying to reconnect to bus...");
1177                                 bus_init(m, true);
1178                         }
1179
1180                         if (!u || !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u))) {
1181                                 log_info("Loading D-Bus service...");
1182                                 manager_start_target(m, SPECIAL_DBUS_SERVICE, JOB_REPLACE);
1183                         }
1184
1185                         break;
1186                 }
1187
1188                 case SIGUSR2: {
1189                         FILE *f;
1190                         char *dump = NULL;
1191                         size_t size;
1192
1193                         if (!(f = open_memstream(&dump, &size))) {
1194                                 log_warning("Failed to allocate memory stream.");
1195                                 break;
1196                         }
1197
1198                         manager_dump_units(m, f, "\t");
1199                         manager_dump_jobs(m, f, "\t");
1200
1201                         if (ferror(f)) {
1202                                 fclose(f);
1203                                 free(dump);
1204                                 log_warning("Failed to write status stream");
1205                                 break;
1206                         }
1207
1208                         fclose(f);
1209                         log_dump(LOG_INFO, dump);
1210                         free(dump);
1211
1212                         break;
1213                 }
1214
1215                 case SIGHUP:
1216                         m->exit_code = MANAGER_RELOAD;
1217                         break;
1218
1219                 default: {
1220
1221                         /* Starting SIGRTMIN+0 */
1222                         static const char * const target_table[] = {
1223                                 [0] = SPECIAL_DEFAULT_TARGET,
1224                                 [1] = SPECIAL_RESCUE_TARGET,
1225                                 [2] = SPECIAL_EMERGENCY_TARGET,
1226                                 [3] = SPECIAL_HALT_TARGET,
1227                                 [4] = SPECIAL_POWEROFF_TARGET,
1228                                 [5] = SPECIAL_REBOOT_TARGET,
1229                                 [6] = SPECIAL_KEXEC_TARGET
1230                         };
1231
1232                         /* Starting SIGRTMIN+13, so that target halt and system halt are 10 apart */
1233                         static const ManagerExitCode code_table[] = {
1234                                 [0] = MANAGER_HALT,
1235                                 [1] = MANAGER_POWEROFF,
1236                                 [2] = MANAGER_REBOOT,
1237                                 [3] = MANAGER_KEXEC
1238                         };
1239
1240                         if ((int) sfsi.ssi_signo >= SIGRTMIN+0 &&
1241                             (int) sfsi.ssi_signo < SIGRTMIN+(int) ELEMENTSOF(target_table)) {
1242                                 int idx = (int) sfsi.ssi_signo - SIGRTMIN;
1243                                 manager_start_target(m, target_table[idx],
1244                                                      (idx == 1 || idx == 2) ? JOB_ISOLATE : JOB_REPLACE);
1245                                 break;
1246                         }
1247
1248                         if ((int) sfsi.ssi_signo >= SIGRTMIN+13 &&
1249                             (int) sfsi.ssi_signo < SIGRTMIN+13+(int) ELEMENTSOF(code_table)) {
1250                                 m->exit_code = code_table[sfsi.ssi_signo - SIGRTMIN - 13];
1251                                 break;
1252                         }
1253
1254                         switch (sfsi.ssi_signo - SIGRTMIN) {
1255
1256                         case 20:
1257                                 log_debug("Enabling showing of status.");
1258                                 manager_set_show_status(m, true);
1259                                 break;
1260
1261                         case 21:
1262                                 log_debug("Disabling showing of status.");
1263                                 manager_set_show_status(m, false);
1264                                 break;
1265
1266                         case 22:
1267                                 log_set_max_level(LOG_DEBUG);
1268                                 log_notice("Setting log level to debug.");
1269                                 break;
1270
1271                         case 23:
1272                                 log_set_max_level(LOG_INFO);
1273                                 log_notice("Setting log level to info.");
1274                                 break;
1275
1276                         case 26:
1277                                 log_set_target(LOG_TARGET_JOURNAL_OR_KMSG);
1278                                 log_notice("Setting log target to journal-or-kmsg.");
1279                                 break;
1280
1281                         case 27:
1282                                 log_set_target(LOG_TARGET_CONSOLE);
1283                                 log_notice("Setting log target to console.");
1284                                 break;
1285
1286                         case 28:
1287                                 log_set_target(LOG_TARGET_KMSG);
1288                                 log_notice("Setting log target to kmsg.");
1289                                 break;
1290
1291                         case 29:
1292                                 log_set_target(LOG_TARGET_SYSLOG_OR_KMSG);
1293                                 log_notice("Setting log target to syslog-or-kmsg.");
1294                                 break;
1295
1296                         default:
1297                                 log_warning("Got unhandled signal <%s>.", signal_to_string(sfsi.ssi_signo));
1298                         }
1299                 }
1300                 }
1301         }
1302
1303         if (sigchld)
1304                 return manager_dispatch_sigchld(m);
1305
1306         return 0;
1307 }
1308
1309 static int process_event(Manager *m, struct epoll_event *ev) {
1310         int r;
1311         Watch *w;
1312
1313         assert(m);
1314         assert(ev);
1315
1316         assert_se(w = ev->data.ptr);
1317
1318         if (w->type == WATCH_INVALID)
1319                 return 0;
1320
1321         switch (w->type) {
1322
1323         case WATCH_SIGNAL:
1324
1325                 /* An incoming signal? */
1326                 if (ev->events != EPOLLIN)
1327                         return -EINVAL;
1328
1329                 if ((r = manager_process_signal_fd(m)) < 0)
1330                         return r;
1331
1332                 break;
1333
1334         case WATCH_NOTIFY:
1335
1336                 /* An incoming daemon notification event? */
1337                 if (ev->events != EPOLLIN)
1338                         return -EINVAL;
1339
1340                 if ((r = manager_process_notify_fd(m)) < 0)
1341                         return r;
1342
1343                 break;
1344
1345         case WATCH_FD:
1346
1347                 /* Some fd event, to be dispatched to the units */
1348                 UNIT_VTABLE(w->data.unit)->fd_event(w->data.unit, w->fd, ev->events, w);
1349                 break;
1350
1351         case WATCH_UNIT_TIMER:
1352         case WATCH_JOB_TIMER: {
1353                 uint64_t v;
1354                 ssize_t k;
1355
1356                 /* Some timer event, to be dispatched to the units */
1357                 if ((k = read(w->fd, &v, sizeof(v))) != sizeof(v)) {
1358
1359                         if (k < 0 && (errno == EINTR || errno == EAGAIN))
1360                                 break;
1361
1362                         return k < 0 ? -errno : -EIO;
1363                 }
1364
1365                 if (w->type == WATCH_UNIT_TIMER)
1366                         UNIT_VTABLE(w->data.unit)->timer_event(w->data.unit, v, w);
1367                 else
1368                         job_timer_event(w->data.job, v, w);
1369                 break;
1370         }
1371
1372         case WATCH_MOUNT:
1373                 /* Some mount table change, intended for the mount subsystem */
1374                 mount_fd_event(m, ev->events);
1375                 break;
1376
1377         case WATCH_SWAP:
1378                 /* Some swap table change, intended for the swap subsystem */
1379                 swap_fd_event(m, ev->events);
1380                 break;
1381
1382         case WATCH_UDEV:
1383                 /* Some notification from udev, intended for the device subsystem */
1384                 device_fd_event(m, ev->events);
1385                 break;
1386
1387         case WATCH_DBUS_WATCH:
1388                 bus_watch_event(m, w, ev->events);
1389                 break;
1390
1391         case WATCH_DBUS_TIMEOUT:
1392                 bus_timeout_event(m, w, ev->events);
1393                 break;
1394
1395         default:
1396                 log_error("event type=%i", w->type);
1397                 assert_not_reached("Unknown epoll event type.");
1398         }
1399
1400         return 0;
1401 }
1402
1403 int manager_loop(Manager *m) {
1404         int r;
1405
1406         RATELIMIT_DEFINE(rl, 1*USEC_PER_SEC, 50000);
1407
1408         assert(m);
1409         m->exit_code = MANAGER_RUNNING;
1410
1411         /* Release the path cache */
1412         set_free_free(m->unit_path_cache);
1413         m->unit_path_cache = NULL;
1414
1415         manager_check_finished(m);
1416
1417         /* There might still be some zombies hanging around from
1418          * before we were exec()'ed. Leat's reap them */
1419         r = manager_dispatch_sigchld(m);
1420         if (r < 0)
1421                 return r;
1422
1423         while (m->exit_code == MANAGER_RUNNING) {
1424                 struct epoll_event event;
1425                 int n;
1426                 int wait_msec = -1;
1427
1428                 if (m->runtime_watchdog > 0 && m->running_as == MANAGER_SYSTEM)
1429                         watchdog_ping();
1430
1431                 if (!ratelimit_test(&rl)) {
1432                         /* Yay, something is going seriously wrong, pause a little */
1433                         log_warning("Looping too fast. Throttling execution a little.");
1434                         sleep(1);
1435                         continue;
1436                 }
1437
1438                 if (manager_dispatch_load_queue(m) > 0)
1439                         continue;
1440
1441                 if (manager_dispatch_run_queue(m) > 0)
1442                         continue;
1443
1444                 if (bus_dispatch(m) > 0)
1445                         continue;
1446
1447                 if (manager_dispatch_cleanup_queue(m) > 0)
1448                         continue;
1449
1450                 if (manager_dispatch_gc_queue(m) > 0)
1451                         continue;
1452
1453                 if (manager_dispatch_dbus_queue(m) > 0)
1454                         continue;
1455
1456                 if (swap_dispatch_reload(m) > 0)
1457                         continue;
1458
1459                 /* Sleep for half the watchdog time */
1460                 if (m->runtime_watchdog > 0 && m->running_as == MANAGER_SYSTEM) {
1461                         wait_msec = (int) (m->runtime_watchdog / 2 / USEC_PER_MSEC);
1462                         if (wait_msec <= 0)
1463                                 wait_msec = 1;
1464                 } else
1465                         wait_msec = -1;
1466
1467                 n = epoll_wait(m->epoll_fd, &event, 1, wait_msec);
1468                 if (n < 0) {
1469
1470                         if (errno == EINTR)
1471                                 continue;
1472
1473                         return -errno;
1474                 } else if (n == 0)
1475                         continue;
1476
1477                 assert(n == 1);
1478
1479                 r = process_event(m, &event);
1480                 if (r < 0)
1481                         return r;
1482         }
1483
1484         return m->exit_code;
1485 }
1486
1487 int manager_get_unit_from_dbus_path(Manager *m, const char *s, Unit **_u) {
1488         char *n;
1489         Unit *u;
1490
1491         assert(m);
1492         assert(s);
1493         assert(_u);
1494
1495         if (!startswith(s, "/org/freedesktop/systemd1/unit/"))
1496                 return -EINVAL;
1497
1498         if (!(n = bus_path_unescape(s+31)))
1499                 return -ENOMEM;
1500
1501         u = manager_get_unit(m, n);
1502         free(n);
1503
1504         if (!u)
1505                 return -ENOENT;
1506
1507         *_u = u;
1508
1509         return 0;
1510 }
1511
1512 int manager_get_job_from_dbus_path(Manager *m, const char *s, Job **_j) {
1513         Job *j;
1514         unsigned id;
1515         int r;
1516
1517         assert(m);
1518         assert(s);
1519         assert(_j);
1520
1521         if (!startswith(s, "/org/freedesktop/systemd1/job/"))
1522                 return -EINVAL;
1523
1524         if ((r = safe_atou(s + 30, &id)) < 0)
1525                 return r;
1526
1527         if (!(j = manager_get_job(m, id)))
1528                 return -ENOENT;
1529
1530         *_j = j;
1531
1532         return 0;
1533 }
1534
1535 void manager_send_unit_audit(Manager *m, Unit *u, int type, bool success) {
1536
1537 #ifdef HAVE_AUDIT
1538         char *p;
1539
1540         if (m->audit_fd < 0)
1541                 return;
1542
1543         /* Don't generate audit events if the service was already
1544          * started and we're just deserializing */
1545         if (m->n_reloading > 0)
1546                 return;
1547
1548         if (m->running_as != MANAGER_SYSTEM)
1549                 return;
1550
1551         if (u->type != UNIT_SERVICE)
1552                 return;
1553
1554         if (!(p = unit_name_to_prefix_and_instance(u->id))) {
1555                 log_error("Failed to allocate unit name for audit message: %s", strerror(ENOMEM));
1556                 return;
1557         }
1558
1559         if (audit_log_user_comm_message(m->audit_fd, type, "", p, NULL, NULL, NULL, success) < 0) {
1560                 if (errno == EPERM) {
1561                         /* We aren't allowed to send audit messages?
1562                          * Then let's not retry again. */
1563                         audit_close(m->audit_fd);
1564                         m->audit_fd = -1;
1565                 } else
1566                         log_warning("Failed to send audit message: %m");
1567         }
1568
1569         free(p);
1570 #endif
1571
1572 }
1573
1574 void manager_send_unit_plymouth(Manager *m, Unit *u) {
1575         int fd = -1;
1576         union sockaddr_union sa;
1577         int n = 0;
1578         char *message = NULL;
1579
1580         /* Don't generate plymouth events if the service was already
1581          * started and we're just deserializing */
1582         if (m->n_reloading > 0)
1583                 return;
1584
1585         if (m->running_as != MANAGER_SYSTEM)
1586                 return;
1587
1588         if (u->type != UNIT_SERVICE &&
1589             u->type != UNIT_MOUNT &&
1590             u->type != UNIT_SWAP)
1591                 return;
1592
1593         /* We set SOCK_NONBLOCK here so that we rather drop the
1594          * message then wait for plymouth */
1595         if ((fd = socket(AF_UNIX, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0)) < 0) {
1596                 log_error("socket() failed: %m");
1597                 return;
1598         }
1599
1600         zero(sa);
1601         sa.sa.sa_family = AF_UNIX;
1602         strncpy(sa.un.sun_path+1, "/org/freedesktop/plymouthd", sizeof(sa.un.sun_path)-1);
1603         if (connect(fd, &sa.sa, offsetof(struct sockaddr_un, sun_path) + 1 + strlen(sa.un.sun_path+1)) < 0) {
1604
1605                 if (errno != EPIPE &&
1606                     errno != EAGAIN &&
1607                     errno != ENOENT &&
1608                     errno != ECONNREFUSED &&
1609                     errno != ECONNRESET &&
1610                     errno != ECONNABORTED)
1611                         log_error("connect() failed: %m");
1612
1613                 goto finish;
1614         }
1615
1616         if (asprintf(&message, "U\002%c%s%n", (int) (strlen(u->id) + 1), u->id, &n) < 0) {
1617                 log_error("Out of memory");
1618                 goto finish;
1619         }
1620
1621         errno = 0;
1622         if (write(fd, message, n + 1) != n + 1) {
1623
1624                 if (errno != EPIPE &&
1625                     errno != EAGAIN &&
1626                     errno != ENOENT &&
1627                     errno != ECONNREFUSED &&
1628                     errno != ECONNRESET &&
1629                     errno != ECONNABORTED)
1630                         log_error("Failed to write Plymouth message: %m");
1631
1632                 goto finish;
1633         }
1634
1635 finish:
1636         if (fd >= 0)
1637                 close_nointr_nofail(fd);
1638
1639         free(message);
1640 }
1641
1642 void manager_dispatch_bus_name_owner_changed(
1643                 Manager *m,
1644                 const char *name,
1645                 const char* old_owner,
1646                 const char *new_owner) {
1647
1648         Unit *u;
1649
1650         assert(m);
1651         assert(name);
1652
1653         if (!(u = hashmap_get(m->watch_bus, name)))
1654                 return;
1655
1656         UNIT_VTABLE(u)->bus_name_owner_change(u, name, old_owner, new_owner);
1657 }
1658
1659 void manager_dispatch_bus_query_pid_done(
1660                 Manager *m,
1661                 const char *name,
1662                 pid_t pid) {
1663
1664         Unit *u;
1665
1666         assert(m);
1667         assert(name);
1668         assert(pid >= 1);
1669
1670         if (!(u = hashmap_get(m->watch_bus, name)))
1671                 return;
1672
1673         UNIT_VTABLE(u)->bus_query_pid_done(u, name, pid);
1674 }
1675
1676 int manager_open_serialization(Manager *m, FILE **_f) {
1677         char *path = NULL;
1678         mode_t saved_umask;
1679         int fd;
1680         FILE *f;
1681
1682         assert(_f);
1683
1684         if (m->running_as == MANAGER_SYSTEM)
1685                 asprintf(&path, "/run/systemd/dump-%lu-XXXXXX", (unsigned long) getpid());
1686         else
1687                 asprintf(&path, "/tmp/systemd-dump-%lu-XXXXXX", (unsigned long) getpid());
1688
1689         if (!path)
1690                 return -ENOMEM;
1691
1692         saved_umask = umask(0077);
1693         fd = mkostemp(path, O_RDWR|O_CLOEXEC);
1694         umask(saved_umask);
1695
1696         if (fd < 0) {
1697                 free(path);
1698                 return -errno;
1699         }
1700
1701         unlink(path);
1702
1703         log_debug("Serializing state to %s", path);
1704         free(path);
1705
1706         if (!(f = fdopen(fd, "w+")))
1707                 return -errno;
1708
1709         *_f = f;
1710
1711         return 0;
1712 }
1713
1714 int manager_serialize(Manager *m, FILE *f, FDSet *fds) {
1715         Iterator i;
1716         Unit *u;
1717         const char *t;
1718         int r;
1719
1720         assert(m);
1721         assert(f);
1722         assert(fds);
1723
1724         m->n_reloading ++;
1725
1726         fprintf(f, "current-job-id=%i\n", m->current_job_id);
1727         fprintf(f, "taint-usr=%s\n", yes_no(m->taint_usr));
1728
1729         dual_timestamp_serialize(f, "initrd-timestamp", &m->initrd_timestamp);
1730         dual_timestamp_serialize(f, "startup-timestamp", &m->startup_timestamp);
1731         dual_timestamp_serialize(f, "finish-timestamp", &m->finish_timestamp);
1732
1733         fputc('\n', f);
1734
1735         HASHMAP_FOREACH_KEY(u, t, m->units, i) {
1736                 if (u->id != t)
1737                         continue;
1738
1739                 if (!unit_can_serialize(u))
1740                         continue;
1741
1742                 /* Start marker */
1743                 fputs(u->id, f);
1744                 fputc('\n', f);
1745
1746                 if ((r = unit_serialize(u, f, fds)) < 0) {
1747                         m->n_reloading --;
1748                         return r;
1749                 }
1750         }
1751
1752         assert(m->n_reloading > 0);
1753         m->n_reloading --;
1754
1755         if (ferror(f))
1756                 return -EIO;
1757
1758         r = bus_fdset_add_all(m, fds);
1759         if (r < 0)
1760                 return r;
1761
1762         return 0;
1763 }
1764
1765 int manager_deserialize(Manager *m, FILE *f, FDSet *fds) {
1766         int r = 0;
1767
1768         assert(m);
1769         assert(f);
1770
1771         log_debug("Deserializing state...");
1772
1773         m->n_reloading ++;
1774
1775         for (;;) {
1776                 char line[LINE_MAX], *l;
1777
1778                 if (!fgets(line, sizeof(line), f)) {
1779                         if (feof(f))
1780                                 r = 0;
1781                         else
1782                                 r = -errno;
1783
1784                         goto finish;
1785                 }
1786
1787                 char_array_0(line);
1788                 l = strstrip(line);
1789
1790                 if (l[0] == 0)
1791                         break;
1792
1793                 if (startswith(l, "current-job-id=")) {
1794                         uint32_t id;
1795
1796                         if (safe_atou32(l+15, &id) < 0)
1797                                 log_debug("Failed to parse current job id value %s", l+15);
1798                         else
1799                                 m->current_job_id = MAX(m->current_job_id, id);
1800                 } else if (startswith(l, "taint-usr=")) {
1801                         int b;
1802
1803                         if ((b = parse_boolean(l+10)) < 0)
1804                                 log_debug("Failed to parse taint /usr flag %s", l+10);
1805                         else
1806                                 m->taint_usr = m->taint_usr || b;
1807                 } else if (startswith(l, "initrd-timestamp="))
1808                         dual_timestamp_deserialize(l+17, &m->initrd_timestamp);
1809                 else if (startswith(l, "startup-timestamp="))
1810                         dual_timestamp_deserialize(l+18, &m->startup_timestamp);
1811                 else if (startswith(l, "finish-timestamp="))
1812                         dual_timestamp_deserialize(l+17, &m->finish_timestamp);
1813                 else
1814                         log_debug("Unknown serialization item '%s'", l);
1815         }
1816
1817         for (;;) {
1818                 Unit *u;
1819                 char name[UNIT_NAME_MAX+2];
1820
1821                 /* Start marker */
1822                 if (!fgets(name, sizeof(name), f)) {
1823                         if (feof(f))
1824                                 r = 0;
1825                         else
1826                                 r = -errno;
1827
1828                         goto finish;
1829                 }
1830
1831                 char_array_0(name);
1832
1833                 if ((r = manager_load_unit(m, strstrip(name), NULL, NULL, &u)) < 0)
1834                         goto finish;
1835
1836                 if ((r = unit_deserialize(u, f, fds)) < 0)
1837                         goto finish;
1838         }
1839
1840 finish:
1841         if (ferror(f)) {
1842                 r = -EIO;
1843                 goto finish;
1844         }
1845
1846         assert(m->n_reloading > 0);
1847         m->n_reloading --;
1848
1849         return r;
1850 }
1851
1852 int manager_reload(Manager *m) {
1853         int r, q;
1854         FILE *f;
1855         FDSet *fds;
1856
1857         assert(m);
1858
1859         if ((r = manager_open_serialization(m, &f)) < 0)
1860                 return r;
1861
1862         m->n_reloading ++;
1863
1864         if (!(fds = fdset_new())) {
1865                 m->n_reloading --;
1866                 r = -ENOMEM;
1867                 goto finish;
1868         }
1869
1870         if ((r = manager_serialize(m, f, fds)) < 0) {
1871                 m->n_reloading --;
1872                 goto finish;
1873         }
1874
1875         if (fseeko(f, 0, SEEK_SET) < 0) {
1876                 m->n_reloading --;
1877                 r = -errno;
1878                 goto finish;
1879         }
1880
1881         /* From here on there is no way back. */
1882         manager_clear_jobs_and_units(m);
1883         manager_undo_generators(m);
1884
1885         /* Find new unit paths */
1886         lookup_paths_free(&m->lookup_paths);
1887         if ((q = lookup_paths_init(&m->lookup_paths, m->running_as, true)) < 0)
1888                 r = q;
1889
1890         manager_run_generators(m);
1891
1892         manager_build_unit_path_cache(m);
1893
1894         /* First, enumerate what we can from all config files */
1895         if ((q = manager_enumerate(m)) < 0)
1896                 r = q;
1897
1898         /* Second, deserialize our stored data */
1899         if ((q = manager_deserialize(m, f, fds)) < 0)
1900                 r = q;
1901
1902         fclose(f);
1903         f = NULL;
1904
1905         /* Third, fire things up! */
1906         if ((q = manager_coldplug(m)) < 0)
1907                 r = q;
1908
1909         assert(m->n_reloading > 0);
1910         m->n_reloading--;
1911
1912 finish:
1913         if (f)
1914                 fclose(f);
1915
1916         if (fds)
1917                 fdset_free(fds);
1918
1919         return r;
1920 }
1921
1922 bool manager_is_booting_or_shutting_down(Manager *m) {
1923         Unit *u;
1924
1925         assert(m);
1926
1927         /* Is the initial job still around? */
1928         if (manager_get_job(m, m->default_unit_job_id))
1929                 return true;
1930
1931         /* Is there a job for the shutdown target? */
1932         u = manager_get_unit(m, SPECIAL_SHUTDOWN_TARGET);
1933         if (u)
1934                 return !!u->job;
1935
1936         return false;
1937 }
1938
1939 void manager_reset_failed(Manager *m) {
1940         Unit *u;
1941         Iterator i;
1942
1943         assert(m);
1944
1945         HASHMAP_FOREACH(u, m->units, i)
1946                 unit_reset_failed(u);
1947 }
1948
1949 bool manager_unit_pending_inactive(Manager *m, const char *name) {
1950         Unit *u;
1951
1952         assert(m);
1953         assert(name);
1954
1955         /* Returns true if the unit is inactive or going down */
1956         if (!(u = manager_get_unit(m, name)))
1957                 return true;
1958
1959         return unit_pending_inactive(u);
1960 }
1961
1962 void manager_check_finished(Manager *m) {
1963         char userspace[FORMAT_TIMESPAN_MAX], initrd[FORMAT_TIMESPAN_MAX], kernel[FORMAT_TIMESPAN_MAX], sum[FORMAT_TIMESPAN_MAX];
1964         usec_t kernel_usec, initrd_usec, userspace_usec, total_usec;
1965
1966         assert(m);
1967
1968         if (hashmap_size(m->jobs) > 0)
1969                 return;
1970
1971         /* Notify Type=idle units that we are done now */
1972         close_pipe(m->idle_pipe);
1973
1974         if (dual_timestamp_is_set(&m->finish_timestamp))
1975                 return;
1976
1977         dual_timestamp_get(&m->finish_timestamp);
1978
1979         if (m->running_as == MANAGER_SYSTEM && detect_container(NULL) <= 0) {
1980
1981                 userspace_usec = m->finish_timestamp.monotonic - m->startup_timestamp.monotonic;
1982                 total_usec = m->finish_timestamp.monotonic;
1983
1984                 if (dual_timestamp_is_set(&m->initrd_timestamp)) {
1985
1986                         kernel_usec = m->initrd_timestamp.monotonic;
1987                         initrd_usec = m->startup_timestamp.monotonic - m->initrd_timestamp.monotonic;
1988
1989                         log_info("Startup finished in %s (kernel) + %s (initrd) + %s (userspace) = %s.",
1990                                  format_timespan(kernel, sizeof(kernel), kernel_usec),
1991                                  format_timespan(initrd, sizeof(initrd), initrd_usec),
1992                                  format_timespan(userspace, sizeof(userspace), userspace_usec),
1993                                  format_timespan(sum, sizeof(sum), total_usec));
1994                 } else {
1995                         kernel_usec = m->startup_timestamp.monotonic;
1996                         initrd_usec = 0;
1997
1998                         log_info("Startup finished in %s (kernel) + %s (userspace) = %s.",
1999                                  format_timespan(kernel, sizeof(kernel), kernel_usec),
2000                                  format_timespan(userspace, sizeof(userspace), userspace_usec),
2001                                  format_timespan(sum, sizeof(sum), total_usec));
2002                 }
2003         } else {
2004                 userspace_usec = initrd_usec = kernel_usec = 0;
2005                 total_usec = m->finish_timestamp.monotonic - m->startup_timestamp.monotonic;
2006
2007                 log_debug("Startup finished in %s.",
2008                           format_timespan(sum, sizeof(sum), total_usec));
2009         }
2010
2011         bus_broadcast_finished(m, kernel_usec, initrd_usec, userspace_usec, total_usec);
2012
2013         sd_notifyf(false,
2014                    "READY=1\nSTATUS=Startup finished in %s.",
2015                    format_timespan(sum, sizeof(sum), total_usec));
2016 }
2017
2018 void manager_run_generators(Manager *m) {
2019         DIR *d = NULL;
2020         const char *generator_path;
2021         const char *argv[3];
2022         mode_t u;
2023
2024         assert(m);
2025
2026         generator_path = m->running_as == MANAGER_SYSTEM ? SYSTEM_GENERATOR_PATH : USER_GENERATOR_PATH;
2027         if (!(d = opendir(generator_path))) {
2028
2029                 if (errno == ENOENT)
2030                         return;
2031
2032                 log_error("Failed to enumerate generator directory: %m");
2033                 return;
2034         }
2035
2036         if (!m->generator_unit_path) {
2037                 const char *p;
2038                 char user_path[] = "/tmp/systemd-generator-XXXXXX";
2039
2040                 if (m->running_as == MANAGER_SYSTEM && getpid() == 1) {
2041                         p = "/run/systemd/generator";
2042
2043                         if (mkdir_p(p, 0755) < 0) {
2044                                 log_error("Failed to create generator directory: %m");
2045                                 goto finish;
2046                         }
2047
2048                 } else {
2049                         if (!(p = mkdtemp(user_path))) {
2050                                 log_error("Failed to create generator directory: %m");
2051                                 goto finish;
2052                         }
2053                 }
2054
2055                 if (!(m->generator_unit_path = strdup(p))) {
2056                         log_error("Failed to allocate generator unit path.");
2057                         goto finish;
2058                 }
2059         }
2060
2061         argv[0] = NULL; /* Leave this empty, execute_directory() will fill something in */
2062         argv[1] = m->generator_unit_path;
2063         argv[2] = NULL;
2064
2065         u = umask(0022);
2066         execute_directory(generator_path, d, (char**) argv);
2067         umask(u);
2068
2069         if (rmdir(m->generator_unit_path) >= 0) {
2070                 /* Uh? we were able to remove this dir? I guess that
2071                  * means the directory was empty, hence let's shortcut
2072                  * this */
2073
2074                 free(m->generator_unit_path);
2075                 m->generator_unit_path = NULL;
2076                 goto finish;
2077         }
2078
2079         if (!strv_find(m->lookup_paths.unit_path, m->generator_unit_path)) {
2080                 char **l;
2081
2082                 if (!(l = strv_append(m->lookup_paths.unit_path, m->generator_unit_path))) {
2083                         log_error("Failed to add generator directory to unit search path: %m");
2084                         goto finish;
2085                 }
2086
2087                 strv_free(m->lookup_paths.unit_path);
2088                 m->lookup_paths.unit_path = l;
2089
2090                 log_debug("Added generator unit path %s to search path.", m->generator_unit_path);
2091         }
2092
2093 finish:
2094         if (d)
2095                 closedir(d);
2096 }
2097
2098 void manager_undo_generators(Manager *m) {
2099         assert(m);
2100
2101         if (!m->generator_unit_path)
2102                 return;
2103
2104         strv_remove(m->lookup_paths.unit_path, m->generator_unit_path);
2105         rm_rf(m->generator_unit_path, false, true, false);
2106
2107         free(m->generator_unit_path);
2108         m->generator_unit_path = NULL;
2109 }
2110
2111 int manager_set_default_controllers(Manager *m, char **controllers) {
2112         char **l;
2113
2114         assert(m);
2115
2116         l = strv_copy(controllers);
2117         if (!l)
2118                 return -ENOMEM;
2119
2120         strv_free(m->default_controllers);
2121         m->default_controllers = l;
2122
2123         cg_shorten_controllers(m->default_controllers);
2124
2125         return 0;
2126 }
2127
2128 void manager_recheck_journal(Manager *m) {
2129         Unit *u;
2130
2131         assert(m);
2132
2133         if (m->running_as != MANAGER_SYSTEM)
2134                 return;
2135
2136         u = manager_get_unit(m, SPECIAL_JOURNALD_SOCKET);
2137         if (u && SOCKET(u)->state != SOCKET_RUNNING) {
2138                 log_close_journal();
2139                 return;
2140         }
2141
2142         u = manager_get_unit(m, SPECIAL_JOURNALD_SERVICE);
2143         if (u && SERVICE(u)->state != SERVICE_RUNNING) {
2144                 log_close_journal();
2145                 return;
2146         }
2147
2148         /* Hmm, OK, so the socket is fully up and the service is up
2149          * too, then let's make use of the thing. */
2150         log_open();
2151 }
2152
2153 void manager_set_show_status(Manager *m, bool b) {
2154         assert(m);
2155
2156         if (m->running_as != MANAGER_SYSTEM)
2157                 return;
2158
2159         m->show_status = b;
2160
2161         if (b)
2162                 touch("/run/systemd/show-status");
2163         else
2164                 unlink("/run/systemd/show-status");
2165 }
2166
2167 bool manager_get_show_status(Manager *m) {
2168         assert(m);
2169
2170         if (m->running_as != MANAGER_SYSTEM)
2171                 return false;
2172
2173         if (m->show_status)
2174                 return true;
2175
2176         /* If Plymouth is running make sure we show the status, so
2177          * that there's something nice to see when people press Esc */
2178
2179         return plymouth_running();
2180 }
2181
2182 static const char* const manager_running_as_table[_MANAGER_RUNNING_AS_MAX] = {
2183         [MANAGER_SYSTEM] = "system",
2184         [MANAGER_USER] = "user"
2185 };
2186
2187 DEFINE_STRING_TABLE_LOOKUP(manager_running_as, ManagerRunningAs);