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