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