]> git.ipfire.org Git - thirdparty/systemd.git/blob - src/core/unit.c
util: make time formatting a bit smarter
[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("More than one OnFailure= dependencies specified for %s but OnFailureIsolate= enabled. Refusing.",
918 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("Failed to load configuration for %s: %s", u->id, strerror(-r));
938
939 return r;
940 }
941
942 bool unit_condition_test(Unit *u) {
943 assert(u);
944
945 dual_timestamp_get(&u->condition_timestamp);
946 u->condition_result = condition_test_list(u->conditions);
947
948 return u->condition_result;
949 }
950
951 static const char* unit_get_status_message_format(Unit *u, JobType t) {
952 const UnitStatusMessageFormats *format_table;
953
954 assert(u);
955 assert(t >= 0);
956 assert(t < _JOB_TYPE_MAX);
957
958 if (t != JOB_START && t != JOB_STOP)
959 return NULL;
960
961 format_table = &UNIT_VTABLE(u)->status_message_formats;
962 if (!format_table)
963 return NULL;
964
965 return format_table->starting_stopping[t == JOB_STOP];
966 }
967
968 static const char *unit_get_status_message_format_try_harder(Unit *u, JobType t) {
969 const char *format;
970
971 assert(u);
972 assert(t >= 0);
973 assert(t < _JOB_TYPE_MAX);
974
975 format = unit_get_status_message_format(u, t);
976 if (format)
977 return format;
978
979 /* Return generic strings */
980 if (t == JOB_START)
981 return "Starting %s.";
982 else if (t == JOB_STOP)
983 return "Stopping %s.";
984 else if (t == JOB_RELOAD)
985 return "Reloading %s.";
986
987 return NULL;
988 }
989
990 static void unit_status_print_starting_stopping(Unit *u, JobType t) {
991 const char *format;
992
993 assert(u);
994
995 /* We only print status messages for selected units on
996 * selected operations. */
997
998 format = unit_get_status_message_format(u, t);
999 if (!format)
1000 return;
1001
1002 unit_status_printf(u, "", format);
1003 }
1004
1005 #pragma GCC diagnostic push
1006 #pragma GCC diagnostic ignored "-Wformat-nonliteral"
1007 static void unit_status_log_starting_stopping_reloading(Unit *u, JobType t) {
1008 const char *format;
1009 char buf[LINE_MAX];
1010 sd_id128_t mid;
1011
1012 assert(u);
1013
1014 if (t != JOB_START && t != JOB_STOP && t != JOB_RELOAD)
1015 return;
1016
1017 if (log_on_console())
1018 return;
1019
1020 /* We log status messages for all units and all operations. */
1021
1022 format = unit_get_status_message_format_try_harder(u, t);
1023 if (!format)
1024 return;
1025
1026 snprintf(buf, sizeof(buf), format, unit_description(u));
1027 char_array_0(buf);
1028
1029 mid = t == JOB_START ? SD_MESSAGE_UNIT_STARTING :
1030 t == JOB_STOP ? SD_MESSAGE_UNIT_STOPPING :
1031 SD_MESSAGE_UNIT_RELOADING;
1032
1033 log_struct_unit(LOG_INFO,
1034 u->id,
1035 MESSAGE_ID(mid),
1036 "MESSAGE=%s", buf,
1037 NULL);
1038 }
1039 #pragma GCC diagnostic pop
1040
1041 /* Errors:
1042 * -EBADR: This unit type does not support starting.
1043 * -EALREADY: Unit is already started.
1044 * -EAGAIN: An operation is already in progress. Retry later.
1045 * -ECANCELED: Too many requests for now.
1046 */
1047 int unit_start(Unit *u) {
1048 UnitActiveState state;
1049 Unit *following;
1050
1051 assert(u);
1052
1053 if (u->load_state != UNIT_LOADED)
1054 return -EINVAL;
1055
1056 /* If this is already started, then this will succeed. Note
1057 * that this will even succeed if this unit is not startable
1058 * by the user. This is relied on to detect when we need to
1059 * wait for units and when waiting is finished. */
1060 state = unit_active_state(u);
1061 if (UNIT_IS_ACTIVE_OR_RELOADING(state))
1062 return -EALREADY;
1063
1064 /* If the conditions failed, don't do anything at all. If we
1065 * already are activating this call might still be useful to
1066 * speed up activation in case there is some hold-off time,
1067 * but we don't want to recheck the condition in that case. */
1068 if (state != UNIT_ACTIVATING &&
1069 !unit_condition_test(u)) {
1070 log_debug("Starting of %s requested but condition failed. Ignoring.", u->id);
1071 return -EALREADY;
1072 }
1073
1074 /* Forward to the main object, if we aren't it. */
1075 if ((following = unit_following(u))) {
1076 log_debug("Redirecting start request from %s to %s.", u->id, following->id);
1077 return unit_start(following);
1078 }
1079
1080 unit_status_log_starting_stopping_reloading(u, JOB_START);
1081 unit_status_print_starting_stopping(u, JOB_START);
1082
1083 /* If it is stopped, but we cannot start it, then fail */
1084 if (!UNIT_VTABLE(u)->start)
1085 return -EBADR;
1086
1087 /* We don't suppress calls to ->start() here when we are
1088 * already starting, to allow this request to be used as a
1089 * "hurry up" call, for example when the unit is in some "auto
1090 * restart" state where it waits for a holdoff timer to elapse
1091 * before it will start again. */
1092
1093 unit_add_to_dbus_queue(u);
1094
1095 return UNIT_VTABLE(u)->start(u);
1096 }
1097
1098 bool unit_can_start(Unit *u) {
1099 assert(u);
1100
1101 return !!UNIT_VTABLE(u)->start;
1102 }
1103
1104 bool unit_can_isolate(Unit *u) {
1105 assert(u);
1106
1107 return unit_can_start(u) &&
1108 u->allow_isolate;
1109 }
1110
1111 /* Errors:
1112 * -EBADR: This unit type does not support stopping.
1113 * -EALREADY: Unit is already stopped.
1114 * -EAGAIN: An operation is already in progress. Retry later.
1115 */
1116 int unit_stop(Unit *u) {
1117 UnitActiveState state;
1118 Unit *following;
1119
1120 assert(u);
1121
1122 state = unit_active_state(u);
1123 if (UNIT_IS_INACTIVE_OR_FAILED(state))
1124 return -EALREADY;
1125
1126 if ((following = unit_following(u))) {
1127 log_debug("Redirecting stop request from %s to %s.", u->id, following->id);
1128 return unit_stop(following);
1129 }
1130
1131 unit_status_log_starting_stopping_reloading(u, JOB_STOP);
1132 unit_status_print_starting_stopping(u, JOB_STOP);
1133
1134 if (!UNIT_VTABLE(u)->stop)
1135 return -EBADR;
1136
1137 unit_add_to_dbus_queue(u);
1138
1139 return UNIT_VTABLE(u)->stop(u);
1140 }
1141
1142 /* Errors:
1143 * -EBADR: This unit type does not support reloading.
1144 * -ENOEXEC: Unit is not started.
1145 * -EAGAIN: An operation is already in progress. Retry later.
1146 */
1147 int unit_reload(Unit *u) {
1148 UnitActiveState state;
1149 Unit *following;
1150
1151 assert(u);
1152
1153 if (u->load_state != UNIT_LOADED)
1154 return -EINVAL;
1155
1156 if (!unit_can_reload(u))
1157 return -EBADR;
1158
1159 state = unit_active_state(u);
1160 if (state == UNIT_RELOADING)
1161 return -EALREADY;
1162
1163 if (state != UNIT_ACTIVE)
1164 return -ENOEXEC;
1165
1166 if ((following = unit_following(u))) {
1167 log_debug("Redirecting reload request from %s to %s.", u->id, following->id);
1168 return unit_reload(following);
1169 }
1170
1171 unit_status_log_starting_stopping_reloading(u, JOB_RELOAD);
1172
1173 unit_add_to_dbus_queue(u);
1174 return UNIT_VTABLE(u)->reload(u);
1175 }
1176
1177 bool unit_can_reload(Unit *u) {
1178 assert(u);
1179
1180 if (!UNIT_VTABLE(u)->reload)
1181 return false;
1182
1183 if (!UNIT_VTABLE(u)->can_reload)
1184 return true;
1185
1186 return UNIT_VTABLE(u)->can_reload(u);
1187 }
1188
1189 static void unit_check_unneeded(Unit *u) {
1190 Iterator i;
1191 Unit *other;
1192
1193 assert(u);
1194
1195 /* If this service shall be shut down when unneeded then do
1196 * so. */
1197
1198 if (!u->stop_when_unneeded)
1199 return;
1200
1201 if (!UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u)))
1202 return;
1203
1204 SET_FOREACH(other, u->dependencies[UNIT_REQUIRED_BY], i)
1205 if (unit_pending_active(other))
1206 return;
1207
1208 SET_FOREACH(other, u->dependencies[UNIT_REQUIRED_BY_OVERRIDABLE], i)
1209 if (unit_pending_active(other))
1210 return;
1211
1212 SET_FOREACH(other, u->dependencies[UNIT_WANTED_BY], i)
1213 if (unit_pending_active(other))
1214 return;
1215
1216 SET_FOREACH(other, u->dependencies[UNIT_BOUND_BY], i)
1217 if (unit_pending_active(other))
1218 return;
1219
1220 log_info("Service %s is not needed anymore. Stopping.", u->id);
1221
1222 /* Ok, nobody needs us anymore. Sniff. Then let's commit suicide */
1223 manager_add_job(u->manager, JOB_STOP, u, JOB_FAIL, true, NULL, NULL);
1224 }
1225
1226 static void retroactively_start_dependencies(Unit *u) {
1227 Iterator i;
1228 Unit *other;
1229
1230 assert(u);
1231 assert(UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u)));
1232
1233 SET_FOREACH(other, u->dependencies[UNIT_REQUIRES], i)
1234 if (!set_get(u->dependencies[UNIT_AFTER], other) &&
1235 !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other)))
1236 manager_add_job(u->manager, JOB_START, other, JOB_REPLACE, true, NULL, NULL);
1237
1238 SET_FOREACH(other, u->dependencies[UNIT_BINDS_TO], i)
1239 if (!set_get(u->dependencies[UNIT_AFTER], other) &&
1240 !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other)))
1241 manager_add_job(u->manager, JOB_START, other, JOB_REPLACE, true, NULL, NULL);
1242
1243 SET_FOREACH(other, u->dependencies[UNIT_REQUIRES_OVERRIDABLE], i)
1244 if (!set_get(u->dependencies[UNIT_AFTER], other) &&
1245 !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other)))
1246 manager_add_job(u->manager, JOB_START, other, JOB_FAIL, false, NULL, NULL);
1247
1248 SET_FOREACH(other, u->dependencies[UNIT_WANTS], i)
1249 if (!set_get(u->dependencies[UNIT_AFTER], other) &&
1250 !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other)))
1251 manager_add_job(u->manager, JOB_START, other, JOB_FAIL, false, NULL, NULL);
1252
1253 SET_FOREACH(other, u->dependencies[UNIT_CONFLICTS], i)
1254 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
1255 manager_add_job(u->manager, JOB_STOP, other, JOB_REPLACE, true, NULL, NULL);
1256
1257 SET_FOREACH(other, u->dependencies[UNIT_CONFLICTED_BY], 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
1262 static void retroactively_stop_dependencies(Unit *u) {
1263 Iterator i;
1264 Unit *other;
1265
1266 assert(u);
1267 assert(UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(u)));
1268
1269 /* Pull down units which are bound to us recursively if enabled */
1270 SET_FOREACH(other, u->dependencies[UNIT_BOUND_BY], i)
1271 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
1272 manager_add_job(u->manager, JOB_STOP, other, JOB_REPLACE, true, NULL, NULL);
1273 }
1274
1275 static void check_unneeded_dependencies(Unit *u) {
1276 Iterator i;
1277 Unit *other;
1278
1279 assert(u);
1280 assert(UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(u)));
1281
1282 /* Garbage collect services that might not be needed anymore, if enabled */
1283 SET_FOREACH(other, u->dependencies[UNIT_REQUIRES], i)
1284 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
1285 unit_check_unneeded(other);
1286 SET_FOREACH(other, u->dependencies[UNIT_REQUIRES_OVERRIDABLE], i)
1287 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
1288 unit_check_unneeded(other);
1289 SET_FOREACH(other, u->dependencies[UNIT_WANTS], i)
1290 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
1291 unit_check_unneeded(other);
1292 SET_FOREACH(other, u->dependencies[UNIT_REQUISITE], i)
1293 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
1294 unit_check_unneeded(other);
1295 SET_FOREACH(other, u->dependencies[UNIT_REQUISITE_OVERRIDABLE], i)
1296 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
1297 unit_check_unneeded(other);
1298 SET_FOREACH(other, u->dependencies[UNIT_BINDS_TO], i)
1299 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
1300 unit_check_unneeded(other);
1301 }
1302
1303 void unit_trigger_on_failure(Unit *u) {
1304 Unit *other;
1305 Iterator i;
1306
1307 assert(u);
1308
1309 if (set_size(u->dependencies[UNIT_ON_FAILURE]) <= 0)
1310 return;
1311
1312 log_info("Triggering OnFailure= dependencies of %s.", u->id);
1313
1314 SET_FOREACH(other, u->dependencies[UNIT_ON_FAILURE], i) {
1315 int r;
1316
1317 if ((r = manager_add_job(u->manager, JOB_START, other, u->on_failure_isolate ? JOB_ISOLATE : JOB_REPLACE, true, NULL, NULL)) < 0)
1318 log_error("Failed to enqueue OnFailure= job: %s", strerror(-r));
1319 }
1320 }
1321
1322 void unit_notify(Unit *u, UnitActiveState os, UnitActiveState ns, bool reload_success) {
1323 Manager *m;
1324 bool unexpected;
1325
1326 assert(u);
1327 assert(os < _UNIT_ACTIVE_STATE_MAX);
1328 assert(ns < _UNIT_ACTIVE_STATE_MAX);
1329
1330 /* Note that this is called for all low-level state changes,
1331 * even if they might map to the same high-level
1332 * UnitActiveState! That means that ns == os is OK an expected
1333 * behavior here. For example: if a mount point is remounted
1334 * this function will be called too! */
1335
1336 m = u->manager;
1337
1338 if (m->n_reloading <= 0) {
1339 dual_timestamp ts;
1340
1341 dual_timestamp_get(&ts);
1342
1343 if (UNIT_IS_INACTIVE_OR_FAILED(os) && !UNIT_IS_INACTIVE_OR_FAILED(ns))
1344 u->inactive_exit_timestamp = ts;
1345 else if (!UNIT_IS_INACTIVE_OR_FAILED(os) && UNIT_IS_INACTIVE_OR_FAILED(ns))
1346 u->inactive_enter_timestamp = ts;
1347
1348 if (!UNIT_IS_ACTIVE_OR_RELOADING(os) && UNIT_IS_ACTIVE_OR_RELOADING(ns))
1349 u->active_enter_timestamp = ts;
1350 else if (UNIT_IS_ACTIVE_OR_RELOADING(os) && !UNIT_IS_ACTIVE_OR_RELOADING(ns))
1351 u->active_exit_timestamp = ts;
1352
1353 timer_unit_notify(u, ns);
1354 path_unit_notify(u, ns);
1355 }
1356
1357 if (UNIT_IS_INACTIVE_OR_FAILED(ns))
1358 cgroup_bonding_trim_list(u->cgroup_bondings, true);
1359
1360 if (UNIT_IS_INACTIVE_OR_FAILED(os) != UNIT_IS_INACTIVE_OR_FAILED(ns)) {
1361 ExecContext *ec = unit_get_exec_context(u);
1362 if (ec && exec_context_may_touch_console(ec)) {
1363 if (UNIT_IS_INACTIVE_OR_FAILED(ns))
1364 m->n_on_console--;
1365 else
1366 m->n_on_console++;
1367 }
1368 }
1369
1370 if (u->job) {
1371 unexpected = false;
1372
1373 if (u->job->state == JOB_WAITING)
1374
1375 /* So we reached a different state for this
1376 * job. Let's see if we can run it now if it
1377 * failed previously due to EAGAIN. */
1378 job_add_to_run_queue(u->job);
1379
1380 /* Let's check whether this state change constitutes a
1381 * finished job, or maybe contradicts a running job and
1382 * hence needs to invalidate jobs. */
1383
1384 switch (u->job->type) {
1385
1386 case JOB_START:
1387 case JOB_VERIFY_ACTIVE:
1388
1389 if (UNIT_IS_ACTIVE_OR_RELOADING(ns))
1390 job_finish_and_invalidate(u->job, JOB_DONE, true);
1391 else if (u->job->state == JOB_RUNNING && ns != UNIT_ACTIVATING) {
1392 unexpected = true;
1393
1394 if (UNIT_IS_INACTIVE_OR_FAILED(ns))
1395 job_finish_and_invalidate(u->job, ns == UNIT_FAILED ? JOB_FAILED : JOB_DONE, true);
1396 }
1397
1398 break;
1399
1400 case JOB_RELOAD:
1401 case JOB_RELOAD_OR_START:
1402
1403 if (u->job->state == JOB_RUNNING) {
1404 if (ns == UNIT_ACTIVE)
1405 job_finish_and_invalidate(u->job, reload_success ? JOB_DONE : JOB_FAILED, true);
1406 else if (ns != UNIT_ACTIVATING && ns != UNIT_RELOADING) {
1407 unexpected = true;
1408
1409 if (UNIT_IS_INACTIVE_OR_FAILED(ns))
1410 job_finish_and_invalidate(u->job, ns == UNIT_FAILED ? JOB_FAILED : JOB_DONE, true);
1411 }
1412 }
1413
1414 break;
1415
1416 case JOB_STOP:
1417 case JOB_RESTART:
1418 case JOB_TRY_RESTART:
1419
1420 if (UNIT_IS_INACTIVE_OR_FAILED(ns))
1421 job_finish_and_invalidate(u->job, JOB_DONE, true);
1422 else if (u->job->state == JOB_RUNNING && ns != UNIT_DEACTIVATING) {
1423 unexpected = true;
1424 job_finish_and_invalidate(u->job, JOB_FAILED, true);
1425 }
1426
1427 break;
1428
1429 default:
1430 assert_not_reached("Job type unknown");
1431 }
1432
1433 } else
1434 unexpected = true;
1435
1436 if (m->n_reloading <= 0) {
1437
1438 /* If this state change happened without being
1439 * requested by a job, then let's retroactively start
1440 * or stop dependencies. We skip that step when
1441 * deserializing, since we don't want to create any
1442 * additional jobs just because something is already
1443 * activated. */
1444
1445 if (unexpected) {
1446 if (UNIT_IS_INACTIVE_OR_FAILED(os) && UNIT_IS_ACTIVE_OR_ACTIVATING(ns))
1447 retroactively_start_dependencies(u);
1448 else if (UNIT_IS_ACTIVE_OR_ACTIVATING(os) && UNIT_IS_INACTIVE_OR_DEACTIVATING(ns))
1449 retroactively_stop_dependencies(u);
1450 }
1451
1452 /* stop unneeded units regardless if going down was expected or not */
1453 if (UNIT_IS_ACTIVE_OR_ACTIVATING(os) && UNIT_IS_INACTIVE_OR_DEACTIVATING(ns))
1454 check_unneeded_dependencies(u);
1455
1456 if (ns != os && ns == UNIT_FAILED) {
1457 log_struct_unit(LOG_NOTICE,
1458 u->id,
1459 "MESSAGE=Unit %s entered failed state", u->id,
1460 NULL);
1461 unit_trigger_on_failure(u);
1462 }
1463 }
1464
1465 /* Some names are special */
1466 if (UNIT_IS_ACTIVE_OR_RELOADING(ns)) {
1467
1468 if (unit_has_name(u, SPECIAL_DBUS_SERVICE))
1469 /* The bus just might have become available,
1470 * hence try to connect to it, if we aren't
1471 * yet connected. */
1472 bus_init(m, true);
1473
1474 if (u->type == UNIT_SERVICE &&
1475 !UNIT_IS_ACTIVE_OR_RELOADING(os) &&
1476 m->n_reloading <= 0) {
1477 /* Write audit record if we have just finished starting up */
1478 manager_send_unit_audit(m, u, AUDIT_SERVICE_START, true);
1479 u->in_audit = true;
1480 }
1481
1482 if (!UNIT_IS_ACTIVE_OR_RELOADING(os))
1483 manager_send_unit_plymouth(m, u);
1484
1485 } else {
1486
1487 /* We don't care about D-Bus here, since we'll get an
1488 * asynchronous notification for it anyway. */
1489
1490 if (u->type == UNIT_SERVICE &&
1491 UNIT_IS_INACTIVE_OR_FAILED(ns) &&
1492 !UNIT_IS_INACTIVE_OR_FAILED(os) &&
1493 m->n_reloading <= 0) {
1494
1495 /* Hmm, if there was no start record written
1496 * write it now, so that we always have a nice
1497 * pair */
1498 if (!u->in_audit) {
1499 manager_send_unit_audit(m, u, AUDIT_SERVICE_START, ns == UNIT_INACTIVE);
1500
1501 if (ns == UNIT_INACTIVE)
1502 manager_send_unit_audit(m, u, AUDIT_SERVICE_STOP, true);
1503 } else
1504 /* Write audit record if we have just finished shutting down */
1505 manager_send_unit_audit(m, u, AUDIT_SERVICE_STOP, ns == UNIT_INACTIVE);
1506
1507 u->in_audit = false;
1508 }
1509 }
1510
1511 manager_recheck_journal(m);
1512
1513 /* Maybe we finished startup and are now ready for being
1514 * stopped because unneeded? */
1515 if (u->manager->n_reloading <= 0)
1516 unit_check_unneeded(u);
1517
1518 unit_add_to_dbus_queue(u);
1519 unit_add_to_gc_queue(u);
1520 }
1521
1522 int unit_watch_fd(Unit *u, int fd, uint32_t events, Watch *w) {
1523 struct epoll_event ev;
1524
1525 assert(u);
1526 assert(fd >= 0);
1527 assert(w);
1528 assert(w->type == WATCH_INVALID || (w->type == WATCH_FD && w->fd == fd && w->data.unit == u));
1529
1530 zero(ev);
1531 ev.data.ptr = w;
1532 ev.events = events;
1533
1534 if (epoll_ctl(u->manager->epoll_fd,
1535 w->type == WATCH_INVALID ? EPOLL_CTL_ADD : EPOLL_CTL_MOD,
1536 fd,
1537 &ev) < 0)
1538 return -errno;
1539
1540 w->fd = fd;
1541 w->type = WATCH_FD;
1542 w->data.unit = u;
1543
1544 return 0;
1545 }
1546
1547 void unit_unwatch_fd(Unit *u, Watch *w) {
1548 assert(u);
1549 assert(w);
1550
1551 if (w->type == WATCH_INVALID)
1552 return;
1553
1554 assert(w->type == WATCH_FD);
1555 assert(w->data.unit == u);
1556 assert_se(epoll_ctl(u->manager->epoll_fd, EPOLL_CTL_DEL, w->fd, NULL) >= 0);
1557
1558 w->fd = -1;
1559 w->type = WATCH_INVALID;
1560 w->data.unit = NULL;
1561 }
1562
1563 int unit_watch_pid(Unit *u, pid_t pid) {
1564 assert(u);
1565 assert(pid >= 1);
1566
1567 /* Watch a specific PID. We only support one unit watching
1568 * each PID for now. */
1569
1570 return hashmap_put(u->manager->watch_pids, LONG_TO_PTR(pid), u);
1571 }
1572
1573 void unit_unwatch_pid(Unit *u, pid_t pid) {
1574 assert(u);
1575 assert(pid >= 1);
1576
1577 hashmap_remove_value(u->manager->watch_pids, LONG_TO_PTR(pid), u);
1578 }
1579
1580 int unit_watch_timer(Unit *u, clockid_t clock_id, bool relative, usec_t usec, Watch *w) {
1581 struct itimerspec its;
1582 int flags, fd;
1583 bool ours;
1584
1585 assert(u);
1586 assert(w);
1587 assert(w->type == WATCH_INVALID || (w->type == WATCH_UNIT_TIMER && w->data.unit == u));
1588
1589 /* This will try to reuse the old timer if there is one */
1590
1591 if (w->type == WATCH_UNIT_TIMER) {
1592 assert(w->data.unit == u);
1593 assert(w->fd >= 0);
1594
1595 ours = false;
1596 fd = w->fd;
1597 } else if (w->type == WATCH_INVALID) {
1598
1599 ours = true;
1600 fd = timerfd_create(clock_id, TFD_NONBLOCK|TFD_CLOEXEC);
1601 if (fd < 0)
1602 return -errno;
1603 } else
1604 assert_not_reached("Invalid watch type");
1605
1606 zero(its);
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
1627 zero(ev);
1628 ev.data.ptr = w;
1629 ev.events = EPOLLIN;
1630
1631 if (epoll_ctl(u->manager->epoll_fd, EPOLL_CTL_ADD, fd, &ev) < 0)
1632 goto fail;
1633 }
1634
1635 w->type = WATCH_UNIT_TIMER;
1636 w->fd = fd;
1637 w->data.unit = u;
1638
1639 return 0;
1640
1641 fail:
1642 if (ours)
1643 close_nointr_nofail(fd);
1644
1645 return -errno;
1646 }
1647
1648 void unit_unwatch_timer(Unit *u, Watch *w) {
1649 assert(u);
1650 assert(w);
1651
1652 if (w->type == WATCH_INVALID)
1653 return;
1654
1655 assert(w->type == WATCH_UNIT_TIMER);
1656 assert(w->data.unit == u);
1657 assert(w->fd >= 0);
1658
1659 assert_se(epoll_ctl(u->manager->epoll_fd, EPOLL_CTL_DEL, w->fd, NULL) >= 0);
1660 close_nointr_nofail(w->fd);
1661
1662 w->fd = -1;
1663 w->type = WATCH_INVALID;
1664 w->data.unit = NULL;
1665 }
1666
1667 bool unit_job_is_applicable(Unit *u, JobType j) {
1668 assert(u);
1669 assert(j >= 0 && j < _JOB_TYPE_MAX);
1670
1671 switch (j) {
1672
1673 case JOB_VERIFY_ACTIVE:
1674 case JOB_START:
1675 case JOB_STOP:
1676 case JOB_NOP:
1677 return true;
1678
1679 case JOB_RESTART:
1680 case JOB_TRY_RESTART:
1681 return unit_can_start(u);
1682
1683 case JOB_RELOAD:
1684 return unit_can_reload(u);
1685
1686 case JOB_RELOAD_OR_START:
1687 return unit_can_reload(u) && unit_can_start(u);
1688
1689 default:
1690 assert_not_reached("Invalid job type");
1691 }
1692 }
1693
1694 int unit_add_dependency(Unit *u, UnitDependency d, Unit *other, bool add_reference) {
1695
1696 static const UnitDependency inverse_table[_UNIT_DEPENDENCY_MAX] = {
1697 [UNIT_REQUIRES] = UNIT_REQUIRED_BY,
1698 [UNIT_REQUIRES_OVERRIDABLE] = UNIT_REQUIRED_BY_OVERRIDABLE,
1699 [UNIT_WANTS] = UNIT_WANTED_BY,
1700 [UNIT_REQUISITE] = UNIT_REQUIRED_BY,
1701 [UNIT_REQUISITE_OVERRIDABLE] = UNIT_REQUIRED_BY_OVERRIDABLE,
1702 [UNIT_BINDS_TO] = UNIT_BOUND_BY,
1703 [UNIT_PART_OF] = UNIT_CONSISTS_OF,
1704 [UNIT_REQUIRED_BY] = _UNIT_DEPENDENCY_INVALID,
1705 [UNIT_REQUIRED_BY_OVERRIDABLE] = _UNIT_DEPENDENCY_INVALID,
1706 [UNIT_WANTED_BY] = _UNIT_DEPENDENCY_INVALID,
1707 [UNIT_BOUND_BY] = UNIT_BINDS_TO,
1708 [UNIT_CONSISTS_OF] = UNIT_PART_OF,
1709 [UNIT_CONFLICTS] = UNIT_CONFLICTED_BY,
1710 [UNIT_CONFLICTED_BY] = UNIT_CONFLICTS,
1711 [UNIT_BEFORE] = UNIT_AFTER,
1712 [UNIT_AFTER] = UNIT_BEFORE,
1713 [UNIT_ON_FAILURE] = _UNIT_DEPENDENCY_INVALID,
1714 [UNIT_REFERENCES] = UNIT_REFERENCED_BY,
1715 [UNIT_REFERENCED_BY] = UNIT_REFERENCES,
1716 [UNIT_TRIGGERS] = UNIT_TRIGGERED_BY,
1717 [UNIT_TRIGGERED_BY] = UNIT_TRIGGERS,
1718 [UNIT_PROPAGATES_RELOAD_TO] = UNIT_RELOAD_PROPAGATED_FROM,
1719 [UNIT_RELOAD_PROPAGATED_FROM] = UNIT_PROPAGATES_RELOAD_TO,
1720 };
1721 int r, q = 0, v = 0, w = 0;
1722
1723 assert(u);
1724 assert(d >= 0 && d < _UNIT_DEPENDENCY_MAX);
1725 assert(other);
1726
1727 u = unit_follow_merge(u);
1728 other = unit_follow_merge(other);
1729
1730 /* We won't allow dependencies on ourselves. We will not
1731 * consider them an error however. */
1732 if (u == other)
1733 return 0;
1734
1735 if ((r = set_ensure_allocated(&u->dependencies[d], trivial_hash_func, trivial_compare_func)) < 0)
1736 return r;
1737
1738 if (inverse_table[d] != _UNIT_DEPENDENCY_INVALID)
1739 if ((r = set_ensure_allocated(&other->dependencies[inverse_table[d]], trivial_hash_func, trivial_compare_func)) < 0)
1740 return r;
1741
1742 if (add_reference)
1743 if ((r = set_ensure_allocated(&u->dependencies[UNIT_REFERENCES], trivial_hash_func, trivial_compare_func)) < 0 ||
1744 (r = set_ensure_allocated(&other->dependencies[UNIT_REFERENCED_BY], trivial_hash_func, trivial_compare_func)) < 0)
1745 return r;
1746
1747 if ((q = set_put(u->dependencies[d], other)) < 0)
1748 return q;
1749
1750 if (inverse_table[d] != _UNIT_DEPENDENCY_INVALID)
1751 if ((v = set_put(other->dependencies[inverse_table[d]], u)) < 0) {
1752 r = v;
1753 goto fail;
1754 }
1755
1756 if (add_reference) {
1757 if ((w = set_put(u->dependencies[UNIT_REFERENCES], other)) < 0) {
1758 r = w;
1759 goto fail;
1760 }
1761
1762 if ((r = set_put(other->dependencies[UNIT_REFERENCED_BY], u)) < 0)
1763 goto fail;
1764 }
1765
1766 unit_add_to_dbus_queue(u);
1767 return 0;
1768
1769 fail:
1770 if (q > 0)
1771 set_remove(u->dependencies[d], other);
1772
1773 if (v > 0)
1774 set_remove(other->dependencies[inverse_table[d]], u);
1775
1776 if (w > 0)
1777 set_remove(u->dependencies[UNIT_REFERENCES], other);
1778
1779 return r;
1780 }
1781
1782 int unit_add_two_dependencies(Unit *u, UnitDependency d, UnitDependency e, Unit *other, bool add_reference) {
1783 int r;
1784
1785 assert(u);
1786
1787 if ((r = unit_add_dependency(u, d, other, add_reference)) < 0)
1788 return r;
1789
1790 if ((r = unit_add_dependency(u, e, other, add_reference)) < 0)
1791 return r;
1792
1793 return 0;
1794 }
1795
1796 static const char *resolve_template(Unit *u, const char *name, const char*path, char **p) {
1797 char *s;
1798
1799 assert(u);
1800 assert(name || path);
1801 assert(p);
1802
1803 if (!name)
1804 name = path_get_file_name(path);
1805
1806 if (!unit_name_is_template(name)) {
1807 *p = NULL;
1808 return name;
1809 }
1810
1811 if (u->instance)
1812 s = unit_name_replace_instance(name, u->instance);
1813 else {
1814 char *i;
1815
1816 i = unit_name_to_prefix(u->id);
1817 if (!i)
1818 return NULL;
1819
1820 s = unit_name_replace_instance(name, i);
1821 free(i);
1822 }
1823
1824 if (!s)
1825 return NULL;
1826
1827 *p = s;
1828 return s;
1829 }
1830
1831 int unit_add_dependency_by_name(Unit *u, UnitDependency d, const char *name, const char *path, bool add_reference) {
1832 Unit *other;
1833 int r;
1834 _cleanup_free_ char *s = NULL;
1835
1836 assert(u);
1837 assert(name || path);
1838
1839 name = resolve_template(u, name, path, &s);
1840 if (!name)
1841 return -ENOMEM;
1842
1843 r = manager_load_unit(u->manager, name, path, NULL, &other);
1844 if (r < 0)
1845 return r;
1846
1847 return unit_add_dependency(u, d, other, add_reference);
1848 }
1849
1850 int unit_add_two_dependencies_by_name(Unit *u, UnitDependency d, UnitDependency e, const char *name, const char *path, bool add_reference) {
1851 Unit *other;
1852 int r;
1853 char *s;
1854
1855 assert(u);
1856 assert(name || path);
1857
1858 if (!(name = resolve_template(u, name, path, &s)))
1859 return -ENOMEM;
1860
1861 if ((r = manager_load_unit(u->manager, name, path, NULL, &other)) < 0)
1862 goto finish;
1863
1864 r = unit_add_two_dependencies(u, d, e, other, add_reference);
1865
1866 finish:
1867 free(s);
1868 return r;
1869 }
1870
1871 int unit_add_dependency_by_name_inverse(Unit *u, UnitDependency d, const char *name, const char *path, bool add_reference) {
1872 Unit *other;
1873 int r;
1874 char *s;
1875
1876 assert(u);
1877 assert(name || path);
1878
1879 if (!(name = resolve_template(u, name, path, &s)))
1880 return -ENOMEM;
1881
1882 if ((r = manager_load_unit(u->manager, name, path, NULL, &other)) < 0)
1883 goto finish;
1884
1885 r = unit_add_dependency(other, d, u, add_reference);
1886
1887 finish:
1888 free(s);
1889 return r;
1890 }
1891
1892 int unit_add_two_dependencies_by_name_inverse(Unit *u, UnitDependency d, UnitDependency e, const char *name, const char *path, bool add_reference) {
1893 Unit *other;
1894 int r;
1895 char *s;
1896
1897 assert(u);
1898 assert(name || path);
1899
1900 if (!(name = resolve_template(u, name, path, &s)))
1901 return -ENOMEM;
1902
1903 if ((r = manager_load_unit(u->manager, name, path, NULL, &other)) < 0)
1904 goto finish;
1905
1906 if ((r = unit_add_two_dependencies(other, d, e, u, add_reference)) < 0)
1907 goto finish;
1908
1909 finish:
1910 free(s);
1911 return r;
1912 }
1913
1914 int set_unit_path(const char *p) {
1915 _cleanup_free_ char *c = NULL;
1916
1917 /* This is mostly for debug purposes */
1918 c = path_make_absolute_cwd(p);
1919 if (setenv("SYSTEMD_UNIT_PATH", c, 0) < 0)
1920 return -errno;
1921
1922 return 0;
1923 }
1924
1925 char *unit_dbus_path(Unit *u) {
1926 assert(u);
1927
1928 if (!u->id)
1929 return NULL;
1930
1931 return unit_dbus_path_from_name(u->id);
1932 }
1933
1934 int unit_add_cgroup(Unit *u, CGroupBonding *b) {
1935 int r;
1936
1937 assert(u);
1938 assert(b);
1939
1940 assert(b->path);
1941
1942 if (!b->controller) {
1943 b->controller = strdup(SYSTEMD_CGROUP_CONTROLLER);
1944 if (!b->controller)
1945 return log_oom();
1946
1947 b->ours = true;
1948 }
1949
1950 /* Ensure this hasn't been added yet */
1951 assert(!b->unit);
1952
1953 if (streq(b->controller, SYSTEMD_CGROUP_CONTROLLER)) {
1954 CGroupBonding *l;
1955
1956 l = hashmap_get(u->manager->cgroup_bondings, b->path);
1957 LIST_PREPEND(CGroupBonding, by_path, l, b);
1958
1959 r = hashmap_replace(u->manager->cgroup_bondings, b->path, l);
1960 if (r < 0) {
1961 LIST_REMOVE(CGroupBonding, by_path, l, b);
1962 return r;
1963 }
1964 }
1965
1966 LIST_PREPEND(CGroupBonding, by_unit, u->cgroup_bondings, b);
1967 b->unit = u;
1968
1969 return 0;
1970 }
1971
1972 char *unit_default_cgroup_path(Unit *u) {
1973 assert(u);
1974
1975 if (u->instance) {
1976 _cleanup_free_ char *t = NULL;
1977
1978 t = unit_name_template(u->id);
1979 if (!t)
1980 return NULL;
1981
1982 return strjoin(u->manager->cgroup_hierarchy, "/", t, "/", u->instance, NULL);
1983 } else
1984 return strjoin(u->manager->cgroup_hierarchy, "/", u->id, NULL);
1985 }
1986
1987 int unit_add_cgroup_from_text(Unit *u, const char *name, bool overwrite, CGroupBonding **ret) {
1988 char *controller = NULL, *path = NULL;
1989 CGroupBonding *b = NULL;
1990 bool ours = false;
1991 int r;
1992
1993 assert(u);
1994 assert(name);
1995
1996 r = cg_split_spec(name, &controller, &path);
1997 if (r < 0)
1998 return r;
1999
2000 if (!path) {
2001 path = unit_default_cgroup_path(u);
2002 ours = true;
2003 }
2004
2005 if (!controller) {
2006 controller = strdup(SYSTEMD_CGROUP_CONTROLLER);
2007 ours = true;
2008 }
2009
2010 if (!path || !controller) {
2011 free(path);
2012 free(controller);
2013 return log_oom();
2014 }
2015
2016 b = cgroup_bonding_find_list(u->cgroup_bondings, controller);
2017 if (b) {
2018 if (streq(path, b->path)) {
2019 free(path);
2020 free(controller);
2021
2022 if (ret)
2023 *ret = b;
2024 return 0;
2025 }
2026
2027 if (overwrite && !b->essential) {
2028 free(controller);
2029
2030 free(b->path);
2031 b->path = path;
2032
2033 b->ours = ours;
2034 b->realized = false;
2035
2036 if (ret)
2037 *ret = b;
2038
2039 return 1;
2040 }
2041
2042 r = -EEXIST;
2043 b = NULL;
2044 goto fail;
2045 }
2046
2047 b = new0(CGroupBonding, 1);
2048 if (!b) {
2049 r = -ENOMEM;
2050 goto fail;
2051 }
2052
2053 b->controller = controller;
2054 b->path = path;
2055 b->ours = ours;
2056 b->essential = streq(controller, SYSTEMD_CGROUP_CONTROLLER);
2057
2058 r = unit_add_cgroup(u, b);
2059 if (r < 0)
2060 goto fail;
2061
2062 if (ret)
2063 *ret = b;
2064
2065 return 1;
2066
2067 fail:
2068 free(path);
2069 free(controller);
2070 free(b);
2071
2072 return r;
2073 }
2074
2075 static int unit_add_one_default_cgroup(Unit *u, const char *controller) {
2076 CGroupBonding *b = NULL;
2077 int r = -ENOMEM;
2078
2079 assert(u);
2080
2081 if (!controller)
2082 controller = SYSTEMD_CGROUP_CONTROLLER;
2083
2084 if (cgroup_bonding_find_list(u->cgroup_bondings, controller))
2085 return 0;
2086
2087 b = new0(CGroupBonding, 1);
2088 if (!b)
2089 return -ENOMEM;
2090
2091 b->controller = strdup(controller);
2092 if (!b->controller)
2093 goto fail;
2094
2095 b->path = unit_default_cgroup_path(u);
2096 if (!b->path)
2097 goto fail;
2098
2099 b->ours = true;
2100 b->essential = streq(controller, SYSTEMD_CGROUP_CONTROLLER);
2101
2102 r = unit_add_cgroup(u, b);
2103 if (r < 0)
2104 goto fail;
2105
2106 return 1;
2107
2108 fail:
2109 free(b->path);
2110 free(b->controller);
2111 free(b);
2112
2113 return r;
2114 }
2115
2116 int unit_add_default_cgroups(Unit *u) {
2117 CGroupAttribute *a;
2118 char **c;
2119 int r;
2120
2121 assert(u);
2122
2123 /* Adds in the default cgroups, if they weren't specified
2124 * otherwise. */
2125
2126 if (!u->manager->cgroup_hierarchy)
2127 return 0;
2128
2129 r = unit_add_one_default_cgroup(u, NULL);
2130 if (r < 0)
2131 return r;
2132
2133 STRV_FOREACH(c, u->manager->default_controllers)
2134 unit_add_one_default_cgroup(u, *c);
2135
2136 LIST_FOREACH(by_unit, a, u->cgroup_attributes)
2137 unit_add_one_default_cgroup(u, a->controller);
2138
2139 return 0;
2140 }
2141
2142 CGroupBonding* unit_get_default_cgroup(Unit *u) {
2143 assert(u);
2144
2145 return cgroup_bonding_find_list(u->cgroup_bondings, NULL);
2146 }
2147
2148 int unit_add_cgroup_attribute(
2149 Unit *u,
2150 const CGroupSemantics *semantics,
2151 const char *controller,
2152 const char *name,
2153 const char *value,
2154 CGroupAttribute **ret) {
2155
2156 _cleanup_free_ char *c = NULL;
2157 CGroupAttribute *a;
2158 int r;
2159
2160 assert(u);
2161 assert(value);
2162
2163 if (semantics) {
2164 /* Semantics always take precedence */
2165 if (semantics->name)
2166 name = semantics->name;
2167
2168 if (semantics->controller)
2169 controller = semantics->controller;
2170 }
2171
2172 if (!name)
2173 return -EINVAL;
2174
2175 if (!controller) {
2176 r = cg_controller_from_attr(name, &c);
2177 if (r < 0)
2178 return -EINVAL;
2179
2180 controller = c;
2181 }
2182
2183 if (!controller || streq(controller, SYSTEMD_CGROUP_CONTROLLER))
2184 return -EINVAL;
2185
2186 if (!filename_is_safe(name))
2187 return -EINVAL;
2188
2189 if (!filename_is_safe(controller))
2190 return -EINVAL;
2191
2192 /* Check if this attribute already exists. Note that we will
2193 * explicitly check for the value here too, as there are
2194 * attributes which accept multiple values. */
2195 a = cgroup_attribute_find_list(u->cgroup_attributes, controller, name);
2196 if (a) {
2197 if (streq(value, a->value)) {
2198 /* Exactly the same value is always OK, let's ignore this */
2199 if (ret)
2200 *ret = a;
2201
2202 return 0;
2203 }
2204
2205 if (semantics && !semantics->multiple) {
2206 char *v;
2207
2208 /* If this is a single-item entry, we can
2209 * simply patch the existing attribute */
2210
2211 v = strdup(value);
2212 if (!v)
2213 return -ENOMEM;
2214
2215 free(a->value);
2216 a->value = v;
2217
2218 if (ret)
2219 *ret = a;
2220 return 1;
2221 }
2222 }
2223
2224 a = new0(CGroupAttribute, 1);
2225 if (!a)
2226 return -ENOMEM;
2227
2228 if (c) {
2229 a->controller = c;
2230 c = NULL;
2231 } else
2232 a->controller = strdup(controller);
2233
2234 a->name = strdup(name);
2235 a->value = strdup(value);
2236
2237 if (!a->controller || !a->name || !a->value) {
2238 free(a->controller);
2239 free(a->name);
2240 free(a->value);
2241 free(a);
2242 return -ENOMEM;
2243 }
2244
2245 a->semantics = semantics;
2246 a->unit = u;
2247
2248 LIST_PREPEND(CGroupAttribute, by_unit, u->cgroup_attributes, a);
2249
2250 if (ret)
2251 *ret = a;
2252
2253 return 1;
2254 }
2255
2256 int unit_load_related_unit(Unit *u, const char *type, Unit **_found) {
2257 char *t;
2258 int r;
2259
2260 assert(u);
2261 assert(type);
2262 assert(_found);
2263
2264 if (!(t = unit_name_change_suffix(u->id, type)))
2265 return -ENOMEM;
2266
2267 assert(!unit_has_name(u, t));
2268
2269 r = manager_load_unit(u->manager, t, NULL, NULL, _found);
2270 free(t);
2271
2272 assert(r < 0 || *_found != u);
2273
2274 return r;
2275 }
2276
2277 int unit_get_related_unit(Unit *u, const char *type, Unit **_found) {
2278 Unit *found;
2279 char *t;
2280
2281 assert(u);
2282 assert(type);
2283 assert(_found);
2284
2285 if (!(t = unit_name_change_suffix(u->id, type)))
2286 return -ENOMEM;
2287
2288 assert(!unit_has_name(u, t));
2289
2290 found = manager_get_unit(u->manager, t);
2291 free(t);
2292
2293 if (!found)
2294 return -ENOENT;
2295
2296 *_found = found;
2297 return 0;
2298 }
2299
2300 int unit_watch_bus_name(Unit *u, const char *name) {
2301 assert(u);
2302 assert(name);
2303
2304 /* Watch a specific name on the bus. We only support one unit
2305 * watching each name for now. */
2306
2307 return hashmap_put(u->manager->watch_bus, name, u);
2308 }
2309
2310 void unit_unwatch_bus_name(Unit *u, const char *name) {
2311 assert(u);
2312 assert(name);
2313
2314 hashmap_remove_value(u->manager->watch_bus, name, u);
2315 }
2316
2317 bool unit_can_serialize(Unit *u) {
2318 assert(u);
2319
2320 return UNIT_VTABLE(u)->serialize && UNIT_VTABLE(u)->deserialize_item;
2321 }
2322
2323 int unit_serialize(Unit *u, FILE *f, FDSet *fds, bool serialize_jobs) {
2324 int r;
2325
2326 assert(u);
2327 assert(f);
2328 assert(fds);
2329
2330 if (!unit_can_serialize(u))
2331 return 0;
2332
2333 if ((r = UNIT_VTABLE(u)->serialize(u, f, fds)) < 0)
2334 return r;
2335
2336
2337 if (serialize_jobs) {
2338 if (u->job) {
2339 fprintf(f, "job\n");
2340 job_serialize(u->job, f, fds);
2341 }
2342
2343 if (u->nop_job) {
2344 fprintf(f, "job\n");
2345 job_serialize(u->nop_job, f, fds);
2346 }
2347 }
2348
2349 dual_timestamp_serialize(f, "inactive-exit-timestamp", &u->inactive_exit_timestamp);
2350 dual_timestamp_serialize(f, "active-enter-timestamp", &u->active_enter_timestamp);
2351 dual_timestamp_serialize(f, "active-exit-timestamp", &u->active_exit_timestamp);
2352 dual_timestamp_serialize(f, "inactive-enter-timestamp", &u->inactive_enter_timestamp);
2353 dual_timestamp_serialize(f, "condition-timestamp", &u->condition_timestamp);
2354
2355 if (dual_timestamp_is_set(&u->condition_timestamp))
2356 unit_serialize_item(u, f, "condition-result", yes_no(u->condition_result));
2357
2358 /* End marker */
2359 fputc('\n', f);
2360 return 0;
2361 }
2362
2363 void unit_serialize_item_format(Unit *u, FILE *f, const char *key, const char *format, ...) {
2364 va_list ap;
2365
2366 assert(u);
2367 assert(f);
2368 assert(key);
2369 assert(format);
2370
2371 fputs(key, f);
2372 fputc('=', f);
2373
2374 va_start(ap, format);
2375 vfprintf(f, format, ap);
2376 va_end(ap);
2377
2378 fputc('\n', f);
2379 }
2380
2381 void unit_serialize_item(Unit *u, FILE *f, const char *key, const char *value) {
2382 assert(u);
2383 assert(f);
2384 assert(key);
2385 assert(value);
2386
2387 fprintf(f, "%s=%s\n", key, value);
2388 }
2389
2390 int unit_deserialize(Unit *u, FILE *f, FDSet *fds) {
2391 int r;
2392
2393 assert(u);
2394 assert(f);
2395 assert(fds);
2396
2397 if (!unit_can_serialize(u))
2398 return 0;
2399
2400 for (;;) {
2401 char line[LINE_MAX], *l, *v;
2402 size_t k;
2403
2404 if (!fgets(line, sizeof(line), f)) {
2405 if (feof(f))
2406 return 0;
2407 return -errno;
2408 }
2409
2410 char_array_0(line);
2411 l = strstrip(line);
2412
2413 /* End marker */
2414 if (l[0] == 0)
2415 return 0;
2416
2417 k = strcspn(l, "=");
2418
2419 if (l[k] == '=') {
2420 l[k] = 0;
2421 v = l+k+1;
2422 } else
2423 v = l+k;
2424
2425 if (streq(l, "job")) {
2426 if (v[0] == '\0') {
2427 /* new-style serialized job */
2428 Job *j = job_new_raw(u);
2429 if (!j)
2430 return -ENOMEM;
2431
2432 r = job_deserialize(j, f, fds);
2433 if (r < 0) {
2434 job_free(j);
2435 return r;
2436 }
2437
2438 r = hashmap_put(u->manager->jobs, UINT32_TO_PTR(j->id), j);
2439 if (r < 0) {
2440 job_free(j);
2441 return r;
2442 }
2443
2444 r = job_install_deserialized(j);
2445 if (r < 0) {
2446 hashmap_remove(u->manager->jobs, UINT32_TO_PTR(j->id));
2447 job_free(j);
2448 return r;
2449 }
2450
2451 if (j->state == JOB_RUNNING)
2452 u->manager->n_running_jobs++;
2453 } else {
2454 /* legacy */
2455 JobType type = job_type_from_string(v);
2456 if (type < 0)
2457 log_debug("Failed to parse job type value %s", v);
2458 else
2459 u->deserialized_job = type;
2460 }
2461 continue;
2462 } else if (streq(l, "inactive-exit-timestamp")) {
2463 dual_timestamp_deserialize(v, &u->inactive_exit_timestamp);
2464 continue;
2465 } else if (streq(l, "active-enter-timestamp")) {
2466 dual_timestamp_deserialize(v, &u->active_enter_timestamp);
2467 continue;
2468 } else if (streq(l, "active-exit-timestamp")) {
2469 dual_timestamp_deserialize(v, &u->active_exit_timestamp);
2470 continue;
2471 } else if (streq(l, "inactive-enter-timestamp")) {
2472 dual_timestamp_deserialize(v, &u->inactive_enter_timestamp);
2473 continue;
2474 } else if (streq(l, "condition-timestamp")) {
2475 dual_timestamp_deserialize(v, &u->condition_timestamp);
2476 continue;
2477 } else if (streq(l, "condition-result")) {
2478 int b;
2479
2480 if ((b = parse_boolean(v)) < 0)
2481 log_debug("Failed to parse condition result value %s", v);
2482 else
2483 u->condition_result = b;
2484
2485 continue;
2486 }
2487
2488 if ((r = UNIT_VTABLE(u)->deserialize_item(u, l, v, fds)) < 0)
2489 return r;
2490 }
2491 }
2492
2493 int unit_add_node_link(Unit *u, const char *what, bool wants) {
2494 Unit *device;
2495 char *e;
2496 int r;
2497
2498 assert(u);
2499
2500 if (!what)
2501 return 0;
2502
2503 /* Adds in links to the device node that this unit is based on */
2504
2505 if (!is_device_path(what))
2506 return 0;
2507
2508 e = unit_name_from_path(what, ".device");
2509 if (!e)
2510 return -ENOMEM;
2511
2512 r = manager_load_unit(u->manager, e, NULL, NULL, &device);
2513 free(e);
2514 if (r < 0)
2515 return r;
2516
2517 r = unit_add_two_dependencies(u, UNIT_AFTER, UNIT_BINDS_TO, device, true);
2518 if (r < 0)
2519 return r;
2520
2521 if (wants) {
2522 r = unit_add_dependency(device, UNIT_WANTS, u, false);
2523 if (r < 0)
2524 return r;
2525 }
2526
2527 return 0;
2528 }
2529
2530 int unit_coldplug(Unit *u) {
2531 int r;
2532
2533 assert(u);
2534
2535 if (UNIT_VTABLE(u)->coldplug)
2536 if ((r = UNIT_VTABLE(u)->coldplug(u)) < 0)
2537 return r;
2538
2539 if (u->job) {
2540 r = job_coldplug(u->job);
2541 if (r < 0)
2542 return r;
2543 } else if (u->deserialized_job >= 0) {
2544 /* legacy */
2545 r = manager_add_job(u->manager, u->deserialized_job, u, JOB_IGNORE_REQUIREMENTS, false, NULL, NULL);
2546 if (r < 0)
2547 return r;
2548
2549 u->deserialized_job = _JOB_TYPE_INVALID;
2550 }
2551
2552 return 0;
2553 }
2554
2555 void unit_status_printf(Unit *u, const char *status, const char *unit_status_msg_format) {
2556 manager_status_printf(u->manager, false, status, unit_status_msg_format, unit_description(u));
2557 }
2558
2559 bool unit_need_daemon_reload(Unit *u) {
2560 _cleanup_strv_free_ char **t = NULL;
2561 char **path;
2562 struct stat st;
2563 unsigned loaded_cnt, current_cnt;
2564
2565 assert(u);
2566
2567 if (u->fragment_path) {
2568 zero(st);
2569 if (stat(u->fragment_path, &st) < 0)
2570 /* What, cannot access this anymore? */
2571 return true;
2572
2573 if (u->fragment_mtime > 0 &&
2574 timespec_load(&st.st_mtim) != u->fragment_mtime)
2575 return true;
2576 }
2577
2578 if (u->source_path) {
2579 zero(st);
2580 if (stat(u->source_path, &st) < 0)
2581 return true;
2582
2583 if (u->source_mtime > 0 &&
2584 timespec_load(&st.st_mtim) != u->source_mtime)
2585 return true;
2586 }
2587
2588 t = unit_find_dropin_paths(u);
2589 loaded_cnt = strv_length(t);
2590 current_cnt = strv_length(u->dropin_paths);
2591
2592 if (loaded_cnt == current_cnt) {
2593 if (loaded_cnt == 0)
2594 return false;
2595
2596 if (strv_overlap(u->dropin_paths, t)) {
2597 STRV_FOREACH(path, u->dropin_paths) {
2598 zero(st);
2599 if (stat(*path, &st) < 0)
2600 return true;
2601
2602 if (u->dropin_mtime > 0 &&
2603 timespec_load(&st.st_mtim) > u->dropin_mtime)
2604 return true;
2605 }
2606
2607 return false;
2608 } else
2609 return true;
2610 } else
2611 return true;
2612 }
2613
2614 void unit_reset_failed(Unit *u) {
2615 assert(u);
2616
2617 if (UNIT_VTABLE(u)->reset_failed)
2618 UNIT_VTABLE(u)->reset_failed(u);
2619 }
2620
2621 Unit *unit_following(Unit *u) {
2622 assert(u);
2623
2624 if (UNIT_VTABLE(u)->following)
2625 return UNIT_VTABLE(u)->following(u);
2626
2627 return NULL;
2628 }
2629
2630 bool unit_pending_inactive(Unit *u) {
2631 assert(u);
2632
2633 /* Returns true if the unit is inactive or going down */
2634
2635 if (UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(u)))
2636 return true;
2637
2638 if (u->job && u->job->type == JOB_STOP)
2639 return true;
2640
2641 return false;
2642 }
2643
2644 bool unit_pending_active(Unit *u) {
2645 assert(u);
2646
2647 /* Returns true if the unit is active or going up */
2648
2649 if (UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u)))
2650 return true;
2651
2652 if (u->job &&
2653 (u->job->type == JOB_START ||
2654 u->job->type == JOB_RELOAD_OR_START ||
2655 u->job->type == JOB_RESTART))
2656 return true;
2657
2658 return false;
2659 }
2660
2661 int unit_kill(Unit *u, KillWho w, int signo, DBusError *error) {
2662 assert(u);
2663 assert(w >= 0 && w < _KILL_WHO_MAX);
2664 assert(signo > 0);
2665 assert(signo < _NSIG);
2666
2667 if (!UNIT_VTABLE(u)->kill)
2668 return -ENOTSUP;
2669
2670 return UNIT_VTABLE(u)->kill(u, w, signo, error);
2671 }
2672
2673 int unit_kill_common(
2674 Unit *u,
2675 KillWho who,
2676 int signo,
2677 pid_t main_pid,
2678 pid_t control_pid,
2679 DBusError *error) {
2680
2681 int r = 0;
2682
2683 if (who == KILL_MAIN && main_pid <= 0) {
2684 if (main_pid < 0)
2685 dbus_set_error(error, BUS_ERROR_NO_SUCH_PROCESS, "%s units have no main processes", unit_type_to_string(u->type));
2686 else
2687 dbus_set_error(error, BUS_ERROR_NO_SUCH_PROCESS, "No main process to kill");
2688 return -ESRCH;
2689 }
2690
2691 if (who == KILL_CONTROL && control_pid <= 0) {
2692 if (control_pid < 0)
2693 dbus_set_error(error, BUS_ERROR_NO_SUCH_PROCESS, "%s units have no control processes", unit_type_to_string(u->type));
2694 else
2695 dbus_set_error(error, BUS_ERROR_NO_SUCH_PROCESS, "No control process to kill");
2696 return -ESRCH;
2697 }
2698
2699 if (who == KILL_CONTROL || who == KILL_ALL)
2700 if (control_pid > 0)
2701 if (kill(control_pid, signo) < 0)
2702 r = -errno;
2703
2704 if (who == KILL_MAIN || who == KILL_ALL)
2705 if (main_pid > 0)
2706 if (kill(main_pid, signo) < 0)
2707 r = -errno;
2708
2709 if (who == KILL_ALL) {
2710 _cleanup_set_free_ Set *pid_set = NULL;
2711 int q;
2712
2713 pid_set = set_new(trivial_hash_func, trivial_compare_func);
2714 if (!pid_set)
2715 return -ENOMEM;
2716
2717 /* Exclude the control/main pid from being killed via the cgroup */
2718 if (control_pid > 0) {
2719 q = set_put(pid_set, LONG_TO_PTR(control_pid));
2720 if (q < 0)
2721 return q;
2722 }
2723
2724 if (main_pid > 0) {
2725 q = set_put(pid_set, LONG_TO_PTR(main_pid));
2726 if (q < 0)
2727 return q;
2728 }
2729
2730 q = cgroup_bonding_kill_list(u->cgroup_bondings, signo, false, false, pid_set, NULL);
2731 if (q < 0 && q != -EAGAIN && q != -ESRCH && q != -ENOENT)
2732 r = q;
2733 }
2734
2735 return r;
2736 }
2737
2738 int unit_following_set(Unit *u, Set **s) {
2739 assert(u);
2740 assert(s);
2741
2742 if (UNIT_VTABLE(u)->following_set)
2743 return UNIT_VTABLE(u)->following_set(u, s);
2744
2745 *s = NULL;
2746 return 0;
2747 }
2748
2749 UnitFileState unit_get_unit_file_state(Unit *u) {
2750 assert(u);
2751
2752 if (u->unit_file_state < 0 && u->fragment_path)
2753 u->unit_file_state = unit_file_get_state(
2754 u->manager->running_as == SYSTEMD_SYSTEM ? UNIT_FILE_SYSTEM : UNIT_FILE_USER,
2755 NULL, path_get_file_name(u->fragment_path));
2756
2757 return u->unit_file_state;
2758 }
2759
2760 Unit* unit_ref_set(UnitRef *ref, Unit *u) {
2761 assert(ref);
2762 assert(u);
2763
2764 if (ref->unit)
2765 unit_ref_unset(ref);
2766
2767 ref->unit = u;
2768 LIST_PREPEND(UnitRef, refs, u->refs, ref);
2769 return u;
2770 }
2771
2772 void unit_ref_unset(UnitRef *ref) {
2773 assert(ref);
2774
2775 if (!ref->unit)
2776 return;
2777
2778 LIST_REMOVE(UnitRef, refs, ref->unit->refs, ref);
2779 ref->unit = NULL;
2780 }
2781
2782 int unit_add_one_mount_link(Unit *u, Mount *m) {
2783 char **i;
2784
2785 assert(u);
2786 assert(m);
2787
2788 if (u->load_state != UNIT_LOADED ||
2789 UNIT(m)->load_state != UNIT_LOADED)
2790 return 0;
2791
2792 STRV_FOREACH(i, u->requires_mounts_for) {
2793
2794 if (UNIT(m) == u)
2795 continue;
2796
2797 if (!path_startswith(*i, m->where))
2798 continue;
2799
2800 return unit_add_two_dependencies(u, UNIT_AFTER, UNIT_REQUIRES, UNIT(m), true);
2801 }
2802
2803 return 0;
2804 }
2805
2806 int unit_add_mount_links(Unit *u) {
2807 Unit *other;
2808 int r;
2809
2810 assert(u);
2811
2812 LIST_FOREACH(units_by_type, other, u->manager->units_by_type[UNIT_MOUNT]) {
2813 r = unit_add_one_mount_link(u, MOUNT(other));
2814 if (r < 0)
2815 return r;
2816 }
2817
2818 return 0;
2819 }
2820
2821 int unit_exec_context_defaults(Unit *u, ExecContext *c) {
2822 unsigned i;
2823 int r;
2824
2825 assert(u);
2826 assert(c);
2827
2828 /* This only copies in the ones that need memory */
2829
2830 for (i = 0; i < RLIMIT_NLIMITS; i++)
2831 if (u->manager->rlimit[i] && !c->rlimit[i]) {
2832 c->rlimit[i] = newdup(struct rlimit, u->manager->rlimit[i], 1);
2833 if (!c->rlimit[i])
2834 return -ENOMEM;
2835 }
2836
2837 if (u->manager->running_as == SYSTEMD_USER &&
2838 !c->working_directory) {
2839
2840 r = get_home_dir(&c->working_directory);
2841 if (r < 0)
2842 return r;
2843 }
2844
2845 return 0;
2846 }
2847
2848 ExecContext *unit_get_exec_context(Unit *u) {
2849 size_t offset;
2850 assert(u);
2851
2852 offset = UNIT_VTABLE(u)->exec_context_offset;
2853 if (offset <= 0)
2854 return NULL;
2855
2856 return (ExecContext*) ((uint8_t*) u + offset);
2857 }
2858
2859 static int drop_in_file(Unit *u, bool runtime, const char *name, char **_p, char **_q) {
2860 char *p, *q;
2861 int r;
2862
2863 assert(u);
2864 assert(name);
2865 assert(_p);
2866 assert(_q);
2867
2868 if (u->manager->running_as == SYSTEMD_USER && runtime)
2869 return -ENOTSUP;
2870
2871 if (!filename_is_safe(name))
2872 return -EINVAL;
2873
2874 if (u->manager->running_as == SYSTEMD_USER) {
2875 _cleanup_free_ char *c = NULL;
2876
2877 r = user_config_home(&c);
2878 if (r < 0)
2879 return r;
2880 if (r == 0)
2881 return -ENOENT;
2882
2883 p = strjoin(c, "/", u->id, ".d", NULL);
2884 } else if (runtime)
2885 p = strjoin("/run/systemd/system/", u->id, ".d", NULL);
2886 else
2887 p = strjoin("/etc/systemd/system/", u->id, ".d", NULL);
2888 if (!p)
2889 return -ENOMEM;
2890
2891 q = strjoin(p, "/50-", name, ".conf", NULL);
2892 if (!q) {
2893 free(p);
2894 return -ENOMEM;
2895 }
2896
2897 *_p = p;
2898 *_q = q;
2899 return 0;
2900 }
2901
2902 int unit_write_drop_in(Unit *u, bool runtime, const char *name, const char *data) {
2903 _cleanup_free_ char *p = NULL, *q = NULL;
2904 int r;
2905
2906 assert(u);
2907
2908 r = drop_in_file(u, runtime, name, &p, &q);
2909 if (r < 0)
2910 return r;
2911
2912 mkdir_p(p, 0755);
2913 return write_string_file_atomic_label(q, data);
2914 }
2915
2916 int unit_remove_drop_in(Unit *u, bool runtime, const char *name) {
2917 _cleanup_free_ char *p = NULL, *q = NULL;
2918 int r;
2919
2920 assert(u);
2921
2922 r = drop_in_file(u, runtime, name, &p, &q);
2923 if (unlink(q) < 0)
2924 r = -errno;
2925 else
2926 r = 0;
2927
2928 rmdir(p);
2929 return r;
2930 }
2931
2932 int unit_kill_context(
2933 Unit *u,
2934 KillContext *c,
2935 bool sigkill,
2936 pid_t main_pid,
2937 pid_t control_pid,
2938 bool main_pid_alien) {
2939
2940 int sig, wait_for_exit = 0, r;
2941
2942 assert(u);
2943 assert(c);
2944
2945 if (c->kill_mode == KILL_NONE)
2946 return 0;
2947
2948 sig = sigkill ? SIGKILL : c->kill_signal;
2949
2950 if (main_pid > 0) {
2951 r = kill_and_sigcont(main_pid, sig);
2952
2953 if (r < 0 && r != -ESRCH) {
2954 _cleanup_free_ char *comm = NULL;
2955 get_process_comm(main_pid, &comm);
2956
2957 log_warning_unit(u->id, "Failed to kill main process %li (%s): %s",
2958 (long) main_pid, strna(comm), strerror(-r));
2959 } else
2960 wait_for_exit = !main_pid_alien;
2961 }
2962
2963 if (control_pid > 0) {
2964 r = kill_and_sigcont(control_pid, sig);
2965
2966 if (r < 0 && r != -ESRCH) {
2967 _cleanup_free_ char *comm = NULL;
2968 get_process_comm(control_pid, &comm);
2969
2970 log_warning_unit(u->id,
2971 "Failed to kill control process %li (%s): %s",
2972 (long) control_pid, strna(comm), strerror(-r));
2973 } else
2974 wait_for_exit = true;
2975 }
2976
2977 if (c->kill_mode == KILL_CONTROL_GROUP) {
2978 _cleanup_set_free_ Set *pid_set = NULL;
2979
2980 pid_set = set_new(trivial_hash_func, trivial_compare_func);
2981 if (!pid_set)
2982 return -ENOMEM;
2983
2984 /* Exclude the main/control pids from being killed via the cgroup */
2985 if (main_pid > 0) {
2986 r = set_put(pid_set, LONG_TO_PTR(main_pid));
2987 if (r < 0)
2988 return r;
2989 }
2990
2991 if (control_pid > 0) {
2992 r = set_put(pid_set, LONG_TO_PTR(control_pid));
2993 if (r < 0)
2994 return r;
2995 }
2996
2997 r = cgroup_bonding_kill_list(u->cgroup_bondings, sig, true, false, pid_set, NULL);
2998 if (r < 0) {
2999 if (r != -EAGAIN && r != -ESRCH && r != -ENOENT)
3000 log_warning_unit(u->id, "Failed to kill control group: %s", strerror(-r));
3001 } else if (r > 0)
3002 wait_for_exit = true;
3003 }
3004
3005 return wait_for_exit;
3006 }
3007
3008 static const char* const unit_active_state_table[_UNIT_ACTIVE_STATE_MAX] = {
3009 [UNIT_ACTIVE] = "active",
3010 [UNIT_RELOADING] = "reloading",
3011 [UNIT_INACTIVE] = "inactive",
3012 [UNIT_FAILED] = "failed",
3013 [UNIT_ACTIVATING] = "activating",
3014 [UNIT_DEACTIVATING] = "deactivating"
3015 };
3016
3017 DEFINE_STRING_TABLE_LOOKUP(unit_active_state, UnitActiveState);
3018
3019 static const char* const unit_dependency_table[_UNIT_DEPENDENCY_MAX] = {
3020 [UNIT_REQUIRES] = "Requires",
3021 [UNIT_REQUIRES_OVERRIDABLE] = "RequiresOverridable",
3022 [UNIT_REQUISITE] = "Requisite",
3023 [UNIT_REQUISITE_OVERRIDABLE] = "RequisiteOverridable",
3024 [UNIT_WANTS] = "Wants",
3025 [UNIT_BINDS_TO] = "BindsTo",
3026 [UNIT_PART_OF] = "PartOf",
3027 [UNIT_REQUIRED_BY] = "RequiredBy",
3028 [UNIT_REQUIRED_BY_OVERRIDABLE] = "RequiredByOverridable",
3029 [UNIT_WANTED_BY] = "WantedBy",
3030 [UNIT_BOUND_BY] = "BoundBy",
3031 [UNIT_CONSISTS_OF] = "ConsistsOf",
3032 [UNIT_CONFLICTS] = "Conflicts",
3033 [UNIT_CONFLICTED_BY] = "ConflictedBy",
3034 [UNIT_BEFORE] = "Before",
3035 [UNIT_AFTER] = "After",
3036 [UNIT_ON_FAILURE] = "OnFailure",
3037 [UNIT_TRIGGERS] = "Triggers",
3038 [UNIT_TRIGGERED_BY] = "TriggeredBy",
3039 [UNIT_PROPAGATES_RELOAD_TO] = "PropagatesReloadTo",
3040 [UNIT_RELOAD_PROPAGATED_FROM] = "ReloadPropagatedFrom",
3041 [UNIT_REFERENCES] = "References",
3042 [UNIT_REFERENCED_BY] = "ReferencedBy",
3043 };
3044
3045 DEFINE_STRING_TABLE_LOOKUP(unit_dependency, UnitDependency);