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