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