chiark / gitweb /
core: minor modernizations
[elogind.git] / src / core / unit.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 <sys/timerfd.h>
27 #include <sys/poll.h>
28 #include <stdlib.h>
29 #include <unistd.h>
30 #include <sys/stat.h>
31
32 #include "sd-id128.h"
33 #include "sd-messages.h"
34 #include "set.h"
35 #include "unit.h"
36 #include "macro.h"
37 #include "strv.h"
38 #include "path-util.h"
39 #include "load-fragment.h"
40 #include "load-dropin.h"
41 #include "log.h"
42 #include "unit-name.h"
43 #include "dbus-unit.h"
44 #include "special.h"
45 #include "cgroup-util.h"
46 #include "missing.h"
47 #include "mkdir.h"
48 #include "label.h"
49 #include "fileio-label.h"
50 #include "bus-errors.h"
51 #include "dbus.h"
52 #include "execute.h"
53 #include "virt.h"
54 #include "dropin.h"
55
56 const UnitVTable * const unit_vtable[_UNIT_TYPE_MAX] = {
57         [UNIT_SERVICE] = &service_vtable,
58         [UNIT_SOCKET] = &socket_vtable,
59         [UNIT_BUSNAME] = &busname_vtable,
60         [UNIT_TARGET] = &target_vtable,
61         [UNIT_SNAPSHOT] = &snapshot_vtable,
62         [UNIT_DEVICE] = &device_vtable,
63         [UNIT_MOUNT] = &mount_vtable,
64         [UNIT_AUTOMOUNT] = &automount_vtable,
65         [UNIT_SWAP] = &swap_vtable,
66         [UNIT_TIMER] = &timer_vtable,
67         [UNIT_PATH] = &path_vtable,
68         [UNIT_SLICE] = &slice_vtable,
69         [UNIT_SCOPE] = &scope_vtable
70 };
71
72 static int maybe_warn_about_dependency(const char *id, const char *other, UnitDependency dependency);
73
74 Unit *unit_new(Manager *m, size_t size) {
75         Unit *u;
76
77         assert(m);
78         assert(size >= sizeof(Unit));
79
80         u = malloc0(size);
81         if (!u)
82                 return NULL;
83
84         u->names = set_new(string_hash_func, string_compare_func);
85         if (!u->names) {
86                 free(u);
87                 return NULL;
88         }
89
90         u->manager = m;
91         u->type = _UNIT_TYPE_INVALID;
92         u->deserialized_job = _JOB_TYPE_INVALID;
93         u->default_dependencies = true;
94         u->unit_file_state = _UNIT_FILE_STATE_INVALID;
95         u->on_failure_job_mode = JOB_REPLACE;
96
97         return u;
98 }
99
100 bool unit_has_name(Unit *u, const char *name) {
101         assert(u);
102         assert(name);
103
104         return !!set_get(u->names, (char*) name);
105 }
106
107 static void unit_init(Unit *u) {
108         CGroupContext *cc;
109         ExecContext *ec;
110         KillContext *kc;
111
112         assert(u);
113         assert(u->manager);
114         assert(u->type >= 0);
115
116         cc = unit_get_cgroup_context(u);
117         if (cc) {
118                 cgroup_context_init(cc);
119
120                 /* Copy in the manager defaults into the cgroup
121                  * context, _before_ the rest of the settings have
122                  * been initialized */
123
124                 cc->cpu_accounting = u->manager->default_cpu_accounting;
125                 cc->blockio_accounting = u->manager->default_blockio_accounting;
126                 cc->memory_accounting = u->manager->default_memory_accounting;
127         }
128
129         ec = unit_get_exec_context(u);
130         if (ec)
131                 exec_context_init(ec);
132
133         kc = unit_get_kill_context(u);
134         if (kc)
135                 kill_context_init(kc);
136
137         if (UNIT_VTABLE(u)->init)
138                 UNIT_VTABLE(u)->init(u);
139 }
140
141 int unit_add_name(Unit *u, const char *text) {
142         _cleanup_free_ char *s = NULL, *i = NULL;
143         UnitType t;
144         int r;
145
146         assert(u);
147         assert(text);
148
149         if (unit_name_is_template(text)) {
150
151                 if (!u->instance)
152                         return -EINVAL;
153
154                 s = unit_name_replace_instance(text, u->instance);
155         } else
156                 s = strdup(text);
157         if (!s)
158                 return -ENOMEM;
159
160         if (!unit_name_is_valid(s, TEMPLATE_INVALID))
161                 return -EINVAL;
162
163         assert_se((t = unit_name_to_type(s)) >= 0);
164
165         if (u->type != _UNIT_TYPE_INVALID && t != u->type)
166                 return -EINVAL;
167
168         r = unit_name_to_instance(s, &i);
169         if (r < 0)
170                 return r;
171
172         if (i && unit_vtable[t]->no_instances)
173                 return -EINVAL;
174
175         /* Ensure that this unit is either instanced or not instanced,
176          * but not both. */
177         if (u->type != _UNIT_TYPE_INVALID && !u->instance != !i)
178                 return -EINVAL;
179
180         if (unit_vtable[t]->no_alias &&
181             !set_isempty(u->names) &&
182             !set_get(u->names, s))
183                 return -EEXIST;
184
185         if (hashmap_size(u->manager->units) >= MANAGER_MAX_NAMES)
186                 return -E2BIG;
187
188         r = set_put(u->names, s);
189         if (r < 0) {
190                 if (r == -EEXIST)
191                         return 0;
192
193                 return r;
194         }
195
196         r = hashmap_put(u->manager->units, s, u);
197         if (r < 0) {
198                 set_remove(u->names, s);
199                 return r;
200         }
201
202         if (u->type == _UNIT_TYPE_INVALID) {
203                 u->type = t;
204                 u->id = s;
205                 u->instance = i;
206
207                 LIST_PREPEND(units_by_type, u->manager->units_by_type[t], u);
208
209                 unit_init(u);
210
211                 i = NULL;
212         }
213
214         s = NULL;
215
216         unit_add_to_dbus_queue(u);
217         return 0;
218 }
219
220 int unit_choose_id(Unit *u, const char *name) {
221         _cleanup_free_ char *t = NULL;
222         char *s, *i;
223         int r;
224
225         assert(u);
226         assert(name);
227
228         if (unit_name_is_template(name)) {
229
230                 if (!u->instance)
231                         return -EINVAL;
232
233                 t = unit_name_replace_instance(name, u->instance);
234                 if (!t)
235                         return -ENOMEM;
236
237                 name = t;
238         }
239
240         /* Selects one of the names of this unit as the id */
241         s = set_get(u->names, (char*) name);
242         if (!s)
243                 return -ENOENT;
244
245         r = unit_name_to_instance(s, &i);
246         if (r < 0)
247                 return r;
248
249         u->id = s;
250
251         free(u->instance);
252         u->instance = i;
253
254         unit_add_to_dbus_queue(u);
255
256         return 0;
257 }
258
259 int unit_set_description(Unit *u, const char *description) {
260         char *s;
261
262         assert(u);
263
264         if (isempty(description))
265                 s = NULL;
266         else {
267                 s = strdup(description);
268                 if (!s)
269                         return -ENOMEM;
270         }
271
272         free(u->description);
273         u->description = s;
274
275         unit_add_to_dbus_queue(u);
276         return 0;
277 }
278
279 bool unit_check_gc(Unit *u) {
280         assert(u);
281
282         if (UNIT_VTABLE(u)->no_gc)
283                 return true;
284
285         if (u->no_gc)
286                 return true;
287
288         if (u->job)
289                 return true;
290
291         if (u->nop_job)
292                 return true;
293
294         if (unit_active_state(u) != UNIT_INACTIVE)
295                 return true;
296
297         if (u->refs)
298                 return true;
299
300         if (UNIT_VTABLE(u)->check_gc)
301                 if (UNIT_VTABLE(u)->check_gc(u))
302                         return true;
303
304         return false;
305 }
306
307 void unit_add_to_load_queue(Unit *u) {
308         assert(u);
309         assert(u->type != _UNIT_TYPE_INVALID);
310
311         if (u->load_state != UNIT_STUB || u->in_load_queue)
312                 return;
313
314         LIST_PREPEND(load_queue, u->manager->load_queue, u);
315         u->in_load_queue = true;
316 }
317
318 void unit_add_to_cleanup_queue(Unit *u) {
319         assert(u);
320
321         if (u->in_cleanup_queue)
322                 return;
323
324         LIST_PREPEND(cleanup_queue, u->manager->cleanup_queue, u);
325         u->in_cleanup_queue = true;
326 }
327
328 void unit_add_to_gc_queue(Unit *u) {
329         assert(u);
330
331         if (u->in_gc_queue || u->in_cleanup_queue)
332                 return;
333
334         if (unit_check_gc(u))
335                 return;
336
337         LIST_PREPEND(gc_queue, u->manager->gc_queue, u);
338         u->in_gc_queue = true;
339
340         u->manager->n_in_gc_queue ++;
341 }
342
343 void unit_add_to_dbus_queue(Unit *u) {
344         assert(u);
345         assert(u->type != _UNIT_TYPE_INVALID);
346
347         if (u->load_state == UNIT_STUB || u->in_dbus_queue)
348                 return;
349
350         /* Shortcut things if nobody cares */
351         if (sd_bus_track_count(u->manager->subscribed) <= 0 &&
352             set_isempty(u->manager->private_buses)) {
353                 u->sent_dbus_new_signal = true;
354                 return;
355         }
356
357         LIST_PREPEND(dbus_queue, u->manager->dbus_unit_queue, u);
358         u->in_dbus_queue = true;
359 }
360
361 static void bidi_set_free(Unit *u, Set *s) {
362         Iterator i;
363         Unit *other;
364
365         assert(u);
366
367         /* Frees the set and makes sure we are dropped from the
368          * inverse pointers */
369
370         SET_FOREACH(other, s, i) {
371                 UnitDependency d;
372
373                 for (d = 0; d < _UNIT_DEPENDENCY_MAX; d++)
374                         set_remove(other->dependencies[d], u);
375
376                 unit_add_to_gc_queue(other);
377         }
378
379         set_free(s);
380 }
381
382 static void unit_remove_transient(Unit *u) {
383         char **i;
384
385         assert(u);
386
387         if (!u->transient)
388                 return;
389
390         if (u->fragment_path)
391                 unlink(u->fragment_path);
392
393         STRV_FOREACH(i, u->dropin_paths) {
394                 _cleanup_free_ char *p = NULL;
395                 int r;
396
397                 unlink(*i);
398
399                 r = path_get_parent(*i, &p);
400                 if (r >= 0)
401                         rmdir(p);
402         }
403 }
404
405 static void unit_free_requires_mounts_for(Unit *u) {
406         char **j;
407
408         STRV_FOREACH(j, u->requires_mounts_for) {
409                 char s[strlen(*j) + 1];
410
411                 PATH_FOREACH_PREFIX_MORE(s, *j) {
412                         char *y;
413                         Set *x;
414
415                         x = hashmap_get2(u->manager->units_requiring_mounts_for, s, (void**) &y);
416                         if (!x)
417                                 continue;
418
419                         set_remove(x, u);
420
421                         if (set_isempty(x)) {
422                                 hashmap_remove(u->manager->units_requiring_mounts_for, y);
423                                 free(y);
424                                 set_free(x);
425                         }
426                 }
427         }
428
429         strv_free(u->requires_mounts_for);
430         u->requires_mounts_for = NULL;
431 }
432
433 static void unit_done(Unit *u) {
434         ExecContext *ec;
435         CGroupContext *cc;
436
437         assert(u);
438
439         if (u->type < 0)
440                 return;
441
442         if (UNIT_VTABLE(u)->done)
443                 UNIT_VTABLE(u)->done(u);
444
445         ec = unit_get_exec_context(u);
446         if (ec)
447                 exec_context_done(ec);
448
449         cc = unit_get_cgroup_context(u);
450         if (cc)
451                 cgroup_context_done(cc);
452 }
453
454 void unit_free(Unit *u) {
455         UnitDependency d;
456         Iterator i;
457         char *t;
458
459         assert(u);
460
461         if (u->manager->n_reloading <= 0)
462                 unit_remove_transient(u);
463
464         bus_unit_send_removed_signal(u);
465
466         unit_done(u);
467
468         unit_free_requires_mounts_for(u);
469
470         SET_FOREACH(t, u->names, i)
471                 hashmap_remove_value(u->manager->units, t, u);
472
473         if (u->job) {
474                 Job *j = u->job;
475                 job_uninstall(j);
476                 job_free(j);
477         }
478
479         if (u->nop_job) {
480                 Job *j = u->nop_job;
481                 job_uninstall(j);
482                 job_free(j);
483         }
484
485         for (d = 0; d < _UNIT_DEPENDENCY_MAX; d++)
486                 bidi_set_free(u, u->dependencies[d]);
487
488         if (u->type != _UNIT_TYPE_INVALID)
489                 LIST_REMOVE(units_by_type, u->manager->units_by_type[u->type], u);
490
491         if (u->in_load_queue)
492                 LIST_REMOVE(load_queue, u->manager->load_queue, u);
493
494         if (u->in_dbus_queue)
495                 LIST_REMOVE(dbus_queue, u->manager->dbus_unit_queue, u);
496
497         if (u->in_cleanup_queue)
498                 LIST_REMOVE(cleanup_queue, u->manager->cleanup_queue, u);
499
500         if (u->in_gc_queue) {
501                 LIST_REMOVE(gc_queue, u->manager->gc_queue, u);
502                 u->manager->n_in_gc_queue--;
503         }
504
505         if (u->in_cgroup_queue)
506                 LIST_REMOVE(cgroup_queue, u->manager->cgroup_queue, u);
507
508         if (u->cgroup_path) {
509                 hashmap_remove(u->manager->cgroup_unit, u->cgroup_path);
510                 free(u->cgroup_path);
511         }
512
513         set_remove(u->manager->failed_units, u);
514         set_remove(u->manager->startup_units, u);
515
516         free(u->description);
517         strv_free(u->documentation);
518         free(u->fragment_path);
519         free(u->source_path);
520         strv_free(u->dropin_paths);
521         free(u->instance);
522
523         set_free_free(u->names);
524
525         unit_unwatch_all_pids(u);
526
527         condition_free_list(u->conditions);
528
529         unit_ref_unset(&u->slice);
530
531         while (u->refs)
532                 unit_ref_unset(u->refs);
533
534         free(u);
535 }
536
537 UnitActiveState unit_active_state(Unit *u) {
538         assert(u);
539
540         if (u->load_state == UNIT_MERGED)
541                 return unit_active_state(unit_follow_merge(u));
542
543         /* After a reload it might happen that a unit is not correctly
544          * loaded but still has a process around. That's why we won't
545          * shortcut failed loading to UNIT_INACTIVE_FAILED. */
546
547         return UNIT_VTABLE(u)->active_state(u);
548 }
549
550 const char* unit_sub_state_to_string(Unit *u) {
551         assert(u);
552
553         return UNIT_VTABLE(u)->sub_state_to_string(u);
554 }
555
556 static void complete_move(Set **s, Set **other) {
557         assert(s);
558         assert(other);
559
560         if (!*other)
561                 return;
562
563         if (*s)
564                 set_move(*s, *other);
565         else {
566                 *s = *other;
567                 *other = NULL;
568         }
569 }
570
571 static void merge_names(Unit *u, Unit *other) {
572         char *t;
573         Iterator i;
574
575         assert(u);
576         assert(other);
577
578         complete_move(&u->names, &other->names);
579
580         set_free_free(other->names);
581         other->names = NULL;
582         other->id = NULL;
583
584         SET_FOREACH(t, u->names, i)
585                 assert_se(hashmap_replace(u->manager->units, t, u) == 0);
586 }
587
588 static void merge_dependencies(Unit *u, Unit *other, const char *other_id, UnitDependency d) {
589         Iterator i;
590         Unit *back;
591         int r;
592
593         assert(u);
594         assert(other);
595         assert(d < _UNIT_DEPENDENCY_MAX);
596
597         /* Fix backwards pointers */
598         SET_FOREACH(back, other->dependencies[d], i) {
599                 UnitDependency k;
600
601                 for (k = 0; k < _UNIT_DEPENDENCY_MAX; k++) {
602                         /* Do not add dependencies between u and itself */
603                         if (back == u) {
604                                 if (set_remove(back->dependencies[k], other))
605                                         maybe_warn_about_dependency(u->id, other_id, k);
606                         } else {
607                                 r = set_remove_and_put(back->dependencies[k], other, u);
608                                 if (r == -EEXIST)
609                                         set_remove(back->dependencies[k], other);
610                                 else
611                                         assert(r >= 0 || r == -ENOENT);
612                         }
613                 }
614         }
615
616         /* Also do not move dependencies on u to itself */
617         back = set_remove(other->dependencies[d], u);
618         if (back)
619                 maybe_warn_about_dependency(u->id, other_id, d);
620
621         complete_move(&u->dependencies[d], &other->dependencies[d]);
622
623         set_free(other->dependencies[d]);
624         other->dependencies[d] = NULL;
625 }
626
627 int unit_merge(Unit *u, Unit *other) {
628         UnitDependency d;
629         const char *other_id = NULL;
630
631         assert(u);
632         assert(other);
633         assert(u->manager == other->manager);
634         assert(u->type != _UNIT_TYPE_INVALID);
635
636         other = unit_follow_merge(other);
637
638         if (other == u)
639                 return 0;
640
641         if (u->type != other->type)
642                 return -EINVAL;
643
644         if (!u->instance != !other->instance)
645                 return -EINVAL;
646
647         if (other->load_state != UNIT_STUB &&
648             other->load_state != UNIT_NOT_FOUND)
649                 return -EEXIST;
650
651         if (other->job)
652                 return -EEXIST;
653
654         if (other->nop_job)
655                 return -EEXIST;
656
657         if (!UNIT_IS_INACTIVE_OR_FAILED(unit_active_state(other)))
658                 return -EEXIST;
659
660         if (other->id)
661                 other_id = strdupa(other->id);
662
663         /* Merge names */
664         merge_names(u, other);
665
666         /* Redirect all references */
667         while (other->refs)
668                 unit_ref_set(other->refs, u);
669
670         /* Merge dependencies */
671         for (d = 0; d < _UNIT_DEPENDENCY_MAX; d++)
672                 merge_dependencies(u, other, other_id, d);
673
674         other->load_state = UNIT_MERGED;
675         other->merged_into = u;
676
677         /* If there is still some data attached to the other node, we
678          * don't need it anymore, and can free it. */
679         if (other->load_state != UNIT_STUB)
680                 if (UNIT_VTABLE(other)->done)
681                         UNIT_VTABLE(other)->done(other);
682
683         unit_add_to_dbus_queue(u);
684         unit_add_to_cleanup_queue(other);
685
686         return 0;
687 }
688
689 int unit_merge_by_name(Unit *u, const char *name) {
690         Unit *other;
691         int r;
692         _cleanup_free_ char *s = NULL;
693
694         assert(u);
695         assert(name);
696
697         if (unit_name_is_template(name)) {
698                 if (!u->instance)
699                         return -EINVAL;
700
701                 s = unit_name_replace_instance(name, u->instance);
702                 if (!s)
703                         return -ENOMEM;
704
705                 name = s;
706         }
707
708         other = manager_get_unit(u->manager, name);
709         if (!other)
710                 r = unit_add_name(u, name);
711         else
712                 r = unit_merge(u, other);
713
714         return r;
715 }
716
717 Unit* unit_follow_merge(Unit *u) {
718         assert(u);
719
720         while (u->load_state == UNIT_MERGED)
721                 assert_se(u = u->merged_into);
722
723         return u;
724 }
725
726 int unit_add_exec_dependencies(Unit *u, ExecContext *c) {
727         int r;
728
729         assert(u);
730         assert(c);
731
732         if (c->working_directory) {
733                 r = unit_require_mounts_for(u, c->working_directory);
734                 if (r < 0)
735                         return r;
736         }
737
738         if (c->root_directory) {
739                 r = unit_require_mounts_for(u, c->root_directory);
740                 if (r < 0)
741                         return r;
742         }
743
744         if (u->manager->running_as != SYSTEMD_SYSTEM)
745                 return 0;
746
747         if (c->private_tmp) {
748                 r = unit_require_mounts_for(u, "/tmp");
749                 if (r < 0)
750                         return r;
751
752                 r = unit_require_mounts_for(u, "/var/tmp");
753                 if (r < 0)
754                         return r;
755         }
756
757         if (c->std_output != EXEC_OUTPUT_KMSG &&
758             c->std_output != EXEC_OUTPUT_SYSLOG &&
759             c->std_output != EXEC_OUTPUT_JOURNAL &&
760             c->std_output != EXEC_OUTPUT_KMSG_AND_CONSOLE &&
761             c->std_output != EXEC_OUTPUT_SYSLOG_AND_CONSOLE &&
762             c->std_output != EXEC_OUTPUT_JOURNAL_AND_CONSOLE &&
763             c->std_error != EXEC_OUTPUT_KMSG &&
764             c->std_error != EXEC_OUTPUT_SYSLOG &&
765             c->std_error != EXEC_OUTPUT_JOURNAL &&
766             c->std_error != EXEC_OUTPUT_KMSG_AND_CONSOLE &&
767             c->std_error != EXEC_OUTPUT_JOURNAL_AND_CONSOLE &&
768             c->std_error != EXEC_OUTPUT_SYSLOG_AND_CONSOLE)
769                 return 0;
770
771         /* If syslog or kernel logging is requested, make sure our own
772          * logging daemon is run first. */
773
774         r = unit_add_dependency_by_name(u, UNIT_AFTER, SPECIAL_JOURNALD_SOCKET, NULL, true);
775         if (r < 0)
776                 return r;
777
778         return 0;
779 }
780
781 const char *unit_description(Unit *u) {
782         assert(u);
783
784         if (u->description)
785                 return u->description;
786
787         return strna(u->id);
788 }
789
790 void unit_dump(Unit *u, FILE *f, const char *prefix) {
791         char *t, **j;
792         UnitDependency d;
793         Iterator i;
794         _cleanup_free_ char *p2 = NULL;
795         const char *prefix2;
796         char
797                 timestamp1[FORMAT_TIMESTAMP_MAX],
798                 timestamp2[FORMAT_TIMESTAMP_MAX],
799                 timestamp3[FORMAT_TIMESTAMP_MAX],
800                 timestamp4[FORMAT_TIMESTAMP_MAX],
801                 timespan[FORMAT_TIMESPAN_MAX];
802         Unit *following;
803         _cleanup_set_free_ Set *following_set = NULL;
804         int r;
805
806         assert(u);
807         assert(u->type >= 0);
808
809         if (!prefix)
810                 prefix = "";
811         p2 = strappend(prefix, "\t");
812         prefix2 = p2 ? p2 : prefix;
813
814         fprintf(f,
815                 "%s-> Unit %s:\n"
816                 "%s\tDescription: %s\n"
817                 "%s\tInstance: %s\n"
818                 "%s\tUnit Load State: %s\n"
819                 "%s\tUnit Active State: %s\n"
820                 "%s\tInactive Exit Timestamp: %s\n"
821                 "%s\tActive Enter Timestamp: %s\n"
822                 "%s\tActive Exit Timestamp: %s\n"
823                 "%s\tInactive Enter Timestamp: %s\n"
824                 "%s\tGC Check Good: %s\n"
825                 "%s\tNeed Daemon Reload: %s\n"
826                 "%s\tTransient: %s\n"
827                 "%s\tSlice: %s\n"
828                 "%s\tCGroup: %s\n"
829                 "%s\tCGroup realized: %s\n"
830                 "%s\tCGroup mask: 0x%x\n"
831                 "%s\tCGroup members mask: 0x%x\n",
832                 prefix, u->id,
833                 prefix, unit_description(u),
834                 prefix, strna(u->instance),
835                 prefix, unit_load_state_to_string(u->load_state),
836                 prefix, unit_active_state_to_string(unit_active_state(u)),
837                 prefix, strna(format_timestamp(timestamp1, sizeof(timestamp1), u->inactive_exit_timestamp.realtime)),
838                 prefix, strna(format_timestamp(timestamp2, sizeof(timestamp2), u->active_enter_timestamp.realtime)),
839                 prefix, strna(format_timestamp(timestamp3, sizeof(timestamp3), u->active_exit_timestamp.realtime)),
840                 prefix, strna(format_timestamp(timestamp4, sizeof(timestamp4), u->inactive_enter_timestamp.realtime)),
841                 prefix, yes_no(unit_check_gc(u)),
842                 prefix, yes_no(unit_need_daemon_reload(u)),
843                 prefix, yes_no(u->transient),
844                 prefix, strna(unit_slice_name(u)),
845                 prefix, strna(u->cgroup_path),
846                 prefix, yes_no(u->cgroup_realized),
847                 prefix, u->cgroup_realized_mask,
848                 prefix, u->cgroup_members_mask);
849
850         SET_FOREACH(t, u->names, i)
851                 fprintf(f, "%s\tName: %s\n", prefix, t);
852
853         STRV_FOREACH(j, u->documentation)
854                 fprintf(f, "%s\tDocumentation: %s\n", prefix, *j);
855
856         following = unit_following(u);
857         if (following)
858                 fprintf(f, "%s\tFollowing: %s\n", prefix, following->id);
859
860         r = unit_following_set(u, &following_set);
861         if (r >= 0) {
862                 Unit *other;
863
864                 SET_FOREACH(other, following_set, i)
865                         fprintf(f, "%s\tFollowing Set Member: %s\n", prefix, other->id);
866         }
867
868         if (u->fragment_path)
869                 fprintf(f, "%s\tFragment Path: %s\n", prefix, u->fragment_path);
870
871         if (u->source_path)
872                 fprintf(f, "%s\tSource Path: %s\n", prefix, u->source_path);
873
874         STRV_FOREACH(j, u->dropin_paths)
875                 fprintf(f, "%s\tDropIn Path: %s\n", prefix, *j);
876
877         if (u->job_timeout > 0)
878                 fprintf(f, "%s\tJob Timeout: %s\n", prefix, format_timespan(timespan, sizeof(timespan), u->job_timeout, 0));
879
880         condition_dump_list(u->conditions, f, prefix);
881
882         if (dual_timestamp_is_set(&u->condition_timestamp))
883                 fprintf(f,
884                         "%s\tCondition Timestamp: %s\n"
885                         "%s\tCondition Result: %s\n",
886                         prefix, strna(format_timestamp(timestamp1, sizeof(timestamp1), u->condition_timestamp.realtime)),
887                         prefix, yes_no(u->condition_result));
888
889         for (d = 0; d < _UNIT_DEPENDENCY_MAX; d++) {
890                 Unit *other;
891
892                 SET_FOREACH(other, u->dependencies[d], i)
893                         fprintf(f, "%s\t%s: %s\n", prefix, unit_dependency_to_string(d), other->id);
894         }
895
896         if (!strv_isempty(u->requires_mounts_for)) {
897                 fprintf(f,
898                         "%s\tRequiresMountsFor:", prefix);
899
900                 STRV_FOREACH(j, u->requires_mounts_for)
901                         fprintf(f, " %s", *j);
902
903                 fputs("\n", f);
904         }
905
906         if (u->load_state == UNIT_LOADED) {
907
908                 fprintf(f,
909                         "%s\tStopWhenUnneeded: %s\n"
910                         "%s\tRefuseManualStart: %s\n"
911                         "%s\tRefuseManualStop: %s\n"
912                         "%s\tDefaultDependencies: %s\n"
913                         "%s\tOnFailureJobMode: %s\n"
914                         "%s\tIgnoreOnIsolate: %s\n"
915                         "%s\tIgnoreOnSnapshot: %s\n",
916                         prefix, yes_no(u->stop_when_unneeded),
917                         prefix, yes_no(u->refuse_manual_start),
918                         prefix, yes_no(u->refuse_manual_stop),
919                         prefix, yes_no(u->default_dependencies),
920                         prefix, job_mode_to_string(u->on_failure_job_mode),
921                         prefix, yes_no(u->ignore_on_isolate),
922                         prefix, yes_no(u->ignore_on_snapshot));
923
924                 if (UNIT_VTABLE(u)->dump)
925                         UNIT_VTABLE(u)->dump(u, f, prefix2);
926
927         } else if (u->load_state == UNIT_MERGED)
928                 fprintf(f,
929                         "%s\tMerged into: %s\n",
930                         prefix, u->merged_into->id);
931         else if (u->load_state == UNIT_ERROR)
932                 fprintf(f, "%s\tLoad Error Code: %s\n", prefix, strerror(-u->load_error));
933
934
935         if (u->job)
936                 job_dump(u->job, f, prefix2);
937
938         if (u->nop_job)
939                 job_dump(u->nop_job, f, prefix2);
940
941 }
942
943 /* Common implementation for multiple backends */
944 int unit_load_fragment_and_dropin(Unit *u) {
945         int r;
946
947         assert(u);
948
949         /* Load a .{service,socket,...} file */
950         r = unit_load_fragment(u);
951         if (r < 0)
952                 return r;
953
954         if (u->load_state == UNIT_STUB)
955                 return -ENOENT;
956
957         /* Load drop-in directory data */
958         r = unit_load_dropin(unit_follow_merge(u));
959         if (r < 0)
960                 return r;
961
962         return 0;
963 }
964
965 /* Common implementation for multiple backends */
966 int unit_load_fragment_and_dropin_optional(Unit *u) {
967         int r;
968
969         assert(u);
970
971         /* Same as unit_load_fragment_and_dropin(), but whether
972          * something can be loaded or not doesn't matter. */
973
974         /* Load a .service file */
975         r = unit_load_fragment(u);
976         if (r < 0)
977                 return r;
978
979         if (u->load_state == UNIT_STUB)
980                 u->load_state = UNIT_LOADED;
981
982         /* Load drop-in directory data */
983         r = unit_load_dropin(unit_follow_merge(u));
984         if (r < 0)
985                 return r;
986
987         return 0;
988 }
989
990 int unit_add_default_target_dependency(Unit *u, Unit *target) {
991         assert(u);
992         assert(target);
993
994         if (target->type != UNIT_TARGET)
995                 return 0;
996
997         /* Only add the dependency if both units are loaded, so that
998          * that loop check below is reliable */
999         if (u->load_state != UNIT_LOADED ||
1000             target->load_state != UNIT_LOADED)
1001                 return 0;
1002
1003         /* If either side wants no automatic dependencies, then let's
1004          * skip this */
1005         if (!u->default_dependencies ||
1006             !target->default_dependencies)
1007                 return 0;
1008
1009         /* Don't create loops */
1010         if (set_get(target->dependencies[UNIT_BEFORE], u))
1011                 return 0;
1012
1013         return unit_add_dependency(target, UNIT_AFTER, u, true);
1014 }
1015
1016 static int unit_add_target_dependencies(Unit *u) {
1017
1018         static const UnitDependency deps[] = {
1019                 UNIT_REQUIRED_BY,
1020                 UNIT_REQUIRED_BY_OVERRIDABLE,
1021                 UNIT_WANTED_BY,
1022                 UNIT_BOUND_BY
1023         };
1024
1025         Unit *target;
1026         Iterator i;
1027         unsigned k;
1028         int r = 0;
1029
1030         assert(u);
1031
1032         for (k = 0; k < ELEMENTSOF(deps); k++)
1033                 SET_FOREACH(target, u->dependencies[deps[k]], i) {
1034                         r = unit_add_default_target_dependency(u, target);
1035                         if (r < 0)
1036                                 return r;
1037                 }
1038
1039         return r;
1040 }
1041
1042 static int unit_add_slice_dependencies(Unit *u) {
1043         assert(u);
1044
1045         if (!unit_get_cgroup_context(u))
1046                 return 0;
1047
1048         if (UNIT_ISSET(u->slice))
1049                 return unit_add_two_dependencies(u, UNIT_AFTER, UNIT_WANTS, UNIT_DEREF(u->slice), true);
1050
1051         if (streq(u->id, SPECIAL_ROOT_SLICE))
1052                 return 0;
1053
1054         return unit_add_two_dependencies_by_name(u, UNIT_AFTER, UNIT_WANTS, SPECIAL_ROOT_SLICE, NULL, true);
1055 }
1056
1057 static int unit_add_mount_dependencies(Unit *u) {
1058         char **i;
1059         int r;
1060
1061         assert(u);
1062
1063         STRV_FOREACH(i, u->requires_mounts_for) {
1064                 char prefix[strlen(*i) + 1];
1065
1066                 PATH_FOREACH_PREFIX_MORE(prefix, *i) {
1067                         Unit *m;
1068
1069                         r = manager_get_unit_by_path(u->manager, prefix, ".mount", &m);
1070                         if (r < 0)
1071                                 return r;
1072                         if (r == 0)
1073                                 continue;
1074                         if (m == u)
1075                                 continue;
1076
1077                         if (m->load_state != UNIT_LOADED)
1078                                 continue;
1079
1080                         r = unit_add_dependency(u, UNIT_AFTER, m, true);
1081                         if (r < 0)
1082                                 return r;
1083
1084                         if (m->fragment_path) {
1085                                 r = unit_add_dependency(u, UNIT_REQUIRES, m, true);
1086                                 if (r < 0)
1087                                         return r;
1088                         }
1089                 }
1090         }
1091
1092         return 0;
1093 }
1094
1095 static int unit_add_startup_units(Unit *u) {
1096         CGroupContext *c;
1097         int r = 0;
1098
1099         c = unit_get_cgroup_context(u);
1100         if (!c)
1101                 return 0;
1102
1103         if (c->startup_cpu_shares == (unsigned long) -1 &&
1104             c->startup_blockio_weight == (unsigned long) -1)
1105                 return 0;
1106
1107         r = set_put(u->manager->startup_units, u);
1108         if (r == -EEXIST)
1109                 return 0;
1110
1111         return r;
1112 }
1113
1114 int unit_load(Unit *u) {
1115         int r;
1116
1117         assert(u);
1118
1119         if (u->in_load_queue) {
1120                 LIST_REMOVE(load_queue, u->manager->load_queue, u);
1121                 u->in_load_queue = false;
1122         }
1123
1124         if (u->type == _UNIT_TYPE_INVALID)
1125                 return -EINVAL;
1126
1127         if (u->load_state != UNIT_STUB)
1128                 return 0;
1129
1130         if (UNIT_VTABLE(u)->load) {
1131                 r = UNIT_VTABLE(u)->load(u);
1132                 if (r < 0)
1133                         goto fail;
1134         }
1135
1136         if (u->load_state == UNIT_STUB) {
1137                 r = -ENOENT;
1138                 goto fail;
1139         }
1140
1141         if (u->load_state == UNIT_LOADED) {
1142
1143                 r = unit_add_target_dependencies(u);
1144                 if (r < 0)
1145                         goto fail;
1146
1147                 r = unit_add_slice_dependencies(u);
1148                 if (r < 0)
1149                         goto fail;
1150
1151                 r = unit_add_mount_dependencies(u);
1152                 if (r < 0)
1153                         goto fail;
1154
1155                 r = unit_add_startup_units(u);
1156                 if (r < 0)
1157                         goto fail;
1158
1159                 if (u->on_failure_job_mode == JOB_ISOLATE && set_size(u->dependencies[UNIT_ON_FAILURE]) > 1) {
1160                         log_error_unit(u->id, "More than one OnFailure= dependencies specified for %s but OnFailureJobMode=isolate set. Refusing.", u->id);
1161                         r = -EINVAL;
1162                         goto fail;
1163                 }
1164
1165                 unit_update_cgroup_members_masks(u);
1166         }
1167
1168         assert((u->load_state != UNIT_MERGED) == !u->merged_into);
1169
1170         unit_add_to_dbus_queue(unit_follow_merge(u));
1171         unit_add_to_gc_queue(u);
1172
1173         return 0;
1174
1175 fail:
1176         u->load_state = u->load_state == UNIT_STUB ? UNIT_NOT_FOUND : UNIT_ERROR;
1177         u->load_error = r;
1178         unit_add_to_dbus_queue(u);
1179         unit_add_to_gc_queue(u);
1180
1181         log_debug_unit(u->id, "Failed to load configuration for %s: %s",
1182                        u->id, strerror(-r));
1183
1184         return r;
1185 }
1186
1187 static bool unit_condition_test(Unit *u) {
1188         assert(u);
1189
1190         dual_timestamp_get(&u->condition_timestamp);
1191         u->condition_result = condition_test_list(u->id, u->conditions);
1192
1193         return u->condition_result;
1194 }
1195
1196 _pure_ static const char* unit_get_status_message_format(Unit *u, JobType t) {
1197         const UnitStatusMessageFormats *format_table;
1198
1199         assert(u);
1200         assert(t >= 0);
1201         assert(t < _JOB_TYPE_MAX);
1202
1203         if (t != JOB_START && t != JOB_STOP)
1204                 return NULL;
1205
1206         format_table = &UNIT_VTABLE(u)->status_message_formats;
1207         if (!format_table)
1208                 return NULL;
1209
1210         return format_table->starting_stopping[t == JOB_STOP];
1211 }
1212
1213 _pure_ static const char *unit_get_status_message_format_try_harder(Unit *u, JobType t) {
1214         const char *format;
1215
1216         assert(u);
1217         assert(t >= 0);
1218         assert(t < _JOB_TYPE_MAX);
1219
1220         format = unit_get_status_message_format(u, t);
1221         if (format)
1222                 return format;
1223
1224         /* Return generic strings */
1225         if (t == JOB_START)
1226                 return "Starting %s.";
1227         else if (t == JOB_STOP)
1228                 return "Stopping %s.";
1229         else if (t == JOB_RELOAD)
1230                 return "Reloading %s.";
1231
1232         return NULL;
1233 }
1234
1235 static void unit_status_print_starting_stopping(Unit *u, JobType t) {
1236         const char *format;
1237
1238         assert(u);
1239
1240         /* We only print status messages for selected units on
1241          * selected operations. */
1242
1243         format = unit_get_status_message_format(u, t);
1244         if (!format)
1245                 return;
1246
1247         DISABLE_WARNING_FORMAT_NONLITERAL;
1248         unit_status_printf(u, "", format);
1249         REENABLE_WARNING;
1250 }
1251
1252 static void unit_status_log_starting_stopping_reloading(Unit *u, JobType t) {
1253         const char *format;
1254         char buf[LINE_MAX];
1255         sd_id128_t mid;
1256
1257         assert(u);
1258
1259         if (t != JOB_START && t != JOB_STOP && t != JOB_RELOAD)
1260                 return;
1261
1262         if (log_on_console())
1263                 return;
1264
1265         /* We log status messages for all units and all operations. */
1266
1267         format = unit_get_status_message_format_try_harder(u, t);
1268         if (!format)
1269                 return;
1270
1271         DISABLE_WARNING_FORMAT_NONLITERAL;
1272         snprintf(buf, sizeof(buf), format, unit_description(u));
1273         char_array_0(buf);
1274         REENABLE_WARNING;
1275
1276         mid = t == JOB_START ? SD_MESSAGE_UNIT_STARTING :
1277               t == JOB_STOP  ? SD_MESSAGE_UNIT_STOPPING :
1278                                SD_MESSAGE_UNIT_RELOADING;
1279
1280         log_struct_unit(LOG_INFO,
1281                         u->id,
1282                         MESSAGE_ID(mid),
1283                         "MESSAGE=%s", buf,
1284                         NULL);
1285 }
1286
1287 /* Errors:
1288  *         -EBADR:     This unit type does not support starting.
1289  *         -EALREADY:  Unit is already started.
1290  *         -EAGAIN:    An operation is already in progress. Retry later.
1291  *         -ECANCELED: Too many requests for now.
1292  */
1293 int unit_start(Unit *u) {
1294         UnitActiveState state;
1295         Unit *following;
1296
1297         assert(u);
1298
1299         if (u->load_state != UNIT_LOADED)
1300                 return -EINVAL;
1301
1302         /* If this is already started, then this will succeed. Note
1303          * that this will even succeed if this unit is not startable
1304          * by the user. This is relied on to detect when we need to
1305          * wait for units and when waiting is finished. */
1306         state = unit_active_state(u);
1307         if (UNIT_IS_ACTIVE_OR_RELOADING(state))
1308                 return -EALREADY;
1309
1310         /* If the conditions failed, don't do anything at all. If we
1311          * already are activating this call might still be useful to
1312          * speed up activation in case there is some hold-off time,
1313          * but we don't want to recheck the condition in that case. */
1314         if (state != UNIT_ACTIVATING &&
1315             !unit_condition_test(u)) {
1316                 log_debug_unit(u->id, "Starting of %s requested but condition failed. Ignoring.", u->id);
1317                 return -EALREADY;
1318         }
1319
1320         /* Forward to the main object, if we aren't it. */
1321         following = unit_following(u);
1322         if (following) {
1323                 log_debug_unit(u->id, "Redirecting start request from %s to %s.",
1324                                u->id, following->id);
1325                 return unit_start(following);
1326         }
1327
1328         unit_status_log_starting_stopping_reloading(u, JOB_START);
1329         unit_status_print_starting_stopping(u, JOB_START);
1330
1331         /* If it is stopped, but we cannot start it, then fail */
1332         if (!UNIT_VTABLE(u)->start)
1333                 return -EBADR;
1334
1335         /* We don't suppress calls to ->start() here when we are
1336          * already starting, to allow this request to be used as a
1337          * "hurry up" call, for example when the unit is in some "auto
1338          * restart" state where it waits for a holdoff timer to elapse
1339          * before it will start again. */
1340
1341         unit_add_to_dbus_queue(u);
1342
1343         return UNIT_VTABLE(u)->start(u);
1344 }
1345
1346 bool unit_can_start(Unit *u) {
1347         assert(u);
1348
1349         return !!UNIT_VTABLE(u)->start;
1350 }
1351
1352 bool unit_can_isolate(Unit *u) {
1353         assert(u);
1354
1355         return unit_can_start(u) &&
1356                 u->allow_isolate;
1357 }
1358
1359 /* Errors:
1360  *         -EBADR:    This unit type does not support stopping.
1361  *         -EALREADY: Unit is already stopped.
1362  *         -EAGAIN:   An operation is already in progress. Retry later.
1363  */
1364 int unit_stop(Unit *u) {
1365         UnitActiveState state;
1366         Unit *following;
1367
1368         assert(u);
1369
1370         state = unit_active_state(u);
1371         if (UNIT_IS_INACTIVE_OR_FAILED(state))
1372                 return -EALREADY;
1373
1374         if ((following = unit_following(u))) {
1375                 log_debug_unit(u->id, "Redirecting stop request from %s to %s.",
1376                                u->id, following->id);
1377                 return unit_stop(following);
1378         }
1379
1380         unit_status_log_starting_stopping_reloading(u, JOB_STOP);
1381         unit_status_print_starting_stopping(u, JOB_STOP);
1382
1383         if (!UNIT_VTABLE(u)->stop)
1384                 return -EBADR;
1385
1386         unit_add_to_dbus_queue(u);
1387
1388         return UNIT_VTABLE(u)->stop(u);
1389 }
1390
1391 /* Errors:
1392  *         -EBADR:    This unit type does not support reloading.
1393  *         -ENOEXEC:  Unit is not started.
1394  *         -EAGAIN:   An operation is already in progress. Retry later.
1395  */
1396 int unit_reload(Unit *u) {
1397         UnitActiveState state;
1398         Unit *following;
1399
1400         assert(u);
1401
1402         if (u->load_state != UNIT_LOADED)
1403                 return -EINVAL;
1404
1405         if (!unit_can_reload(u))
1406                 return -EBADR;
1407
1408         state = unit_active_state(u);
1409         if (state == UNIT_RELOADING)
1410                 return -EALREADY;
1411
1412         if (state != UNIT_ACTIVE) {
1413                 log_warning_unit(u->id, "Unit %s cannot be reloaded because it is inactive.",
1414                                  u->id);
1415                 return -ENOEXEC;
1416         }
1417
1418         following = unit_following(u);
1419         if (following) {
1420                 log_debug_unit(u->id, "Redirecting reload request from %s to %s.",
1421                                u->id, following->id);
1422                 return unit_reload(following);
1423         }
1424
1425         unit_status_log_starting_stopping_reloading(u, JOB_RELOAD);
1426
1427         unit_add_to_dbus_queue(u);
1428         return UNIT_VTABLE(u)->reload(u);
1429 }
1430
1431 bool unit_can_reload(Unit *u) {
1432         assert(u);
1433
1434         if (!UNIT_VTABLE(u)->reload)
1435                 return false;
1436
1437         if (!UNIT_VTABLE(u)->can_reload)
1438                 return true;
1439
1440         return UNIT_VTABLE(u)->can_reload(u);
1441 }
1442
1443 static void unit_check_unneeded(Unit *u) {
1444         Iterator i;
1445         Unit *other;
1446
1447         assert(u);
1448
1449         /* If this service shall be shut down when unneeded then do
1450          * so. */
1451
1452         if (!u->stop_when_unneeded)
1453                 return;
1454
1455         if (!UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u)))
1456                 return;
1457
1458         SET_FOREACH(other, u->dependencies[UNIT_REQUIRED_BY], i)
1459                 if (unit_active_or_pending(other))
1460                         return;
1461
1462         SET_FOREACH(other, u->dependencies[UNIT_REQUIRED_BY_OVERRIDABLE], i)
1463                 if (unit_active_or_pending(other))
1464                         return;
1465
1466         SET_FOREACH(other, u->dependencies[UNIT_WANTED_BY], i)
1467                 if (unit_active_or_pending(other))
1468                         return;
1469
1470         SET_FOREACH(other, u->dependencies[UNIT_BOUND_BY], i)
1471                 if (unit_active_or_pending(other))
1472                         return;
1473
1474         log_info_unit(u->id, "Unit %s is not needed anymore. Stopping.", u->id);
1475
1476         /* Ok, nobody needs us anymore. Sniff. Then let's commit suicide */
1477         manager_add_job(u->manager, JOB_STOP, u, JOB_FAIL, true, NULL, NULL);
1478 }
1479
1480 static void unit_check_binds_to(Unit *u) {
1481         bool stop = false;
1482         Unit *other;
1483         Iterator i;
1484
1485         assert(u);
1486
1487         if (u->job)
1488                 return;
1489
1490         if (unit_active_state(u) != UNIT_ACTIVE)
1491                 return;
1492
1493         SET_FOREACH(other, u->dependencies[UNIT_BINDS_TO], i) {
1494                 if (other->job)
1495                         continue;
1496
1497                 if (!UNIT_IS_INACTIVE_OR_FAILED(unit_active_state(other)))
1498                         continue;
1499
1500                 stop = true;
1501         }
1502
1503         if (!stop)
1504                 return;
1505
1506         log_info_unit(u->id, "Unit %s is bound to inactive service. Stopping, too.", u->id);
1507
1508         /* A unit we need to run is gone. Sniff. Let's stop this. */
1509         manager_add_job(u->manager, JOB_STOP, u, JOB_FAIL, true, NULL, NULL);
1510 }
1511
1512 static void retroactively_start_dependencies(Unit *u) {
1513         Iterator i;
1514         Unit *other;
1515
1516         assert(u);
1517         assert(UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u)));
1518
1519         SET_FOREACH(other, u->dependencies[UNIT_REQUIRES], i)
1520                 if (!set_get(u->dependencies[UNIT_AFTER], other) &&
1521                     !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other)))
1522                         manager_add_job(u->manager, JOB_START, other, JOB_REPLACE, true, NULL, NULL);
1523
1524         SET_FOREACH(other, u->dependencies[UNIT_BINDS_TO], i)
1525                 if (!set_get(u->dependencies[UNIT_AFTER], other) &&
1526                     !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other)))
1527                         manager_add_job(u->manager, JOB_START, other, JOB_REPLACE, true, NULL, NULL);
1528
1529         SET_FOREACH(other, u->dependencies[UNIT_REQUIRES_OVERRIDABLE], i)
1530                 if (!set_get(u->dependencies[UNIT_AFTER], other) &&
1531                     !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other)))
1532                         manager_add_job(u->manager, JOB_START, other, JOB_FAIL, false, NULL, NULL);
1533
1534         SET_FOREACH(other, u->dependencies[UNIT_WANTS], i)
1535                 if (!set_get(u->dependencies[UNIT_AFTER], other) &&
1536                     !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other)))
1537                         manager_add_job(u->manager, JOB_START, other, JOB_FAIL, false, NULL, NULL);
1538
1539         SET_FOREACH(other, u->dependencies[UNIT_CONFLICTS], i)
1540                 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
1541                         manager_add_job(u->manager, JOB_STOP, other, JOB_REPLACE, true, NULL, NULL);
1542
1543         SET_FOREACH(other, u->dependencies[UNIT_CONFLICTED_BY], i)
1544                 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
1545                         manager_add_job(u->manager, JOB_STOP, other, JOB_REPLACE, true, NULL, NULL);
1546 }
1547
1548 static void retroactively_stop_dependencies(Unit *u) {
1549         Iterator i;
1550         Unit *other;
1551
1552         assert(u);
1553         assert(UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(u)));
1554
1555         /* Pull down units which are bound to us recursively if enabled */
1556         SET_FOREACH(other, u->dependencies[UNIT_BOUND_BY], i)
1557                 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
1558                         manager_add_job(u->manager, JOB_STOP, other, JOB_REPLACE, true, NULL, NULL);
1559 }
1560
1561 static void check_unneeded_dependencies(Unit *u) {
1562         Iterator i;
1563         Unit *other;
1564
1565         assert(u);
1566         assert(UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(u)));
1567
1568         /* Garbage collect services that might not be needed anymore, if enabled */
1569         SET_FOREACH(other, u->dependencies[UNIT_REQUIRES], i)
1570                 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
1571                         unit_check_unneeded(other);
1572         SET_FOREACH(other, u->dependencies[UNIT_REQUIRES_OVERRIDABLE], i)
1573                 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
1574                         unit_check_unneeded(other);
1575         SET_FOREACH(other, u->dependencies[UNIT_WANTS], i)
1576                 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
1577                         unit_check_unneeded(other);
1578         SET_FOREACH(other, u->dependencies[UNIT_REQUISITE], i)
1579                 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
1580                         unit_check_unneeded(other);
1581         SET_FOREACH(other, u->dependencies[UNIT_REQUISITE_OVERRIDABLE], i)
1582                 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
1583                         unit_check_unneeded(other);
1584         SET_FOREACH(other, u->dependencies[UNIT_BINDS_TO], i)
1585                 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
1586                         unit_check_unneeded(other);
1587 }
1588
1589 void unit_start_on_failure(Unit *u) {
1590         Unit *other;
1591         Iterator i;
1592
1593         assert(u);
1594
1595         if (set_size(u->dependencies[UNIT_ON_FAILURE]) <= 0)
1596                 return;
1597
1598         log_info_unit(u->id, "Triggering OnFailure= dependencies of %s.", u->id);
1599
1600         SET_FOREACH(other, u->dependencies[UNIT_ON_FAILURE], i) {
1601                 int r;
1602
1603                 r = manager_add_job(u->manager, JOB_START, other, u->on_failure_job_mode, true, NULL, NULL);
1604                 if (r < 0)
1605                         log_error_unit(u->id, "Failed to enqueue OnFailure= job: %s", strerror(-r));
1606         }
1607 }
1608
1609 void unit_trigger_notify(Unit *u) {
1610         Unit *other;
1611         Iterator i;
1612
1613         assert(u);
1614
1615         SET_FOREACH(other, u->dependencies[UNIT_TRIGGERED_BY], i)
1616                 if (UNIT_VTABLE(other)->trigger_notify)
1617                         UNIT_VTABLE(other)->trigger_notify(other, u);
1618 }
1619
1620 void unit_notify(Unit *u, UnitActiveState os, UnitActiveState ns, bool reload_success) {
1621         Manager *m;
1622         bool unexpected;
1623
1624         assert(u);
1625         assert(os < _UNIT_ACTIVE_STATE_MAX);
1626         assert(ns < _UNIT_ACTIVE_STATE_MAX);
1627
1628         /* Note that this is called for all low-level state changes,
1629          * even if they might map to the same high-level
1630          * UnitActiveState! That means that ns == os is an expected
1631          * behavior here. For example: if a mount point is remounted
1632          * this function will be called too! */
1633
1634         m = u->manager;
1635
1636         /* Update timestamps for state changes */
1637         if (m->n_reloading <= 0) {
1638                 dual_timestamp ts;
1639
1640                 dual_timestamp_get(&ts);
1641
1642                 if (UNIT_IS_INACTIVE_OR_FAILED(os) && !UNIT_IS_INACTIVE_OR_FAILED(ns))
1643                         u->inactive_exit_timestamp = ts;
1644                 else if (!UNIT_IS_INACTIVE_OR_FAILED(os) && UNIT_IS_INACTIVE_OR_FAILED(ns))
1645                         u->inactive_enter_timestamp = ts;
1646
1647                 if (!UNIT_IS_ACTIVE_OR_RELOADING(os) && UNIT_IS_ACTIVE_OR_RELOADING(ns))
1648                         u->active_enter_timestamp = ts;
1649                 else if (UNIT_IS_ACTIVE_OR_RELOADING(os) && !UNIT_IS_ACTIVE_OR_RELOADING(ns))
1650                         u->active_exit_timestamp = ts;
1651         }
1652
1653         /* Keep track of failed units */
1654         if (ns == UNIT_FAILED)
1655                 set_put(u->manager->failed_units, u);
1656         else
1657                 set_remove(u->manager->failed_units, u);
1658
1659         /* Make sure the cgroup is always removed when we become inactive */
1660         if (UNIT_IS_INACTIVE_OR_FAILED(ns))
1661                 unit_destroy_cgroup(u);
1662
1663         /* Note that this doesn't apply to RemainAfterExit services exiting
1664          * successfully, since there's no change of state in that case. Which is
1665          * why it is handled in service_set_state() */
1666         if (UNIT_IS_INACTIVE_OR_FAILED(os) != UNIT_IS_INACTIVE_OR_FAILED(ns)) {
1667                 ExecContext *ec;
1668
1669                 ec = unit_get_exec_context(u);
1670                 if (ec && exec_context_may_touch_console(ec)) {
1671                         if (UNIT_IS_INACTIVE_OR_FAILED(ns)) {
1672                                 m->n_on_console --;
1673
1674                                 if (m->n_on_console == 0)
1675                                         /* unset no_console_output flag, since the console is free */
1676                                         m->no_console_output = false;
1677                         } else
1678                                 m->n_on_console ++;
1679                 }
1680         }
1681
1682         if (u->job) {
1683                 unexpected = false;
1684
1685                 if (u->job->state == JOB_WAITING)
1686
1687                         /* So we reached a different state for this
1688                          * job. Let's see if we can run it now if it
1689                          * failed previously due to EAGAIN. */
1690                         job_add_to_run_queue(u->job);
1691
1692                 /* Let's check whether this state change constitutes a
1693                  * finished job, or maybe contradicts a running job and
1694                  * hence needs to invalidate jobs. */
1695
1696                 switch (u->job->type) {
1697
1698                 case JOB_START:
1699                 case JOB_VERIFY_ACTIVE:
1700
1701                         if (UNIT_IS_ACTIVE_OR_RELOADING(ns))
1702                                 job_finish_and_invalidate(u->job, JOB_DONE, true);
1703                         else if (u->job->state == JOB_RUNNING && ns != UNIT_ACTIVATING) {
1704                                 unexpected = true;
1705
1706                                 if (UNIT_IS_INACTIVE_OR_FAILED(ns))
1707                                         job_finish_and_invalidate(u->job, ns == UNIT_FAILED ? JOB_FAILED : JOB_DONE, true);
1708                         }
1709
1710                         break;
1711
1712                 case JOB_RELOAD:
1713                 case JOB_RELOAD_OR_START:
1714
1715                         if (u->job->state == JOB_RUNNING) {
1716                                 if (ns == UNIT_ACTIVE)
1717                                         job_finish_and_invalidate(u->job, reload_success ? JOB_DONE : JOB_FAILED, true);
1718                                 else if (ns != UNIT_ACTIVATING && ns != UNIT_RELOADING) {
1719                                         unexpected = true;
1720
1721                                         if (UNIT_IS_INACTIVE_OR_FAILED(ns))
1722                                                 job_finish_and_invalidate(u->job, ns == UNIT_FAILED ? JOB_FAILED : JOB_DONE, true);
1723                                 }
1724                         }
1725
1726                         break;
1727
1728                 case JOB_STOP:
1729                 case JOB_RESTART:
1730                 case JOB_TRY_RESTART:
1731
1732                         if (UNIT_IS_INACTIVE_OR_FAILED(ns))
1733                                 job_finish_and_invalidate(u->job, JOB_DONE, true);
1734                         else if (u->job->state == JOB_RUNNING && ns != UNIT_DEACTIVATING) {
1735                                 unexpected = true;
1736                                 job_finish_and_invalidate(u->job, JOB_FAILED, true);
1737                         }
1738
1739                         break;
1740
1741                 default:
1742                         assert_not_reached("Job type unknown");
1743                 }
1744
1745         } else
1746                 unexpected = true;
1747
1748         if (m->n_reloading <= 0) {
1749
1750                 /* If this state change happened without being
1751                  * requested by a job, then let's retroactively start
1752                  * or stop dependencies. We skip that step when
1753                  * deserializing, since we don't want to create any
1754                  * additional jobs just because something is already
1755                  * activated. */
1756
1757                 if (unexpected) {
1758                         if (UNIT_IS_INACTIVE_OR_FAILED(os) && UNIT_IS_ACTIVE_OR_ACTIVATING(ns))
1759                                 retroactively_start_dependencies(u);
1760                         else if (UNIT_IS_ACTIVE_OR_ACTIVATING(os) && UNIT_IS_INACTIVE_OR_DEACTIVATING(ns))
1761                                 retroactively_stop_dependencies(u);
1762                 }
1763
1764                 /* stop unneeded units regardless if going down was expected or not */
1765                 if (UNIT_IS_INACTIVE_OR_DEACTIVATING(ns))
1766                         check_unneeded_dependencies(u);
1767
1768                 if (ns != os && ns == UNIT_FAILED) {
1769                         log_notice_unit(u->id, "Unit %s entered failed state.", u->id);
1770                         unit_start_on_failure(u);
1771                 }
1772         }
1773
1774         /* Some names are special */
1775         if (UNIT_IS_ACTIVE_OR_RELOADING(ns)) {
1776
1777                 if (unit_has_name(u, SPECIAL_DBUS_SERVICE))
1778                         /* The bus might have just become available,
1779                          * hence try to connect to it, if we aren't
1780                          * yet connected. */
1781                         bus_init(m, true);
1782
1783                 if (u->type == UNIT_SERVICE &&
1784                     !UNIT_IS_ACTIVE_OR_RELOADING(os) &&
1785                     m->n_reloading <= 0) {
1786                         /* Write audit record if we have just finished starting up */
1787                         manager_send_unit_audit(m, u, AUDIT_SERVICE_START, true);
1788                         u->in_audit = true;
1789                 }
1790
1791                 if (!UNIT_IS_ACTIVE_OR_RELOADING(os))
1792                         manager_send_unit_plymouth(m, u);
1793
1794         } else {
1795
1796                 /* We don't care about D-Bus here, since we'll get an
1797                  * asynchronous notification for it anyway. */
1798
1799                 if (u->type == UNIT_SERVICE &&
1800                     UNIT_IS_INACTIVE_OR_FAILED(ns) &&
1801                     !UNIT_IS_INACTIVE_OR_FAILED(os) &&
1802                     m->n_reloading <= 0) {
1803
1804                         /* Hmm, if there was no start record written
1805                          * write it now, so that we always have a nice
1806                          * pair */
1807                         if (!u->in_audit) {
1808                                 manager_send_unit_audit(m, u, AUDIT_SERVICE_START, ns == UNIT_INACTIVE);
1809
1810                                 if (ns == UNIT_INACTIVE)
1811                                         manager_send_unit_audit(m, u, AUDIT_SERVICE_STOP, true);
1812                         } else
1813                                 /* Write audit record if we have just finished shutting down */
1814                                 manager_send_unit_audit(m, u, AUDIT_SERVICE_STOP, ns == UNIT_INACTIVE);
1815
1816                         u->in_audit = false;
1817                 }
1818         }
1819
1820         manager_recheck_journal(m);
1821         unit_trigger_notify(u);
1822
1823         if (u->manager->n_reloading <= 0) {
1824                 /* Maybe we finished startup and are now ready for
1825                  * being stopped because unneeded? */
1826                 unit_check_unneeded(u);
1827
1828                 /* Maybe we finished startup, but something we needed
1829                  * has vanished? Let's die then. (This happens when
1830                  * something BindsTo= to a Type=oneshot unit, as these
1831                  * units go directly from starting to inactive,
1832                  * without ever entering started.) */
1833                 unit_check_binds_to(u);
1834         }
1835
1836         unit_add_to_dbus_queue(u);
1837         unit_add_to_gc_queue(u);
1838 }
1839
1840 int unit_watch_pid(Unit *u, pid_t pid) {
1841         int q, r;
1842
1843         assert(u);
1844         assert(pid >= 1);
1845
1846         /* Watch a specific PID. We only support one or two units
1847          * watching each PID for now, not more. */
1848
1849         r = set_ensure_allocated(&u->pids, trivial_hash_func, trivial_compare_func);
1850         if (r < 0)
1851                 return r;
1852
1853         r = hashmap_ensure_allocated(&u->manager->watch_pids1, trivial_hash_func, trivial_compare_func);
1854         if (r < 0)
1855                 return r;
1856
1857         r = hashmap_put(u->manager->watch_pids1, LONG_TO_PTR(pid), u);
1858         if (r == -EEXIST) {
1859                 r = hashmap_ensure_allocated(&u->manager->watch_pids2, trivial_hash_func, trivial_compare_func);
1860                 if (r < 0)
1861                         return r;
1862
1863                 r = hashmap_put(u->manager->watch_pids2, LONG_TO_PTR(pid), u);
1864         }
1865
1866         q = set_put(u->pids, LONG_TO_PTR(pid));
1867         if (q < 0)
1868                 return q;
1869
1870         return r;
1871 }
1872
1873 void unit_unwatch_pid(Unit *u, pid_t pid) {
1874         assert(u);
1875         assert(pid >= 1);
1876
1877         hashmap_remove_value(u->manager->watch_pids1, LONG_TO_PTR(pid), u);
1878         hashmap_remove_value(u->manager->watch_pids2, LONG_TO_PTR(pid), u);
1879         set_remove(u->pids, LONG_TO_PTR(pid));
1880 }
1881
1882 void unit_unwatch_all_pids(Unit *u) {
1883         assert(u);
1884
1885         while (!set_isempty(u->pids))
1886                 unit_unwatch_pid(u, PTR_TO_LONG(set_first(u->pids)));
1887
1888         set_free(u->pids);
1889         u->pids = NULL;
1890 }
1891
1892 static int unit_watch_pids_in_path(Unit *u, const char *path) {
1893         _cleanup_closedir_ DIR *d = NULL;
1894         _cleanup_fclose_ FILE *f = NULL;
1895         int ret = 0, r;
1896
1897         assert(u);
1898         assert(path);
1899
1900         /* Adds all PIDs from a specific cgroup path to the set of PIDs we watch. */
1901
1902         r = cg_enumerate_processes(SYSTEMD_CGROUP_CONTROLLER, path, &f);
1903         if (r >= 0) {
1904                 pid_t pid;
1905
1906                 while ((r = cg_read_pid(f, &pid)) > 0) {
1907                         r = unit_watch_pid(u, pid);
1908                         if (r < 0 && ret >= 0)
1909                                 ret = r;
1910                 }
1911                 if (r < 0 && ret >= 0)
1912                         ret = r;
1913
1914         } else if (ret >= 0)
1915                 ret = r;
1916
1917         r = cg_enumerate_subgroups(SYSTEMD_CGROUP_CONTROLLER, path, &d);
1918         if (r >= 0) {
1919                 char *fn;
1920
1921                 while ((r = cg_read_subgroup(d, &fn)) > 0) {
1922                         _cleanup_free_ char *p = NULL;
1923
1924                         p = strjoin(path, "/", fn, NULL);
1925                         free(fn);
1926
1927                         if (!p)
1928                                 return -ENOMEM;
1929
1930                         r = unit_watch_pids_in_path(u, p);
1931                         if (r < 0 && ret >= 0)
1932                                 ret = r;
1933                 }
1934                 if (r < 0 && ret >= 0)
1935                         ret = r;
1936
1937         } else if (ret >= 0)
1938                 ret = r;
1939
1940         return ret;
1941 }
1942
1943 int unit_watch_all_pids(Unit *u) {
1944         assert(u);
1945
1946         /* Adds all PIDs from our cgroup to the set of PIDs we watch */
1947
1948         if (!u->cgroup_path)
1949                 return -ENOENT;
1950
1951         return unit_watch_pids_in_path(u, u->cgroup_path);
1952 }
1953
1954 void unit_tidy_watch_pids(Unit *u, pid_t except1, pid_t except2) {
1955         Iterator i;
1956         void *e;
1957
1958         assert(u);
1959
1960         /* Cleans dead PIDs from our list */
1961
1962         SET_FOREACH(e, u->pids, i) {
1963                 pid_t pid = PTR_TO_LONG(e);
1964
1965                 if (pid == except1 || pid == except2)
1966                         continue;
1967
1968                 if (!pid_is_unwaited(pid))
1969                         unit_unwatch_pid(u, pid);
1970         }
1971 }
1972
1973 bool unit_job_is_applicable(Unit *u, JobType j) {
1974         assert(u);
1975         assert(j >= 0 && j < _JOB_TYPE_MAX);
1976
1977         switch (j) {
1978
1979         case JOB_VERIFY_ACTIVE:
1980         case JOB_START:
1981         case JOB_STOP:
1982         case JOB_NOP:
1983                 return true;
1984
1985         case JOB_RESTART:
1986         case JOB_TRY_RESTART:
1987                 return unit_can_start(u);
1988
1989         case JOB_RELOAD:
1990                 return unit_can_reload(u);
1991
1992         case JOB_RELOAD_OR_START:
1993                 return unit_can_reload(u) && unit_can_start(u);
1994
1995         default:
1996                 assert_not_reached("Invalid job type");
1997         }
1998 }
1999
2000 static int maybe_warn_about_dependency(const char *id, const char *other, UnitDependency dependency) {
2001         assert(id);
2002
2003         switch (dependency) {
2004         case UNIT_REQUIRES:
2005         case UNIT_REQUIRES_OVERRIDABLE:
2006         case UNIT_WANTS:
2007         case UNIT_REQUISITE:
2008         case UNIT_REQUISITE_OVERRIDABLE:
2009         case UNIT_BINDS_TO:
2010         case UNIT_PART_OF:
2011         case UNIT_REQUIRED_BY:
2012         case UNIT_REQUIRED_BY_OVERRIDABLE:
2013         case UNIT_WANTED_BY:
2014         case UNIT_BOUND_BY:
2015         case UNIT_CONSISTS_OF:
2016         case UNIT_REFERENCES:
2017         case UNIT_REFERENCED_BY:
2018         case UNIT_PROPAGATES_RELOAD_TO:
2019         case UNIT_RELOAD_PROPAGATED_FROM:
2020         case UNIT_JOINS_NAMESPACE_OF:
2021                 return 0;
2022
2023         case UNIT_CONFLICTS:
2024         case UNIT_CONFLICTED_BY:
2025         case UNIT_BEFORE:
2026         case UNIT_AFTER:
2027         case UNIT_ON_FAILURE:
2028         case UNIT_TRIGGERS:
2029         case UNIT_TRIGGERED_BY:
2030                 if (streq_ptr(id, other))
2031                         log_warning_unit(id, "Dependency %s=%s dropped from unit %s",
2032                                          unit_dependency_to_string(dependency), id, other);
2033                 else
2034                         log_warning_unit(id, "Dependency %s=%s dropped from unit %s merged into %s",
2035                                          unit_dependency_to_string(dependency), id,
2036                                          strna(other), id);
2037                 return -EINVAL;
2038
2039         case _UNIT_DEPENDENCY_MAX:
2040         case _UNIT_DEPENDENCY_INVALID:
2041                 break;
2042         }
2043
2044         assert_not_reached("Invalid dependency type");
2045 }
2046
2047 int unit_add_dependency(Unit *u, UnitDependency d, Unit *other, bool add_reference) {
2048
2049         static const UnitDependency inverse_table[_UNIT_DEPENDENCY_MAX] = {
2050                 [UNIT_REQUIRES] = UNIT_REQUIRED_BY,
2051                 [UNIT_REQUIRES_OVERRIDABLE] = UNIT_REQUIRED_BY_OVERRIDABLE,
2052                 [UNIT_WANTS] = UNIT_WANTED_BY,
2053                 [UNIT_REQUISITE] = UNIT_REQUIRED_BY,
2054                 [UNIT_REQUISITE_OVERRIDABLE] = UNIT_REQUIRED_BY_OVERRIDABLE,
2055                 [UNIT_BINDS_TO] = UNIT_BOUND_BY,
2056                 [UNIT_PART_OF] = UNIT_CONSISTS_OF,
2057                 [UNIT_REQUIRED_BY] = _UNIT_DEPENDENCY_INVALID,
2058                 [UNIT_REQUIRED_BY_OVERRIDABLE] = _UNIT_DEPENDENCY_INVALID,
2059                 [UNIT_WANTED_BY] = _UNIT_DEPENDENCY_INVALID,
2060                 [UNIT_BOUND_BY] = UNIT_BINDS_TO,
2061                 [UNIT_CONSISTS_OF] = UNIT_PART_OF,
2062                 [UNIT_CONFLICTS] = UNIT_CONFLICTED_BY,
2063                 [UNIT_CONFLICTED_BY] = UNIT_CONFLICTS,
2064                 [UNIT_BEFORE] = UNIT_AFTER,
2065                 [UNIT_AFTER] = UNIT_BEFORE,
2066                 [UNIT_ON_FAILURE] = _UNIT_DEPENDENCY_INVALID,
2067                 [UNIT_REFERENCES] = UNIT_REFERENCED_BY,
2068                 [UNIT_REFERENCED_BY] = UNIT_REFERENCES,
2069                 [UNIT_TRIGGERS] = UNIT_TRIGGERED_BY,
2070                 [UNIT_TRIGGERED_BY] = UNIT_TRIGGERS,
2071                 [UNIT_PROPAGATES_RELOAD_TO] = UNIT_RELOAD_PROPAGATED_FROM,
2072                 [UNIT_RELOAD_PROPAGATED_FROM] = UNIT_PROPAGATES_RELOAD_TO,
2073                 [UNIT_JOINS_NAMESPACE_OF] = UNIT_JOINS_NAMESPACE_OF,
2074         };
2075         int r, q = 0, v = 0, w = 0;
2076         Unit *orig_u = u, *orig_other = other;
2077
2078         assert(u);
2079         assert(d >= 0 && d < _UNIT_DEPENDENCY_MAX);
2080         assert(other);
2081
2082         u = unit_follow_merge(u);
2083         other = unit_follow_merge(other);
2084
2085         /* We won't allow dependencies on ourselves. We will not
2086          * consider them an error however. */
2087         if (u == other) {
2088                 maybe_warn_about_dependency(orig_u->id, orig_other->id, d);
2089                 return 0;
2090         }
2091
2092         r = set_ensure_allocated(&u->dependencies[d], trivial_hash_func, trivial_compare_func);
2093         if (r < 0)
2094                 return r;
2095
2096         if (inverse_table[d] != _UNIT_DEPENDENCY_INVALID) {
2097                 r = set_ensure_allocated(&other->dependencies[inverse_table[d]], trivial_hash_func, trivial_compare_func);
2098                 if (r < 0)
2099                         return r;
2100         }
2101
2102         if (add_reference) {
2103                 r = set_ensure_allocated(&u->dependencies[UNIT_REFERENCES], trivial_hash_func, trivial_compare_func);
2104                 if (r < 0)
2105                         return r;
2106
2107                 r = set_ensure_allocated(&other->dependencies[UNIT_REFERENCED_BY], trivial_hash_func, trivial_compare_func);
2108                 if (r < 0)
2109                         return r;
2110         }
2111
2112         q = set_put(u->dependencies[d], other);
2113         if (q < 0)
2114                 return q;
2115
2116         if (inverse_table[d] != _UNIT_DEPENDENCY_INVALID && inverse_table[d] != d) {
2117                 v = set_put(other->dependencies[inverse_table[d]], u);
2118                 if (v < 0) {
2119                         r = v;
2120                         goto fail;
2121                 }
2122         }
2123
2124         if (add_reference) {
2125                 w = set_put(u->dependencies[UNIT_REFERENCES], other);
2126                 if (w < 0) {
2127                         r = w;
2128                         goto fail;
2129                 }
2130
2131                 r = set_put(other->dependencies[UNIT_REFERENCED_BY], u);
2132                 if (r < 0)
2133                         goto fail;
2134         }
2135
2136         unit_add_to_dbus_queue(u);
2137         return 0;
2138
2139 fail:
2140         if (q > 0)
2141                 set_remove(u->dependencies[d], other);
2142
2143         if (v > 0)
2144                 set_remove(other->dependencies[inverse_table[d]], u);
2145
2146         if (w > 0)
2147                 set_remove(u->dependencies[UNIT_REFERENCES], other);
2148
2149         return r;
2150 }
2151
2152 int unit_add_two_dependencies(Unit *u, UnitDependency d, UnitDependency e, Unit *other, bool add_reference) {
2153         int r;
2154
2155         assert(u);
2156
2157         r = unit_add_dependency(u, d, other, add_reference);
2158         if (r < 0)
2159                 return r;
2160
2161         r = unit_add_dependency(u, e, other, add_reference);
2162         if (r < 0)
2163                 return r;
2164
2165         return 0;
2166 }
2167
2168 static const char *resolve_template(Unit *u, const char *name, const char*path, char **p) {
2169         char *s;
2170
2171         assert(u);
2172         assert(name || path);
2173         assert(p);
2174
2175         if (!name)
2176                 name = basename(path);
2177
2178         if (!unit_name_is_template(name)) {
2179                 *p = NULL;
2180                 return name;
2181         }
2182
2183         if (u->instance)
2184                 s = unit_name_replace_instance(name, u->instance);
2185         else {
2186                 _cleanup_free_ char *i = NULL;
2187
2188                 i = unit_name_to_prefix(u->id);
2189                 if (!i)
2190                         return NULL;
2191
2192                 s = unit_name_replace_instance(name, i);
2193         }
2194
2195         if (!s)
2196                 return NULL;
2197
2198         *p = s;
2199         return s;
2200 }
2201
2202 int unit_add_dependency_by_name(Unit *u, UnitDependency d, const char *name, const char *path, bool add_reference) {
2203         Unit *other;
2204         int r;
2205         _cleanup_free_ char *s = NULL;
2206
2207         assert(u);
2208         assert(name || path);
2209
2210         name = resolve_template(u, name, path, &s);
2211         if (!name)
2212                 return -ENOMEM;
2213
2214         r = manager_load_unit(u->manager, name, path, NULL, &other);
2215         if (r < 0)
2216                 return r;
2217
2218         return unit_add_dependency(u, d, other, add_reference);
2219 }
2220
2221 int unit_add_two_dependencies_by_name(Unit *u, UnitDependency d, UnitDependency e, const char *name, const char *path, bool add_reference) {
2222         _cleanup_free_ char *s = NULL;
2223         Unit *other;
2224         int r;
2225
2226         assert(u);
2227         assert(name || path);
2228
2229         name = resolve_template(u, name, path, &s);
2230         if (!name)
2231                 return -ENOMEM;
2232
2233         r = manager_load_unit(u->manager, name, path, NULL, &other);
2234         if (r < 0)
2235                 return r;
2236
2237         return unit_add_two_dependencies(u, d, e, other, add_reference);
2238 }
2239
2240 int unit_add_dependency_by_name_inverse(Unit *u, UnitDependency d, const char *name, const char *path, bool add_reference) {
2241         Unit *other;
2242         int r;
2243         _cleanup_free_ char *s = NULL;
2244
2245         assert(u);
2246         assert(name || path);
2247
2248         name = resolve_template(u, name, path, &s);
2249         if (!name)
2250                 return -ENOMEM;
2251
2252         r = manager_load_unit(u->manager, name, path, NULL, &other);
2253         if (r < 0)
2254                 return r;
2255
2256         return unit_add_dependency(other, d, u, add_reference);
2257 }
2258
2259 int unit_add_two_dependencies_by_name_inverse(Unit *u, UnitDependency d, UnitDependency e, const char *name, const char *path, bool add_reference) {
2260         Unit *other;
2261         int r;
2262         _cleanup_free_ char *s = NULL;
2263
2264         assert(u);
2265         assert(name || path);
2266
2267         name = resolve_template(u, name, path, &s);
2268         if (!name)
2269                 return -ENOMEM;
2270
2271         r = manager_load_unit(u->manager, name, path, NULL, &other);
2272         if (r < 0)
2273                 return r;
2274
2275         r = unit_add_two_dependencies(other, d, e, u, add_reference);
2276         if (r < 0)
2277                 return r;
2278
2279         return r;
2280 }
2281
2282 int set_unit_path(const char *p) {
2283         /* This is mostly for debug purposes */
2284         if (setenv("SYSTEMD_UNIT_PATH", p, 0) < 0)
2285                 return -errno;
2286
2287         return 0;
2288 }
2289
2290 char *unit_dbus_path(Unit *u) {
2291         assert(u);
2292
2293         if (!u->id)
2294                 return NULL;
2295
2296         return unit_dbus_path_from_name(u->id);
2297 }
2298
2299 char *unit_default_cgroup_path(Unit *u) {
2300         _cleanup_free_ char *escaped = NULL, *slice = NULL;
2301         int r;
2302
2303         assert(u);
2304
2305         if (unit_has_name(u, SPECIAL_ROOT_SLICE))
2306                 return strdup(u->manager->cgroup_root);
2307
2308         if (UNIT_ISSET(u->slice) && !unit_has_name(UNIT_DEREF(u->slice), SPECIAL_ROOT_SLICE)) {
2309                 r = cg_slice_to_path(UNIT_DEREF(u->slice)->id, &slice);
2310                 if (r < 0)
2311                         return NULL;
2312         }
2313
2314         escaped = cg_escape(u->id);
2315         if (!escaped)
2316                 return NULL;
2317
2318         if (slice)
2319                 return strjoin(u->manager->cgroup_root, "/", slice, "/", escaped, NULL);
2320         else
2321                 return strjoin(u->manager->cgroup_root, "/", escaped, NULL);
2322 }
2323
2324 int unit_add_default_slice(Unit *u, CGroupContext *c) {
2325         _cleanup_free_ char *b = NULL;
2326         const char *slice_name;
2327         Unit *slice;
2328         int r;
2329
2330         assert(u);
2331         assert(c);
2332
2333         if (UNIT_ISSET(u->slice))
2334                 return 0;
2335
2336         if (u->instance) {
2337                 _cleanup_free_ char *prefix = NULL, *escaped = NULL;
2338
2339                 /* Implicitly place all instantiated units in their
2340                  * own per-template slice */
2341
2342                 prefix = unit_name_to_prefix(u->id);
2343                 if (!prefix)
2344                         return -ENOMEM;
2345
2346                 /* The prefix is already escaped, but it might include
2347                  * "-" which has a special meaning for slice units,
2348                  * hence escape it here extra. */
2349                 escaped = strreplace(prefix, "-", "\\x2d");
2350                 if (!escaped)
2351                         return -ENOMEM;
2352
2353                 if (u->manager->running_as == SYSTEMD_SYSTEM)
2354                         b = strjoin("system-", escaped, ".slice", NULL);
2355                 else
2356                         b = strappend(escaped, ".slice");
2357                 if (!b)
2358                         return -ENOMEM;
2359
2360                 slice_name = b;
2361         } else
2362                 slice_name =
2363                         u->manager->running_as == SYSTEMD_SYSTEM
2364                         ? SPECIAL_SYSTEM_SLICE
2365                         : SPECIAL_ROOT_SLICE;
2366
2367         r = manager_load_unit(u->manager, slice_name, NULL, NULL, &slice);
2368         if (r < 0)
2369                 return r;
2370
2371         unit_ref_set(&u->slice, slice);
2372         return 0;
2373 }
2374
2375 const char *unit_slice_name(Unit *u) {
2376         assert(u);
2377
2378         if (!UNIT_ISSET(u->slice))
2379                 return NULL;
2380
2381         return UNIT_DEREF(u->slice)->id;
2382 }
2383
2384 int unit_load_related_unit(Unit *u, const char *type, Unit **_found) {
2385         _cleanup_free_ char *t = NULL;
2386         int r;
2387
2388         assert(u);
2389         assert(type);
2390         assert(_found);
2391
2392         t = unit_name_change_suffix(u->id, type);
2393         if (!t)
2394                 return -ENOMEM;
2395
2396         assert(!unit_has_name(u, t));
2397
2398         r = manager_load_unit(u->manager, t, NULL, NULL, _found);
2399         assert(r < 0 || *_found != u);
2400         return r;
2401 }
2402
2403 int unit_watch_bus_name(Unit *u, const char *name) {
2404         assert(u);
2405         assert(name);
2406
2407         /* Watch a specific name on the bus. We only support one unit
2408          * watching each name for now. */
2409
2410         return hashmap_put(u->manager->watch_bus, name, u);
2411 }
2412
2413 void unit_unwatch_bus_name(Unit *u, const char *name) {
2414         assert(u);
2415         assert(name);
2416
2417         hashmap_remove_value(u->manager->watch_bus, name, u);
2418 }
2419
2420 bool unit_can_serialize(Unit *u) {
2421         assert(u);
2422
2423         return UNIT_VTABLE(u)->serialize && UNIT_VTABLE(u)->deserialize_item;
2424 }
2425
2426 int unit_serialize(Unit *u, FILE *f, FDSet *fds, bool serialize_jobs) {
2427         int r;
2428
2429         assert(u);
2430         assert(f);
2431         assert(fds);
2432
2433         if (unit_can_serialize(u)) {
2434                 ExecRuntime *rt;
2435
2436                 r = UNIT_VTABLE(u)->serialize(u, f, fds);
2437                 if (r < 0)
2438                         return r;
2439
2440                 rt = unit_get_exec_runtime(u);
2441                 if (rt) {
2442                         r = exec_runtime_serialize(rt, u, f, fds);
2443                         if (r < 0)
2444                                 return r;
2445                 }
2446         }
2447
2448         dual_timestamp_serialize(f, "inactive-exit-timestamp", &u->inactive_exit_timestamp);
2449         dual_timestamp_serialize(f, "active-enter-timestamp", &u->active_enter_timestamp);
2450         dual_timestamp_serialize(f, "active-exit-timestamp", &u->active_exit_timestamp);
2451         dual_timestamp_serialize(f, "inactive-enter-timestamp", &u->inactive_enter_timestamp);
2452         dual_timestamp_serialize(f, "condition-timestamp", &u->condition_timestamp);
2453
2454         if (dual_timestamp_is_set(&u->condition_timestamp))
2455                 unit_serialize_item(u, f, "condition-result", yes_no(u->condition_result));
2456
2457         unit_serialize_item(u, f, "transient", yes_no(u->transient));
2458
2459         if (u->cgroup_path)
2460                 unit_serialize_item(u, f, "cgroup", u->cgroup_path);
2461
2462         if (serialize_jobs) {
2463                 if (u->job) {
2464                         fprintf(f, "job\n");
2465                         job_serialize(u->job, f, fds);
2466                 }
2467
2468                 if (u->nop_job) {
2469                         fprintf(f, "job\n");
2470                         job_serialize(u->nop_job, f, fds);
2471                 }
2472         }
2473
2474         /* End marker */
2475         fputc('\n', f);
2476         return 0;
2477 }
2478
2479 void unit_serialize_item_format(Unit *u, FILE *f, const char *key, const char *format, ...) {
2480         va_list ap;
2481
2482         assert(u);
2483         assert(f);
2484         assert(key);
2485         assert(format);
2486
2487         fputs(key, f);
2488         fputc('=', f);
2489
2490         va_start(ap, format);
2491         vfprintf(f, format, ap);
2492         va_end(ap);
2493
2494         fputc('\n', f);
2495 }
2496
2497 void unit_serialize_item(Unit *u, FILE *f, const char *key, const char *value) {
2498         assert(u);
2499         assert(f);
2500         assert(key);
2501         assert(value);
2502
2503         fprintf(f, "%s=%s\n", key, value);
2504 }
2505
2506 int unit_deserialize(Unit *u, FILE *f, FDSet *fds) {
2507         ExecRuntime **rt = NULL;
2508         size_t offset;
2509         int r;
2510
2511         assert(u);
2512         assert(f);
2513         assert(fds);
2514
2515         offset = UNIT_VTABLE(u)->exec_runtime_offset;
2516         if (offset > 0)
2517                 rt = (ExecRuntime**) ((uint8_t*) u + offset);
2518
2519         for (;;) {
2520                 char line[LINE_MAX], *l, *v;
2521                 size_t k;
2522
2523                 if (!fgets(line, sizeof(line), f)) {
2524                         if (feof(f))
2525                                 return 0;
2526                         return -errno;
2527                 }
2528
2529                 char_array_0(line);
2530                 l = strstrip(line);
2531
2532                 /* End marker */
2533                 if (l[0] == 0)
2534                         return 0;
2535
2536                 k = strcspn(l, "=");
2537
2538                 if (l[k] == '=') {
2539                         l[k] = 0;
2540                         v = l+k+1;
2541                 } else
2542                         v = l+k;
2543
2544                 if (streq(l, "job")) {
2545                         if (v[0] == '\0') {
2546                                 /* new-style serialized job */
2547                                 Job *j = job_new_raw(u);
2548                                 if (!j)
2549                                         return -ENOMEM;
2550
2551                                 r = job_deserialize(j, f, fds);
2552                                 if (r < 0) {
2553                                         job_free(j);
2554                                         return r;
2555                                 }
2556
2557                                 r = hashmap_put(u->manager->jobs, UINT32_TO_PTR(j->id), j);
2558                                 if (r < 0) {
2559                                         job_free(j);
2560                                         return r;
2561                                 }
2562
2563                                 r = job_install_deserialized(j);
2564                                 if (r < 0) {
2565                                         hashmap_remove(u->manager->jobs, UINT32_TO_PTR(j->id));
2566                                         job_free(j);
2567                                         return r;
2568                                 }
2569
2570                                 if (j->state == JOB_RUNNING)
2571                                         u->manager->n_running_jobs++;
2572                         } else {
2573                                 /* legacy */
2574                                 JobType type = job_type_from_string(v);
2575                                 if (type < 0)
2576                                         log_debug("Failed to parse job type value %s", v);
2577                                 else
2578                                         u->deserialized_job = type;
2579                         }
2580                         continue;
2581                 } else if (streq(l, "inactive-exit-timestamp")) {
2582                         dual_timestamp_deserialize(v, &u->inactive_exit_timestamp);
2583                         continue;
2584                 } else if (streq(l, "active-enter-timestamp")) {
2585                         dual_timestamp_deserialize(v, &u->active_enter_timestamp);
2586                         continue;
2587                 } else if (streq(l, "active-exit-timestamp")) {
2588                         dual_timestamp_deserialize(v, &u->active_exit_timestamp);
2589                         continue;
2590                 } else if (streq(l, "inactive-enter-timestamp")) {
2591                         dual_timestamp_deserialize(v, &u->inactive_enter_timestamp);
2592                         continue;
2593                 } else if (streq(l, "condition-timestamp")) {
2594                         dual_timestamp_deserialize(v, &u->condition_timestamp);
2595                         continue;
2596                 } else if (streq(l, "condition-result")) {
2597                         int b;
2598
2599                         b = parse_boolean(v);
2600                         if (b < 0)
2601                                 log_debug("Failed to parse condition result value %s", v);
2602                         else
2603                                 u->condition_result = b;
2604
2605                         continue;
2606
2607                 } else if (streq(l, "transient")) {
2608                         int b;
2609
2610                         b = parse_boolean(v);
2611                         if (b < 0)
2612                                 log_debug("Failed to parse transient bool %s", v);
2613                         else
2614                                 u->transient = b;
2615
2616                         continue;
2617                 } else if (streq(l, "cgroup")) {
2618                         char *s;
2619
2620                         s = strdup(v);
2621                         if (!s)
2622                                 return -ENOMEM;
2623
2624                         if (u->cgroup_path) {
2625                                 void *p;
2626
2627                                 p = hashmap_remove(u->manager->cgroup_unit, u->cgroup_path);
2628                                 log_info("Removing cgroup_path %s from hashmap (%p)",
2629                                          u->cgroup_path, p);
2630                                 free(u->cgroup_path);
2631                         }
2632
2633                         u->cgroup_path = s;
2634                         assert(hashmap_put(u->manager->cgroup_unit, s, u) == 1);
2635
2636                         continue;
2637                 }
2638
2639                 if (unit_can_serialize(u)) {
2640                         if (rt) {
2641                                 r = exec_runtime_deserialize_item(rt, u, l, v, fds);
2642                                 if (r < 0)
2643                                         return r;
2644                                 if (r > 0)
2645                                         continue;
2646                         }
2647
2648                         r = UNIT_VTABLE(u)->deserialize_item(u, l, v, fds);
2649                         if (r < 0)
2650                                 return r;
2651                 }
2652         }
2653 }
2654
2655 int unit_add_node_link(Unit *u, const char *what, bool wants) {
2656         Unit *device;
2657         _cleanup_free_ char *e = NULL;
2658         int r;
2659
2660         assert(u);
2661
2662         if (!what)
2663                 return 0;
2664
2665         /* Adds in links to the device node that this unit is based on */
2666
2667         if (!is_device_path(what))
2668                 return 0;
2669
2670         e = unit_name_from_path(what, ".device");
2671         if (!e)
2672                 return -ENOMEM;
2673
2674         r = manager_load_unit(u->manager, e, NULL, NULL, &device);
2675
2676         if (r < 0)
2677                 return r;
2678
2679         r = unit_add_two_dependencies(u, UNIT_AFTER, UNIT_BINDS_TO, device, true);
2680         if (r < 0)
2681                 return r;
2682
2683         if (wants) {
2684                 r = unit_add_dependency(device, UNIT_WANTS, u, false);
2685                 if (r < 0)
2686                         return r;
2687         }
2688
2689         return 0;
2690 }
2691
2692 int unit_coldplug(Unit *u) {
2693         int r;
2694
2695         assert(u);
2696
2697         if (UNIT_VTABLE(u)->coldplug)
2698                 if ((r = UNIT_VTABLE(u)->coldplug(u)) < 0)
2699                         return r;
2700
2701         if (u->job) {
2702                 r = job_coldplug(u->job);
2703                 if (r < 0)
2704                         return r;
2705         } else if (u->deserialized_job >= 0) {
2706                 /* legacy */
2707                 r = manager_add_job(u->manager, u->deserialized_job, u, JOB_IGNORE_REQUIREMENTS, false, NULL, NULL);
2708                 if (r < 0)
2709                         return r;
2710
2711                 u->deserialized_job = _JOB_TYPE_INVALID;
2712         }
2713
2714         return 0;
2715 }
2716
2717 void unit_status_printf(Unit *u, const char *status, const char *unit_status_msg_format) {
2718         DISABLE_WARNING_FORMAT_NONLITERAL;
2719         manager_status_printf(u->manager, false, status, unit_status_msg_format, unit_description(u));
2720         REENABLE_WARNING;
2721 }
2722
2723 bool unit_need_daemon_reload(Unit *u) {
2724         _cleanup_strv_free_ char **t = NULL;
2725         char **path;
2726         struct stat st;
2727         unsigned loaded_cnt, current_cnt;
2728
2729         assert(u);
2730
2731         if (u->fragment_path) {
2732                 zero(st);
2733                 if (stat(u->fragment_path, &st) < 0)
2734                         /* What, cannot access this anymore? */
2735                         return true;
2736
2737                 if (u->fragment_mtime > 0 &&
2738                     timespec_load(&st.st_mtim) != u->fragment_mtime)
2739                         return true;
2740         }
2741
2742         if (u->source_path) {
2743                 zero(st);
2744                 if (stat(u->source_path, &st) < 0)
2745                         return true;
2746
2747                 if (u->source_mtime > 0 &&
2748                     timespec_load(&st.st_mtim) != u->source_mtime)
2749                         return true;
2750         }
2751
2752         t = unit_find_dropin_paths(u);
2753         loaded_cnt = strv_length(t);
2754         current_cnt = strv_length(u->dropin_paths);
2755
2756         if (loaded_cnt == current_cnt) {
2757                 if (loaded_cnt == 0)
2758                         return false;
2759
2760                 if (strv_overlap(u->dropin_paths, t)) {
2761                         STRV_FOREACH(path, u->dropin_paths) {
2762                                 zero(st);
2763                                 if (stat(*path, &st) < 0)
2764                                         return true;
2765
2766                                 if (u->dropin_mtime > 0 &&
2767                                     timespec_load(&st.st_mtim) > u->dropin_mtime)
2768                                         return true;
2769                         }
2770
2771                         return false;
2772                 } else
2773                         return true;
2774         } else
2775                 return true;
2776 }
2777
2778 void unit_reset_failed(Unit *u) {
2779         assert(u);
2780
2781         if (UNIT_VTABLE(u)->reset_failed)
2782                 UNIT_VTABLE(u)->reset_failed(u);
2783 }
2784
2785 Unit *unit_following(Unit *u) {
2786         assert(u);
2787
2788         if (UNIT_VTABLE(u)->following)
2789                 return UNIT_VTABLE(u)->following(u);
2790
2791         return NULL;
2792 }
2793
2794 bool unit_stop_pending(Unit *u) {
2795         assert(u);
2796
2797         /* This call does check the current state of the unit. It's
2798          * hence useful to be called from state change calls of the
2799          * unit itself, where the state isn't updated yet. This is
2800          * different from unit_inactive_or_pending() which checks both
2801          * the current state and for a queued job. */
2802
2803         return u->job && u->job->type == JOB_STOP;
2804 }
2805
2806 bool unit_inactive_or_pending(Unit *u) {
2807         assert(u);
2808
2809         /* Returns true if the unit is inactive or going down */
2810
2811         if (UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(u)))
2812                 return true;
2813
2814         if (unit_stop_pending(u))
2815                 return true;
2816
2817         return false;
2818 }
2819
2820 bool unit_active_or_pending(Unit *u) {
2821         assert(u);
2822
2823         /* Returns true if the unit is active or going up */
2824
2825         if (UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u)))
2826                 return true;
2827
2828         if (u->job &&
2829             (u->job->type == JOB_START ||
2830              u->job->type == JOB_RELOAD_OR_START ||
2831              u->job->type == JOB_RESTART))
2832                 return true;
2833
2834         return false;
2835 }
2836
2837 int unit_kill(Unit *u, KillWho w, int signo, sd_bus_error *error) {
2838         assert(u);
2839         assert(w >= 0 && w < _KILL_WHO_MAX);
2840         assert(signo > 0);
2841         assert(signo < _NSIG);
2842
2843         if (!UNIT_VTABLE(u)->kill)
2844                 return -ENOTSUP;
2845
2846         return UNIT_VTABLE(u)->kill(u, w, signo, error);
2847 }
2848
2849 static Set *unit_pid_set(pid_t main_pid, pid_t control_pid) {
2850         Set *pid_set;
2851         int r;
2852
2853         pid_set = set_new(trivial_hash_func, trivial_compare_func);
2854         if (!pid_set)
2855                 return NULL;
2856
2857         /* Exclude the main/control pids from being killed via the cgroup */
2858         if (main_pid > 0) {
2859                 r = set_put(pid_set, LONG_TO_PTR(main_pid));
2860                 if (r < 0)
2861                         goto fail;
2862         }
2863
2864         if (control_pid > 0) {
2865                 r = set_put(pid_set, LONG_TO_PTR(control_pid));
2866                 if (r < 0)
2867                         goto fail;
2868         }
2869
2870         return pid_set;
2871
2872 fail:
2873         set_free(pid_set);
2874         return NULL;
2875 }
2876
2877 int unit_kill_common(
2878                 Unit *u,
2879                 KillWho who,
2880                 int signo,
2881                 pid_t main_pid,
2882                 pid_t control_pid,
2883                 sd_bus_error *error) {
2884
2885         int r = 0;
2886
2887         if (who == KILL_MAIN && main_pid <= 0) {
2888                 if (main_pid < 0)
2889                         sd_bus_error_setf(error, BUS_ERROR_NO_SUCH_PROCESS, "%s units have no main processes", unit_type_to_string(u->type));
2890                 else
2891                         sd_bus_error_set_const(error, BUS_ERROR_NO_SUCH_PROCESS, "No main process to kill");
2892                 return -ESRCH;
2893         }
2894
2895         if (who == KILL_CONTROL && control_pid <= 0) {
2896                 if (control_pid < 0)
2897                         sd_bus_error_setf(error, BUS_ERROR_NO_SUCH_PROCESS, "%s units have no control processes", unit_type_to_string(u->type));
2898                 else
2899                         sd_bus_error_set_const(error, BUS_ERROR_NO_SUCH_PROCESS, "No control process to kill");
2900                 return -ESRCH;
2901         }
2902
2903         if (who == KILL_CONTROL || who == KILL_ALL)
2904                 if (control_pid > 0)
2905                         if (kill(control_pid, signo) < 0)
2906                                 r = -errno;
2907
2908         if (who == KILL_MAIN || who == KILL_ALL)
2909                 if (main_pid > 0)
2910                         if (kill(main_pid, signo) < 0)
2911                                 r = -errno;
2912
2913         if (who == KILL_ALL && u->cgroup_path) {
2914                 _cleanup_set_free_ Set *pid_set = NULL;
2915                 int q;
2916
2917                 /* Exclude the main/control pids from being killed via the cgroup */
2918                 pid_set = unit_pid_set(main_pid, control_pid);
2919                 if (!pid_set)
2920                         return -ENOMEM;
2921
2922                 q = cg_kill_recursive(SYSTEMD_CGROUP_CONTROLLER, u->cgroup_path, signo, false, true, false, pid_set);
2923                 if (q < 0 && q != -EAGAIN && q != -ESRCH && q != -ENOENT)
2924                         r = q;
2925         }
2926
2927         return r;
2928 }
2929
2930 int unit_following_set(Unit *u, Set **s) {
2931         assert(u);
2932         assert(s);
2933
2934         if (UNIT_VTABLE(u)->following_set)
2935                 return UNIT_VTABLE(u)->following_set(u, s);
2936
2937         *s = NULL;
2938         return 0;
2939 }
2940
2941 UnitFileState unit_get_unit_file_state(Unit *u) {
2942         assert(u);
2943
2944         if (u->unit_file_state < 0 && u->fragment_path)
2945                 u->unit_file_state = unit_file_get_state(
2946                                 u->manager->running_as == SYSTEMD_SYSTEM ? UNIT_FILE_SYSTEM : UNIT_FILE_USER,
2947                                 NULL, basename(u->fragment_path));
2948
2949         return u->unit_file_state;
2950 }
2951
2952 Unit* unit_ref_set(UnitRef *ref, Unit *u) {
2953         assert(ref);
2954         assert(u);
2955
2956         if (ref->unit)
2957                 unit_ref_unset(ref);
2958
2959         ref->unit = u;
2960         LIST_PREPEND(refs, u->refs, ref);
2961         return u;
2962 }
2963
2964 void unit_ref_unset(UnitRef *ref) {
2965         assert(ref);
2966
2967         if (!ref->unit)
2968                 return;
2969
2970         LIST_REMOVE(refs, ref->unit->refs, ref);
2971         ref->unit = NULL;
2972 }
2973
2974 int unit_patch_contexts(Unit *u) {
2975         CGroupContext *cc;
2976         ExecContext *ec;
2977         unsigned i;
2978         int r;
2979
2980         assert(u);
2981
2982         /* Patch in the manager defaults into the exec and cgroup
2983          * contexts, _after_ the rest of the settings have been
2984          * initialized */
2985
2986         ec = unit_get_exec_context(u);
2987         if (ec) {
2988                 /* This only copies in the ones that need memory */
2989                 for (i = 0; i < _RLIMIT_MAX; i++)
2990                         if (u->manager->rlimit[i] && !ec->rlimit[i]) {
2991                                 ec->rlimit[i] = newdup(struct rlimit, u->manager->rlimit[i], 1);
2992                                 if (!ec->rlimit[i])
2993                                         return -ENOMEM;
2994                         }
2995
2996                 if (u->manager->running_as == SYSTEMD_USER &&
2997                     !ec->working_directory) {
2998
2999                         r = get_home_dir(&ec->working_directory);
3000                         if (r < 0)
3001                                 return r;
3002                 }
3003
3004                 if (u->manager->running_as == SYSTEMD_USER &&
3005                     (ec->syscall_whitelist ||
3006                      !set_isempty(ec->syscall_filter) ||
3007                      !set_isempty(ec->syscall_archs) ||
3008                      ec->address_families_whitelist ||
3009                      !set_isempty(ec->address_families)))
3010                         ec->no_new_privileges = true;
3011
3012                 if (ec->private_devices)
3013                         ec->capability_bounding_set_drop |= (uint64_t) 1ULL << (uint64_t) CAP_MKNOD;
3014         }
3015
3016         cc = unit_get_cgroup_context(u);
3017         if (cc) {
3018
3019                 if (ec &&
3020                     ec->private_devices &&
3021                     cc->device_policy == CGROUP_AUTO)
3022                         cc->device_policy = CGROUP_CLOSED;
3023         }
3024
3025         return 0;
3026 }
3027
3028 ExecContext *unit_get_exec_context(Unit *u) {
3029         size_t offset;
3030         assert(u);
3031
3032         if (u->type < 0)
3033                 return NULL;
3034
3035         offset = UNIT_VTABLE(u)->exec_context_offset;
3036         if (offset <= 0)
3037                 return NULL;
3038
3039         return (ExecContext*) ((uint8_t*) u + offset);
3040 }
3041
3042 KillContext *unit_get_kill_context(Unit *u) {
3043         size_t offset;
3044         assert(u);
3045
3046         if (u->type < 0)
3047                 return NULL;
3048
3049         offset = UNIT_VTABLE(u)->kill_context_offset;
3050         if (offset <= 0)
3051                 return NULL;
3052
3053         return (KillContext*) ((uint8_t*) u + offset);
3054 }
3055
3056 CGroupContext *unit_get_cgroup_context(Unit *u) {
3057         size_t offset;
3058
3059         if (u->type < 0)
3060                 return NULL;
3061
3062         offset = UNIT_VTABLE(u)->cgroup_context_offset;
3063         if (offset <= 0)
3064                 return NULL;
3065
3066         return (CGroupContext*) ((uint8_t*) u + offset);
3067 }
3068
3069 ExecRuntime *unit_get_exec_runtime(Unit *u) {
3070         size_t offset;
3071
3072         if (u->type < 0)
3073                 return NULL;
3074
3075         offset = UNIT_VTABLE(u)->exec_runtime_offset;
3076         if (offset <= 0)
3077                 return NULL;
3078
3079         return *(ExecRuntime**) ((uint8_t*) u + offset);
3080 }
3081
3082 static int unit_drop_in_dir(Unit *u, UnitSetPropertiesMode mode, bool transient, char **dir) {
3083         if (u->manager->running_as == SYSTEMD_USER) {
3084                 int r;
3085
3086                 r = user_config_home(dir);
3087                 if (r == 0)
3088                         return -ENOENT;
3089                 return r;
3090         }
3091
3092         if (mode == UNIT_PERSISTENT && !transient)
3093                 *dir = strdup("/etc/systemd/system");
3094         else
3095                 *dir = strdup("/run/systemd/system");
3096         if (!*dir)
3097                 return -ENOMEM;
3098
3099         return 0;
3100 }
3101
3102 static int unit_drop_in_file(Unit *u,
3103                              UnitSetPropertiesMode mode, const char *name, char **p, char **q) {
3104         _cleanup_free_ char *dir = NULL;
3105         int r;
3106
3107         assert(u);
3108
3109         r = unit_drop_in_dir(u, mode, u->transient, &dir);
3110         if (r < 0)
3111                 return r;
3112
3113         return drop_in_file(dir, u->id, 50, name, p, q);
3114 }
3115
3116 int unit_write_drop_in(Unit *u, UnitSetPropertiesMode mode, const char *name, const char *data) {
3117
3118         _cleanup_free_ char *dir = NULL;
3119         int r;
3120
3121         assert(u);
3122
3123         if (!IN_SET(mode, UNIT_PERSISTENT, UNIT_RUNTIME))
3124                 return 0;
3125
3126         r = unit_drop_in_dir(u, mode, u->transient, &dir);
3127         if (r < 0)
3128                 return r;
3129
3130         return write_drop_in(dir, u->id, 50, name, data);
3131 }
3132
3133 int unit_write_drop_in_format(Unit *u, UnitSetPropertiesMode mode, const char *name, const char *format, ...) {
3134         _cleanup_free_ char *p = NULL;
3135         va_list ap;
3136         int r;
3137
3138         assert(u);
3139         assert(name);
3140         assert(format);
3141
3142         if (!IN_SET(mode, UNIT_PERSISTENT, UNIT_RUNTIME))
3143                 return 0;
3144
3145         va_start(ap, format);
3146         r = vasprintf(&p, format, ap);
3147         va_end(ap);
3148
3149         if (r < 0)
3150                 return -ENOMEM;
3151
3152         return unit_write_drop_in(u, mode, name, p);
3153 }
3154
3155 int unit_write_drop_in_private(Unit *u, UnitSetPropertiesMode mode, const char *name, const char *data) {
3156         _cleanup_free_ char *ndata = NULL;
3157
3158         assert(u);
3159         assert(name);
3160         assert(data);
3161
3162         if (!UNIT_VTABLE(u)->private_section)
3163                 return -EINVAL;
3164
3165         if (!IN_SET(mode, UNIT_PERSISTENT, UNIT_RUNTIME))
3166                 return 0;
3167
3168         ndata = strjoin("[", UNIT_VTABLE(u)->private_section, "]\n", data, NULL);
3169         if (!ndata)
3170                 return -ENOMEM;
3171
3172         return unit_write_drop_in(u, mode, name, ndata);
3173 }
3174
3175 int unit_write_drop_in_private_format(Unit *u, UnitSetPropertiesMode mode, const char *name, const char *format, ...) {
3176         _cleanup_free_ char *p = NULL;
3177         va_list ap;
3178         int r;
3179
3180         assert(u);
3181         assert(name);
3182         assert(format);
3183
3184         if (!IN_SET(mode, UNIT_PERSISTENT, UNIT_RUNTIME))
3185                 return 0;
3186
3187         va_start(ap, format);
3188         r = vasprintf(&p, format, ap);
3189         va_end(ap);
3190
3191         if (r < 0)
3192                 return -ENOMEM;
3193
3194         return unit_write_drop_in_private(u, mode, name, p);
3195 }
3196
3197 int unit_remove_drop_in(Unit *u, UnitSetPropertiesMode mode, const char *name) {
3198         _cleanup_free_ char *p = NULL, *q = NULL;
3199         int r;
3200
3201         assert(u);
3202
3203         if (!IN_SET(mode, UNIT_PERSISTENT, UNIT_RUNTIME))
3204                 return 0;
3205
3206         r = unit_drop_in_file(u, mode, name, &p, &q);
3207         if (r < 0)
3208                 return r;
3209
3210         if (unlink(q) < 0)
3211                 r = errno == ENOENT ? 0 : -errno;
3212         else
3213                 r = 1;
3214
3215         rmdir(p);
3216         return r;
3217 }
3218
3219 int unit_make_transient(Unit *u) {
3220         int r;
3221
3222         assert(u);
3223
3224         u->load_state = UNIT_STUB;
3225         u->load_error = 0;
3226         u->transient = true;
3227
3228         free(u->fragment_path);
3229         u->fragment_path = NULL;
3230
3231         if (u->manager->running_as == SYSTEMD_USER) {
3232                 _cleanup_free_ char *c = NULL;
3233
3234                 r = user_config_home(&c);
3235                 if (r < 0)
3236                         return r;
3237                 if (r == 0)
3238                         return -ENOENT;
3239
3240                 u->fragment_path = strjoin(c, "/", u->id, NULL);
3241                 if (!u->fragment_path)
3242                         return -ENOMEM;
3243
3244                 mkdir_p(c, 0755);
3245         } else {
3246                 u->fragment_path = strappend("/run/systemd/system/", u->id);
3247                 if (!u->fragment_path)
3248                         return -ENOMEM;
3249
3250                 mkdir_p("/run/systemd/system", 0755);
3251         }
3252
3253         return write_string_file_atomic_label(u->fragment_path, "# Transient stub");
3254 }
3255
3256 int unit_kill_context(
3257                 Unit *u,
3258                 KillContext *c,
3259                 bool sigkill,
3260                 pid_t main_pid,
3261                 pid_t control_pid,
3262                 bool main_pid_alien) {
3263
3264         int sig, wait_for_exit = false, r;
3265
3266         assert(u);
3267         assert(c);
3268
3269         if (c->kill_mode == KILL_NONE)
3270                 return 0;
3271
3272         sig = sigkill ? SIGKILL : c->kill_signal;
3273
3274         if (main_pid > 0) {
3275                 r = kill_and_sigcont(main_pid, sig);
3276
3277                 if (r < 0 && r != -ESRCH) {
3278                         _cleanup_free_ char *comm = NULL;
3279                         get_process_comm(main_pid, &comm);
3280
3281                         log_warning_unit(u->id, "Failed to kill main process " PID_FMT " (%s): %s", main_pid, strna(comm), strerror(-r));
3282                 } else {
3283                         if (!main_pid_alien)
3284                                 wait_for_exit = true;
3285
3286                         if (c->send_sighup && !sigkill)
3287                                 kill(main_pid, SIGHUP);
3288                 }
3289         }
3290
3291         if (control_pid > 0) {
3292                 r = kill_and_sigcont(control_pid, sig);
3293
3294                 if (r < 0 && r != -ESRCH) {
3295                         _cleanup_free_ char *comm = NULL;
3296                         get_process_comm(control_pid, &comm);
3297
3298                         log_warning_unit(u->id, "Failed to kill control process " PID_FMT " (%s): %s", control_pid, strna(comm), strerror(-r));
3299                 } else {
3300                         wait_for_exit = true;
3301
3302                         if (c->send_sighup && !sigkill)
3303                                 kill(control_pid, SIGHUP);
3304                 }
3305         }
3306
3307         if ((c->kill_mode == KILL_CONTROL_GROUP || (c->kill_mode == KILL_MIXED && sigkill)) && u->cgroup_path) {
3308                 _cleanup_set_free_ Set *pid_set = NULL;
3309
3310                 /* Exclude the main/control pids from being killed via the cgroup */
3311                 pid_set = unit_pid_set(main_pid, control_pid);
3312                 if (!pid_set)
3313                         return -ENOMEM;
3314
3315                 r = cg_kill_recursive(SYSTEMD_CGROUP_CONTROLLER, u->cgroup_path, sig, true, true, false, pid_set);
3316                 if (r < 0) {
3317                         if (r != -EAGAIN && r != -ESRCH && r != -ENOENT)
3318                                 log_warning_unit(u->id, "Failed to kill control group: %s", strerror(-r));
3319                 } else if (r > 0) {
3320
3321                         /* FIXME: For now, we will not wait for the
3322                          * cgroup members to die, simply because
3323                          * cgroup notification is unreliable. It
3324                          * doesn't work at all in containers, and
3325                          * outside of containers it can be confused
3326                          * easily by leaving directories in the
3327                          * cgroup. */
3328
3329                         /* wait_for_exit = true; */
3330
3331                         if (c->send_sighup && !sigkill) {
3332                                 set_free(pid_set);
3333
3334                                 pid_set = unit_pid_set(main_pid, control_pid);
3335                                 if (!pid_set)
3336                                         return -ENOMEM;
3337
3338                                 cg_kill_recursive(SYSTEMD_CGROUP_CONTROLLER, u->cgroup_path, SIGHUP, false, true, false, pid_set);
3339                         }
3340                 }
3341         }
3342
3343         return wait_for_exit;
3344 }
3345
3346 int unit_require_mounts_for(Unit *u, const char *path) {
3347         char prefix[strlen(path) + 1], *p;
3348         int r;
3349
3350         assert(u);
3351         assert(path);
3352
3353         /* Registers a unit for requiring a certain path and all its
3354          * prefixes. We keep a simple array of these paths in the
3355          * unit, since its usually short. However, we build a prefix
3356          * table for all possible prefixes so that new appearing mount
3357          * units can easily determine which units to make themselves a
3358          * dependency of. */
3359
3360         if (!path_is_absolute(path))
3361                 return -EINVAL;
3362
3363         p = strdup(path);
3364         if (!p)
3365                 return -ENOMEM;
3366
3367         path_kill_slashes(p);
3368
3369         if (!path_is_safe(p)) {
3370                 free(p);
3371                 return -EPERM;
3372         }
3373
3374         if (strv_contains(u->requires_mounts_for, p)) {
3375                 free(p);
3376                 return 0;
3377         }
3378
3379         r = strv_consume(&u->requires_mounts_for, p);
3380         if (r < 0)
3381                 return r;
3382
3383         PATH_FOREACH_PREFIX_MORE(prefix, p) {
3384                 Set *x;
3385
3386                 x = hashmap_get(u->manager->units_requiring_mounts_for, prefix);
3387                 if (!x) {
3388                         char *q;
3389
3390                         if (!u->manager->units_requiring_mounts_for) {
3391                                 u->manager->units_requiring_mounts_for = hashmap_new(string_hash_func, string_compare_func);
3392                                 if (!u->manager->units_requiring_mounts_for)
3393                                         return -ENOMEM;
3394                         }
3395
3396                         q = strdup(prefix);
3397                         if (!q)
3398                                 return -ENOMEM;
3399
3400                         x = set_new(NULL, NULL);
3401                         if (!x) {
3402                                 free(q);
3403                                 return -ENOMEM;
3404                         }
3405
3406                         r = hashmap_put(u->manager->units_requiring_mounts_for, q, x);
3407                         if (r < 0) {
3408                                 free(q);
3409                                 set_free(x);
3410                                 return r;
3411                         }
3412                 }
3413
3414                 r = set_put(x, u);
3415                 if (r < 0)
3416                         return r;
3417         }
3418
3419         return 0;
3420 }
3421
3422 int unit_setup_exec_runtime(Unit *u) {
3423         ExecRuntime **rt;
3424         size_t offset;
3425         Iterator i;
3426         Unit *other;
3427
3428         offset = UNIT_VTABLE(u)->exec_runtime_offset;
3429         assert(offset > 0);
3430
3431         /* Check if ther already is an ExecRuntime for this unit? */
3432         rt = (ExecRuntime**) ((uint8_t*) u + offset);
3433         if (*rt)
3434                 return 0;
3435
3436         /* Try to get it from somebody else */
3437         SET_FOREACH(other, u->dependencies[UNIT_JOINS_NAMESPACE_OF], i) {
3438
3439                 *rt = unit_get_exec_runtime(other);
3440                 if (*rt) {
3441                         exec_runtime_ref(*rt);
3442                         return 0;
3443                 }
3444         }
3445
3446         return exec_runtime_make(rt, unit_get_exec_context(u), u->id);
3447 }
3448
3449 static const char* const unit_active_state_table[_UNIT_ACTIVE_STATE_MAX] = {
3450         [UNIT_ACTIVE] = "active",
3451         [UNIT_RELOADING] = "reloading",
3452         [UNIT_INACTIVE] = "inactive",
3453         [UNIT_FAILED] = "failed",
3454         [UNIT_ACTIVATING] = "activating",
3455         [UNIT_DEACTIVATING] = "deactivating"
3456 };
3457
3458 DEFINE_STRING_TABLE_LOOKUP(unit_active_state, UnitActiveState);
3459
3460 static const char* const unit_dependency_table[_UNIT_DEPENDENCY_MAX] = {
3461         [UNIT_REQUIRES] = "Requires",
3462         [UNIT_REQUIRES_OVERRIDABLE] = "RequiresOverridable",
3463         [UNIT_REQUISITE] = "Requisite",
3464         [UNIT_REQUISITE_OVERRIDABLE] = "RequisiteOverridable",
3465         [UNIT_WANTS] = "Wants",
3466         [UNIT_BINDS_TO] = "BindsTo",
3467         [UNIT_PART_OF] = "PartOf",
3468         [UNIT_REQUIRED_BY] = "RequiredBy",
3469         [UNIT_REQUIRED_BY_OVERRIDABLE] = "RequiredByOverridable",
3470         [UNIT_WANTED_BY] = "WantedBy",
3471         [UNIT_BOUND_BY] = "BoundBy",
3472         [UNIT_CONSISTS_OF] = "ConsistsOf",
3473         [UNIT_CONFLICTS] = "Conflicts",
3474         [UNIT_CONFLICTED_BY] = "ConflictedBy",
3475         [UNIT_BEFORE] = "Before",
3476         [UNIT_AFTER] = "After",
3477         [UNIT_ON_FAILURE] = "OnFailure",
3478         [UNIT_TRIGGERS] = "Triggers",
3479         [UNIT_TRIGGERED_BY] = "TriggeredBy",
3480         [UNIT_PROPAGATES_RELOAD_TO] = "PropagatesReloadTo",
3481         [UNIT_RELOAD_PROPAGATED_FROM] = "ReloadPropagatedFrom",
3482         [UNIT_JOINS_NAMESPACE_OF] = "JoinsNamespaceOf",
3483         [UNIT_REFERENCES] = "References",
3484         [UNIT_REFERENCED_BY] = "ReferencedBy",
3485 };
3486
3487 DEFINE_STRING_TABLE_LOOKUP(unit_dependency, UnitDependency);