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