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