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