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