]> git.ipfire.org Git - thirdparty/systemd.git/blob - src/core/unit.c
core: let's make our log messages proper sentences with full stops
[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 .data.ptr = w,
1525 .events = events,
1526 };
1527
1528 assert(u);
1529 assert(fd >= 0);
1530 assert(w);
1531 assert(w->type == WATCH_INVALID || (w->type == WATCH_FD && w->fd == fd && w->data.unit == u));
1532
1533 if (epoll_ctl(u->manager->epoll_fd,
1534 w->type == WATCH_INVALID ? EPOLL_CTL_ADD : EPOLL_CTL_MOD,
1535 fd,
1536 &ev) < 0)
1537 return -errno;
1538
1539 w->fd = fd;
1540 w->type = WATCH_FD;
1541 w->data.unit = u;
1542
1543 return 0;
1544 }
1545
1546 void unit_unwatch_fd(Unit *u, Watch *w) {
1547 assert(u);
1548 assert(w);
1549
1550 if (w->type == WATCH_INVALID)
1551 return;
1552
1553 assert(w->type == WATCH_FD);
1554 assert(w->data.unit == u);
1555 assert_se(epoll_ctl(u->manager->epoll_fd, EPOLL_CTL_DEL, w->fd, NULL) >= 0);
1556
1557 w->fd = -1;
1558 w->type = WATCH_INVALID;
1559 w->data.unit = NULL;
1560 }
1561
1562 int unit_watch_pid(Unit *u, pid_t pid) {
1563 assert(u);
1564 assert(pid >= 1);
1565
1566 /* Watch a specific PID. We only support one unit watching
1567 * each PID for now. */
1568
1569 return hashmap_put(u->manager->watch_pids, LONG_TO_PTR(pid), u);
1570 }
1571
1572 void unit_unwatch_pid(Unit *u, pid_t pid) {
1573 assert(u);
1574 assert(pid >= 1);
1575
1576 hashmap_remove_value(u->manager->watch_pids, LONG_TO_PTR(pid), u);
1577 }
1578
1579 int unit_watch_timer(Unit *u, clockid_t clock_id, bool relative, usec_t usec, Watch *w) {
1580 struct itimerspec its = {};
1581 int flags, fd;
1582 bool ours;
1583
1584 assert(u);
1585 assert(w);
1586 assert(w->type == WATCH_INVALID || (w->type == WATCH_UNIT_TIMER && w->data.unit == u));
1587
1588 /* This will try to reuse the old timer if there is one */
1589
1590 if (w->type == WATCH_UNIT_TIMER) {
1591 assert(w->data.unit == u);
1592 assert(w->fd >= 0);
1593
1594 ours = false;
1595 fd = w->fd;
1596 } else if (w->type == WATCH_INVALID) {
1597
1598 ours = true;
1599 fd = timerfd_create(clock_id, TFD_NONBLOCK|TFD_CLOEXEC);
1600 if (fd < 0)
1601 return -errno;
1602 } else
1603 assert_not_reached("Invalid watch type");
1604
1605 if (usec <= 0) {
1606 /* Set absolute time in the past, but not 0, since we
1607 * don't want to disarm the timer */
1608 its.it_value.tv_sec = 0;
1609 its.it_value.tv_nsec = 1;
1610
1611 flags = TFD_TIMER_ABSTIME;
1612 } else {
1613 timespec_store(&its.it_value, usec);
1614 flags = relative ? 0 : TFD_TIMER_ABSTIME;
1615 }
1616
1617 /* This will also flush the elapse counter */
1618 if (timerfd_settime(fd, flags, &its, NULL) < 0)
1619 goto fail;
1620
1621 if (w->type == WATCH_INVALID) {
1622 struct epoll_event ev = {
1623 .data.ptr = w,
1624 .events = EPOLLIN,
1625 };
1626
1627 if (epoll_ctl(u->manager->epoll_fd, EPOLL_CTL_ADD, fd, &ev) < 0)
1628 goto fail;
1629 }
1630
1631 w->type = WATCH_UNIT_TIMER;
1632 w->fd = fd;
1633 w->data.unit = u;
1634
1635 return 0;
1636
1637 fail:
1638 if (ours)
1639 close_nointr_nofail(fd);
1640
1641 return -errno;
1642 }
1643
1644 void unit_unwatch_timer(Unit *u, Watch *w) {
1645 assert(u);
1646 assert(w);
1647
1648 if (w->type == WATCH_INVALID)
1649 return;
1650
1651 assert(w->type == WATCH_UNIT_TIMER);
1652 assert(w->data.unit == u);
1653 assert(w->fd >= 0);
1654
1655 assert_se(epoll_ctl(u->manager->epoll_fd, EPOLL_CTL_DEL, w->fd, NULL) >= 0);
1656 close_nointr_nofail(w->fd);
1657
1658 w->fd = -1;
1659 w->type = WATCH_INVALID;
1660 w->data.unit = NULL;
1661 }
1662
1663 bool unit_job_is_applicable(Unit *u, JobType j) {
1664 assert(u);
1665 assert(j >= 0 && j < _JOB_TYPE_MAX);
1666
1667 switch (j) {
1668
1669 case JOB_VERIFY_ACTIVE:
1670 case JOB_START:
1671 case JOB_STOP:
1672 case JOB_NOP:
1673 return true;
1674
1675 case JOB_RESTART:
1676 case JOB_TRY_RESTART:
1677 return unit_can_start(u);
1678
1679 case JOB_RELOAD:
1680 return unit_can_reload(u);
1681
1682 case JOB_RELOAD_OR_START:
1683 return unit_can_reload(u) && unit_can_start(u);
1684
1685 default:
1686 assert_not_reached("Invalid job type");
1687 }
1688 }
1689
1690 int unit_add_dependency(Unit *u, UnitDependency d, Unit *other, bool add_reference) {
1691
1692 static const UnitDependency inverse_table[_UNIT_DEPENDENCY_MAX] = {
1693 [UNIT_REQUIRES] = UNIT_REQUIRED_BY,
1694 [UNIT_REQUIRES_OVERRIDABLE] = UNIT_REQUIRED_BY_OVERRIDABLE,
1695 [UNIT_WANTS] = UNIT_WANTED_BY,
1696 [UNIT_REQUISITE] = UNIT_REQUIRED_BY,
1697 [UNIT_REQUISITE_OVERRIDABLE] = UNIT_REQUIRED_BY_OVERRIDABLE,
1698 [UNIT_BINDS_TO] = UNIT_BOUND_BY,
1699 [UNIT_PART_OF] = UNIT_CONSISTS_OF,
1700 [UNIT_REQUIRED_BY] = _UNIT_DEPENDENCY_INVALID,
1701 [UNIT_REQUIRED_BY_OVERRIDABLE] = _UNIT_DEPENDENCY_INVALID,
1702 [UNIT_WANTED_BY] = _UNIT_DEPENDENCY_INVALID,
1703 [UNIT_BOUND_BY] = UNIT_BINDS_TO,
1704 [UNIT_CONSISTS_OF] = UNIT_PART_OF,
1705 [UNIT_CONFLICTS] = UNIT_CONFLICTED_BY,
1706 [UNIT_CONFLICTED_BY] = UNIT_CONFLICTS,
1707 [UNIT_BEFORE] = UNIT_AFTER,
1708 [UNIT_AFTER] = UNIT_BEFORE,
1709 [UNIT_ON_FAILURE] = _UNIT_DEPENDENCY_INVALID,
1710 [UNIT_REFERENCES] = UNIT_REFERENCED_BY,
1711 [UNIT_REFERENCED_BY] = UNIT_REFERENCES,
1712 [UNIT_TRIGGERS] = UNIT_TRIGGERED_BY,
1713 [UNIT_TRIGGERED_BY] = UNIT_TRIGGERS,
1714 [UNIT_PROPAGATES_RELOAD_TO] = UNIT_RELOAD_PROPAGATED_FROM,
1715 [UNIT_RELOAD_PROPAGATED_FROM] = UNIT_PROPAGATES_RELOAD_TO,
1716 };
1717 int r, q = 0, v = 0, w = 0;
1718
1719 assert(u);
1720 assert(d >= 0 && d < _UNIT_DEPENDENCY_MAX);
1721 assert(other);
1722
1723 u = unit_follow_merge(u);
1724 other = unit_follow_merge(other);
1725
1726 /* We won't allow dependencies on ourselves. We will not
1727 * consider them an error however. */
1728 if (u == other)
1729 return 0;
1730
1731 if ((r = set_ensure_allocated(&u->dependencies[d], trivial_hash_func, trivial_compare_func)) < 0)
1732 return r;
1733
1734 if (inverse_table[d] != _UNIT_DEPENDENCY_INVALID)
1735 if ((r = set_ensure_allocated(&other->dependencies[inverse_table[d]], trivial_hash_func, trivial_compare_func)) < 0)
1736 return r;
1737
1738 if (add_reference)
1739 if ((r = set_ensure_allocated(&u->dependencies[UNIT_REFERENCES], trivial_hash_func, trivial_compare_func)) < 0 ||
1740 (r = set_ensure_allocated(&other->dependencies[UNIT_REFERENCED_BY], trivial_hash_func, trivial_compare_func)) < 0)
1741 return r;
1742
1743 if ((q = set_put(u->dependencies[d], other)) < 0)
1744 return q;
1745
1746 if (inverse_table[d] != _UNIT_DEPENDENCY_INVALID)
1747 if ((v = set_put(other->dependencies[inverse_table[d]], u)) < 0) {
1748 r = v;
1749 goto fail;
1750 }
1751
1752 if (add_reference) {
1753 if ((w = set_put(u->dependencies[UNIT_REFERENCES], other)) < 0) {
1754 r = w;
1755 goto fail;
1756 }
1757
1758 if ((r = set_put(other->dependencies[UNIT_REFERENCED_BY], u)) < 0)
1759 goto fail;
1760 }
1761
1762 unit_add_to_dbus_queue(u);
1763 return 0;
1764
1765 fail:
1766 if (q > 0)
1767 set_remove(u->dependencies[d], other);
1768
1769 if (v > 0)
1770 set_remove(other->dependencies[inverse_table[d]], u);
1771
1772 if (w > 0)
1773 set_remove(u->dependencies[UNIT_REFERENCES], other);
1774
1775 return r;
1776 }
1777
1778 int unit_add_two_dependencies(Unit *u, UnitDependency d, UnitDependency e, Unit *other, bool add_reference) {
1779 int r;
1780
1781 assert(u);
1782
1783 if ((r = unit_add_dependency(u, d, other, add_reference)) < 0)
1784 return r;
1785
1786 if ((r = unit_add_dependency(u, e, other, add_reference)) < 0)
1787 return r;
1788
1789 return 0;
1790 }
1791
1792 static const char *resolve_template(Unit *u, const char *name, const char*path, char **p) {
1793 char *s;
1794
1795 assert(u);
1796 assert(name || path);
1797 assert(p);
1798
1799 if (!name)
1800 name = path_get_file_name(path);
1801
1802 if (!unit_name_is_template(name)) {
1803 *p = NULL;
1804 return name;
1805 }
1806
1807 if (u->instance)
1808 s = unit_name_replace_instance(name, u->instance);
1809 else {
1810 char *i;
1811
1812 i = unit_name_to_prefix(u->id);
1813 if (!i)
1814 return NULL;
1815
1816 s = unit_name_replace_instance(name, i);
1817 free(i);
1818 }
1819
1820 if (!s)
1821 return NULL;
1822
1823 *p = s;
1824 return s;
1825 }
1826
1827 int unit_add_dependency_by_name(Unit *u, UnitDependency d, const char *name, const char *path, bool add_reference) {
1828 Unit *other;
1829 int r;
1830 _cleanup_free_ char *s = NULL;
1831
1832 assert(u);
1833 assert(name || path);
1834
1835 name = resolve_template(u, name, path, &s);
1836 if (!name)
1837 return -ENOMEM;
1838
1839 r = manager_load_unit(u->manager, name, path, NULL, &other);
1840 if (r < 0)
1841 return r;
1842
1843 return unit_add_dependency(u, d, other, add_reference);
1844 }
1845
1846 int unit_add_two_dependencies_by_name(Unit *u, UnitDependency d, UnitDependency e, const char *name, const char *path, bool add_reference) {
1847 Unit *other;
1848 int r;
1849 char *s;
1850
1851 assert(u);
1852 assert(name || path);
1853
1854 if (!(name = resolve_template(u, name, path, &s)))
1855 return -ENOMEM;
1856
1857 if ((r = manager_load_unit(u->manager, name, path, NULL, &other)) < 0)
1858 goto finish;
1859
1860 r = unit_add_two_dependencies(u, d, e, other, add_reference);
1861
1862 finish:
1863 free(s);
1864 return r;
1865 }
1866
1867 int unit_add_dependency_by_name_inverse(Unit *u, UnitDependency d, const char *name, const char *path, bool add_reference) {
1868 Unit *other;
1869 int r;
1870 char *s;
1871
1872 assert(u);
1873 assert(name || path);
1874
1875 if (!(name = resolve_template(u, name, path, &s)))
1876 return -ENOMEM;
1877
1878 if ((r = manager_load_unit(u->manager, name, path, NULL, &other)) < 0)
1879 goto finish;
1880
1881 r = unit_add_dependency(other, d, u, add_reference);
1882
1883 finish:
1884 free(s);
1885 return r;
1886 }
1887
1888 int unit_add_two_dependencies_by_name_inverse(Unit *u, UnitDependency d, UnitDependency e, const char *name, const char *path, bool add_reference) {
1889 Unit *other;
1890 int r;
1891 char *s;
1892
1893 assert(u);
1894 assert(name || path);
1895
1896 if (!(name = resolve_template(u, name, path, &s)))
1897 return -ENOMEM;
1898
1899 if ((r = manager_load_unit(u->manager, name, path, NULL, &other)) < 0)
1900 goto finish;
1901
1902 if ((r = unit_add_two_dependencies(other, d, e, u, add_reference)) < 0)
1903 goto finish;
1904
1905 finish:
1906 free(s);
1907 return r;
1908 }
1909
1910 int set_unit_path(const char *p) {
1911 _cleanup_free_ char *c = NULL;
1912
1913 /* This is mostly for debug purposes */
1914 c = path_make_absolute_cwd(p);
1915 if (setenv("SYSTEMD_UNIT_PATH", c, 0) < 0)
1916 return -errno;
1917
1918 return 0;
1919 }
1920
1921 char *unit_dbus_path(Unit *u) {
1922 assert(u);
1923
1924 if (!u->id)
1925 return NULL;
1926
1927 return unit_dbus_path_from_name(u->id);
1928 }
1929
1930 int unit_add_cgroup(Unit *u, CGroupBonding *b) {
1931 int r;
1932
1933 assert(u);
1934 assert(b);
1935
1936 assert(b->path);
1937
1938 if (!b->controller) {
1939 b->controller = strdup(SYSTEMD_CGROUP_CONTROLLER);
1940 if (!b->controller)
1941 return log_oom();
1942
1943 b->ours = true;
1944 }
1945
1946 /* Ensure this hasn't been added yet */
1947 assert(!b->unit);
1948
1949 if (streq(b->controller, SYSTEMD_CGROUP_CONTROLLER)) {
1950 CGroupBonding *l;
1951
1952 l = hashmap_get(u->manager->cgroup_bondings, b->path);
1953 LIST_PREPEND(CGroupBonding, by_path, l, b);
1954
1955 r = hashmap_replace(u->manager->cgroup_bondings, b->path, l);
1956 if (r < 0) {
1957 LIST_REMOVE(CGroupBonding, by_path, l, b);
1958 return r;
1959 }
1960 }
1961
1962 LIST_PREPEND(CGroupBonding, by_unit, u->cgroup_bondings, b);
1963 b->unit = u;
1964
1965 return 0;
1966 }
1967
1968 char *unit_default_cgroup_path(Unit *u) {
1969 assert(u);
1970
1971 if (u->instance) {
1972 _cleanup_free_ char *t = NULL;
1973
1974 t = unit_name_template(u->id);
1975 if (!t)
1976 return NULL;
1977
1978 return strjoin(u->manager->cgroup_hierarchy, "/", t, "/", u->instance, NULL);
1979 } else
1980 return strjoin(u->manager->cgroup_hierarchy, "/", u->id, NULL);
1981 }
1982
1983 int unit_add_cgroup_from_text(Unit *u, const char *name, bool overwrite, CGroupBonding **ret) {
1984 char *controller = NULL, *path = NULL;
1985 CGroupBonding *b = NULL;
1986 bool ours = false;
1987 int r;
1988
1989 assert(u);
1990 assert(name);
1991
1992 r = cg_split_spec(name, &controller, &path);
1993 if (r < 0)
1994 return r;
1995
1996 if (!path) {
1997 path = unit_default_cgroup_path(u);
1998 ours = true;
1999 }
2000
2001 if (!controller) {
2002 controller = strdup(SYSTEMD_CGROUP_CONTROLLER);
2003 ours = true;
2004 }
2005
2006 if (!path || !controller) {
2007 free(path);
2008 free(controller);
2009 return log_oom();
2010 }
2011
2012 b = cgroup_bonding_find_list(u->cgroup_bondings, controller);
2013 if (b) {
2014 if (streq(path, b->path)) {
2015 free(path);
2016 free(controller);
2017
2018 if (ret)
2019 *ret = b;
2020 return 0;
2021 }
2022
2023 if (overwrite && !b->essential) {
2024 free(controller);
2025
2026 free(b->path);
2027 b->path = path;
2028
2029 b->ours = ours;
2030 b->realized = false;
2031
2032 if (ret)
2033 *ret = b;
2034
2035 return 1;
2036 }
2037
2038 r = -EEXIST;
2039 b = NULL;
2040 goto fail;
2041 }
2042
2043 b = new0(CGroupBonding, 1);
2044 if (!b) {
2045 r = -ENOMEM;
2046 goto fail;
2047 }
2048
2049 b->controller = controller;
2050 b->path = path;
2051 b->ours = ours;
2052 b->essential = streq(controller, SYSTEMD_CGROUP_CONTROLLER);
2053
2054 r = unit_add_cgroup(u, b);
2055 if (r < 0)
2056 goto fail;
2057
2058 if (ret)
2059 *ret = b;
2060
2061 return 1;
2062
2063 fail:
2064 free(path);
2065 free(controller);
2066 free(b);
2067
2068 return r;
2069 }
2070
2071 static int unit_add_one_default_cgroup(Unit *u, const char *controller) {
2072 CGroupBonding *b = NULL;
2073 int r = -ENOMEM;
2074
2075 assert(u);
2076
2077 if (!controller)
2078 controller = SYSTEMD_CGROUP_CONTROLLER;
2079
2080 if (cgroup_bonding_find_list(u->cgroup_bondings, controller))
2081 return 0;
2082
2083 b = new0(CGroupBonding, 1);
2084 if (!b)
2085 return -ENOMEM;
2086
2087 b->controller = strdup(controller);
2088 if (!b->controller)
2089 goto fail;
2090
2091 b->path = unit_default_cgroup_path(u);
2092 if (!b->path)
2093 goto fail;
2094
2095 b->ours = true;
2096 b->essential = streq(controller, SYSTEMD_CGROUP_CONTROLLER);
2097
2098 r = unit_add_cgroup(u, b);
2099 if (r < 0)
2100 goto fail;
2101
2102 return 1;
2103
2104 fail:
2105 free(b->path);
2106 free(b->controller);
2107 free(b);
2108
2109 return r;
2110 }
2111
2112 int unit_add_default_cgroups(Unit *u) {
2113 CGroupAttribute *a;
2114 char **c;
2115 int r;
2116
2117 assert(u);
2118
2119 /* Adds in the default cgroups, if they weren't specified
2120 * otherwise. */
2121
2122 if (!u->manager->cgroup_hierarchy)
2123 return 0;
2124
2125 r = unit_add_one_default_cgroup(u, NULL);
2126 if (r < 0)
2127 return r;
2128
2129 STRV_FOREACH(c, u->manager->default_controllers)
2130 unit_add_one_default_cgroup(u, *c);
2131
2132 LIST_FOREACH(by_unit, a, u->cgroup_attributes)
2133 unit_add_one_default_cgroup(u, a->controller);
2134
2135 return 0;
2136 }
2137
2138 CGroupBonding* unit_get_default_cgroup(Unit *u) {
2139 assert(u);
2140
2141 return cgroup_bonding_find_list(u->cgroup_bondings, NULL);
2142 }
2143
2144 int unit_add_cgroup_attribute(
2145 Unit *u,
2146 const CGroupSemantics *semantics,
2147 const char *controller,
2148 const char *name,
2149 const char *value,
2150 CGroupAttribute **ret) {
2151
2152 _cleanup_free_ char *c = NULL;
2153 CGroupAttribute *a;
2154 int r;
2155
2156 assert(u);
2157 assert(value);
2158
2159 if (semantics) {
2160 /* Semantics always take precedence */
2161 if (semantics->name)
2162 name = semantics->name;
2163
2164 if (semantics->controller)
2165 controller = semantics->controller;
2166 }
2167
2168 if (!name)
2169 return -EINVAL;
2170
2171 if (!controller) {
2172 r = cg_controller_from_attr(name, &c);
2173 if (r < 0)
2174 return -EINVAL;
2175
2176 controller = c;
2177 }
2178
2179 if (!controller || streq(controller, SYSTEMD_CGROUP_CONTROLLER))
2180 return -EINVAL;
2181
2182 if (!filename_is_safe(name))
2183 return -EINVAL;
2184
2185 if (!filename_is_safe(controller))
2186 return -EINVAL;
2187
2188 /* Check if this attribute already exists. Note that we will
2189 * explicitly check for the value here too, as there are
2190 * attributes which accept multiple values. */
2191 a = cgroup_attribute_find_list(u->cgroup_attributes, controller, name);
2192 if (a) {
2193 if (streq(value, a->value)) {
2194 /* Exactly the same value is always OK, let's ignore this */
2195 if (ret)
2196 *ret = a;
2197
2198 return 0;
2199 }
2200
2201 if (semantics && !semantics->multiple) {
2202 char *v;
2203
2204 /* If this is a single-item entry, we can
2205 * simply patch the existing attribute */
2206
2207 v = strdup(value);
2208 if (!v)
2209 return -ENOMEM;
2210
2211 free(a->value);
2212 a->value = v;
2213
2214 if (ret)
2215 *ret = a;
2216 return 1;
2217 }
2218 }
2219
2220 a = new0(CGroupAttribute, 1);
2221 if (!a)
2222 return -ENOMEM;
2223
2224 if (c) {
2225 a->controller = c;
2226 c = NULL;
2227 } else
2228 a->controller = strdup(controller);
2229
2230 a->name = strdup(name);
2231 a->value = strdup(value);
2232
2233 if (!a->controller || !a->name || !a->value) {
2234 free(a->controller);
2235 free(a->name);
2236 free(a->value);
2237 free(a);
2238 return -ENOMEM;
2239 }
2240
2241 a->semantics = semantics;
2242 a->unit = u;
2243
2244 LIST_PREPEND(CGroupAttribute, by_unit, u->cgroup_attributes, a);
2245
2246 if (ret)
2247 *ret = a;
2248
2249 return 1;
2250 }
2251
2252 int unit_load_related_unit(Unit *u, const char *type, Unit **_found) {
2253 char *t;
2254 int r;
2255
2256 assert(u);
2257 assert(type);
2258 assert(_found);
2259
2260 if (!(t = unit_name_change_suffix(u->id, type)))
2261 return -ENOMEM;
2262
2263 assert(!unit_has_name(u, t));
2264
2265 r = manager_load_unit(u->manager, t, NULL, NULL, _found);
2266 free(t);
2267
2268 assert(r < 0 || *_found != u);
2269
2270 return r;
2271 }
2272
2273 int unit_get_related_unit(Unit *u, const char *type, Unit **_found) {
2274 Unit *found;
2275 char *t;
2276
2277 assert(u);
2278 assert(type);
2279 assert(_found);
2280
2281 if (!(t = unit_name_change_suffix(u->id, type)))
2282 return -ENOMEM;
2283
2284 assert(!unit_has_name(u, t));
2285
2286 found = manager_get_unit(u->manager, t);
2287 free(t);
2288
2289 if (!found)
2290 return -ENOENT;
2291
2292 *_found = found;
2293 return 0;
2294 }
2295
2296 int unit_watch_bus_name(Unit *u, const char *name) {
2297 assert(u);
2298 assert(name);
2299
2300 /* Watch a specific name on the bus. We only support one unit
2301 * watching each name for now. */
2302
2303 return hashmap_put(u->manager->watch_bus, name, u);
2304 }
2305
2306 void unit_unwatch_bus_name(Unit *u, const char *name) {
2307 assert(u);
2308 assert(name);
2309
2310 hashmap_remove_value(u->manager->watch_bus, name, u);
2311 }
2312
2313 bool unit_can_serialize(Unit *u) {
2314 assert(u);
2315
2316 return UNIT_VTABLE(u)->serialize && UNIT_VTABLE(u)->deserialize_item;
2317 }
2318
2319 int unit_serialize(Unit *u, FILE *f, FDSet *fds, bool serialize_jobs) {
2320 int r;
2321
2322 assert(u);
2323 assert(f);
2324 assert(fds);
2325
2326 if (!unit_can_serialize(u))
2327 return 0;
2328
2329 if ((r = UNIT_VTABLE(u)->serialize(u, f, fds)) < 0)
2330 return r;
2331
2332
2333 if (serialize_jobs) {
2334 if (u->job) {
2335 fprintf(f, "job\n");
2336 job_serialize(u->job, f, fds);
2337 }
2338
2339 if (u->nop_job) {
2340 fprintf(f, "job\n");
2341 job_serialize(u->nop_job, f, fds);
2342 }
2343 }
2344
2345 dual_timestamp_serialize(f, "inactive-exit-timestamp", &u->inactive_exit_timestamp);
2346 dual_timestamp_serialize(f, "active-enter-timestamp", &u->active_enter_timestamp);
2347 dual_timestamp_serialize(f, "active-exit-timestamp", &u->active_exit_timestamp);
2348 dual_timestamp_serialize(f, "inactive-enter-timestamp", &u->inactive_enter_timestamp);
2349 dual_timestamp_serialize(f, "condition-timestamp", &u->condition_timestamp);
2350
2351 if (dual_timestamp_is_set(&u->condition_timestamp))
2352 unit_serialize_item(u, f, "condition-result", yes_no(u->condition_result));
2353
2354 /* End marker */
2355 fputc('\n', f);
2356 return 0;
2357 }
2358
2359 void unit_serialize_item_format(Unit *u, FILE *f, const char *key, const char *format, ...) {
2360 va_list ap;
2361
2362 assert(u);
2363 assert(f);
2364 assert(key);
2365 assert(format);
2366
2367 fputs(key, f);
2368 fputc('=', f);
2369
2370 va_start(ap, format);
2371 vfprintf(f, format, ap);
2372 va_end(ap);
2373
2374 fputc('\n', f);
2375 }
2376
2377 void unit_serialize_item(Unit *u, FILE *f, const char *key, const char *value) {
2378 assert(u);
2379 assert(f);
2380 assert(key);
2381 assert(value);
2382
2383 fprintf(f, "%s=%s\n", key, value);
2384 }
2385
2386 int unit_deserialize(Unit *u, FILE *f, FDSet *fds) {
2387 int r;
2388
2389 assert(u);
2390 assert(f);
2391 assert(fds);
2392
2393 if (!unit_can_serialize(u))
2394 return 0;
2395
2396 for (;;) {
2397 char line[LINE_MAX], *l, *v;
2398 size_t k;
2399
2400 if (!fgets(line, sizeof(line), f)) {
2401 if (feof(f))
2402 return 0;
2403 return -errno;
2404 }
2405
2406 char_array_0(line);
2407 l = strstrip(line);
2408
2409 /* End marker */
2410 if (l[0] == 0)
2411 return 0;
2412
2413 k = strcspn(l, "=");
2414
2415 if (l[k] == '=') {
2416 l[k] = 0;
2417 v = l+k+1;
2418 } else
2419 v = l+k;
2420
2421 if (streq(l, "job")) {
2422 if (v[0] == '\0') {
2423 /* new-style serialized job */
2424 Job *j = job_new_raw(u);
2425 if (!j)
2426 return -ENOMEM;
2427
2428 r = job_deserialize(j, f, fds);
2429 if (r < 0) {
2430 job_free(j);
2431 return r;
2432 }
2433
2434 r = hashmap_put(u->manager->jobs, UINT32_TO_PTR(j->id), j);
2435 if (r < 0) {
2436 job_free(j);
2437 return r;
2438 }
2439
2440 r = job_install_deserialized(j);
2441 if (r < 0) {
2442 hashmap_remove(u->manager->jobs, UINT32_TO_PTR(j->id));
2443 job_free(j);
2444 return r;
2445 }
2446
2447 if (j->state == JOB_RUNNING)
2448 u->manager->n_running_jobs++;
2449 } else {
2450 /* legacy */
2451 JobType type = job_type_from_string(v);
2452 if (type < 0)
2453 log_debug("Failed to parse job type value %s", v);
2454 else
2455 u->deserialized_job = type;
2456 }
2457 continue;
2458 } else if (streq(l, "inactive-exit-timestamp")) {
2459 dual_timestamp_deserialize(v, &u->inactive_exit_timestamp);
2460 continue;
2461 } else if (streq(l, "active-enter-timestamp")) {
2462 dual_timestamp_deserialize(v, &u->active_enter_timestamp);
2463 continue;
2464 } else if (streq(l, "active-exit-timestamp")) {
2465 dual_timestamp_deserialize(v, &u->active_exit_timestamp);
2466 continue;
2467 } else if (streq(l, "inactive-enter-timestamp")) {
2468 dual_timestamp_deserialize(v, &u->inactive_enter_timestamp);
2469 continue;
2470 } else if (streq(l, "condition-timestamp")) {
2471 dual_timestamp_deserialize(v, &u->condition_timestamp);
2472 continue;
2473 } else if (streq(l, "condition-result")) {
2474 int b;
2475
2476 if ((b = parse_boolean(v)) < 0)
2477 log_debug("Failed to parse condition result value %s", v);
2478 else
2479 u->condition_result = b;
2480
2481 continue;
2482 }
2483
2484 if ((r = UNIT_VTABLE(u)->deserialize_item(u, l, v, fds)) < 0)
2485 return r;
2486 }
2487 }
2488
2489 int unit_add_node_link(Unit *u, const char *what, bool wants) {
2490 Unit *device;
2491 char *e;
2492 int r;
2493
2494 assert(u);
2495
2496 if (!what)
2497 return 0;
2498
2499 /* Adds in links to the device node that this unit is based on */
2500
2501 if (!is_device_path(what))
2502 return 0;
2503
2504 e = unit_name_from_path(what, ".device");
2505 if (!e)
2506 return -ENOMEM;
2507
2508 r = manager_load_unit(u->manager, e, NULL, NULL, &device);
2509 free(e);
2510 if (r < 0)
2511 return r;
2512
2513 r = unit_add_two_dependencies(u, UNIT_AFTER, UNIT_BINDS_TO, device, true);
2514 if (r < 0)
2515 return r;
2516
2517 if (wants) {
2518 r = unit_add_dependency(device, UNIT_WANTS, u, false);
2519 if (r < 0)
2520 return r;
2521 }
2522
2523 return 0;
2524 }
2525
2526 int unit_coldplug(Unit *u) {
2527 int r;
2528
2529 assert(u);
2530
2531 if (UNIT_VTABLE(u)->coldplug)
2532 if ((r = UNIT_VTABLE(u)->coldplug(u)) < 0)
2533 return r;
2534
2535 if (u->job) {
2536 r = job_coldplug(u->job);
2537 if (r < 0)
2538 return r;
2539 } else if (u->deserialized_job >= 0) {
2540 /* legacy */
2541 r = manager_add_job(u->manager, u->deserialized_job, u, JOB_IGNORE_REQUIREMENTS, false, NULL, NULL);
2542 if (r < 0)
2543 return r;
2544
2545 u->deserialized_job = _JOB_TYPE_INVALID;
2546 }
2547
2548 return 0;
2549 }
2550
2551 void unit_status_printf(Unit *u, const char *status, const char *unit_status_msg_format) {
2552 manager_status_printf(u->manager, false, status, unit_status_msg_format, unit_description(u));
2553 }
2554
2555 bool unit_need_daemon_reload(Unit *u) {
2556 _cleanup_strv_free_ char **t = NULL;
2557 char **path;
2558 struct stat st;
2559 unsigned loaded_cnt, current_cnt;
2560
2561 assert(u);
2562
2563 if (u->fragment_path) {
2564 zero(st);
2565 if (stat(u->fragment_path, &st) < 0)
2566 /* What, cannot access this anymore? */
2567 return true;
2568
2569 if (u->fragment_mtime > 0 &&
2570 timespec_load(&st.st_mtim) != u->fragment_mtime)
2571 return true;
2572 }
2573
2574 if (u->source_path) {
2575 zero(st);
2576 if (stat(u->source_path, &st) < 0)
2577 return true;
2578
2579 if (u->source_mtime > 0 &&
2580 timespec_load(&st.st_mtim) != u->source_mtime)
2581 return true;
2582 }
2583
2584 t = unit_find_dropin_paths(u);
2585 loaded_cnt = strv_length(t);
2586 current_cnt = strv_length(u->dropin_paths);
2587
2588 if (loaded_cnt == current_cnt) {
2589 if (loaded_cnt == 0)
2590 return false;
2591
2592 if (strv_overlap(u->dropin_paths, t)) {
2593 STRV_FOREACH(path, u->dropin_paths) {
2594 zero(st);
2595 if (stat(*path, &st) < 0)
2596 return true;
2597
2598 if (u->dropin_mtime > 0 &&
2599 timespec_load(&st.st_mtim) > u->dropin_mtime)
2600 return true;
2601 }
2602
2603 return false;
2604 } else
2605 return true;
2606 } else
2607 return true;
2608 }
2609
2610 void unit_reset_failed(Unit *u) {
2611 assert(u);
2612
2613 if (UNIT_VTABLE(u)->reset_failed)
2614 UNIT_VTABLE(u)->reset_failed(u);
2615 }
2616
2617 Unit *unit_following(Unit *u) {
2618 assert(u);
2619
2620 if (UNIT_VTABLE(u)->following)
2621 return UNIT_VTABLE(u)->following(u);
2622
2623 return NULL;
2624 }
2625
2626 bool unit_pending_inactive(Unit *u) {
2627 assert(u);
2628
2629 /* Returns true if the unit is inactive or going down */
2630
2631 if (UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(u)))
2632 return true;
2633
2634 if (u->job && u->job->type == JOB_STOP)
2635 return true;
2636
2637 return false;
2638 }
2639
2640 bool unit_pending_active(Unit *u) {
2641 assert(u);
2642
2643 /* Returns true if the unit is active or going up */
2644
2645 if (UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u)))
2646 return true;
2647
2648 if (u->job &&
2649 (u->job->type == JOB_START ||
2650 u->job->type == JOB_RELOAD_OR_START ||
2651 u->job->type == JOB_RESTART))
2652 return true;
2653
2654 return false;
2655 }
2656
2657 int unit_kill(Unit *u, KillWho w, int signo, DBusError *error) {
2658 assert(u);
2659 assert(w >= 0 && w < _KILL_WHO_MAX);
2660 assert(signo > 0);
2661 assert(signo < _NSIG);
2662
2663 if (!UNIT_VTABLE(u)->kill)
2664 return -ENOTSUP;
2665
2666 return UNIT_VTABLE(u)->kill(u, w, signo, error);
2667 }
2668
2669 int unit_kill_common(
2670 Unit *u,
2671 KillWho who,
2672 int signo,
2673 pid_t main_pid,
2674 pid_t control_pid,
2675 DBusError *error) {
2676
2677 int r = 0;
2678
2679 if (who == KILL_MAIN && main_pid <= 0) {
2680 if (main_pid < 0)
2681 dbus_set_error(error, BUS_ERROR_NO_SUCH_PROCESS, "%s units have no main processes", unit_type_to_string(u->type));
2682 else
2683 dbus_set_error(error, BUS_ERROR_NO_SUCH_PROCESS, "No main process to kill");
2684 return -ESRCH;
2685 }
2686
2687 if (who == KILL_CONTROL && control_pid <= 0) {
2688 if (control_pid < 0)
2689 dbus_set_error(error, BUS_ERROR_NO_SUCH_PROCESS, "%s units have no control processes", unit_type_to_string(u->type));
2690 else
2691 dbus_set_error(error, BUS_ERROR_NO_SUCH_PROCESS, "No control process to kill");
2692 return -ESRCH;
2693 }
2694
2695 if (who == KILL_CONTROL || who == KILL_ALL)
2696 if (control_pid > 0)
2697 if (kill(control_pid, signo) < 0)
2698 r = -errno;
2699
2700 if (who == KILL_MAIN || who == KILL_ALL)
2701 if (main_pid > 0)
2702 if (kill(main_pid, signo) < 0)
2703 r = -errno;
2704
2705 if (who == KILL_ALL) {
2706 _cleanup_set_free_ Set *pid_set = NULL;
2707 int q;
2708
2709 pid_set = set_new(trivial_hash_func, trivial_compare_func);
2710 if (!pid_set)
2711 return -ENOMEM;
2712
2713 /* Exclude the control/main pid from being killed via the cgroup */
2714 if (control_pid > 0) {
2715 q = set_put(pid_set, LONG_TO_PTR(control_pid));
2716 if (q < 0)
2717 return q;
2718 }
2719
2720 if (main_pid > 0) {
2721 q = set_put(pid_set, LONG_TO_PTR(main_pid));
2722 if (q < 0)
2723 return q;
2724 }
2725
2726 q = cgroup_bonding_kill_list(u->cgroup_bondings, signo, false, false, pid_set, NULL);
2727 if (q < 0 && q != -EAGAIN && q != -ESRCH && q != -ENOENT)
2728 r = q;
2729 }
2730
2731 return r;
2732 }
2733
2734 int unit_following_set(Unit *u, Set **s) {
2735 assert(u);
2736 assert(s);
2737
2738 if (UNIT_VTABLE(u)->following_set)
2739 return UNIT_VTABLE(u)->following_set(u, s);
2740
2741 *s = NULL;
2742 return 0;
2743 }
2744
2745 UnitFileState unit_get_unit_file_state(Unit *u) {
2746 assert(u);
2747
2748 if (u->unit_file_state < 0 && u->fragment_path)
2749 u->unit_file_state = unit_file_get_state(
2750 u->manager->running_as == SYSTEMD_SYSTEM ? UNIT_FILE_SYSTEM : UNIT_FILE_USER,
2751 NULL, path_get_file_name(u->fragment_path));
2752
2753 return u->unit_file_state;
2754 }
2755
2756 Unit* unit_ref_set(UnitRef *ref, Unit *u) {
2757 assert(ref);
2758 assert(u);
2759
2760 if (ref->unit)
2761 unit_ref_unset(ref);
2762
2763 ref->unit = u;
2764 LIST_PREPEND(UnitRef, refs, u->refs, ref);
2765 return u;
2766 }
2767
2768 void unit_ref_unset(UnitRef *ref) {
2769 assert(ref);
2770
2771 if (!ref->unit)
2772 return;
2773
2774 LIST_REMOVE(UnitRef, refs, ref->unit->refs, ref);
2775 ref->unit = NULL;
2776 }
2777
2778 int unit_add_one_mount_link(Unit *u, Mount *m) {
2779 char **i;
2780
2781 assert(u);
2782 assert(m);
2783
2784 if (u->load_state != UNIT_LOADED ||
2785 UNIT(m)->load_state != UNIT_LOADED)
2786 return 0;
2787
2788 STRV_FOREACH(i, u->requires_mounts_for) {
2789
2790 if (UNIT(m) == u)
2791 continue;
2792
2793 if (!path_startswith(*i, m->where))
2794 continue;
2795
2796 return unit_add_two_dependencies(u, UNIT_AFTER, UNIT_REQUIRES, UNIT(m), true);
2797 }
2798
2799 return 0;
2800 }
2801
2802 int unit_add_mount_links(Unit *u) {
2803 Unit *other;
2804 int r;
2805
2806 assert(u);
2807
2808 LIST_FOREACH(units_by_type, other, u->manager->units_by_type[UNIT_MOUNT]) {
2809 r = unit_add_one_mount_link(u, MOUNT(other));
2810 if (r < 0)
2811 return r;
2812 }
2813
2814 return 0;
2815 }
2816
2817 int unit_exec_context_defaults(Unit *u, ExecContext *c) {
2818 unsigned i;
2819 int r;
2820
2821 assert(u);
2822 assert(c);
2823
2824 /* This only copies in the ones that need memory */
2825
2826 for (i = 0; i < RLIMIT_NLIMITS; i++)
2827 if (u->manager->rlimit[i] && !c->rlimit[i]) {
2828 c->rlimit[i] = newdup(struct rlimit, u->manager->rlimit[i], 1);
2829 if (!c->rlimit[i])
2830 return -ENOMEM;
2831 }
2832
2833 if (u->manager->running_as == SYSTEMD_USER &&
2834 !c->working_directory) {
2835
2836 r = get_home_dir(&c->working_directory);
2837 if (r < 0)
2838 return r;
2839 }
2840
2841 return 0;
2842 }
2843
2844 ExecContext *unit_get_exec_context(Unit *u) {
2845 size_t offset;
2846 assert(u);
2847
2848 offset = UNIT_VTABLE(u)->exec_context_offset;
2849 if (offset <= 0)
2850 return NULL;
2851
2852 return (ExecContext*) ((uint8_t*) u + offset);
2853 }
2854
2855 static int drop_in_file(Unit *u, bool runtime, const char *name, char **_p, char **_q) {
2856 char *p, *q;
2857 int r;
2858
2859 assert(u);
2860 assert(name);
2861 assert(_p);
2862 assert(_q);
2863
2864 if (u->manager->running_as == SYSTEMD_USER && runtime)
2865 return -ENOTSUP;
2866
2867 if (!filename_is_safe(name))
2868 return -EINVAL;
2869
2870 if (u->manager->running_as == SYSTEMD_USER) {
2871 _cleanup_free_ char *c = NULL;
2872
2873 r = user_config_home(&c);
2874 if (r < 0)
2875 return r;
2876 if (r == 0)
2877 return -ENOENT;
2878
2879 p = strjoin(c, "/", u->id, ".d", NULL);
2880 } else if (runtime)
2881 p = strjoin("/run/systemd/system/", u->id, ".d", NULL);
2882 else
2883 p = strjoin("/etc/systemd/system/", u->id, ".d", NULL);
2884 if (!p)
2885 return -ENOMEM;
2886
2887 q = strjoin(p, "/50-", name, ".conf", NULL);
2888 if (!q) {
2889 free(p);
2890 return -ENOMEM;
2891 }
2892
2893 *_p = p;
2894 *_q = q;
2895 return 0;
2896 }
2897
2898 int unit_write_drop_in(Unit *u, bool runtime, const char *name, const char *data) {
2899 _cleanup_free_ char *p = NULL, *q = NULL;
2900 int r;
2901
2902 assert(u);
2903
2904 r = drop_in_file(u, runtime, name, &p, &q);
2905 if (r < 0)
2906 return r;
2907
2908 mkdir_p(p, 0755);
2909 return write_string_file_atomic_label(q, data);
2910 }
2911
2912 int unit_remove_drop_in(Unit *u, bool runtime, const char *name) {
2913 _cleanup_free_ char *p = NULL, *q = NULL;
2914 int r;
2915
2916 assert(u);
2917
2918 r = drop_in_file(u, runtime, name, &p, &q);
2919 if (unlink(q) < 0)
2920 r = -errno;
2921 else
2922 r = 0;
2923
2924 rmdir(p);
2925 return r;
2926 }
2927
2928 int unit_kill_context(
2929 Unit *u,
2930 KillContext *c,
2931 bool sigkill,
2932 pid_t main_pid,
2933 pid_t control_pid,
2934 bool main_pid_alien) {
2935
2936 int sig, wait_for_exit = 0, r;
2937
2938 assert(u);
2939 assert(c);
2940
2941 if (c->kill_mode == KILL_NONE)
2942 return 0;
2943
2944 sig = sigkill ? SIGKILL : c->kill_signal;
2945
2946 if (main_pid > 0) {
2947 r = kill_and_sigcont(main_pid, sig);
2948
2949 if (r < 0 && r != -ESRCH) {
2950 _cleanup_free_ char *comm = NULL;
2951 get_process_comm(main_pid, &comm);
2952
2953 log_warning_unit(u->id, "Failed to kill main process %li (%s): %s",
2954 (long) main_pid, strna(comm), strerror(-r));
2955 } else
2956 wait_for_exit = !main_pid_alien;
2957 }
2958
2959 if (control_pid > 0) {
2960 r = kill_and_sigcont(control_pid, sig);
2961
2962 if (r < 0 && r != -ESRCH) {
2963 _cleanup_free_ char *comm = NULL;
2964 get_process_comm(control_pid, &comm);
2965
2966 log_warning_unit(u->id,
2967 "Failed to kill control process %li (%s): %s",
2968 (long) control_pid, strna(comm), strerror(-r));
2969 } else
2970 wait_for_exit = true;
2971 }
2972
2973 if (c->kill_mode == KILL_CONTROL_GROUP) {
2974 _cleanup_set_free_ Set *pid_set = NULL;
2975
2976 pid_set = set_new(trivial_hash_func, trivial_compare_func);
2977 if (!pid_set)
2978 return -ENOMEM;
2979
2980 /* Exclude the main/control pids from being killed via the cgroup */
2981 if (main_pid > 0) {
2982 r = set_put(pid_set, LONG_TO_PTR(main_pid));
2983 if (r < 0)
2984 return r;
2985 }
2986
2987 if (control_pid > 0) {
2988 r = set_put(pid_set, LONG_TO_PTR(control_pid));
2989 if (r < 0)
2990 return r;
2991 }
2992
2993 r = cgroup_bonding_kill_list(u->cgroup_bondings, sig, true, false, pid_set, NULL);
2994 if (r < 0) {
2995 if (r != -EAGAIN && r != -ESRCH && r != -ENOENT)
2996 log_warning_unit(u->id, "Failed to kill control group: %s", strerror(-r));
2997 } else if (r > 0)
2998 wait_for_exit = true;
2999 }
3000
3001 return wait_for_exit;
3002 }
3003
3004 static const char* const unit_active_state_table[_UNIT_ACTIVE_STATE_MAX] = {
3005 [UNIT_ACTIVE] = "active",
3006 [UNIT_RELOADING] = "reloading",
3007 [UNIT_INACTIVE] = "inactive",
3008 [UNIT_FAILED] = "failed",
3009 [UNIT_ACTIVATING] = "activating",
3010 [UNIT_DEACTIVATING] = "deactivating"
3011 };
3012
3013 DEFINE_STRING_TABLE_LOOKUP(unit_active_state, UnitActiveState);
3014
3015 static const char* const unit_dependency_table[_UNIT_DEPENDENCY_MAX] = {
3016 [UNIT_REQUIRES] = "Requires",
3017 [UNIT_REQUIRES_OVERRIDABLE] = "RequiresOverridable",
3018 [UNIT_REQUISITE] = "Requisite",
3019 [UNIT_REQUISITE_OVERRIDABLE] = "RequisiteOverridable",
3020 [UNIT_WANTS] = "Wants",
3021 [UNIT_BINDS_TO] = "BindsTo",
3022 [UNIT_PART_OF] = "PartOf",
3023 [UNIT_REQUIRED_BY] = "RequiredBy",
3024 [UNIT_REQUIRED_BY_OVERRIDABLE] = "RequiredByOverridable",
3025 [UNIT_WANTED_BY] = "WantedBy",
3026 [UNIT_BOUND_BY] = "BoundBy",
3027 [UNIT_CONSISTS_OF] = "ConsistsOf",
3028 [UNIT_CONFLICTS] = "Conflicts",
3029 [UNIT_CONFLICTED_BY] = "ConflictedBy",
3030 [UNIT_BEFORE] = "Before",
3031 [UNIT_AFTER] = "After",
3032 [UNIT_ON_FAILURE] = "OnFailure",
3033 [UNIT_TRIGGERS] = "Triggers",
3034 [UNIT_TRIGGERED_BY] = "TriggeredBy",
3035 [UNIT_PROPAGATES_RELOAD_TO] = "PropagatesReloadTo",
3036 [UNIT_RELOAD_PROPAGATED_FROM] = "ReloadPropagatedFrom",
3037 [UNIT_REFERENCES] = "References",
3038 [UNIT_REFERENCED_BY] = "ReferencedBy",
3039 };
3040
3041 DEFINE_STRING_TABLE_LOOKUP(unit_dependency, UnitDependency);