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