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