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