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