]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/core/unit.c
Merge pull request #2011 from poettering/resolve-dname
[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 30
b5efdb8a 31#include "alloc-util.h"
4f5dd394
LP
32#include "bus-common-errors.h"
33#include "bus-util.h"
c6c18be3 34#include "cgroup-util.h"
4f5dd394
LP
35#include "dbus-unit.h"
36#include "dbus.h"
37#include "dropin.h"
38#include "escape.h"
39#include "execute.h"
a5c32cff 40#include "fileio-label.h"
6482f626 41#include "formats-util.h"
4f5dd394
LP
42#include "load-dropin.h"
43#include "load-fragment.h"
44#include "log.h"
45#include "macro.h"
46#include "missing.h"
47#include "mkdir.h"
6bedfcbb 48#include "parse-util.h"
4f5dd394 49#include "path-util.h"
0b452006 50#include "process-util.h"
4f5dd394 51#include "set.h"
e9db43d5 52#include "special.h"
8fcde012 53#include "stat-util.h"
07630cea 54#include "string-util.h"
4f5dd394
LP
55#include "strv.h"
56#include "unit-name.h"
e9db43d5 57#include "unit.h"
b1d4f8e1
LP
58#include "user-util.h"
59#include "virt.h"
87f0e418
LP
60
61const UnitVTable * const unit_vtable[_UNIT_TYPE_MAX] = {
62 [UNIT_SERVICE] = &service_vtable,
87f0e418 63 [UNIT_SOCKET] = &socket_vtable,
e821075a 64 [UNIT_BUSNAME] = &busname_vtable,
87f0e418
LP
65 [UNIT_TARGET] = &target_vtable,
66 [UNIT_DEVICE] = &device_vtable,
67 [UNIT_MOUNT] = &mount_vtable,
68 [UNIT_AUTOMOUNT] = &automount_vtable,
01f78473 69 [UNIT_SWAP] = &swap_vtable,
e821075a 70 [UNIT_TIMER] = &timer_vtable,
a016b922 71 [UNIT_PATH] = &path_vtable,
6c12b52e
LP
72 [UNIT_SLICE] = &slice_vtable,
73 [UNIT_SCOPE] = &scope_vtable
87f0e418
LP
74};
75
f2341e0a 76static void maybe_warn_about_dependency(Unit *u, const char *other, UnitDependency dependency);
d1fab3fe 77
7d17cfbc 78Unit *unit_new(Manager *m, size_t size) {
87f0e418
LP
79 Unit *u;
80
81 assert(m);
ac155bb8 82 assert(size >= sizeof(Unit));
87f0e418 83
7d17cfbc
MS
84 u = malloc0(size);
85 if (!u)
87f0e418
LP
86 return NULL;
87
d5099efc 88 u->names = set_new(&string_hash_ops);
ac155bb8 89 if (!u->names) {
87f0e418
LP
90 free(u);
91 return NULL;
92 }
93
ac155bb8
MS
94 u->manager = m;
95 u->type = _UNIT_TYPE_INVALID;
ac155bb8
MS
96 u->default_dependencies = true;
97 u->unit_file_state = _UNIT_FILE_STATE_INVALID;
d2dc52db 98 u->unit_file_preset = -1;
d420282b 99 u->on_failure_job_mode = JOB_REPLACE;
efdb0237 100 u->cgroup_inotify_wd = -1;
87f0e418 101
67bfdc97 102 RATELIMIT_INIT(u->auto_stop_ratelimit, 10 * USEC_PER_SEC, 16);
bea355da 103
87f0e418
LP
104 return u;
105}
106
f278026d
LP
107bool unit_has_name(Unit *u, const char *name) {
108 assert(u);
109 assert(name);
110
ac155bb8 111 return !!set_get(u->names, (char*) name);
f278026d
LP
112}
113
598459ce
LP
114static void unit_init(Unit *u) {
115 CGroupContext *cc;
116 ExecContext *ec;
117 KillContext *kc;
118
119 assert(u);
120 assert(u->manager);
121 assert(u->type >= 0);
122
123 cc = unit_get_cgroup_context(u);
124 if (cc) {
125 cgroup_context_init(cc);
126
127 /* Copy in the manager defaults into the cgroup
128 * context, _before_ the rest of the settings have
129 * been initialized */
130
131 cc->cpu_accounting = u->manager->default_cpu_accounting;
132 cc->blockio_accounting = u->manager->default_blockio_accounting;
133 cc->memory_accounting = u->manager->default_memory_accounting;
03a7b521 134 cc->tasks_accounting = u->manager->default_tasks_accounting;
0af20ea2
LP
135
136 if (u->type != UNIT_SLICE)
137 cc->tasks_max = u->manager->default_tasks_max;
598459ce
LP
138 }
139
140 ec = unit_get_exec_context(u);
141 if (ec)
142 exec_context_init(ec);
143
144 kc = unit_get_kill_context(u);
145 if (kc)
146 kill_context_init(kc);
147
148 if (UNIT_VTABLE(u)->init)
149 UNIT_VTABLE(u)->init(u);
150}
151
87f0e418 152int unit_add_name(Unit *u, const char *text) {
598459ce 153 _cleanup_free_ char *s = NULL, *i = NULL;
87f0e418 154 UnitType t;
87f0e418
LP
155 int r;
156
157 assert(u);
158 assert(text);
159
7410616c 160 if (unit_name_is_valid(text, UNIT_NAME_TEMPLATE)) {
598459ce 161
ac155bb8 162 if (!u->instance)
9e2f7c11 163 return -EINVAL;
87f0e418 164
7410616c
LP
165 r = unit_name_replace_instance(text, u->instance, &s);
166 if (r < 0)
167 return r;
168 } else {
9e2f7c11 169 s = strdup(text);
7410616c
LP
170 if (!s)
171 return -ENOMEM;
172 }
87f0e418 173
7410616c
LP
174 if (set_contains(u->names, s))
175 return 0;
176 if (hashmap_contains(u->manager->units, s))
177 return -EEXIST;
178
179 if (!unit_name_is_valid(s, UNIT_NAME_PLAIN|UNIT_NAME_INSTANCE))
598459ce 180 return -EINVAL;
e537352b 181
7410616c
LP
182 t = unit_name_to_type(s);
183 if (t < 0)
184 return -EINVAL;
87f0e418 185
598459ce
LP
186 if (u->type != _UNIT_TYPE_INVALID && t != u->type)
187 return -EINVAL;
87f0e418 188
e48614c4
ZJS
189 r = unit_name_to_instance(s, &i);
190 if (r < 0)
598459ce 191 return r;
87f0e418 192
598459ce
LP
193 if (i && unit_vtable[t]->no_instances)
194 return -EINVAL;
9e2f7c11 195
276c3e78 196 /* Ensure that this unit is either instanced or not instanced,
7410616c
LP
197 * but not both. Note that we do allow names with different
198 * instance names however! */
598459ce
LP
199 if (u->type != _UNIT_TYPE_INVALID && !u->instance != !i)
200 return -EINVAL;
9e2f7c11 201
7410616c 202 if (unit_vtable[t]->no_alias && !set_isempty(u->names))
598459ce 203 return -EEXIST;
9e2f7c11 204
598459ce
LP
205 if (hashmap_size(u->manager->units) >= MANAGER_MAX_NAMES)
206 return -E2BIG;
4f0f902f 207
e48614c4 208 r = set_put(u->names, s);
7410616c 209 if (r < 0)
598459ce 210 return r;
7410616c 211 assert(r > 0);
87f0e418 212
e48614c4
ZJS
213 r = hashmap_put(u->manager->units, s, u);
214 if (r < 0) {
7410616c 215 (void) set_remove(u->names, s);
598459ce 216 return r;
87f0e418
LP
217 }
218
ac155bb8 219 if (u->type == _UNIT_TYPE_INVALID) {
ac155bb8
MS
220 u->type = t;
221 u->id = s;
222 u->instance = i;
9e2f7c11 223
71fda00f 224 LIST_PREPEND(units_by_type, u->manager->units_by_type[t], u);
e537352b 225
598459ce 226 unit_init(u);
87f0e418 227
598459ce
LP
228 i = NULL;
229 }
9e2f7c11 230
598459ce 231 s = NULL;
9e2f7c11 232
598459ce
LP
233 unit_add_to_dbus_queue(u);
234 return 0;
87f0e418
LP
235}
236
0ae97ec1 237int unit_choose_id(Unit *u, const char *name) {
68eda4bd 238 _cleanup_free_ char *t = NULL;
598459ce 239 char *s, *i;
276c3e78 240 int r;
0ae97ec1
LP
241
242 assert(u);
243 assert(name);
244
7410616c 245 if (unit_name_is_valid(name, UNIT_NAME_TEMPLATE)) {
9e2f7c11 246
ac155bb8 247 if (!u->instance)
9e2f7c11
LP
248 return -EINVAL;
249
7410616c
LP
250 r = unit_name_replace_instance(name, u->instance, &t);
251 if (r < 0)
252 return r;
9e2f7c11
LP
253
254 name = t;
255 }
256
0ae97ec1 257 /* Selects one of the names of this unit as the id */
ac155bb8 258 s = set_get(u->names, (char*) name);
9e2f7c11 259 if (!s)
0ae97ec1
LP
260 return -ENOENT;
261
7410616c 262 /* Determine the new instance from the new id */
e48614c4
ZJS
263 r = unit_name_to_instance(s, &i);
264 if (r < 0)
276c3e78
LP
265 return r;
266
ac155bb8 267 u->id = s;
276c3e78 268
ac155bb8
MS
269 free(u->instance);
270 u->instance = i;
276c3e78 271
c1e1601e 272 unit_add_to_dbus_queue(u);
9e2f7c11 273
0ae97ec1
LP
274 return 0;
275}
276
f50e0a01
LP
277int unit_set_description(Unit *u, const char *description) {
278 char *s;
279
280 assert(u);
281
8aec412f
LP
282 if (isempty(description))
283 s = NULL;
284 else {
285 s = strdup(description);
286 if (!s)
287 return -ENOMEM;
288 }
f50e0a01 289
ac155bb8
MS
290 free(u->description);
291 u->description = s;
c1e1601e
LP
292
293 unit_add_to_dbus_queue(u);
f50e0a01
LP
294 return 0;
295}
296
701cc384 297bool unit_check_gc(Unit *u) {
a354329f 298 UnitActiveState state;
701cc384
LP
299 assert(u);
300
a354329f 301 if (u->job)
701cc384
LP
302 return true;
303
a354329f 304 if (u->nop_job)
6c073082
LP
305 return true;
306
a354329f
LP
307 state = unit_active_state(u);
308
309 /* If the unit is inactive and failed and no job is queued for
310 * it, then release its runtime resources */
311 if (UNIT_IS_INACTIVE_OR_FAILED(state) &&
312 UNIT_VTABLE(u)->release_resources)
313 UNIT_VTABLE(u)->release_resources(u);
314
315 /* But we keep the unit object around for longer when it is
316 * referenced or configured to not be gc'ed */
317 if (state != UNIT_INACTIVE)
701cc384
LP
318 return true;
319
a354329f 320 if (u->no_gc)
701cc384
LP
321 return true;
322
9d576438
LP
323 if (u->refs)
324 return true;
325
701cc384
LP
326 if (UNIT_VTABLE(u)->check_gc)
327 if (UNIT_VTABLE(u)->check_gc(u))
328 return true;
329
330 return false;
331}
332
87f0e418
LP
333void unit_add_to_load_queue(Unit *u) {
334 assert(u);
ac155bb8 335 assert(u->type != _UNIT_TYPE_INVALID);
87f0e418 336
ac155bb8 337 if (u->load_state != UNIT_STUB || u->in_load_queue)
87f0e418
LP
338 return;
339
71fda00f 340 LIST_PREPEND(load_queue, u->manager->load_queue, u);
ac155bb8 341 u->in_load_queue = true;
87f0e418
LP
342}
343
23a177ef
LP
344void unit_add_to_cleanup_queue(Unit *u) {
345 assert(u);
346
ac155bb8 347 if (u->in_cleanup_queue)
23a177ef
LP
348 return;
349
71fda00f 350 LIST_PREPEND(cleanup_queue, u->manager->cleanup_queue, u);
ac155bb8 351 u->in_cleanup_queue = true;
23a177ef
LP
352}
353
701cc384
LP
354void unit_add_to_gc_queue(Unit *u) {
355 assert(u);
356
ac155bb8 357 if (u->in_gc_queue || u->in_cleanup_queue)
701cc384
LP
358 return;
359
360 if (unit_check_gc(u))
361 return;
362
71fda00f 363 LIST_PREPEND(gc_queue, u->manager->gc_queue, u);
ac155bb8 364 u->in_gc_queue = true;
701cc384 365
ac155bb8 366 u->manager->n_in_gc_queue ++;
701cc384
LP
367}
368
c1e1601e
LP
369void unit_add_to_dbus_queue(Unit *u) {
370 assert(u);
ac155bb8 371 assert(u->type != _UNIT_TYPE_INVALID);
c1e1601e 372
ac155bb8 373 if (u->load_state == UNIT_STUB || u->in_dbus_queue)
c1e1601e
LP
374 return;
375
a567261a 376 /* Shortcut things if nobody cares */
8f8f05a9
LP
377 if (sd_bus_track_count(u->manager->subscribed) <= 0 &&
378 set_isempty(u->manager->private_buses)) {
ac155bb8 379 u->sent_dbus_new_signal = true;
94b6dfa2
LP
380 return;
381 }
382
71fda00f 383 LIST_PREPEND(dbus_queue, u->manager->dbus_unit_queue, u);
ac155bb8 384 u->in_dbus_queue = true;
c1e1601e
LP
385}
386
87f0e418
LP
387static void bidi_set_free(Unit *u, Set *s) {
388 Iterator i;
389 Unit *other;
390
391 assert(u);
392
393 /* Frees the set and makes sure we are dropped from the
394 * inverse pointers */
395
396 SET_FOREACH(other, s, i) {
397 UnitDependency d;
398
399 for (d = 0; d < _UNIT_DEPENDENCY_MAX; d++)
ac155bb8 400 set_remove(other->dependencies[d], u);
701cc384
LP
401
402 unit_add_to_gc_queue(other);
87f0e418
LP
403 }
404
405 set_free(s);
406}
407
c2756a68
LP
408static void unit_remove_transient(Unit *u) {
409 char **i;
410
411 assert(u);
412
413 if (!u->transient)
414 return;
415
416 if (u->fragment_path)
3f5e8115 417 (void) unlink(u->fragment_path);
c2756a68
LP
418
419 STRV_FOREACH(i, u->dropin_paths) {
420 _cleanup_free_ char *p = NULL;
c2756a68 421
3f5e8115 422 (void) unlink(*i);
c2756a68 423
5f311f8c
LP
424 p = dirname_malloc(*i);
425 if (p)
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"
36b4a7ba 1000 "%s\tIgnoreOnIsolate: %s\n",
ac155bb8
MS
1001 prefix, yes_no(u->stop_when_unneeded),
1002 prefix, yes_no(u->refuse_manual_start),
1003 prefix, yes_no(u->refuse_manual_stop),
1004 prefix, yes_no(u->default_dependencies),
d420282b 1005 prefix, job_mode_to_string(u->on_failure_job_mode),
36b4a7ba 1006 prefix, yes_no(u->ignore_on_isolate));
ac155bb8 1007
23a177ef
LP
1008 if (UNIT_VTABLE(u)->dump)
1009 UNIT_VTABLE(u)->dump(u, f, prefix2);
b0650475 1010
ac155bb8 1011 } else if (u->load_state == UNIT_MERGED)
b0650475
LP
1012 fprintf(f,
1013 "%s\tMerged into: %s\n",
ac155bb8
MS
1014 prefix, u->merged_into->id);
1015 else if (u->load_state == UNIT_ERROR)
1016 fprintf(f, "%s\tLoad Error Code: %s\n", prefix, strerror(-u->load_error));
8821a00f 1017
87f0e418 1018
ac155bb8
MS
1019 if (u->job)
1020 job_dump(u->job, f, prefix2);
87f0e418 1021
e0209d83
MS
1022 if (u->nop_job)
1023 job_dump(u->nop_job, f, prefix2);
1024
87f0e418
LP
1025}
1026
1027/* Common implementation for multiple backends */
e537352b 1028int unit_load_fragment_and_dropin(Unit *u) {
23a177ef
LP
1029 int r;
1030
1031 assert(u);
23a177ef 1032
e48614c4 1033 /* Load a .{service,socket,...} file */
4ad49000
LP
1034 r = unit_load_fragment(u);
1035 if (r < 0)
23a177ef
LP
1036 return r;
1037
ac155bb8 1038 if (u->load_state == UNIT_STUB)
23a177ef
LP
1039 return -ENOENT;
1040
1041 /* Load drop-in directory data */
4ad49000
LP
1042 r = unit_load_dropin(unit_follow_merge(u));
1043 if (r < 0)
23a177ef
LP
1044 return r;
1045
1046 return 0;
1047}
1048
1049/* Common implementation for multiple backends */
e537352b 1050int unit_load_fragment_and_dropin_optional(Unit *u) {
23a177ef 1051 int r;
87f0e418
LP
1052
1053 assert(u);
1054
23a177ef
LP
1055 /* Same as unit_load_fragment_and_dropin(), but whether
1056 * something can be loaded or not doesn't matter. */
1057
1058 /* Load a .service file */
4ad49000
LP
1059 r = unit_load_fragment(u);
1060 if (r < 0)
87f0e418
LP
1061 return r;
1062
ac155bb8
MS
1063 if (u->load_state == UNIT_STUB)
1064 u->load_state = UNIT_LOADED;
d46de8a1 1065
87f0e418 1066 /* Load drop-in directory data */
4ad49000
LP
1067 r = unit_load_dropin(unit_follow_merge(u));
1068 if (r < 0)
87f0e418
LP
1069 return r;
1070
23a177ef 1071 return 0;
87f0e418
LP
1072}
1073
bba34eed 1074int unit_add_default_target_dependency(Unit *u, Unit *target) {
98bc2000
LP
1075 assert(u);
1076 assert(target);
1077
ac155bb8 1078 if (target->type != UNIT_TARGET)
98bc2000
LP
1079 return 0;
1080
35b8ca3a 1081 /* Only add the dependency if both units are loaded, so that
bba34eed 1082 * that loop check below is reliable */
ac155bb8
MS
1083 if (u->load_state != UNIT_LOADED ||
1084 target->load_state != UNIT_LOADED)
bba34eed
LP
1085 return 0;
1086
21256a2b
LP
1087 /* If either side wants no automatic dependencies, then let's
1088 * skip this */
ac155bb8
MS
1089 if (!u->default_dependencies ||
1090 !target->default_dependencies)
21256a2b
LP
1091 return 0;
1092
98bc2000 1093 /* Don't create loops */
ac155bb8 1094 if (set_get(target->dependencies[UNIT_BEFORE], u))
98bc2000
LP
1095 return 0;
1096
1097 return unit_add_dependency(target, UNIT_AFTER, u, true);
1098}
1099
e954c9cf 1100static int unit_add_target_dependencies(Unit *u) {
a016b922 1101
21256a2b
LP
1102 static const UnitDependency deps[] = {
1103 UNIT_REQUIRED_BY,
be7d9ff7 1104 UNIT_REQUISITE_OF,
21256a2b
LP
1105 UNIT_WANTED_BY,
1106 UNIT_BOUND_BY
1107 };
1108
bba34eed 1109 Unit *target;
98bc2000 1110 Iterator i;
21256a2b 1111 unsigned k;
db57f3c6 1112 int r = 0;
98bc2000
LP
1113
1114 assert(u);
1115
21256a2b 1116 for (k = 0; k < ELEMENTSOF(deps); k++)
a016b922
LP
1117 SET_FOREACH(target, u->dependencies[deps[k]], i) {
1118 r = unit_add_default_target_dependency(u, target);
1119 if (r < 0)
21256a2b 1120 return r;
a016b922
LP
1121 }
1122
e954c9cf
LP
1123 return r;
1124}
4ad49000 1125
e954c9cf
LP
1126static int unit_add_slice_dependencies(Unit *u) {
1127 assert(u);
b81884e7 1128
35b7ff80 1129 if (!UNIT_HAS_CGROUP_CONTEXT(u))
e954c9cf
LP
1130 return 0;
1131
1132 if (UNIT_ISSET(u->slice))
8c8da0e0 1133 return unit_add_two_dependencies(u, UNIT_AFTER, UNIT_REQUIRES, UNIT_DEREF(u->slice), true);
e954c9cf 1134
8c8da0e0 1135 if (unit_has_name(u, SPECIAL_ROOT_SLICE))
d1fab3fe
ZJS
1136 return 0;
1137
8c8da0e0 1138 return unit_add_two_dependencies_by_name(u, UNIT_AFTER, UNIT_REQUIRES, SPECIAL_ROOT_SLICE, NULL, true);
98bc2000
LP
1139}
1140
e954c9cf 1141static int unit_add_mount_dependencies(Unit *u) {
9588bc32
LP
1142 char **i;
1143 int r;
1144
1145 assert(u);
1146
1147 STRV_FOREACH(i, u->requires_mounts_for) {
1148 char prefix[strlen(*i) + 1];
1149
1150 PATH_FOREACH_PREFIX_MORE(prefix, *i) {
c7c89abb 1151 _cleanup_free_ char *p = NULL;
9588bc32
LP
1152 Unit *m;
1153
c7c89abb 1154 r = unit_name_from_path(prefix, ".mount", &p);
9588bc32
LP
1155 if (r < 0)
1156 return r;
c7c89abb
FB
1157
1158 m = manager_get_unit(u->manager, p);
1159 if (!m) {
1160 /* Make sure to load the mount unit if
1161 * it exists. If so the dependencies
1162 * on this unit will be added later
1163 * during the loading of the mount
1164 * unit. */
1165 (void) manager_load_unit_prepare(u->manager, p, NULL, NULL, &m);
9588bc32 1166 continue;
c7c89abb 1167 }
9588bc32
LP
1168 if (m == u)
1169 continue;
1170
1171 if (m->load_state != UNIT_LOADED)
1172 continue;
1173
1174 r = unit_add_dependency(u, UNIT_AFTER, m, true);
1175 if (r < 0)
1176 return r;
1177
1178 if (m->fragment_path) {
1179 r = unit_add_dependency(u, UNIT_REQUIRES, m, true);
1180 if (r < 0)
1181 return r;
1182 }
1183 }
1184 }
1185
1186 return 0;
1187}
1188
95ae05c0
WC
1189static int unit_add_startup_units(Unit *u) {
1190 CGroupContext *c;
5269eb6b 1191 int r;
95ae05c0
WC
1192
1193 c = unit_get_cgroup_context(u);
db785129
LP
1194 if (!c)
1195 return 0;
1196
d53d9474
LP
1197 if (c->startup_cpu_shares == CGROUP_CPU_SHARES_INVALID &&
1198 c->startup_blockio_weight == CGROUP_BLKIO_WEIGHT_INVALID)
db785129
LP
1199 return 0;
1200
5269eb6b
LP
1201 r = set_ensure_allocated(&u->manager->startup_units, NULL);
1202 if (r < 0)
1203 return r;
1204
756c09e6 1205 return set_put(u->manager->startup_units, u);
95ae05c0
WC
1206}
1207
87f0e418
LP
1208int unit_load(Unit *u) {
1209 int r;
1210
1211 assert(u);
1212
ac155bb8 1213 if (u->in_load_queue) {
71fda00f 1214 LIST_REMOVE(load_queue, u->manager->load_queue, u);
ac155bb8 1215 u->in_load_queue = false;
87f0e418
LP
1216 }
1217
ac155bb8 1218 if (u->type == _UNIT_TYPE_INVALID)
e537352b
LP
1219 return -EINVAL;
1220
ac155bb8 1221 if (u->load_state != UNIT_STUB)
87f0e418
LP
1222 return 0;
1223
c2756a68
LP
1224 if (UNIT_VTABLE(u)->load) {
1225 r = UNIT_VTABLE(u)->load(u);
1226 if (r < 0)
87f0e418 1227 goto fail;
c2756a68 1228 }
23a177ef 1229
ac155bb8 1230 if (u->load_state == UNIT_STUB) {
23a177ef
LP
1231 r = -ENOENT;
1232 goto fail;
1233 }
1234
7c8fa05c 1235 if (u->load_state == UNIT_LOADED) {
c2756a68 1236
e954c9cf
LP
1237 r = unit_add_target_dependencies(u);
1238 if (r < 0)
1239 goto fail;
1240
1241 r = unit_add_slice_dependencies(u);
1242 if (r < 0)
1243 goto fail;
c2756a68 1244
e954c9cf 1245 r = unit_add_mount_dependencies(u);
7c8fa05c 1246 if (r < 0)
c2756a68 1247 goto fail;
7c8fa05c 1248
95ae05c0
WC
1249 r = unit_add_startup_units(u);
1250 if (r < 0)
1251 goto fail;
1252
bc432dc7 1253 if (u->on_failure_job_mode == JOB_ISOLATE && set_size(u->dependencies[UNIT_ON_FAILURE]) > 1) {
f2341e0a 1254 log_unit_error(u, "More than one OnFailure= dependencies specified but OnFailureJobMode=isolate set. Refusing.");
c2756a68
LP
1255 r = -EINVAL;
1256 goto fail;
1257 }
bc432dc7
LP
1258
1259 unit_update_cgroup_members_masks(u);
32ee7d33
DM
1260
1261 /* If we are reloading, we need to wait for the deserializer
1262 * to restore the net_cls ids that have been set previously */
1263 if (u->manager->n_reloading <= 0) {
1264 r = unit_add_to_netclass_cgroup(u);
1265 if (r < 0)
1266 return r;
1267 }
f68319bb
LP
1268 }
1269
ac155bb8 1270 assert((u->load_state != UNIT_MERGED) == !u->merged_into);
23a177ef
LP
1271
1272 unit_add_to_dbus_queue(unit_follow_merge(u));
701cc384 1273 unit_add_to_gc_queue(u);
87f0e418 1274
87f0e418
LP
1275 return 0;
1276
1277fail:
c2756a68 1278 u->load_state = u->load_state == UNIT_STUB ? UNIT_NOT_FOUND : UNIT_ERROR;
ac155bb8 1279 u->load_error = r;
c1e1601e 1280 unit_add_to_dbus_queue(u);
9a46fc3b 1281 unit_add_to_gc_queue(u);
23a177ef 1282
f2341e0a 1283 log_unit_debug_errno(u, r, "Failed to load configuration: %m");
23a177ef 1284
87f0e418
LP
1285 return r;
1286}
1287
49365733
LP
1288static bool unit_condition_test_list(Unit *u, Condition *first, const char *(*to_string)(ConditionType t)) {
1289 Condition *c;
1290 int triggered = -1;
1291
1292 assert(u);
1293 assert(to_string);
1294
1295 /* If the condition list is empty, then it is true */
1296 if (!first)
1297 return true;
1298
1299 /* Otherwise, if all of the non-trigger conditions apply and
1300 * if any of the trigger conditions apply (unless there are
1301 * none) we return true */
1302 LIST_FOREACH(conditions, c, first) {
1303 int r;
1304
1305 r = condition_test(c);
1306 if (r < 0)
f2341e0a
LP
1307 log_unit_warning(u,
1308 "Couldn't determine result for %s=%s%s%s, assuming failed: %m",
49365733
LP
1309 to_string(c->type),
1310 c->trigger ? "|" : "",
1311 c->negate ? "!" : "",
f2341e0a 1312 c->parameter);
49365733 1313 else
f2341e0a
LP
1314 log_unit_debug(u,
1315 "%s=%s%s%s %s.",
49365733
LP
1316 to_string(c->type),
1317 c->trigger ? "|" : "",
1318 c->negate ? "!" : "",
1319 c->parameter,
f2341e0a 1320 condition_result_to_string(c->result));
49365733
LP
1321
1322 if (!c->trigger && r <= 0)
1323 return false;
1324
1325 if (c->trigger && triggered <= 0)
1326 triggered = r > 0;
1327 }
1328
1329 return triggered != 0;
1330}
1331
9588bc32 1332static bool unit_condition_test(Unit *u) {
90bbc946
LP
1333 assert(u);
1334
ac155bb8 1335 dual_timestamp_get(&u->condition_timestamp);
49365733 1336 u->condition_result = unit_condition_test_list(u, u->conditions, condition_type_to_string);
90bbc946 1337
ac155bb8 1338 return u->condition_result;
90bbc946
LP
1339}
1340
59fccdc5
LP
1341static bool unit_assert_test(Unit *u) {
1342 assert(u);
1343
1344 dual_timestamp_get(&u->assert_timestamp);
49365733 1345 u->assert_result = unit_condition_test_list(u, u->asserts, assert_type_to_string);
59fccdc5
LP
1346
1347 return u->assert_result;
1348}
1349
df446f96
LP
1350void unit_status_printf(Unit *u, const char *status, const char *unit_status_msg_format) {
1351 DISABLE_WARNING_FORMAT_NONLITERAL;
1352 manager_status_printf(u->manager, STATUS_TYPE_NORMAL, status, unit_status_msg_format, unit_description(u));
1353 REENABLE_WARNING;
1354}
1355
44a6b1b6 1356_pure_ static const char* unit_get_status_message_format(Unit *u, JobType t) {
877d54e9 1357 const char *format;
a85ca902 1358 const UnitStatusMessageFormats *format_table;
877d54e9
LP
1359
1360 assert(u);
df446f96 1361 assert(IN_SET(t, JOB_START, JOB_STOP, JOB_RELOAD));
877d54e9 1362
b5bf308b 1363 if (t != JOB_RELOAD) {
a85ca902
MS
1364 format_table = &UNIT_VTABLE(u)->status_message_formats;
1365 if (format_table) {
1366 format = format_table->starting_stopping[t == JOB_STOP];
1367 if (format)
1368 return format;
1369 }
1370 }
877d54e9
LP
1371
1372 /* Return generic strings */
1373 if (t == JOB_START)
1374 return "Starting %s.";
1375 else if (t == JOB_STOP)
1376 return "Stopping %s.";
b5bf308b 1377 else
877d54e9 1378 return "Reloading %s.";
877d54e9
LP
1379}
1380
1381static void unit_status_print_starting_stopping(Unit *u, JobType t) {
1382 const char *format;
1383
1384 assert(u);
1385
df446f96
LP
1386 /* Reload status messages have traditionally not been printed to console. */
1387 if (!IN_SET(t, JOB_START, JOB_STOP))
1388 return;
1389
877d54e9 1390 format = unit_get_status_message_format(u, t);
c6918296 1391
bcfce235 1392 DISABLE_WARNING_FORMAT_NONLITERAL;
49b1d377 1393 unit_status_printf(u, "", format);
bcfce235 1394 REENABLE_WARNING;
c6918296
MS
1395}
1396
877d54e9
LP
1397static void unit_status_log_starting_stopping_reloading(Unit *u, JobType t) {
1398 const char *format;
1399 char buf[LINE_MAX];
1400 sd_id128_t mid;
1401
1402 assert(u);
1403
df446f96 1404 if (!IN_SET(t, JOB_START, JOB_STOP, JOB_RELOAD))
877d54e9
LP
1405 return;
1406
81270860
LP
1407 if (log_on_console())
1408 return;
1409
877d54e9
LP
1410 /* We log status messages for all units and all operations. */
1411
a85ca902 1412 format = unit_get_status_message_format(u, t);
877d54e9 1413
bcfce235 1414 DISABLE_WARNING_FORMAT_NONLITERAL;
877d54e9 1415 snprintf(buf, sizeof(buf), format, unit_description(u));
bcfce235 1416 REENABLE_WARNING;
877d54e9
LP
1417
1418 mid = t == JOB_START ? SD_MESSAGE_UNIT_STARTING :
1419 t == JOB_STOP ? SD_MESSAGE_UNIT_STOPPING :
1420 SD_MESSAGE_UNIT_RELOADING;
1421
f2341e0a
LP
1422 /* Note that we deliberately use LOG_MESSAGE() instead of
1423 * LOG_UNIT_MESSAGE() here, since this is supposed to mimic
1424 * closely what is written to screen using the status output,
1425 * which is supposed the highest level, friendliest output
1426 * possible, which means we should avoid the low-level unit
1427 * name. */
1428 log_struct(LOG_INFO,
1429 LOG_MESSAGE_ID(mid),
1430 LOG_UNIT_ID(u),
1431 LOG_MESSAGE("%s", buf),
1432 NULL);
877d54e9 1433}
877d54e9 1434
d1a34ae9 1435void unit_status_emit_starting_stopping_reloading(Unit *u, JobType t) {
df446f96
LP
1436 assert(u);
1437 assert(t >= 0);
1438 assert(t < _JOB_TYPE_MAX);
d1a34ae9
MS
1439
1440 unit_status_log_starting_stopping_reloading(u, t);
df446f96 1441 unit_status_print_starting_stopping(u, t);
d1a34ae9
MS
1442}
1443
87f0e418 1444/* Errors:
d5159713
LP
1445 * -EBADR: This unit type does not support starting.
1446 * -EALREADY: Unit is already started.
1447 * -EAGAIN: An operation is already in progress. Retry later.
1448 * -ECANCELED: Too many requests for now.
59fccdc5 1449 * -EPROTO: Assert failed
87f0e418
LP
1450 */
1451int unit_start(Unit *u) {
1452 UnitActiveState state;
92ab323c 1453 Unit *following;
87f0e418
LP
1454
1455 assert(u);
1456
8ff4d2ab 1457 /* Units that aren't loaded cannot be started */
ac155bb8 1458 if (u->load_state != UNIT_LOADED)
6124958c
LP
1459 return -EINVAL;
1460
a82e5507
LP
1461 /* If this is already started, then this will succeed. Note
1462 * that this will even succeed if this unit is not startable
1463 * by the user. This is relied on to detect when we need to
1464 * wait for units and when waiting is finished. */
87f0e418
LP
1465 state = unit_active_state(u);
1466 if (UNIT_IS_ACTIVE_OR_RELOADING(state))
1467 return -EALREADY;
1468
a82e5507
LP
1469 /* If the conditions failed, don't do anything at all. If we
1470 * already are activating this call might still be useful to
1471 * speed up activation in case there is some hold-off time,
1472 * but we don't want to recheck the condition in that case. */
1473 if (state != UNIT_ACTIVATING &&
1474 !unit_condition_test(u)) {
f2341e0a 1475 log_unit_debug(u, "Starting requested but condition failed. Not starting unit.");
52661efd
LP
1476 return -EALREADY;
1477 }
1478
59fccdc5
LP
1479 /* If the asserts failed, fail the entire job */
1480 if (state != UNIT_ACTIVATING &&
1481 !unit_assert_test(u)) {
f2341e0a 1482 log_unit_notice(u, "Starting requested but asserts failed.");
59fccdc5
LP
1483 return -EPROTO;
1484 }
1485
d11a7645
LP
1486 /* Units of types that aren't supported cannot be
1487 * started. Note that we do this test only after the condition
1488 * checks, so that we rather return condition check errors
1489 * (which are usually not considered a true failure) than "not
1490 * supported" errors (which are considered a failure).
1491 */
1492 if (!unit_supported(u))
1493 return -EOPNOTSUPP;
1494
92ab323c 1495 /* Forward to the main object, if we aren't it. */
52990c2e
ZJS
1496 following = unit_following(u);
1497 if (following) {
f2341e0a 1498 log_unit_debug(u, "Redirecting start request from %s to %s.", u->id, following->id);
92ab323c
LP
1499 return unit_start(following);
1500 }
1501
1502 /* If it is stopped, but we cannot start it, then fail */
1503 if (!UNIT_VTABLE(u)->start)
1504 return -EBADR;
1505
87f0e418
LP
1506 /* We don't suppress calls to ->start() here when we are
1507 * already starting, to allow this request to be used as a
1508 * "hurry up" call, for example when the unit is in some "auto
1509 * restart" state where it waits for a holdoff timer to elapse
1510 * before it will start again. */
1511
c1e1601e 1512 unit_add_to_dbus_queue(u);
9e58ff9c 1513
d1a34ae9 1514 return UNIT_VTABLE(u)->start(u);
87f0e418
LP
1515}
1516
1517bool unit_can_start(Unit *u) {
1518 assert(u);
1519
8ff4d2ab
LP
1520 if (u->load_state != UNIT_LOADED)
1521 return false;
1522
1523 if (!unit_supported(u))
1524 return false;
1525
87f0e418
LP
1526 return !!UNIT_VTABLE(u)->start;
1527}
1528
2528a7a6
LP
1529bool unit_can_isolate(Unit *u) {
1530 assert(u);
1531
1532 return unit_can_start(u) &&
ac155bb8 1533 u->allow_isolate;
2528a7a6
LP
1534}
1535
87f0e418
LP
1536/* Errors:
1537 * -EBADR: This unit type does not support stopping.
1538 * -EALREADY: Unit is already stopped.
1539 * -EAGAIN: An operation is already in progress. Retry later.
1540 */
1541int unit_stop(Unit *u) {
1542 UnitActiveState state;
92ab323c 1543 Unit *following;
87f0e418
LP
1544
1545 assert(u);
1546
87f0e418 1547 state = unit_active_state(u);
fdf20a31 1548 if (UNIT_IS_INACTIVE_OR_FAILED(state))
87f0e418
LP
1549 return -EALREADY;
1550
0faacd47
LP
1551 following = unit_following(u);
1552 if (following) {
f2341e0a 1553 log_unit_debug(u, "Redirecting stop request from %s to %s.", u->id, following->id);
92ab323c
LP
1554 return unit_stop(following);
1555 }
1556
7898b0cf
LP
1557 if (!UNIT_VTABLE(u)->stop)
1558 return -EBADR;
1559
c1e1601e 1560 unit_add_to_dbus_queue(u);
9e58ff9c 1561
d1a34ae9 1562 return UNIT_VTABLE(u)->stop(u);
87f0e418
LP
1563}
1564
1565/* Errors:
1566 * -EBADR: This unit type does not support reloading.
1567 * -ENOEXEC: Unit is not started.
1568 * -EAGAIN: An operation is already in progress. Retry later.
1569 */
1570int unit_reload(Unit *u) {
1571 UnitActiveState state;
92ab323c 1572 Unit *following;
87f0e418
LP
1573
1574 assert(u);
1575
ac155bb8 1576 if (u->load_state != UNIT_LOADED)
6124958c
LP
1577 return -EINVAL;
1578
87f0e418
LP
1579 if (!unit_can_reload(u))
1580 return -EBADR;
1581
1582 state = unit_active_state(u);
e364ad06 1583 if (state == UNIT_RELOADING)
87f0e418
LP
1584 return -EALREADY;
1585
6a371e23 1586 if (state != UNIT_ACTIVE) {
f2341e0a 1587 log_unit_warning(u, "Unit cannot be reloaded because it is inactive.");
87f0e418 1588 return -ENOEXEC;
6a371e23 1589 }
87f0e418 1590
e48614c4
ZJS
1591 following = unit_following(u);
1592 if (following) {
f2341e0a 1593 log_unit_debug(u, "Redirecting reload request from %s to %s.", u->id, following->id);
92ab323c
LP
1594 return unit_reload(following);
1595 }
1596
c1e1601e 1597 unit_add_to_dbus_queue(u);
82a2b6bb 1598
d1a34ae9 1599 return UNIT_VTABLE(u)->reload(u);
87f0e418
LP
1600}
1601
1602bool unit_can_reload(Unit *u) {
1603 assert(u);
1604
1605 if (!UNIT_VTABLE(u)->reload)
1606 return false;
1607
1608 if (!UNIT_VTABLE(u)->can_reload)
1609 return true;
1610
1611 return UNIT_VTABLE(u)->can_reload(u);
1612}
1613
b4a16b7b 1614static void unit_check_unneeded(Unit *u) {
be7d9ff7 1615
4bd29fe5
LP
1616 _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL;
1617
be7d9ff7
LP
1618 static const UnitDependency needed_dependencies[] = {
1619 UNIT_REQUIRED_BY,
084918ba 1620 UNIT_REQUISITE_OF,
be7d9ff7
LP
1621 UNIT_WANTED_BY,
1622 UNIT_BOUND_BY,
1623 };
1624
f3bff0eb 1625 Unit *other;
be7d9ff7
LP
1626 Iterator i;
1627 unsigned j;
1628 int r;
f3bff0eb
LP
1629
1630 assert(u);
1631
1632 /* If this service shall be shut down when unneeded then do
1633 * so. */
1634
ac155bb8 1635 if (!u->stop_when_unneeded)
f3bff0eb
LP
1636 return;
1637
1638 if (!UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u)))
1639 return;
1640
be7d9ff7 1641 for (j = 0; j < ELEMENTSOF(needed_dependencies); j++)
f3b85044 1642 SET_FOREACH(other, u->dependencies[needed_dependencies[j]], i)
be7d9ff7
LP
1643 if (unit_active_or_pending(other))
1644 return;
b81884e7 1645
bea355da
LP
1646 /* If stopping a unit fails continously we might enter a stop
1647 * loop here, hence stop acting on the service being
1648 * unnecessary after a while. */
67bfdc97 1649 if (!ratelimit_test(&u->auto_stop_ratelimit)) {
bea355da
LP
1650 log_unit_warning(u, "Unit not needed anymore, but not stopping since we tried this too often recently.");
1651 return;
1652 }
1653
f2341e0a 1654 log_unit_info(u, "Unit not needed anymore. Stopping.");
f3bff0eb
LP
1655
1656 /* Ok, nobody needs us anymore. Sniff. Then let's commit suicide */
4bd29fe5 1657 r = manager_add_job(u->manager, JOB_STOP, u, JOB_FAIL, &error, NULL);
be7d9ff7 1658 if (r < 0)
4bd29fe5 1659 log_unit_warning_errno(u, r, "Failed to enqueue stop job, ignoring: %s", bus_error_message(&error, r));
f3bff0eb
LP
1660}
1661
ff502445 1662static void unit_check_binds_to(Unit *u) {
4bd29fe5 1663 _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL;
ff502445
LP
1664 bool stop = false;
1665 Unit *other;
1666 Iterator i;
67bfdc97 1667 int r;
ff502445
LP
1668
1669 assert(u);
1670
1671 if (u->job)
1672 return;
1673
1674 if (unit_active_state(u) != UNIT_ACTIVE)
1675 return;
1676
1677 SET_FOREACH(other, u->dependencies[UNIT_BINDS_TO], i) {
1678 if (other->job)
1679 continue;
1680
1681 if (!UNIT_IS_INACTIVE_OR_FAILED(unit_active_state(other)))
1682 continue;
1683
1684 stop = true;
98f738b6 1685 break;
ff502445
LP
1686 }
1687
1688 if (!stop)
1689 return;
1690
67bfdc97
LP
1691 /* If stopping a unit fails continously we might enter a stop
1692 * loop here, hence stop acting on the service being
1693 * unnecessary after a while. */
1694 if (!ratelimit_test(&u->auto_stop_ratelimit)) {
1695 log_unit_warning(u, "Unit is bound to inactive unit %s, but not stopping since we tried this too often recently.", other->id);
1696 return;
1697 }
1698
98f738b6 1699 assert(other);
f2341e0a 1700 log_unit_info(u, "Unit is bound to inactive unit %s. Stopping, too.", other->id);
ff502445
LP
1701
1702 /* A unit we need to run is gone. Sniff. Let's stop this. */
4bd29fe5 1703 r = manager_add_job(u->manager, JOB_STOP, u, JOB_FAIL, &error, NULL);
67bfdc97 1704 if (r < 0)
4bd29fe5 1705 log_unit_warning_errno(u, r, "Failed to enqueue stop job, ignoring: %s", bus_error_message(&error, r));
ff502445
LP
1706}
1707
87f0e418
LP
1708static void retroactively_start_dependencies(Unit *u) {
1709 Iterator i;
1710 Unit *other;
1711
1712 assert(u);
1713 assert(UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u)));
1714
ac155bb8
MS
1715 SET_FOREACH(other, u->dependencies[UNIT_REQUIRES], i)
1716 if (!set_get(u->dependencies[UNIT_AFTER], other) &&
b81884e7 1717 !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other)))
4bd29fe5 1718 manager_add_job(u->manager, JOB_START, other, JOB_REPLACE, NULL, NULL);
b81884e7 1719
7f2cddae 1720 SET_FOREACH(other, u->dependencies[UNIT_BINDS_TO], i)
ac155bb8 1721 if (!set_get(u->dependencies[UNIT_AFTER], other) &&
b81884e7 1722 !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other)))
4bd29fe5 1723 manager_add_job(u->manager, JOB_START, other, JOB_REPLACE, NULL, NULL);
87f0e418 1724
ac155bb8
MS
1725 SET_FOREACH(other, u->dependencies[UNIT_WANTS], i)
1726 if (!set_get(u->dependencies[UNIT_AFTER], other) &&
b81884e7 1727 !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other)))
4bd29fe5 1728 manager_add_job(u->manager, JOB_START, other, JOB_FAIL, NULL, NULL);
87f0e418 1729
ac155bb8 1730 SET_FOREACH(other, u->dependencies[UNIT_CONFLICTS], i)
b81884e7 1731 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
4bd29fe5 1732 manager_add_job(u->manager, JOB_STOP, other, JOB_REPLACE, NULL, NULL);
69dd2852 1733
ac155bb8 1734 SET_FOREACH(other, u->dependencies[UNIT_CONFLICTED_BY], i)
b81884e7 1735 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
4bd29fe5 1736 manager_add_job(u->manager, JOB_STOP, other, JOB_REPLACE, NULL, NULL);
87f0e418
LP
1737}
1738
1739static void retroactively_stop_dependencies(Unit *u) {
1740 Iterator i;
1741 Unit *other;
1742
1743 assert(u);
1744 assert(UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(u)));
1745
b81884e7 1746 /* Pull down units which are bound to us recursively if enabled */
ac155bb8 1747 SET_FOREACH(other, u->dependencies[UNIT_BOUND_BY], i)
b81884e7 1748 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
4bd29fe5 1749 manager_add_job(u->manager, JOB_STOP, other, JOB_REPLACE, NULL, NULL);
cd0504d0
MS
1750}
1751
1752static void check_unneeded_dependencies(Unit *u) {
1753 Iterator i;
1754 Unit *other;
1755
1756 assert(u);
1757 assert(UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(u)));
f3bff0eb
LP
1758
1759 /* Garbage collect services that might not be needed anymore, if enabled */
ac155bb8 1760 SET_FOREACH(other, u->dependencies[UNIT_REQUIRES], i)
87f0e418 1761 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
b4a16b7b 1762 unit_check_unneeded(other);
ac155bb8 1763 SET_FOREACH(other, u->dependencies[UNIT_WANTS], i)
f3bff0eb 1764 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
b4a16b7b 1765 unit_check_unneeded(other);
ac155bb8 1766 SET_FOREACH(other, u->dependencies[UNIT_REQUISITE], i)
f3bff0eb 1767 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
b4a16b7b 1768 unit_check_unneeded(other);
7f2cddae 1769 SET_FOREACH(other, u->dependencies[UNIT_BINDS_TO], i)
b81884e7
LP
1770 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
1771 unit_check_unneeded(other);
87f0e418
LP
1772}
1773
3ecaa09b 1774void unit_start_on_failure(Unit *u) {
c0daa706
LP
1775 Unit *other;
1776 Iterator i;
1777
1778 assert(u);
1779
ac155bb8 1780 if (set_size(u->dependencies[UNIT_ON_FAILURE]) <= 0)
222ae6a8
LP
1781 return;
1782
f2341e0a 1783 log_unit_info(u, "Triggering OnFailure= dependencies.");
222ae6a8 1784
ac155bb8 1785 SET_FOREACH(other, u->dependencies[UNIT_ON_FAILURE], i) {
222ae6a8
LP
1786 int r;
1787
4bd29fe5 1788 r = manager_add_job(u->manager, JOB_START, other, u->on_failure_job_mode, NULL, NULL);
c1b6628d 1789 if (r < 0)
f2341e0a 1790 log_unit_error_errno(u, r, "Failed to enqueue OnFailure= job: %m");
222ae6a8 1791 }
c0daa706
LP
1792}
1793
3ecaa09b
LP
1794void unit_trigger_notify(Unit *u) {
1795 Unit *other;
1796 Iterator i;
1797
1798 assert(u);
1799
1800 SET_FOREACH(other, u->dependencies[UNIT_TRIGGERED_BY], i)
1801 if (UNIT_VTABLE(other)->trigger_notify)
1802 UNIT_VTABLE(other)->trigger_notify(other, u);
1803}
1804
e2f3b44c 1805void unit_notify(Unit *u, UnitActiveState os, UnitActiveState ns, bool reload_success) {
546ac4f0 1806 Manager *m;
7e6e7b06 1807 bool unexpected;
a096ed36 1808
87f0e418
LP
1809 assert(u);
1810 assert(os < _UNIT_ACTIVE_STATE_MAX);
1811 assert(ns < _UNIT_ACTIVE_STATE_MAX);
87f0e418 1812
8e471ccd
LP
1813 /* Note that this is called for all low-level state changes,
1814 * even if they might map to the same high-level
865cc19a 1815 * UnitActiveState! That means that ns == os is an expected
c5315881 1816 * behavior here. For example: if a mount point is remounted
cd6d0a45 1817 * this function will be called too! */
87f0e418 1818
546ac4f0
MS
1819 m = u->manager;
1820
f755e3b7 1821 /* Update timestamps for state changes */
546ac4f0 1822 if (m->n_reloading <= 0) {
bdbf9951 1823 dual_timestamp ts;
173e3821 1824
bdbf9951 1825 dual_timestamp_get(&ts);
173e3821 1826
bdbf9951 1827 if (UNIT_IS_INACTIVE_OR_FAILED(os) && !UNIT_IS_INACTIVE_OR_FAILED(ns))
ac155bb8 1828 u->inactive_exit_timestamp = ts;
bdbf9951 1829 else if (!UNIT_IS_INACTIVE_OR_FAILED(os) && UNIT_IS_INACTIVE_OR_FAILED(ns))
ac155bb8 1830 u->inactive_enter_timestamp = ts;
bdbf9951
LP
1831
1832 if (!UNIT_IS_ACTIVE_OR_RELOADING(os) && UNIT_IS_ACTIVE_OR_RELOADING(ns))
ac155bb8 1833 u->active_enter_timestamp = ts;
bdbf9951 1834 else if (UNIT_IS_ACTIVE_OR_RELOADING(os) && !UNIT_IS_ACTIVE_OR_RELOADING(ns))
ac155bb8 1835 u->active_exit_timestamp = ts;
bdbf9951 1836 }
87f0e418 1837
865cc19a 1838 /* Keep track of failed units */
5269eb6b 1839 (void) manager_update_failed_units(u->manager, u, ns == UNIT_FAILED);
f755e3b7
LP
1840
1841 /* Make sure the cgroup is always removed when we become inactive */
fdf20a31 1842 if (UNIT_IS_INACTIVE_OR_FAILED(ns))
efdb0237 1843 unit_prune_cgroup(u);
fb385181 1844
9cd86184 1845 /* Note that this doesn't apply to RemainAfterExit services exiting
6f285378 1846 * successfully, since there's no change of state in that case. Which is
9cd86184 1847 * why it is handled in service_set_state() */
7ed9f6cd 1848 if (UNIT_IS_INACTIVE_OR_FAILED(os) != UNIT_IS_INACTIVE_OR_FAILED(ns)) {
b33918c2
LP
1849 ExecContext *ec;
1850
1851 ec = unit_get_exec_context(u);
7ed9f6cd 1852 if (ec && exec_context_may_touch_console(ec)) {
31a7eb86
ZJS
1853 if (UNIT_IS_INACTIVE_OR_FAILED(ns)) {
1854 m->n_on_console --;
1855
1856 if (m->n_on_console == 0)
1857 /* unset no_console_output flag, since the console is free */
2f38577f 1858 m->no_console_output = false;
31a7eb86
ZJS
1859 } else
1860 m->n_on_console ++;
7ed9f6cd
MS
1861 }
1862 }
1863
ac155bb8 1864 if (u->job) {
7e6e7b06 1865 unexpected = false;
87f0e418 1866
ac155bb8 1867 if (u->job->state == JOB_WAITING)
87f0e418
LP
1868
1869 /* So we reached a different state for this
1870 * job. Let's see if we can run it now if it
1871 * failed previously due to EAGAIN. */
ac155bb8 1872 job_add_to_run_queue(u->job);
87f0e418 1873
b410e6b9 1874 /* Let's check whether this state change constitutes a
35b8ca3a 1875 * finished job, or maybe contradicts a running job and
b410e6b9 1876 * hence needs to invalidate jobs. */
87f0e418 1877
ac155bb8 1878 switch (u->job->type) {
87f0e418 1879
b410e6b9
LP
1880 case JOB_START:
1881 case JOB_VERIFY_ACTIVE:
87f0e418 1882
b410e6b9 1883 if (UNIT_IS_ACTIVE_OR_RELOADING(ns))
5273510e 1884 job_finish_and_invalidate(u->job, JOB_DONE, true);
ac155bb8 1885 else if (u->job->state == JOB_RUNNING && ns != UNIT_ACTIVATING) {
b410e6b9 1886 unexpected = true;
41b02ec7 1887
fdf20a31 1888 if (UNIT_IS_INACTIVE_OR_FAILED(ns))
5273510e 1889 job_finish_and_invalidate(u->job, ns == UNIT_FAILED ? JOB_FAILED : JOB_DONE, true);
b410e6b9 1890 }
87f0e418 1891
b410e6b9 1892 break;
87f0e418 1893
b410e6b9
LP
1894 case JOB_RELOAD:
1895 case JOB_RELOAD_OR_START:
87f0e418 1896
ac155bb8 1897 if (u->job->state == JOB_RUNNING) {
a096ed36 1898 if (ns == UNIT_ACTIVE)
5273510e 1899 job_finish_and_invalidate(u->job, reload_success ? JOB_DONE : JOB_FAILED, true);
032ff4af 1900 else if (ns != UNIT_ACTIVATING && ns != UNIT_RELOADING) {
a096ed36 1901 unexpected = true;
41b02ec7 1902
fdf20a31 1903 if (UNIT_IS_INACTIVE_OR_FAILED(ns))
5273510e 1904 job_finish_and_invalidate(u->job, ns == UNIT_FAILED ? JOB_FAILED : JOB_DONE, true);
a096ed36 1905 }
b410e6b9 1906 }
87f0e418 1907
b410e6b9 1908 break;
87f0e418 1909
b410e6b9
LP
1910 case JOB_STOP:
1911 case JOB_RESTART:
1912 case JOB_TRY_RESTART:
87f0e418 1913
fdf20a31 1914 if (UNIT_IS_INACTIVE_OR_FAILED(ns))
5273510e 1915 job_finish_and_invalidate(u->job, JOB_DONE, true);
ac155bb8 1916 else if (u->job->state == JOB_RUNNING && ns != UNIT_DEACTIVATING) {
b410e6b9 1917 unexpected = true;
5273510e 1918 job_finish_and_invalidate(u->job, JOB_FAILED, true);
b410e6b9 1919 }
87f0e418 1920
b410e6b9 1921 break;
87f0e418 1922
b410e6b9
LP
1923 default:
1924 assert_not_reached("Job type unknown");
87f0e418 1925 }
87f0e418 1926
7e6e7b06
LP
1927 } else
1928 unexpected = true;
1929
546ac4f0 1930 if (m->n_reloading <= 0) {
f3bff0eb 1931
bdbf9951
LP
1932 /* If this state change happened without being
1933 * requested by a job, then let's retroactively start
1934 * or stop dependencies. We skip that step when
1935 * deserializing, since we don't want to create any
1936 * additional jobs just because something is already
1937 * activated. */
1938
1939 if (unexpected) {
1940 if (UNIT_IS_INACTIVE_OR_FAILED(os) && UNIT_IS_ACTIVE_OR_ACTIVATING(ns))
1941 retroactively_start_dependencies(u);
1942 else if (UNIT_IS_ACTIVE_OR_ACTIVATING(os) && UNIT_IS_INACTIVE_OR_DEACTIVATING(ns))
1943 retroactively_stop_dependencies(u);
1944 }
5de9682c 1945
cd0504d0 1946 /* stop unneeded units regardless if going down was expected or not */
b33918c2 1947 if (UNIT_IS_INACTIVE_OR_DEACTIVATING(ns))
cd0504d0
MS
1948 check_unneeded_dependencies(u);
1949
bdbf9951 1950 if (ns != os && ns == UNIT_FAILED) {
f2341e0a 1951 log_unit_notice(u, "Unit entered failed state.");
3ecaa09b 1952 unit_start_on_failure(u);
cd6d0a45 1953 }
3b2775c5 1954 }
e537352b 1955
3b2775c5
LP
1956 /* Some names are special */
1957 if (UNIT_IS_ACTIVE_OR_RELOADING(ns)) {
1958
1959 if (unit_has_name(u, SPECIAL_DBUS_SERVICE))
865cc19a 1960 /* The bus might have just become available,
3b2775c5
LP
1961 * hence try to connect to it, if we aren't
1962 * yet connected. */
546ac4f0 1963 bus_init(m, true);
3b2775c5 1964
ac155bb8 1965 if (u->type == UNIT_SERVICE &&
3b2775c5 1966 !UNIT_IS_ACTIVE_OR_RELOADING(os) &&
546ac4f0 1967 m->n_reloading <= 0) {
3b2775c5 1968 /* Write audit record if we have just finished starting up */
546ac4f0 1969 manager_send_unit_audit(m, u, AUDIT_SERVICE_START, true);
ac155bb8 1970 u->in_audit = true;
3b2775c5 1971 }
e983b760 1972
3b2775c5 1973 if (!UNIT_IS_ACTIVE_OR_RELOADING(os))
546ac4f0 1974 manager_send_unit_plymouth(m, u);
bdbf9951 1975
3b2775c5 1976 } else {
bdbf9951 1977
3b2775c5
LP
1978 /* We don't care about D-Bus here, since we'll get an
1979 * asynchronous notification for it anyway. */
cd6d0a45 1980
ac155bb8 1981 if (u->type == UNIT_SERVICE &&
3b2775c5
LP
1982 UNIT_IS_INACTIVE_OR_FAILED(ns) &&
1983 !UNIT_IS_INACTIVE_OR_FAILED(os) &&
546ac4f0 1984 m->n_reloading <= 0) {
4927fcae 1985
3b2775c5
LP
1986 /* Hmm, if there was no start record written
1987 * write it now, so that we always have a nice
1988 * pair */
ac155bb8 1989 if (!u->in_audit) {
546ac4f0 1990 manager_send_unit_audit(m, u, AUDIT_SERVICE_START, ns == UNIT_INACTIVE);
cd6d0a45 1991
3b2775c5 1992 if (ns == UNIT_INACTIVE)
546ac4f0 1993 manager_send_unit_audit(m, u, AUDIT_SERVICE_STOP, true);
3b2775c5
LP
1994 } else
1995 /* Write audit record if we have just finished shutting down */
546ac4f0 1996 manager_send_unit_audit(m, u, AUDIT_SERVICE_STOP, ns == UNIT_INACTIVE);
bdbf9951 1997
ac155bb8 1998 u->in_audit = false;
cd6d0a45 1999 }
f278026d
LP
2000 }
2001
546ac4f0 2002 manager_recheck_journal(m);
3ecaa09b 2003 unit_trigger_notify(u);
3b2775c5 2004
ff502445
LP
2005 if (u->manager->n_reloading <= 0) {
2006 /* Maybe we finished startup and are now ready for
2007 * being stopped because unneeded? */
bf6dcfa6 2008 unit_check_unneeded(u);
c1e1601e 2009
ff502445
LP
2010 /* Maybe we finished startup, but something we needed
2011 * has vanished? Let's die then. (This happens when
2012 * something BindsTo= to a Type=oneshot unit, as these
2013 * units go directly from starting to inactive,
2014 * without ever entering started.) */
2015 unit_check_binds_to(u);
2016 }
2017
c1e1601e 2018 unit_add_to_dbus_queue(u);
701cc384 2019 unit_add_to_gc_queue(u);
87f0e418
LP
2020}
2021
87f0e418 2022int unit_watch_pid(Unit *u, pid_t pid) {
a911bb9a
LP
2023 int q, r;
2024
87f0e418
LP
2025 assert(u);
2026 assert(pid >= 1);
2027
5ba6985b
LP
2028 /* Watch a specific PID. We only support one or two units
2029 * watching each PID for now, not more. */
2030
d5099efc 2031 r = set_ensure_allocated(&u->pids, NULL);
5ba6985b
LP
2032 if (r < 0)
2033 return r;
2034
d5099efc 2035 r = hashmap_ensure_allocated(&u->manager->watch_pids1, NULL);
a911bb9a
LP
2036 if (r < 0)
2037 return r;
2038
fea72cc0 2039 r = hashmap_put(u->manager->watch_pids1, PID_TO_PTR(pid), u);
5ba6985b 2040 if (r == -EEXIST) {
d5099efc 2041 r = hashmap_ensure_allocated(&u->manager->watch_pids2, NULL);
5ba6985b
LP
2042 if (r < 0)
2043 return r;
05e343b7 2044
fea72cc0 2045 r = hashmap_put(u->manager->watch_pids2, PID_TO_PTR(pid), u);
5ba6985b 2046 }
a911bb9a 2047
fea72cc0 2048 q = set_put(u->pids, PID_TO_PTR(pid));
a911bb9a
LP
2049 if (q < 0)
2050 return q;
2051
2052 return r;
87f0e418
LP
2053}
2054
2055void unit_unwatch_pid(Unit *u, pid_t pid) {
2056 assert(u);
2057 assert(pid >= 1);
2058
fea72cc0
LP
2059 (void) hashmap_remove_value(u->manager->watch_pids1, PID_TO_PTR(pid), u);
2060 (void) hashmap_remove_value(u->manager->watch_pids2, PID_TO_PTR(pid), u);
2061 (void) set_remove(u->pids, PID_TO_PTR(pid));
a911bb9a
LP
2062}
2063
bd44e61b
LP
2064void unit_unwatch_all_pids(Unit *u) {
2065 assert(u);
2066
2067 while (!set_isempty(u->pids))
fea72cc0 2068 unit_unwatch_pid(u, PTR_TO_PID(set_first(u->pids)));
bd44e61b 2069
efdb0237 2070 u->pids = set_free(u->pids);
a911bb9a
LP
2071}
2072
2073void unit_tidy_watch_pids(Unit *u, pid_t except1, pid_t except2) {
2074 Iterator i;
2075 void *e;
2076
2077 assert(u);
2078
2079 /* Cleans dead PIDs from our list */
2080
2081 SET_FOREACH(e, u->pids, i) {
fea72cc0 2082 pid_t pid = PTR_TO_PID(e);
a911bb9a
LP
2083
2084 if (pid == except1 || pid == except2)
2085 continue;
2086
9f5650ae 2087 if (!pid_is_unwaited(pid))
bd44e61b 2088 unit_unwatch_pid(u, pid);
a911bb9a 2089 }
87f0e418
LP
2090}
2091
87f0e418
LP
2092bool unit_job_is_applicable(Unit *u, JobType j) {
2093 assert(u);
2094 assert(j >= 0 && j < _JOB_TYPE_MAX);
2095
2096 switch (j) {
2097
2098 case JOB_VERIFY_ACTIVE:
2099 case JOB_START:
57339f47 2100 case JOB_STOP:
e0209d83 2101 case JOB_NOP:
87f0e418
LP
2102 return true;
2103
87f0e418
LP
2104 case JOB_RESTART:
2105 case JOB_TRY_RESTART:
2106 return unit_can_start(u);
2107
2108 case JOB_RELOAD:
2109 return unit_can_reload(u);
2110
2111 case JOB_RELOAD_OR_START:
2112 return unit_can_reload(u) && unit_can_start(u);
2113
2114 default:
2115 assert_not_reached("Invalid job type");
2116 }
2117}
2118
f2341e0a
LP
2119static void maybe_warn_about_dependency(Unit *u, const char *other, UnitDependency dependency) {
2120 assert(u);
d1fab3fe 2121
f2341e0a
LP
2122 /* Only warn about some unit types */
2123 if (!IN_SET(dependency, UNIT_CONFLICTS, UNIT_CONFLICTED_BY, UNIT_BEFORE, UNIT_AFTER, UNIT_ON_FAILURE, UNIT_TRIGGERS, UNIT_TRIGGERED_BY))
2124 return;
3f3cc397 2125
f2341e0a
LP
2126 if (streq_ptr(u->id, other))
2127 log_unit_warning(u, "Dependency %s=%s dropped", unit_dependency_to_string(dependency), u->id);
2128 else
2129 log_unit_warning(u, "Dependency %s=%s dropped, merged into %s", unit_dependency_to_string(dependency), strna(other), u->id);
d1fab3fe
ZJS
2130}
2131
701cc384 2132int unit_add_dependency(Unit *u, UnitDependency d, Unit *other, bool add_reference) {
87f0e418
LP
2133
2134 static const UnitDependency inverse_table[_UNIT_DEPENDENCY_MAX] = {
2135 [UNIT_REQUIRES] = UNIT_REQUIRED_BY,
87f0e418 2136 [UNIT_WANTS] = UNIT_WANTED_BY,
be7d9ff7 2137 [UNIT_REQUISITE] = UNIT_REQUISITE_OF,
7f2cddae 2138 [UNIT_BINDS_TO] = UNIT_BOUND_BY,
60649f17 2139 [UNIT_PART_OF] = UNIT_CONSISTS_OF,
be7d9ff7 2140 [UNIT_REQUIRED_BY] = UNIT_REQUIRES,
be7d9ff7 2141 [UNIT_REQUISITE_OF] = UNIT_REQUISITE,
be7d9ff7 2142 [UNIT_WANTED_BY] = UNIT_WANTS,
7f2cddae 2143 [UNIT_BOUND_BY] = UNIT_BINDS_TO,
60649f17 2144 [UNIT_CONSISTS_OF] = UNIT_PART_OF,
69dd2852
LP
2145 [UNIT_CONFLICTS] = UNIT_CONFLICTED_BY,
2146 [UNIT_CONFLICTED_BY] = UNIT_CONFLICTS,
87f0e418 2147 [UNIT_BEFORE] = UNIT_AFTER,
701cc384 2148 [UNIT_AFTER] = UNIT_BEFORE,
5de9682c 2149 [UNIT_ON_FAILURE] = _UNIT_DEPENDENCY_INVALID,
701cc384 2150 [UNIT_REFERENCES] = UNIT_REFERENCED_BY,
57020a3a
LP
2151 [UNIT_REFERENCED_BY] = UNIT_REFERENCES,
2152 [UNIT_TRIGGERS] = UNIT_TRIGGERED_BY,
4dcc1cb4 2153 [UNIT_TRIGGERED_BY] = UNIT_TRIGGERS,
7f2cddae 2154 [UNIT_PROPAGATES_RELOAD_TO] = UNIT_RELOAD_PROPAGATED_FROM,
85e9a101 2155 [UNIT_RELOAD_PROPAGATED_FROM] = UNIT_PROPAGATES_RELOAD_TO,
613b411c 2156 [UNIT_JOINS_NAMESPACE_OF] = UNIT_JOINS_NAMESPACE_OF,
87f0e418 2157 };
701cc384 2158 int r, q = 0, v = 0, w = 0;
d1fab3fe 2159 Unit *orig_u = u, *orig_other = other;
87f0e418
LP
2160
2161 assert(u);
2162 assert(d >= 0 && d < _UNIT_DEPENDENCY_MAX);
87f0e418
LP
2163 assert(other);
2164
9f151f29
LP
2165 u = unit_follow_merge(u);
2166 other = unit_follow_merge(other);
2167
87f0e418
LP
2168 /* We won't allow dependencies on ourselves. We will not
2169 * consider them an error however. */
d1fab3fe 2170 if (u == other) {
f2341e0a 2171 maybe_warn_about_dependency(orig_u, orig_other->id, d);
87f0e418 2172 return 0;
d1fab3fe 2173 }
87f0e418 2174
d5099efc 2175 r = set_ensure_allocated(&u->dependencies[d], NULL);
613b411c 2176 if (r < 0)
87f0e418
LP
2177 return r;
2178
613b411c 2179 if (inverse_table[d] != _UNIT_DEPENDENCY_INVALID) {
d5099efc 2180 r = set_ensure_allocated(&other->dependencies[inverse_table[d]], NULL);
613b411c
LP
2181 if (r < 0)
2182 return r;
2183 }
2184
2185 if (add_reference) {
d5099efc 2186 r = set_ensure_allocated(&u->dependencies[UNIT_REFERENCES], NULL);
613b411c 2187 if (r < 0)
5de9682c
LP
2188 return r;
2189
d5099efc 2190 r = set_ensure_allocated(&other->dependencies[UNIT_REFERENCED_BY], NULL);
613b411c 2191 if (r < 0)
701cc384 2192 return r;
613b411c 2193 }
87f0e418 2194
613b411c
LP
2195 q = set_put(u->dependencies[d], other);
2196 if (q < 0)
701cc384 2197 return q;
87f0e418 2198
613b411c
LP
2199 if (inverse_table[d] != _UNIT_DEPENDENCY_INVALID && inverse_table[d] != d) {
2200 v = set_put(other->dependencies[inverse_table[d]], u);
2201 if (v < 0) {
5de9682c
LP
2202 r = v;
2203 goto fail;
2204 }
613b411c 2205 }
701cc384
LP
2206
2207 if (add_reference) {
613b411c
LP
2208 w = set_put(u->dependencies[UNIT_REFERENCES], other);
2209 if (w < 0) {
701cc384
LP
2210 r = w;
2211 goto fail;
2212 }
2213
613b411c
LP
2214 r = set_put(other->dependencies[UNIT_REFERENCED_BY], u);
2215 if (r < 0)
701cc384 2216 goto fail;
87f0e418
LP
2217 }
2218
c1e1601e 2219 unit_add_to_dbus_queue(u);
87f0e418 2220 return 0;
701cc384
LP
2221
2222fail:
2223 if (q > 0)
ac155bb8 2224 set_remove(u->dependencies[d], other);
701cc384
LP
2225
2226 if (v > 0)
ac155bb8 2227 set_remove(other->dependencies[inverse_table[d]], u);
701cc384
LP
2228
2229 if (w > 0)
ac155bb8 2230 set_remove(u->dependencies[UNIT_REFERENCES], other);
701cc384
LP
2231
2232 return r;
87f0e418 2233}
0301abf4 2234
2c966c03
LP
2235int unit_add_two_dependencies(Unit *u, UnitDependency d, UnitDependency e, Unit *other, bool add_reference) {
2236 int r;
2237
2238 assert(u);
2239
3f3cc397
LP
2240 r = unit_add_dependency(u, d, other, add_reference);
2241 if (r < 0)
2c966c03
LP
2242 return r;
2243
7410616c 2244 return unit_add_dependency(u, e, other, add_reference);
2c966c03
LP
2245}
2246
7410616c
LP
2247static int resolve_template(Unit *u, const char *name, const char*path, char **buf, const char **ret) {
2248 int r;
9e2f7c11
LP
2249
2250 assert(u);
2251 assert(name || path);
7410616c
LP
2252 assert(buf);
2253 assert(ret);
9e2f7c11
LP
2254
2255 if (!name)
2b6bf07d 2256 name = basename(path);
9e2f7c11 2257
7410616c
LP
2258 if (!unit_name_is_valid(name, UNIT_NAME_TEMPLATE)) {
2259 *buf = NULL;
2260 *ret = name;
2261 return 0;
9e2f7c11
LP
2262 }
2263
ac155bb8 2264 if (u->instance)
7410616c 2265 r = unit_name_replace_instance(name, u->instance, buf);
9e2f7c11 2266 else {
ae018d9b 2267 _cleanup_free_ char *i = NULL;
9e2f7c11 2268
7410616c
LP
2269 r = unit_name_to_prefix(u->id, &i);
2270 if (r < 0)
2271 return r;
9e2f7c11 2272
7410616c 2273 r = unit_name_replace_instance(name, i, buf);
9e2f7c11 2274 }
7410616c
LP
2275 if (r < 0)
2276 return r;
9e2f7c11 2277
7410616c
LP
2278 *ret = *buf;
2279 return 0;
9e2f7c11
LP
2280}
2281
701cc384 2282int unit_add_dependency_by_name(Unit *u, UnitDependency d, const char *name, const char *path, bool add_reference) {
7410616c 2283 _cleanup_free_ char *buf = NULL;
09b6b09f
LP
2284 Unit *other;
2285 int r;
2286
9e2f7c11
LP
2287 assert(u);
2288 assert(name || path);
09b6b09f 2289
7410616c
LP
2290 r = resolve_template(u, name, path, &buf, &name);
2291 if (r < 0)
2292 return r;
09b6b09f 2293
8afbb8e1
LP
2294 r = manager_load_unit(u->manager, name, path, NULL, &other);
2295 if (r < 0)
2296 return r;
9e2f7c11 2297
8afbb8e1 2298 return unit_add_dependency(u, d, other, add_reference);
09b6b09f
LP
2299}
2300
2c966c03 2301int unit_add_two_dependencies_by_name(Unit *u, UnitDependency d, UnitDependency e, const char *name, const char *path, bool add_reference) {
7410616c 2302 _cleanup_free_ char *buf = NULL;
2c966c03
LP
2303 Unit *other;
2304 int r;
2c966c03
LP
2305
2306 assert(u);
2307 assert(name || path);
2308
7410616c
LP
2309 r = resolve_template(u, name, path, &buf, &name);
2310 if (r < 0)
2311 return r;
2c966c03 2312
3f3cc397
LP
2313 r = manager_load_unit(u->manager, name, path, NULL, &other);
2314 if (r < 0)
68eda4bd 2315 return r;
2c966c03 2316
3f3cc397 2317 return unit_add_two_dependencies(u, d, e, other, add_reference);
2c966c03
LP
2318}
2319
0301abf4 2320int set_unit_path(const char *p) {
0301abf4 2321 /* This is mostly for debug purposes */
cbe46ead 2322 if (setenv("SYSTEMD_UNIT_PATH", p, 1) < 0)
26d04f86 2323 return -errno;
0301abf4
LP
2324
2325 return 0;
2326}
88066b3a 2327
ea430986 2328char *unit_dbus_path(Unit *u) {
ea430986
LP
2329 assert(u);
2330
ac155bb8 2331 if (!u->id)
04ade7d2
LP
2332 return NULL;
2333
48899192 2334 return unit_dbus_path_from_name(u->id);
ea430986
LP
2335}
2336
d79200e2
LP
2337int unit_set_slice(Unit *u, Unit *slice) {
2338 assert(u);
2339 assert(slice);
2340
2341 /* Sets the unit slice if it has not been set before. Is extra
2342 * careful, to only allow this for units that actually have a
2343 * cgroup context. Also, we don't allow to set this for slices
2344 * (since the parent slice is derived from the name). Make
2345 * sure the unit we set is actually a slice. */
2346
2347 if (!UNIT_HAS_CGROUP_CONTEXT(u))
2348 return -EOPNOTSUPP;
2349
2350 if (u->type == UNIT_SLICE)
2351 return -EINVAL;
2352
102ef982
LP
2353 if (unit_active_state(u) != UNIT_INACTIVE)
2354 return -EBUSY;
2355
d79200e2
LP
2356 if (slice->type != UNIT_SLICE)
2357 return -EINVAL;
2358
efdb0237
LP
2359 if (unit_has_name(u, SPECIAL_INIT_SCOPE) &&
2360 !unit_has_name(slice, SPECIAL_ROOT_SLICE))
2361 return -EPERM;
2362
d79200e2
LP
2363 if (UNIT_DEREF(u->slice) == slice)
2364 return 0;
2365
2366 if (UNIT_ISSET(u->slice))
2367 return -EBUSY;
2368
2369 unit_ref_set(&u->slice, slice);
2370 return 1;
2371}
2372
2373int unit_set_default_slice(Unit *u) {
a8833944
LP
2374 _cleanup_free_ char *b = NULL;
2375 const char *slice_name;
a016b922
LP
2376 Unit *slice;
2377 int r;
2378
2379 assert(u);
2380
9444b1f2 2381 if (UNIT_ISSET(u->slice))
a016b922
LP
2382 return 0;
2383
a8833944
LP
2384 if (u->instance) {
2385 _cleanup_free_ char *prefix = NULL, *escaped = NULL;
68eda4bd 2386
a8833944
LP
2387 /* Implicitly place all instantiated units in their
2388 * own per-template slice */
2389
7410616c
LP
2390 r = unit_name_to_prefix(u->id, &prefix);
2391 if (r < 0)
2392 return r;
a8833944
LP
2393
2394 /* The prefix is already escaped, but it might include
2395 * "-" which has a special meaning for slice units,
2396 * hence escape it here extra. */
7410616c 2397 escaped = unit_name_escape(prefix);
a8833944
LP
2398 if (!escaped)
2399 return -ENOMEM;
2400
b2c23da8 2401 if (u->manager->running_as == MANAGER_SYSTEM)
a8833944
LP
2402 b = strjoin("system-", escaped, ".slice", NULL);
2403 else
2404 b = strappend(escaped, ".slice");
2405 if (!b)
2406 return -ENOMEM;
2407
2408 slice_name = b;
2409 } else
2410 slice_name =
efdb0237 2411 u->manager->running_as == MANAGER_SYSTEM && !unit_has_name(u, SPECIAL_INIT_SCOPE)
a8833944
LP
2412 ? SPECIAL_SYSTEM_SLICE
2413 : SPECIAL_ROOT_SLICE;
2414
2415 r = manager_load_unit(u->manager, slice_name, NULL, NULL, &slice);
a016b922
LP
2416 if (r < 0)
2417 return r;
2418
d79200e2 2419 return unit_set_slice(u, slice);
a016b922
LP
2420}
2421
9444b1f2
LP
2422const char *unit_slice_name(Unit *u) {
2423 assert(u);
2424
2425 if (!UNIT_ISSET(u->slice))
2426 return NULL;
2427
2428 return UNIT_DEREF(u->slice)->id;
2429}
2430
f6ff8c29 2431int unit_load_related_unit(Unit *u, const char *type, Unit **_found) {
78edb35a 2432 _cleanup_free_ char *t = NULL;
f6ff8c29
LP
2433 int r;
2434
2435 assert(u);
2436 assert(type);
2437 assert(_found);
2438
7410616c
LP
2439 r = unit_name_change_suffix(u->id, type, &t);
2440 if (r < 0)
2441 return r;
2442 if (unit_has_name(u, t))
2443 return -EINVAL;
f6ff8c29 2444
ac155bb8 2445 r = manager_load_unit(u->manager, t, NULL, NULL, _found);
9e2f7c11 2446 assert(r < 0 || *_found != u);
f6ff8c29
LP
2447 return r;
2448}
2449
bbc29086
DM
2450static int signal_name_owner_changed(sd_bus_message *message, void *userdata, sd_bus_error *error) {
2451 const char *name, *old_owner, *new_owner;
2452 Unit *u = userdata;
2453 int r;
2454
2455 assert(message);
2456 assert(u);
2457
2458 r = sd_bus_message_read(message, "sss", &name, &old_owner, &new_owner);
2459 if (r < 0) {
2460 bus_log_parse_error(r);
2461 return 0;
2462 }
2463
2464 if (UNIT_VTABLE(u)->bus_name_owner_change)
2465 UNIT_VTABLE(u)->bus_name_owner_change(u, name, old_owner, new_owner);
2466
2467 return 0;
2468}
2469
9806e87d
LP
2470int unit_install_bus_match(Unit *u, sd_bus *bus, const char *name) {
2471 const char *match;
bbc29086 2472
9806e87d
LP
2473 assert(u);
2474 assert(bus);
2475 assert(name);
bbc29086
DM
2476
2477 if (u->match_bus_slot)
2478 return -EBUSY;
2479
9806e87d 2480 match = strjoina("type='signal',"
bbc29086
DM
2481 "sender='org.freedesktop.DBus',"
2482 "path='/org/freedesktop/DBus',"
2483 "interface='org.freedesktop.DBus',"
2484 "member='NameOwnerChanged',"
9806e87d 2485 "arg0='", name, "'",
bbc29086 2486 NULL);
bbc29086
DM
2487
2488 return sd_bus_add_match(bus, &u->match_bus_slot, match, signal_name_owner_changed, u);
2489}
2490
05e343b7 2491int unit_watch_bus_name(Unit *u, const char *name) {
bbc29086
DM
2492 int r;
2493
05e343b7
LP
2494 assert(u);
2495 assert(name);
2496
2497 /* Watch a specific name on the bus. We only support one unit
2498 * watching each name for now. */
2499
bbc29086
DM
2500 if (u->manager->api_bus) {
2501 /* If the bus is already available, install the match directly.
2502 * Otherwise, just put the name in the list. bus_setup_api() will take care later. */
9806e87d 2503 r = unit_install_bus_match(u, u->manager->api_bus, name);
bbc29086 2504 if (r < 0)
8ea823b6 2505 return log_warning_errno(r, "Failed to subscribe to NameOwnerChanged signal for '%s': %m", name);
bbc29086
DM
2506 }
2507
2508 r = hashmap_put(u->manager->watch_bus, name, u);
2509 if (r < 0) {
2510 u->match_bus_slot = sd_bus_slot_unref(u->match_bus_slot);
2511 return log_warning_errno(r, "Failed to put bus name to hashmap: %m");
2512 }
2513
2514 return 0;
05e343b7
LP
2515}
2516
2517void unit_unwatch_bus_name(Unit *u, const char *name) {
2518 assert(u);
2519 assert(name);
2520
ac155bb8 2521 hashmap_remove_value(u->manager->watch_bus, name, u);
bbc29086 2522 u->match_bus_slot = sd_bus_slot_unref(u->match_bus_slot);
05e343b7
LP
2523}
2524
a16e1123
LP
2525bool unit_can_serialize(Unit *u) {
2526 assert(u);
2527
2528 return UNIT_VTABLE(u)->serialize && UNIT_VTABLE(u)->deserialize_item;
2529}
2530
6b78f9b4 2531int unit_serialize(Unit *u, FILE *f, FDSet *fds, bool serialize_jobs) {
a16e1123
LP
2532 int r;
2533
2534 assert(u);
2535 assert(f);
2536 assert(fds);
2537
9bdb98c5
LP
2538 if (unit_can_serialize(u)) {
2539 ExecRuntime *rt;
a16e1123 2540
9bdb98c5 2541 r = UNIT_VTABLE(u)->serialize(u, f, fds);
613b411c
LP
2542 if (r < 0)
2543 return r;
9bdb98c5
LP
2544
2545 rt = unit_get_exec_runtime(u);
2546 if (rt) {
f2341e0a 2547 r = exec_runtime_serialize(u, rt, f, fds);
9bdb98c5
LP
2548 if (r < 0)
2549 return r;
2550 }
e0209d83
MS
2551 }
2552
ac155bb8
MS
2553 dual_timestamp_serialize(f, "inactive-exit-timestamp", &u->inactive_exit_timestamp);
2554 dual_timestamp_serialize(f, "active-enter-timestamp", &u->active_enter_timestamp);
2555 dual_timestamp_serialize(f, "active-exit-timestamp", &u->active_exit_timestamp);
2556 dual_timestamp_serialize(f, "inactive-enter-timestamp", &u->inactive_enter_timestamp);
2557 dual_timestamp_serialize(f, "condition-timestamp", &u->condition_timestamp);
59fccdc5 2558 dual_timestamp_serialize(f, "assert-timestamp", &u->assert_timestamp);
2791a8f8 2559
ac155bb8
MS
2560 if (dual_timestamp_is_set(&u->condition_timestamp))
2561 unit_serialize_item(u, f, "condition-result", yes_no(u->condition_result));
10717a1a 2562
59fccdc5
LP
2563 if (dual_timestamp_is_set(&u->assert_timestamp))
2564 unit_serialize_item(u, f, "assert-result", yes_no(u->assert_result));
2565
c2756a68 2566 unit_serialize_item(u, f, "transient", yes_no(u->transient));
5ad096b3 2567 unit_serialize_item_format(u, f, "cpuacct-usage-base", "%" PRIu64, u->cpuacct_usage_base);
c2756a68
LP
2568
2569 if (u->cgroup_path)
2570 unit_serialize_item(u, f, "cgroup", u->cgroup_path);
de1d4f9b 2571 unit_serialize_item(u, f, "cgroup-realized", yes_no(u->cgroup_realized));
c2756a68 2572
32ee7d33
DM
2573 if (u->cgroup_netclass_id)
2574 unit_serialize_item_format(u, f, "netclass-id", "%" PRIu32, u->cgroup_netclass_id);
2575
613b411c
LP
2576 if (serialize_jobs) {
2577 if (u->job) {
2578 fprintf(f, "job\n");
2579 job_serialize(u->job, f, fds);
2580 }
2581
2582 if (u->nop_job) {
2583 fprintf(f, "job\n");
2584 job_serialize(u->nop_job, f, fds);
2585 }
2586 }
2587
a16e1123
LP
2588 /* End marker */
2589 fputc('\n', f);
2590 return 0;
2591}
2592
a34ceba6
LP
2593int unit_serialize_item(Unit *u, FILE *f, const char *key, const char *value) {
2594 assert(u);
2595 assert(f);
2596 assert(key);
2597
2598 if (!value)
2599 return 0;
2600
2601 fputs(key, f);
2602 fputc('=', f);
2603 fputs(value, f);
2604 fputc('\n', f);
2605
2606 return 1;
2607}
2608
2609int unit_serialize_item_escaped(Unit *u, FILE *f, const char *key, const char *value) {
2610 _cleanup_free_ char *c = NULL;
2611
2612 assert(u);
2613 assert(f);
2614 assert(key);
2615
2616 if (!value)
2617 return 0;
2618
2619 c = cescape(value);
2620 if (!c)
2621 return -ENOMEM;
2622
2623 fputs(key, f);
2624 fputc('=', f);
2625 fputs(c, f);
2626 fputc('\n', f);
2627
2628 return 1;
2629}
2630
2631int unit_serialize_item_fd(Unit *u, FILE *f, FDSet *fds, const char *key, int fd) {
2632 int copy;
2633
2634 assert(u);
2635 assert(f);
2636 assert(key);
2637
2638 if (fd < 0)
2639 return 0;
2640
2641 copy = fdset_put_dup(fds, fd);
2642 if (copy < 0)
2643 return copy;
2644
2645 fprintf(f, "%s=%i\n", key, copy);
2646 return 1;
2647}
2648
a16e1123
LP
2649void unit_serialize_item_format(Unit *u, FILE *f, const char *key, const char *format, ...) {
2650 va_list ap;
2651
2652 assert(u);
2653 assert(f);
2654 assert(key);
2655 assert(format);
2656
2657 fputs(key, f);
2658 fputc('=', f);
2659
2660 va_start(ap, format);
2661 vfprintf(f, format, ap);
2662 va_end(ap);
2663
2664 fputc('\n', f);
2665}
2666
a16e1123 2667int unit_deserialize(Unit *u, FILE *f, FDSet *fds) {
28b99ccd 2668 ExecRuntime **rt = NULL;
9bdb98c5 2669 size_t offset;
a16e1123
LP
2670 int r;
2671
2672 assert(u);
2673 assert(f);
2674 assert(fds);
2675
613b411c
LP
2676 offset = UNIT_VTABLE(u)->exec_runtime_offset;
2677 if (offset > 0)
2678 rt = (ExecRuntime**) ((uint8_t*) u + offset);
2679
a16e1123 2680 for (;;) {
20c03b7b 2681 char line[LINE_MAX], *l, *v;
a16e1123
LP
2682 size_t k;
2683
2684 if (!fgets(line, sizeof(line), f)) {
2685 if (feof(f))
2686 return 0;
2687 return -errno;
2688 }
2689
10f8e83c 2690 char_array_0(line);
a16e1123
LP
2691 l = strstrip(line);
2692
2693 /* End marker */
e911de99 2694 if (isempty(l))
a16e1123
LP
2695 return 0;
2696
2697 k = strcspn(l, "=");
2698
2699 if (l[k] == '=') {
2700 l[k] = 0;
2701 v = l+k+1;
2702 } else
2703 v = l+k;
2704
cca098b0 2705 if (streq(l, "job")) {
39a18c60
MS
2706 if (v[0] == '\0') {
2707 /* new-style serialized job */
9c3349e2
LP
2708 Job *j;
2709
2710 j = job_new_raw(u);
39a18c60 2711 if (!j)
e911de99 2712 return log_oom();
39a18c60
MS
2713
2714 r = job_deserialize(j, f, fds);
2715 if (r < 0) {
2716 job_free(j);
2717 return r;
2718 }
cca098b0 2719
39a18c60
MS
2720 r = hashmap_put(u->manager->jobs, UINT32_TO_PTR(j->id), j);
2721 if (r < 0) {
2722 job_free(j);
2723 return r;
2724 }
e0209d83
MS
2725
2726 r = job_install_deserialized(j);
2727 if (r < 0) {
2728 hashmap_remove(u->manager->jobs, UINT32_TO_PTR(j->id));
2729 job_free(j);
2730 return r;
2731 }
ed10fa8c
LP
2732 } else /* legacy for pre-44 */
2733 log_unit_warning(u, "Update from too old systemd versions are unsupported, cannot deserialize job: %s", v);
cca098b0 2734 continue;
8aaf019b 2735 } else if (streq(l, "inactive-exit-timestamp")) {
ac155bb8 2736 dual_timestamp_deserialize(v, &u->inactive_exit_timestamp);
8aaf019b
LP
2737 continue;
2738 } else if (streq(l, "active-enter-timestamp")) {
ac155bb8 2739 dual_timestamp_deserialize(v, &u->active_enter_timestamp);
8aaf019b
LP
2740 continue;
2741 } else if (streq(l, "active-exit-timestamp")) {
ac155bb8 2742 dual_timestamp_deserialize(v, &u->active_exit_timestamp);
8aaf019b
LP
2743 continue;
2744 } else if (streq(l, "inactive-enter-timestamp")) {
ac155bb8 2745 dual_timestamp_deserialize(v, &u->inactive_enter_timestamp);
8aaf019b 2746 continue;
2791a8f8 2747 } else if (streq(l, "condition-timestamp")) {
ac155bb8 2748 dual_timestamp_deserialize(v, &u->condition_timestamp);
2791a8f8 2749 continue;
59fccdc5
LP
2750 } else if (streq(l, "assert-timestamp")) {
2751 dual_timestamp_deserialize(v, &u->assert_timestamp);
2752 continue;
2791a8f8 2753 } else if (streq(l, "condition-result")) {
2791a8f8 2754
e911de99
LP
2755 r = parse_boolean(v);
2756 if (r < 0)
f2341e0a 2757 log_unit_debug(u, "Failed to parse condition result value %s, ignoring.", v);
2791a8f8 2758 else
e911de99 2759 u->condition_result = r;
efbac6d2
LP
2760
2761 continue;
c2756a68 2762
59fccdc5 2763 } else if (streq(l, "assert-result")) {
59fccdc5 2764
e911de99
LP
2765 r = parse_boolean(v);
2766 if (r < 0)
f2341e0a 2767 log_unit_debug(u, "Failed to parse assert result value %s, ignoring.", v);
59fccdc5 2768 else
e911de99 2769 u->assert_result = r;
59fccdc5
LP
2770
2771 continue;
2772
c2756a68 2773 } else if (streq(l, "transient")) {
c2756a68 2774
e911de99
LP
2775 r = parse_boolean(v);
2776 if (r < 0)
f2341e0a 2777 log_unit_debug(u, "Failed to parse transient bool %s, ignoring.", v);
c2756a68 2778 else
e911de99 2779 u->transient = r;
c2756a68
LP
2780
2781 continue;
e911de99 2782
5ad096b3
LP
2783 } else if (streq(l, "cpuacct-usage-base")) {
2784
2785 r = safe_atou64(v, &u->cpuacct_usage_base);
2786 if (r < 0)
f2341e0a 2787 log_unit_debug(u, "Failed to parse CPU usage %s, ignoring.", v);
5ad096b3 2788
0f908397 2789 continue;
4e595329 2790
e911de99 2791 } else if (streq(l, "cgroup")) {
72673e86 2792
e911de99
LP
2793 r = unit_set_cgroup_path(u, v);
2794 if (r < 0)
f2341e0a 2795 log_unit_debug_errno(u, r, "Failed to set cgroup path %s, ignoring: %m", v);
4e595329 2796
efdb0237
LP
2797 (void) unit_watch_cgroup(u);
2798
de1d4f9b
WF
2799 continue;
2800 } else if (streq(l, "cgroup-realized")) {
2801 int b;
2802
2803 b = parse_boolean(v);
2804 if (b < 0)
2805 log_unit_debug(u, "Failed to parse cgroup-realized bool %s, ignoring.", v);
2806 else
2807 u->cgroup_realized = b;
2808
32ee7d33
DM
2809 continue;
2810 } else if (streq(l, "netclass-id")) {
2811 r = safe_atou32(v, &u->cgroup_netclass_id);
2812 if (r < 0)
2813 log_unit_debug(u, "Failed to parse netclass ID %s, ignoring.", v);
2814 else {
2815 r = unit_add_to_netclass_cgroup(u);
2816 if (r < 0)
2817 log_unit_debug_errno(u, r, "Failed to add unit to netclass cgroup, ignoring: %m");
2818 }
2819
c2756a68 2820 continue;
8aaf019b 2821 }
cca098b0 2822
9bdb98c5
LP
2823 if (unit_can_serialize(u)) {
2824 if (rt) {
f2341e0a 2825 r = exec_runtime_deserialize_item(u, rt, l, v, fds);
e911de99 2826 if (r < 0) {
f2341e0a 2827 log_unit_warning(u, "Failed to deserialize runtime parameter '%s', ignoring.", l);
e911de99
LP
2828 continue;
2829 }
2830
2831 /* Returns positive if key was handled by the call */
9bdb98c5
LP
2832 if (r > 0)
2833 continue;
2834 }
2835
2836 r = UNIT_VTABLE(u)->deserialize_item(u, l, v, fds);
613b411c 2837 if (r < 0)
f2341e0a 2838 log_unit_warning(u, "Failed to deserialize unit parameter '%s', ignoring.", l);
613b411c 2839 }
a16e1123
LP
2840 }
2841}
2842
6e2ef85b
LP
2843int unit_add_node_link(Unit *u, const char *what, bool wants) {
2844 Unit *device;
68eda4bd 2845 _cleanup_free_ char *e = NULL;
6e2ef85b
LP
2846 int r;
2847
2848 assert(u);
2849
6e2ef85b 2850 /* Adds in links to the device node that this unit is based on */
47bc12e1
LP
2851 if (isempty(what))
2852 return 0;
6e2ef85b 2853
8407a5d0 2854 if (!is_device_path(what))
6e2ef85b
LP
2855 return 0;
2856
47bc12e1
LP
2857 /* When device units aren't supported (such as in a
2858 * container), don't create dependencies on them. */
1c2e9646 2859 if (!unit_type_supported(UNIT_DEVICE))
47bc12e1
LP
2860 return 0;
2861
7410616c
LP
2862 r = unit_name_from_path(what, ".device", &e);
2863 if (r < 0)
2864 return r;
6e2ef85b 2865
ac155bb8 2866 r = manager_load_unit(u->manager, e, NULL, NULL, &device);
6e2ef85b
LP
2867 if (r < 0)
2868 return r;
2869
b2c23da8 2870 r = unit_add_two_dependencies(u, UNIT_AFTER, u->manager->running_as == MANAGER_SYSTEM ? UNIT_BINDS_TO : UNIT_WANTS, device, true);
faa368e3 2871 if (r < 0)
6e2ef85b
LP
2872 return r;
2873
faa368e3
LP
2874 if (wants) {
2875 r = unit_add_dependency(device, UNIT_WANTS, u, false);
2876 if (r < 0)
6e2ef85b 2877 return r;
faa368e3 2878 }
6e2ef85b
LP
2879
2880 return 0;
2881}
a16e1123 2882
be847e82 2883int unit_coldplug(Unit *u) {
5a6158b6 2884 int r = 0, q = 0;
cca098b0
LP
2885
2886 assert(u);
2887
f78f265f
LP
2888 /* Make sure we don't enter a loop, when coldplugging
2889 * recursively. */
2890 if (u->coldplugged)
2891 return 0;
2892
2893 u->coldplugged = true;
2894
5a6158b6 2895 if (UNIT_VTABLE(u)->coldplug)
f78f265f 2896 r = UNIT_VTABLE(u)->coldplug(u);
cca098b0 2897
5a6158b6
LP
2898 if (u->job)
2899 q = job_coldplug(u->job);
2900
2901 if (r < 0)
2902 return r;
2903 if (q < 0)
2904 return q;
cca098b0
LP
2905
2906 return 0;
2907}
2908
45fb0699 2909bool unit_need_daemon_reload(Unit *u) {
ae7a7182
OS
2910 _cleanup_strv_free_ char **t = NULL;
2911 char **path;
1b64d026 2912 struct stat st;
ae7a7182 2913 unsigned loaded_cnt, current_cnt;
1b64d026 2914
45fb0699
LP
2915 assert(u);
2916
ac155bb8 2917 if (u->fragment_path) {
5f4b19f4 2918 zero(st);
ac155bb8 2919 if (stat(u->fragment_path, &st) < 0)
5f4b19f4
LP
2920 /* What, cannot access this anymore? */
2921 return true;
45fb0699 2922
ac155bb8
MS
2923 if (u->fragment_mtime > 0 &&
2924 timespec_load(&st.st_mtim) != u->fragment_mtime)
5f4b19f4
LP
2925 return true;
2926 }
2927
1b64d026
LP
2928 if (u->source_path) {
2929 zero(st);
2930 if (stat(u->source_path, &st) < 0)
2931 return true;
2932
2933 if (u->source_mtime > 0 &&
2934 timespec_load(&st.st_mtim) != u->source_mtime)
2935 return true;
2936 }
5f4b19f4 2937
1a7f1b38 2938 (void) unit_find_dropin_paths(u, &t);
ae7a7182
OS
2939 loaded_cnt = strv_length(t);
2940 current_cnt = strv_length(u->dropin_paths);
2941
2942 if (loaded_cnt == current_cnt) {
2943 if (loaded_cnt == 0)
2944 return false;
2945
2946 if (strv_overlap(u->dropin_paths, t)) {
2947 STRV_FOREACH(path, u->dropin_paths) {
2948 zero(st);
2949 if (stat(*path, &st) < 0)
2950 return true;
2951
2952 if (u->dropin_mtime > 0 &&
2953 timespec_load(&st.st_mtim) > u->dropin_mtime)
2954 return true;
2955 }
2956
2957 return false;
2958 } else
2959 return true;
2960 } else
2961 return true;
45fb0699
LP
2962}
2963
fdf20a31 2964void unit_reset_failed(Unit *u) {
5632e374
LP
2965 assert(u);
2966
fdf20a31
MM
2967 if (UNIT_VTABLE(u)->reset_failed)
2968 UNIT_VTABLE(u)->reset_failed(u);
5632e374
LP
2969}
2970
a7f241db
LP
2971Unit *unit_following(Unit *u) {
2972 assert(u);
2973
2974 if (UNIT_VTABLE(u)->following)
2975 return UNIT_VTABLE(u)->following(u);
2976
2977 return NULL;
2978}
2979
31afa0a4 2980bool unit_stop_pending(Unit *u) {
18ffdfda
LP
2981 assert(u);
2982
31afa0a4
LP
2983 /* This call does check the current state of the unit. It's
2984 * hence useful to be called from state change calls of the
2985 * unit itself, where the state isn't updated yet. This is
2986 * different from unit_inactive_or_pending() which checks both
2987 * the current state and for a queued job. */
18ffdfda 2988
31afa0a4
LP
2989 return u->job && u->job->type == JOB_STOP;
2990}
2991
2992bool unit_inactive_or_pending(Unit *u) {
2993 assert(u);
2994
2995 /* Returns true if the unit is inactive or going down */
18ffdfda 2996
d956ac29
LP
2997 if (UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(u)))
2998 return true;
2999
31afa0a4 3000 if (unit_stop_pending(u))
18ffdfda
LP
3001 return true;
3002
3003 return false;
3004}
3005
31afa0a4 3006bool unit_active_or_pending(Unit *u) {
f976f3f6
LP
3007 assert(u);
3008
f60c2665 3009 /* Returns true if the unit is active or going up */
f976f3f6
LP
3010
3011 if (UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u)))
3012 return true;
3013
ac155bb8
MS
3014 if (u->job &&
3015 (u->job->type == JOB_START ||
3016 u->job->type == JOB_RELOAD_OR_START ||
3017 u->job->type == JOB_RESTART))
f976f3f6
LP
3018 return true;
3019
3020 return false;
3021}
3022
718db961 3023int unit_kill(Unit *u, KillWho w, int signo, sd_bus_error *error) {
8a0867d6
LP
3024 assert(u);
3025 assert(w >= 0 && w < _KILL_WHO_MAX);
8a0867d6
LP
3026 assert(signo > 0);
3027 assert(signo < _NSIG);
3028
8a0867d6 3029 if (!UNIT_VTABLE(u)->kill)
15411c0c 3030 return -EOPNOTSUPP;
8a0867d6 3031
c74f17d9 3032 return UNIT_VTABLE(u)->kill(u, w, signo, error);
8a0867d6
LP
3033}
3034
82659fd7
LP
3035static Set *unit_pid_set(pid_t main_pid, pid_t control_pid) {
3036 Set *pid_set;
3037 int r;
3038
d5099efc 3039 pid_set = set_new(NULL);
82659fd7
LP
3040 if (!pid_set)
3041 return NULL;
3042
3043 /* Exclude the main/control pids from being killed via the cgroup */
3044 if (main_pid > 0) {
fea72cc0 3045 r = set_put(pid_set, PID_TO_PTR(main_pid));
82659fd7
LP
3046 if (r < 0)
3047 goto fail;
3048 }
3049
3050 if (control_pid > 0) {
fea72cc0 3051 r = set_put(pid_set, PID_TO_PTR(control_pid));
82659fd7
LP
3052 if (r < 0)
3053 goto fail;
3054 }
3055
3056 return pid_set;
3057
3058fail:
3059 set_free(pid_set);
3060 return NULL;
3061}
3062
d91c34f2
LP
3063int unit_kill_common(
3064 Unit *u,
3065 KillWho who,
3066 int signo,
3067 pid_t main_pid,
3068 pid_t control_pid,
718db961 3069 sd_bus_error *error) {
d91c34f2 3070
814cc562 3071 int r = 0;
ac5e3a50 3072 bool killed = false;
814cc562 3073
ac5e3a50 3074 if (IN_SET(who, KILL_MAIN, KILL_MAIN_FAIL)) {
814cc562 3075 if (main_pid < 0)
7358dc02 3076 return sd_bus_error_setf(error, BUS_ERROR_NO_SUCH_PROCESS, "%s units have no main processes", unit_type_to_string(u->type));
52f448c3 3077 else if (main_pid == 0)
7358dc02 3078 return sd_bus_error_set_const(error, BUS_ERROR_NO_SUCH_PROCESS, "No main process to kill");
814cc562
MS
3079 }
3080
ac5e3a50 3081 if (IN_SET(who, KILL_CONTROL, KILL_CONTROL_FAIL)) {
814cc562 3082 if (control_pid < 0)
7358dc02 3083 return sd_bus_error_setf(error, BUS_ERROR_NO_SUCH_PROCESS, "%s units have no control processes", unit_type_to_string(u->type));
52f448c3 3084 else if (control_pid == 0)
7358dc02 3085 return sd_bus_error_set_const(error, BUS_ERROR_NO_SUCH_PROCESS, "No control process to kill");
814cc562
MS
3086 }
3087
ac5e3a50
JS
3088 if (IN_SET(who, KILL_CONTROL, KILL_CONTROL_FAIL, KILL_ALL, KILL_ALL_FAIL))
3089 if (control_pid > 0) {
814cc562
MS
3090 if (kill(control_pid, signo) < 0)
3091 r = -errno;
ac5e3a50
JS
3092 else
3093 killed = true;
3094 }
814cc562 3095
ac5e3a50
JS
3096 if (IN_SET(who, KILL_MAIN, KILL_MAIN_FAIL, KILL_ALL, KILL_ALL_FAIL))
3097 if (main_pid > 0) {
814cc562
MS
3098 if (kill(main_pid, signo) < 0)
3099 r = -errno;
ac5e3a50
JS
3100 else
3101 killed = true;
3102 }
814cc562 3103
ac5e3a50 3104 if (IN_SET(who, KILL_ALL, KILL_ALL_FAIL) && u->cgroup_path) {
814cc562
MS
3105 _cleanup_set_free_ Set *pid_set = NULL;
3106 int q;
3107
82659fd7
LP
3108 /* Exclude the main/control pids from being killed via the cgroup */
3109 pid_set = unit_pid_set(main_pid, control_pid);
814cc562
MS
3110 if (!pid_set)
3111 return -ENOMEM;
3112
d0667321 3113 q = cg_kill_recursive(SYSTEMD_CGROUP_CONTROLLER, u->cgroup_path, signo, false, false, false, pid_set);
814cc562
MS
3114 if (q < 0 && q != -EAGAIN && q != -ESRCH && q != -ENOENT)
3115 r = q;
ac5e3a50
JS
3116 else
3117 killed = true;
814cc562
MS
3118 }
3119
ac5e3a50
JS
3120 if (r == 0 && !killed && IN_SET(who, KILL_ALL_FAIL, KILL_CONTROL_FAIL, KILL_ALL_FAIL))
3121 return -ESRCH;
3122
814cc562
MS
3123 return r;
3124}
3125
6210e7fc
LP
3126int unit_following_set(Unit *u, Set **s) {
3127 assert(u);
3128 assert(s);
3129
3130 if (UNIT_VTABLE(u)->following_set)
3131 return UNIT_VTABLE(u)->following_set(u, s);
3132
3133 *s = NULL;
3134 return 0;
3135}
3136
a4375746 3137UnitFileState unit_get_unit_file_state(Unit *u) {
0ec0deaa
LP
3138 int r;
3139
a4375746
LP
3140 assert(u);
3141
0ec0deaa
LP
3142 if (u->unit_file_state < 0 && u->fragment_path) {
3143 r = unit_file_get_state(
b2c23da8 3144 u->manager->running_as == MANAGER_SYSTEM ? UNIT_FILE_SYSTEM : UNIT_FILE_USER,
0ec0deaa
LP
3145 NULL,
3146 basename(u->fragment_path),
3147 &u->unit_file_state);
3148 if (r < 0)
3149 u->unit_file_state = UNIT_FILE_BAD;
3150 }
a4375746 3151
ac155bb8 3152 return u->unit_file_state;
a4375746
LP
3153}
3154
d2dc52db
LP
3155int unit_get_unit_file_preset(Unit *u) {
3156 assert(u);
3157
3158 if (u->unit_file_preset < 0 && u->fragment_path)
3159 u->unit_file_preset = unit_file_query_preset(
b2c23da8 3160 u->manager->running_as == MANAGER_SYSTEM ? UNIT_FILE_SYSTEM : UNIT_FILE_USER,
0ec0deaa
LP
3161 NULL,
3162 basename(u->fragment_path));
d2dc52db
LP
3163
3164 return u->unit_file_preset;
3165}
3166
57020a3a
LP
3167Unit* unit_ref_set(UnitRef *ref, Unit *u) {
3168 assert(ref);
3169 assert(u);
3170
3171 if (ref->unit)
3172 unit_ref_unset(ref);
3173
3174 ref->unit = u;
71fda00f 3175 LIST_PREPEND(refs, u->refs, ref);
57020a3a
LP
3176 return u;
3177}
3178
3179void unit_ref_unset(UnitRef *ref) {
3180 assert(ref);
3181
3182 if (!ref->unit)
3183 return;
3184
71fda00f 3185 LIST_REMOVE(refs, ref->unit->refs, ref);
57020a3a
LP
3186 ref->unit = NULL;
3187}
3188
598459ce
LP
3189int unit_patch_contexts(Unit *u) {
3190 CGroupContext *cc;
3191 ExecContext *ec;
cba6e062
LP
3192 unsigned i;
3193 int r;
3194
e06c73cc 3195 assert(u);
e06c73cc 3196
598459ce
LP
3197 /* Patch in the manager defaults into the exec and cgroup
3198 * contexts, _after_ the rest of the settings have been
3199 * initialized */
085afe36 3200
598459ce
LP
3201 ec = unit_get_exec_context(u);
3202 if (ec) {
3203 /* This only copies in the ones that need memory */
3204 for (i = 0; i < _RLIMIT_MAX; i++)
3205 if (u->manager->rlimit[i] && !ec->rlimit[i]) {
3206 ec->rlimit[i] = newdup(struct rlimit, u->manager->rlimit[i], 1);
3207 if (!ec->rlimit[i])
3208 return -ENOMEM;
3209 }
3210
b2c23da8 3211 if (u->manager->running_as == MANAGER_USER &&
598459ce
LP
3212 !ec->working_directory) {
3213
3214 r = get_home_dir(&ec->working_directory);
3215 if (r < 0)
3216 return r;
4c08c824
LP
3217
3218 /* Allow user services to run, even if the
3219 * home directory is missing */
3220 ec->working_directory_missing_ok = true;
cba6e062
LP
3221 }
3222
b2c23da8 3223 if (u->manager->running_as == MANAGER_USER &&
598459ce
LP
3224 (ec->syscall_whitelist ||
3225 !set_isempty(ec->syscall_filter) ||
3226 !set_isempty(ec->syscall_archs) ||
3227 ec->address_families_whitelist ||
3228 !set_isempty(ec->address_families)))
3229 ec->no_new_privileges = true;
e06c73cc 3230
598459ce
LP
3231 if (ec->private_devices)
3232 ec->capability_bounding_set_drop |= (uint64_t) 1ULL << (uint64_t) CAP_MKNOD;
cba6e062
LP
3233 }
3234
598459ce
LP
3235 cc = unit_get_cgroup_context(u);
3236 if (cc) {
f513e420 3237
598459ce
LP
3238 if (ec &&
3239 ec->private_devices &&
3240 cc->device_policy == CGROUP_AUTO)
3241 cc->device_policy = CGROUP_CLOSED;
3242 }
f1660f96 3243
cba6e062 3244 return 0;
e06c73cc
LP
3245}
3246
3ef63c31
LP
3247ExecContext *unit_get_exec_context(Unit *u) {
3248 size_t offset;
3249 assert(u);
3250
598459ce
LP
3251 if (u->type < 0)
3252 return NULL;
3253
3ef63c31
LP
3254 offset = UNIT_VTABLE(u)->exec_context_offset;
3255 if (offset <= 0)
3256 return NULL;
3257
3258 return (ExecContext*) ((uint8_t*) u + offset);
3259}
3260
718db961
LP
3261KillContext *unit_get_kill_context(Unit *u) {
3262 size_t offset;
3263 assert(u);
3264
598459ce
LP
3265 if (u->type < 0)
3266 return NULL;
3267
718db961
LP
3268 offset = UNIT_VTABLE(u)->kill_context_offset;
3269 if (offset <= 0)
3270 return NULL;
3271
3272 return (KillContext*) ((uint8_t*) u + offset);
3273}
3274
4ad49000
LP
3275CGroupContext *unit_get_cgroup_context(Unit *u) {
3276 size_t offset;
3277
598459ce
LP
3278 if (u->type < 0)
3279 return NULL;
3280
4ad49000
LP
3281 offset = UNIT_VTABLE(u)->cgroup_context_offset;
3282 if (offset <= 0)
3283 return NULL;
3284
3285 return (CGroupContext*) ((uint8_t*) u + offset);
3286}
3287
613b411c
LP
3288ExecRuntime *unit_get_exec_runtime(Unit *u) {
3289 size_t offset;
3290
598459ce
LP
3291 if (u->type < 0)
3292 return NULL;
3293
613b411c
LP
3294 offset = UNIT_VTABLE(u)->exec_runtime_offset;
3295 if (offset <= 0)
3296 return NULL;
3297
3298 return *(ExecRuntime**) ((uint8_t*) u + offset);
3299}
3300
29686440 3301static int unit_drop_in_dir(Unit *u, UnitSetPropertiesMode mode, bool transient, char **dir) {
3f5e8115
LP
3302 assert(u);
3303
b2c23da8 3304 if (u->manager->running_as == MANAGER_USER) {
29686440 3305 int r;
26d04f86 3306
718880ba
SA
3307 if (mode == UNIT_PERSISTENT && !transient)
3308 r = user_config_home(dir);
3309 else
4d5dec23 3310 r = user_runtime_dir(dir);
26d04f86
LP
3311 if (r == 0)
3312 return -ENOENT;
3f5e8115 3313
29686440
ZJS
3314 return r;
3315 }
26d04f86 3316
29686440
ZJS
3317 if (mode == UNIT_PERSISTENT && !transient)
3318 *dir = strdup("/etc/systemd/system");
8e2af478 3319 else
29686440
ZJS
3320 *dir = strdup("/run/systemd/system");
3321 if (!*dir)
71645aca
LP
3322 return -ENOMEM;
3323
26d04f86 3324 return 0;
71645aca
LP
3325}
3326
8e2af478 3327int unit_write_drop_in(Unit *u, UnitSetPropertiesMode mode, const char *name, const char *data) {
29686440 3328
adb76a70 3329 _cleanup_free_ char *dir = NULL, *p = NULL, *q = NULL;
26d04f86 3330 int r;
71645aca
LP
3331
3332 assert(u);
3333
6d235724 3334 if (!IN_SET(mode, UNIT_PERSISTENT, UNIT_RUNTIME))
8e2af478
LP
3335 return 0;
3336
29686440 3337 r = unit_drop_in_dir(u, mode, u->transient, &dir);
26d04f86
LP
3338 if (r < 0)
3339 return r;
71645aca 3340
adb76a70
WC
3341 r = write_drop_in(dir, u->id, 50, name, data);
3342 if (r < 0)
3343 return r;
3344
3345 r = drop_in_file(dir, u->id, 50, name, &p, &q);
3346 if (r < 0)
3347 return r;
3348
3349 r = strv_extend(&u->dropin_paths, q);
3350 if (r < 0)
3351 return r;
3352
3353 strv_sort(u->dropin_paths);
3354 strv_uniq(u->dropin_paths);
3355
3356 u->dropin_mtime = now(CLOCK_REALTIME);
3357
3358 return 0;
26d04f86 3359}
71645aca 3360
b9ec9359
LP
3361int unit_write_drop_in_format(Unit *u, UnitSetPropertiesMode mode, const char *name, const char *format, ...) {
3362 _cleanup_free_ char *p = NULL;
3363 va_list ap;
3364 int r;
3365
3366 assert(u);
3367 assert(name);
3368 assert(format);
3369
6d235724 3370 if (!IN_SET(mode, UNIT_PERSISTENT, UNIT_RUNTIME))
b9ec9359
LP
3371 return 0;
3372
3373 va_start(ap, format);
3374 r = vasprintf(&p, format, ap);
3375 va_end(ap);
3376
3377 if (r < 0)
3378 return -ENOMEM;
3379
3380 return unit_write_drop_in(u, mode, name, p);
3381}
3382
3383int unit_write_drop_in_private(Unit *u, UnitSetPropertiesMode mode, const char *name, const char *data) {
b42defe3
LP
3384 _cleanup_free_ char *ndata = NULL;
3385
3386 assert(u);
3387 assert(name);
3388 assert(data);
3389
3390 if (!UNIT_VTABLE(u)->private_section)
3391 return -EINVAL;
3392
6d235724 3393 if (!IN_SET(mode, UNIT_PERSISTENT, UNIT_RUNTIME))
b9ec9359
LP
3394 return 0;
3395
b42defe3
LP
3396 ndata = strjoin("[", UNIT_VTABLE(u)->private_section, "]\n", data, NULL);
3397 if (!ndata)
3398 return -ENOMEM;
3399
3400 return unit_write_drop_in(u, mode, name, ndata);
3401}
3402
b9ec9359
LP
3403int unit_write_drop_in_private_format(Unit *u, UnitSetPropertiesMode mode, const char *name, const char *format, ...) {
3404 _cleanup_free_ char *p = NULL;
3405 va_list ap;
3406 int r;
3407
3408 assert(u);
3409 assert(name);
3410 assert(format);
3411
6d235724 3412 if (!IN_SET(mode, UNIT_PERSISTENT, UNIT_RUNTIME))
b9ec9359
LP
3413 return 0;
3414
3415 va_start(ap, format);
3416 r = vasprintf(&p, format, ap);
3417 va_end(ap);
3418
3419 if (r < 0)
3420 return -ENOMEM;
3421
3422 return unit_write_drop_in_private(u, mode, name, p);
3423}
71645aca 3424
c2756a68 3425int unit_make_transient(Unit *u) {
c2756a68
LP
3426 assert(u);
3427
3f5e8115
LP
3428 if (!UNIT_VTABLE(u)->can_transient)
3429 return -EOPNOTSUPP;
3430
c2756a68
LP
3431 u->load_state = UNIT_STUB;
3432 u->load_error = 0;
3433 u->transient = true;
7c65093a 3434
3f5e8115 3435 u->fragment_path = mfree(u->fragment_path);
7c65093a
LP
3436 u->source_path = mfree(u->source_path);
3437 u->dropin_paths = strv_free(u->dropin_paths);
3438 u->fragment_mtime = u->source_mtime = u->dropin_mtime = 0;
3439
3440 unit_add_to_dbus_queue(u);
3441 unit_add_to_gc_queue(u);
3442 unit_add_to_load_queue(u);
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}
0f13f3bd
LP
3718
3719bool unit_is_pristine(Unit *u) {
3720 assert(u);
3721
7c65093a 3722 /* Check if the unit already exists or is already around,
0f13f3bd
LP
3723 * in a number of different ways. Note that to cater for unit
3724 * types such as slice, we are generally fine with units that
3725 * are marked UNIT_LOADED even even though nothing was
3726 * actually loaded, as those unit types don't require a file
3727 * on disk to validly load. */
3728
3729 return !(!IN_SET(u->load_state, UNIT_NOT_FOUND, UNIT_LOADED) ||
3730 u->fragment_path ||
3731 u->source_path ||
3732 !strv_isempty(u->dropin_paths) ||
0f13f3bd
LP
3733 u->job ||
3734 u->merged_into);
3735}