]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/core/unit.c
core: dispatch load queue each time we set up a transient units
[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
44a6b1b6 1350_pure_ static const char* unit_get_status_message_format(Unit *u, JobType t) {
877d54e9 1351 const char *format;
a85ca902 1352 const UnitStatusMessageFormats *format_table;
877d54e9
LP
1353
1354 assert(u);
b5bf308b 1355 assert(t == JOB_START || t == JOB_STOP || t == JOB_RELOAD);
877d54e9 1356
b5bf308b 1357 if (t != JOB_RELOAD) {
a85ca902
MS
1358 format_table = &UNIT_VTABLE(u)->status_message_formats;
1359 if (format_table) {
1360 format = format_table->starting_stopping[t == JOB_STOP];
1361 if (format)
1362 return format;
1363 }
1364 }
877d54e9
LP
1365
1366 /* Return generic strings */
1367 if (t == JOB_START)
1368 return "Starting %s.";
1369 else if (t == JOB_STOP)
1370 return "Stopping %s.";
b5bf308b 1371 else
877d54e9 1372 return "Reloading %s.";
877d54e9
LP
1373}
1374
1375static void unit_status_print_starting_stopping(Unit *u, JobType t) {
1376 const char *format;
1377
1378 assert(u);
1379
877d54e9 1380 format = unit_get_status_message_format(u, t);
c6918296 1381
bcfce235 1382 DISABLE_WARNING_FORMAT_NONLITERAL;
49b1d377 1383 unit_status_printf(u, "", format);
bcfce235 1384 REENABLE_WARNING;
c6918296
MS
1385}
1386
877d54e9
LP
1387static void unit_status_log_starting_stopping_reloading(Unit *u, JobType t) {
1388 const char *format;
1389 char buf[LINE_MAX];
1390 sd_id128_t mid;
1391
1392 assert(u);
1393
1394 if (t != JOB_START && t != JOB_STOP && t != JOB_RELOAD)
1395 return;
1396
81270860
LP
1397 if (log_on_console())
1398 return;
1399
877d54e9
LP
1400 /* We log status messages for all units and all operations. */
1401
a85ca902 1402 format = unit_get_status_message_format(u, t);
877d54e9 1403
bcfce235 1404 DISABLE_WARNING_FORMAT_NONLITERAL;
877d54e9 1405 snprintf(buf, sizeof(buf), format, unit_description(u));
bcfce235 1406 REENABLE_WARNING;
877d54e9
LP
1407
1408 mid = t == JOB_START ? SD_MESSAGE_UNIT_STARTING :
1409 t == JOB_STOP ? SD_MESSAGE_UNIT_STOPPING :
1410 SD_MESSAGE_UNIT_RELOADING;
1411
f2341e0a
LP
1412 /* Note that we deliberately use LOG_MESSAGE() instead of
1413 * LOG_UNIT_MESSAGE() here, since this is supposed to mimic
1414 * closely what is written to screen using the status output,
1415 * which is supposed the highest level, friendliest output
1416 * possible, which means we should avoid the low-level unit
1417 * name. */
1418 log_struct(LOG_INFO,
1419 LOG_MESSAGE_ID(mid),
1420 LOG_UNIT_ID(u),
1421 LOG_MESSAGE("%s", buf),
1422 NULL);
877d54e9 1423}
877d54e9 1424
d1a34ae9
MS
1425void unit_status_emit_starting_stopping_reloading(Unit *u, JobType t) {
1426
1427 unit_status_log_starting_stopping_reloading(u, t);
1428
1429 /* Reload status messages have traditionally not been printed to console. */
1430 if (t != JOB_RELOAD)
1431 unit_status_print_starting_stopping(u, t);
1432}
1433
87f0e418 1434/* Errors:
d5159713
LP
1435 * -EBADR: This unit type does not support starting.
1436 * -EALREADY: Unit is already started.
1437 * -EAGAIN: An operation is already in progress. Retry later.
1438 * -ECANCELED: Too many requests for now.
59fccdc5 1439 * -EPROTO: Assert failed
87f0e418
LP
1440 */
1441int unit_start(Unit *u) {
1442 UnitActiveState state;
92ab323c 1443 Unit *following;
87f0e418
LP
1444
1445 assert(u);
1446
8ff4d2ab 1447 /* Units that aren't loaded cannot be started */
ac155bb8 1448 if (u->load_state != UNIT_LOADED)
6124958c
LP
1449 return -EINVAL;
1450
a82e5507
LP
1451 /* If this is already started, then this will succeed. Note
1452 * that this will even succeed if this unit is not startable
1453 * by the user. This is relied on to detect when we need to
1454 * wait for units and when waiting is finished. */
87f0e418
LP
1455 state = unit_active_state(u);
1456 if (UNIT_IS_ACTIVE_OR_RELOADING(state))
1457 return -EALREADY;
1458
a82e5507
LP
1459 /* If the conditions failed, don't do anything at all. If we
1460 * already are activating this call might still be useful to
1461 * speed up activation in case there is some hold-off time,
1462 * but we don't want to recheck the condition in that case. */
1463 if (state != UNIT_ACTIVATING &&
1464 !unit_condition_test(u)) {
f2341e0a 1465 log_unit_debug(u, "Starting requested but condition failed. Not starting unit.");
52661efd
LP
1466 return -EALREADY;
1467 }
1468
59fccdc5
LP
1469 /* If the asserts failed, fail the entire job */
1470 if (state != UNIT_ACTIVATING &&
1471 !unit_assert_test(u)) {
f2341e0a 1472 log_unit_notice(u, "Starting requested but asserts failed.");
59fccdc5
LP
1473 return -EPROTO;
1474 }
1475
d11a7645
LP
1476 /* Units of types that aren't supported cannot be
1477 * started. Note that we do this test only after the condition
1478 * checks, so that we rather return condition check errors
1479 * (which are usually not considered a true failure) than "not
1480 * supported" errors (which are considered a failure).
1481 */
1482 if (!unit_supported(u))
1483 return -EOPNOTSUPP;
1484
92ab323c 1485 /* Forward to the main object, if we aren't it. */
52990c2e
ZJS
1486 following = unit_following(u);
1487 if (following) {
f2341e0a 1488 log_unit_debug(u, "Redirecting start request from %s to %s.", u->id, following->id);
92ab323c
LP
1489 return unit_start(following);
1490 }
1491
1492 /* If it is stopped, but we cannot start it, then fail */
1493 if (!UNIT_VTABLE(u)->start)
1494 return -EBADR;
1495
87f0e418
LP
1496 /* We don't suppress calls to ->start() here when we are
1497 * already starting, to allow this request to be used as a
1498 * "hurry up" call, for example when the unit is in some "auto
1499 * restart" state where it waits for a holdoff timer to elapse
1500 * before it will start again. */
1501
c1e1601e 1502 unit_add_to_dbus_queue(u);
9e58ff9c 1503
d1a34ae9 1504 return UNIT_VTABLE(u)->start(u);
87f0e418
LP
1505}
1506
1507bool unit_can_start(Unit *u) {
1508 assert(u);
1509
8ff4d2ab
LP
1510 if (u->load_state != UNIT_LOADED)
1511 return false;
1512
1513 if (!unit_supported(u))
1514 return false;
1515
87f0e418
LP
1516 return !!UNIT_VTABLE(u)->start;
1517}
1518
2528a7a6
LP
1519bool unit_can_isolate(Unit *u) {
1520 assert(u);
1521
1522 return unit_can_start(u) &&
ac155bb8 1523 u->allow_isolate;
2528a7a6
LP
1524}
1525
87f0e418
LP
1526/* Errors:
1527 * -EBADR: This unit type does not support stopping.
1528 * -EALREADY: Unit is already stopped.
1529 * -EAGAIN: An operation is already in progress. Retry later.
1530 */
1531int unit_stop(Unit *u) {
1532 UnitActiveState state;
92ab323c 1533 Unit *following;
87f0e418
LP
1534
1535 assert(u);
1536
87f0e418 1537 state = unit_active_state(u);
fdf20a31 1538 if (UNIT_IS_INACTIVE_OR_FAILED(state))
87f0e418
LP
1539 return -EALREADY;
1540
0faacd47
LP
1541 following = unit_following(u);
1542 if (following) {
f2341e0a 1543 log_unit_debug(u, "Redirecting stop request from %s to %s.", u->id, following->id);
92ab323c
LP
1544 return unit_stop(following);
1545 }
1546
7898b0cf
LP
1547 if (!UNIT_VTABLE(u)->stop)
1548 return -EBADR;
1549
c1e1601e 1550 unit_add_to_dbus_queue(u);
9e58ff9c 1551
d1a34ae9 1552 return UNIT_VTABLE(u)->stop(u);
87f0e418
LP
1553}
1554
1555/* Errors:
1556 * -EBADR: This unit type does not support reloading.
1557 * -ENOEXEC: Unit is not started.
1558 * -EAGAIN: An operation is already in progress. Retry later.
1559 */
1560int unit_reload(Unit *u) {
1561 UnitActiveState state;
92ab323c 1562 Unit *following;
87f0e418
LP
1563
1564 assert(u);
1565
ac155bb8 1566 if (u->load_state != UNIT_LOADED)
6124958c
LP
1567 return -EINVAL;
1568
87f0e418
LP
1569 if (!unit_can_reload(u))
1570 return -EBADR;
1571
1572 state = unit_active_state(u);
e364ad06 1573 if (state == UNIT_RELOADING)
87f0e418
LP
1574 return -EALREADY;
1575
6a371e23 1576 if (state != UNIT_ACTIVE) {
f2341e0a 1577 log_unit_warning(u, "Unit cannot be reloaded because it is inactive.");
87f0e418 1578 return -ENOEXEC;
6a371e23 1579 }
87f0e418 1580
e48614c4
ZJS
1581 following = unit_following(u);
1582 if (following) {
f2341e0a 1583 log_unit_debug(u, "Redirecting reload request from %s to %s.", u->id, following->id);
92ab323c
LP
1584 return unit_reload(following);
1585 }
1586
c1e1601e 1587 unit_add_to_dbus_queue(u);
82a2b6bb 1588
d1a34ae9 1589 return UNIT_VTABLE(u)->reload(u);
87f0e418
LP
1590}
1591
1592bool unit_can_reload(Unit *u) {
1593 assert(u);
1594
1595 if (!UNIT_VTABLE(u)->reload)
1596 return false;
1597
1598 if (!UNIT_VTABLE(u)->can_reload)
1599 return true;
1600
1601 return UNIT_VTABLE(u)->can_reload(u);
1602}
1603
b4a16b7b 1604static void unit_check_unneeded(Unit *u) {
be7d9ff7 1605
4bd29fe5
LP
1606 _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL;
1607
be7d9ff7
LP
1608 static const UnitDependency needed_dependencies[] = {
1609 UNIT_REQUIRED_BY,
084918ba 1610 UNIT_REQUISITE_OF,
be7d9ff7
LP
1611 UNIT_WANTED_BY,
1612 UNIT_BOUND_BY,
1613 };
1614
f3bff0eb 1615 Unit *other;
be7d9ff7
LP
1616 Iterator i;
1617 unsigned j;
1618 int r;
f3bff0eb
LP
1619
1620 assert(u);
1621
1622 /* If this service shall be shut down when unneeded then do
1623 * so. */
1624
ac155bb8 1625 if (!u->stop_when_unneeded)
f3bff0eb
LP
1626 return;
1627
1628 if (!UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u)))
1629 return;
1630
be7d9ff7 1631 for (j = 0; j < ELEMENTSOF(needed_dependencies); j++)
f3b85044 1632 SET_FOREACH(other, u->dependencies[needed_dependencies[j]], i)
be7d9ff7
LP
1633 if (unit_active_or_pending(other))
1634 return;
b81884e7 1635
bea355da
LP
1636 /* If stopping a unit fails continously we might enter a stop
1637 * loop here, hence stop acting on the service being
1638 * unnecessary after a while. */
67bfdc97 1639 if (!ratelimit_test(&u->auto_stop_ratelimit)) {
bea355da
LP
1640 log_unit_warning(u, "Unit not needed anymore, but not stopping since we tried this too often recently.");
1641 return;
1642 }
1643
f2341e0a 1644 log_unit_info(u, "Unit not needed anymore. Stopping.");
f3bff0eb
LP
1645
1646 /* Ok, nobody needs us anymore. Sniff. Then let's commit suicide */
4bd29fe5 1647 r = manager_add_job(u->manager, JOB_STOP, u, JOB_FAIL, &error, NULL);
be7d9ff7 1648 if (r < 0)
4bd29fe5 1649 log_unit_warning_errno(u, r, "Failed to enqueue stop job, ignoring: %s", bus_error_message(&error, r));
f3bff0eb
LP
1650}
1651
ff502445 1652static void unit_check_binds_to(Unit *u) {
4bd29fe5 1653 _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL;
ff502445
LP
1654 bool stop = false;
1655 Unit *other;
1656 Iterator i;
67bfdc97 1657 int r;
ff502445
LP
1658
1659 assert(u);
1660
1661 if (u->job)
1662 return;
1663
1664 if (unit_active_state(u) != UNIT_ACTIVE)
1665 return;
1666
1667 SET_FOREACH(other, u->dependencies[UNIT_BINDS_TO], i) {
1668 if (other->job)
1669 continue;
1670
1671 if (!UNIT_IS_INACTIVE_OR_FAILED(unit_active_state(other)))
1672 continue;
1673
1674 stop = true;
98f738b6 1675 break;
ff502445
LP
1676 }
1677
1678 if (!stop)
1679 return;
1680
67bfdc97
LP
1681 /* If stopping a unit fails continously we might enter a stop
1682 * loop here, hence stop acting on the service being
1683 * unnecessary after a while. */
1684 if (!ratelimit_test(&u->auto_stop_ratelimit)) {
1685 log_unit_warning(u, "Unit is bound to inactive unit %s, but not stopping since we tried this too often recently.", other->id);
1686 return;
1687 }
1688
98f738b6 1689 assert(other);
f2341e0a 1690 log_unit_info(u, "Unit is bound to inactive unit %s. Stopping, too.", other->id);
ff502445
LP
1691
1692 /* A unit we need to run is gone. Sniff. Let's stop this. */
4bd29fe5 1693 r = manager_add_job(u->manager, JOB_STOP, u, JOB_FAIL, &error, NULL);
67bfdc97 1694 if (r < 0)
4bd29fe5 1695 log_unit_warning_errno(u, r, "Failed to enqueue stop job, ignoring: %s", bus_error_message(&error, r));
ff502445
LP
1696}
1697
87f0e418
LP
1698static void retroactively_start_dependencies(Unit *u) {
1699 Iterator i;
1700 Unit *other;
1701
1702 assert(u);
1703 assert(UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u)));
1704
ac155bb8
MS
1705 SET_FOREACH(other, u->dependencies[UNIT_REQUIRES], i)
1706 if (!set_get(u->dependencies[UNIT_AFTER], other) &&
b81884e7 1707 !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other)))
4bd29fe5 1708 manager_add_job(u->manager, JOB_START, other, JOB_REPLACE, NULL, NULL);
b81884e7 1709
7f2cddae 1710 SET_FOREACH(other, u->dependencies[UNIT_BINDS_TO], i)
ac155bb8 1711 if (!set_get(u->dependencies[UNIT_AFTER], other) &&
b81884e7 1712 !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other)))
4bd29fe5 1713 manager_add_job(u->manager, JOB_START, other, JOB_REPLACE, NULL, NULL);
87f0e418 1714
ac155bb8
MS
1715 SET_FOREACH(other, u->dependencies[UNIT_WANTS], 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_FAIL, NULL, NULL);
87f0e418 1719
ac155bb8 1720 SET_FOREACH(other, u->dependencies[UNIT_CONFLICTS], i)
b81884e7 1721 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
4bd29fe5 1722 manager_add_job(u->manager, JOB_STOP, other, JOB_REPLACE, NULL, NULL);
69dd2852 1723
ac155bb8 1724 SET_FOREACH(other, u->dependencies[UNIT_CONFLICTED_BY], i)
b81884e7 1725 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
4bd29fe5 1726 manager_add_job(u->manager, JOB_STOP, other, JOB_REPLACE, NULL, NULL);
87f0e418
LP
1727}
1728
1729static void retroactively_stop_dependencies(Unit *u) {
1730 Iterator i;
1731 Unit *other;
1732
1733 assert(u);
1734 assert(UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(u)));
1735
b81884e7 1736 /* Pull down units which are bound to us recursively if enabled */
ac155bb8 1737 SET_FOREACH(other, u->dependencies[UNIT_BOUND_BY], i)
b81884e7 1738 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
4bd29fe5 1739 manager_add_job(u->manager, JOB_STOP, other, JOB_REPLACE, NULL, NULL);
cd0504d0
MS
1740}
1741
1742static void check_unneeded_dependencies(Unit *u) {
1743 Iterator i;
1744 Unit *other;
1745
1746 assert(u);
1747 assert(UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(u)));
f3bff0eb
LP
1748
1749 /* Garbage collect services that might not be needed anymore, if enabled */
ac155bb8 1750 SET_FOREACH(other, u->dependencies[UNIT_REQUIRES], i)
87f0e418 1751 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
b4a16b7b 1752 unit_check_unneeded(other);
ac155bb8 1753 SET_FOREACH(other, u->dependencies[UNIT_WANTS], i)
f3bff0eb 1754 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
b4a16b7b 1755 unit_check_unneeded(other);
ac155bb8 1756 SET_FOREACH(other, u->dependencies[UNIT_REQUISITE], i)
f3bff0eb 1757 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
b4a16b7b 1758 unit_check_unneeded(other);
7f2cddae 1759 SET_FOREACH(other, u->dependencies[UNIT_BINDS_TO], i)
b81884e7
LP
1760 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
1761 unit_check_unneeded(other);
87f0e418
LP
1762}
1763
3ecaa09b 1764void unit_start_on_failure(Unit *u) {
c0daa706
LP
1765 Unit *other;
1766 Iterator i;
1767
1768 assert(u);
1769
ac155bb8 1770 if (set_size(u->dependencies[UNIT_ON_FAILURE]) <= 0)
222ae6a8
LP
1771 return;
1772
f2341e0a 1773 log_unit_info(u, "Triggering OnFailure= dependencies.");
222ae6a8 1774
ac155bb8 1775 SET_FOREACH(other, u->dependencies[UNIT_ON_FAILURE], i) {
222ae6a8
LP
1776 int r;
1777
4bd29fe5 1778 r = manager_add_job(u->manager, JOB_START, other, u->on_failure_job_mode, NULL, NULL);
c1b6628d 1779 if (r < 0)
f2341e0a 1780 log_unit_error_errno(u, r, "Failed to enqueue OnFailure= job: %m");
222ae6a8 1781 }
c0daa706
LP
1782}
1783
3ecaa09b
LP
1784void unit_trigger_notify(Unit *u) {
1785 Unit *other;
1786 Iterator i;
1787
1788 assert(u);
1789
1790 SET_FOREACH(other, u->dependencies[UNIT_TRIGGERED_BY], i)
1791 if (UNIT_VTABLE(other)->trigger_notify)
1792 UNIT_VTABLE(other)->trigger_notify(other, u);
1793}
1794
e2f3b44c 1795void unit_notify(Unit *u, UnitActiveState os, UnitActiveState ns, bool reload_success) {
546ac4f0 1796 Manager *m;
7e6e7b06 1797 bool unexpected;
a096ed36 1798
87f0e418
LP
1799 assert(u);
1800 assert(os < _UNIT_ACTIVE_STATE_MAX);
1801 assert(ns < _UNIT_ACTIVE_STATE_MAX);
87f0e418 1802
8e471ccd
LP
1803 /* Note that this is called for all low-level state changes,
1804 * even if they might map to the same high-level
865cc19a 1805 * UnitActiveState! That means that ns == os is an expected
c5315881 1806 * behavior here. For example: if a mount point is remounted
cd6d0a45 1807 * this function will be called too! */
87f0e418 1808
546ac4f0
MS
1809 m = u->manager;
1810
f755e3b7 1811 /* Update timestamps for state changes */
546ac4f0 1812 if (m->n_reloading <= 0) {
bdbf9951 1813 dual_timestamp ts;
173e3821 1814
bdbf9951 1815 dual_timestamp_get(&ts);
173e3821 1816
bdbf9951 1817 if (UNIT_IS_INACTIVE_OR_FAILED(os) && !UNIT_IS_INACTIVE_OR_FAILED(ns))
ac155bb8 1818 u->inactive_exit_timestamp = ts;
bdbf9951 1819 else if (!UNIT_IS_INACTIVE_OR_FAILED(os) && UNIT_IS_INACTIVE_OR_FAILED(ns))
ac155bb8 1820 u->inactive_enter_timestamp = ts;
bdbf9951
LP
1821
1822 if (!UNIT_IS_ACTIVE_OR_RELOADING(os) && UNIT_IS_ACTIVE_OR_RELOADING(ns))
ac155bb8 1823 u->active_enter_timestamp = ts;
bdbf9951 1824 else if (UNIT_IS_ACTIVE_OR_RELOADING(os) && !UNIT_IS_ACTIVE_OR_RELOADING(ns))
ac155bb8 1825 u->active_exit_timestamp = ts;
bdbf9951 1826 }
87f0e418 1827
865cc19a 1828 /* Keep track of failed units */
5269eb6b 1829 (void) manager_update_failed_units(u->manager, u, ns == UNIT_FAILED);
f755e3b7
LP
1830
1831 /* Make sure the cgroup is always removed when we become inactive */
fdf20a31 1832 if (UNIT_IS_INACTIVE_OR_FAILED(ns))
efdb0237 1833 unit_prune_cgroup(u);
fb385181 1834
9cd86184 1835 /* Note that this doesn't apply to RemainAfterExit services exiting
6f285378 1836 * successfully, since there's no change of state in that case. Which is
9cd86184 1837 * why it is handled in service_set_state() */
7ed9f6cd 1838 if (UNIT_IS_INACTIVE_OR_FAILED(os) != UNIT_IS_INACTIVE_OR_FAILED(ns)) {
b33918c2
LP
1839 ExecContext *ec;
1840
1841 ec = unit_get_exec_context(u);
7ed9f6cd 1842 if (ec && exec_context_may_touch_console(ec)) {
31a7eb86
ZJS
1843 if (UNIT_IS_INACTIVE_OR_FAILED(ns)) {
1844 m->n_on_console --;
1845
1846 if (m->n_on_console == 0)
1847 /* unset no_console_output flag, since the console is free */
2f38577f 1848 m->no_console_output = false;
31a7eb86
ZJS
1849 } else
1850 m->n_on_console ++;
7ed9f6cd
MS
1851 }
1852 }
1853
ac155bb8 1854 if (u->job) {
7e6e7b06 1855 unexpected = false;
87f0e418 1856
ac155bb8 1857 if (u->job->state == JOB_WAITING)
87f0e418
LP
1858
1859 /* So we reached a different state for this
1860 * job. Let's see if we can run it now if it
1861 * failed previously due to EAGAIN. */
ac155bb8 1862 job_add_to_run_queue(u->job);
87f0e418 1863
b410e6b9 1864 /* Let's check whether this state change constitutes a
35b8ca3a 1865 * finished job, or maybe contradicts a running job and
b410e6b9 1866 * hence needs to invalidate jobs. */
87f0e418 1867
ac155bb8 1868 switch (u->job->type) {
87f0e418 1869
b410e6b9
LP
1870 case JOB_START:
1871 case JOB_VERIFY_ACTIVE:
87f0e418 1872
b410e6b9 1873 if (UNIT_IS_ACTIVE_OR_RELOADING(ns))
5273510e 1874 job_finish_and_invalidate(u->job, JOB_DONE, true);
ac155bb8 1875 else if (u->job->state == JOB_RUNNING && ns != UNIT_ACTIVATING) {
b410e6b9 1876 unexpected = true;
41b02ec7 1877
fdf20a31 1878 if (UNIT_IS_INACTIVE_OR_FAILED(ns))
5273510e 1879 job_finish_and_invalidate(u->job, ns == UNIT_FAILED ? JOB_FAILED : JOB_DONE, true);
b410e6b9 1880 }
87f0e418 1881
b410e6b9 1882 break;
87f0e418 1883
b410e6b9
LP
1884 case JOB_RELOAD:
1885 case JOB_RELOAD_OR_START:
87f0e418 1886
ac155bb8 1887 if (u->job->state == JOB_RUNNING) {
a096ed36 1888 if (ns == UNIT_ACTIVE)
5273510e 1889 job_finish_and_invalidate(u->job, reload_success ? JOB_DONE : JOB_FAILED, true);
032ff4af 1890 else if (ns != UNIT_ACTIVATING && ns != UNIT_RELOADING) {
a096ed36 1891 unexpected = true;
41b02ec7 1892
fdf20a31 1893 if (UNIT_IS_INACTIVE_OR_FAILED(ns))
5273510e 1894 job_finish_and_invalidate(u->job, ns == UNIT_FAILED ? JOB_FAILED : JOB_DONE, true);
a096ed36 1895 }
b410e6b9 1896 }
87f0e418 1897
b410e6b9 1898 break;
87f0e418 1899
b410e6b9
LP
1900 case JOB_STOP:
1901 case JOB_RESTART:
1902 case JOB_TRY_RESTART:
87f0e418 1903
fdf20a31 1904 if (UNIT_IS_INACTIVE_OR_FAILED(ns))
5273510e 1905 job_finish_and_invalidate(u->job, JOB_DONE, true);
ac155bb8 1906 else if (u->job->state == JOB_RUNNING && ns != UNIT_DEACTIVATING) {
b410e6b9 1907 unexpected = true;
5273510e 1908 job_finish_and_invalidate(u->job, JOB_FAILED, true);
b410e6b9 1909 }
87f0e418 1910
b410e6b9 1911 break;
87f0e418 1912
b410e6b9
LP
1913 default:
1914 assert_not_reached("Job type unknown");
87f0e418 1915 }
87f0e418 1916
7e6e7b06
LP
1917 } else
1918 unexpected = true;
1919
546ac4f0 1920 if (m->n_reloading <= 0) {
f3bff0eb 1921
bdbf9951
LP
1922 /* If this state change happened without being
1923 * requested by a job, then let's retroactively start
1924 * or stop dependencies. We skip that step when
1925 * deserializing, since we don't want to create any
1926 * additional jobs just because something is already
1927 * activated. */
1928
1929 if (unexpected) {
1930 if (UNIT_IS_INACTIVE_OR_FAILED(os) && UNIT_IS_ACTIVE_OR_ACTIVATING(ns))
1931 retroactively_start_dependencies(u);
1932 else if (UNIT_IS_ACTIVE_OR_ACTIVATING(os) && UNIT_IS_INACTIVE_OR_DEACTIVATING(ns))
1933 retroactively_stop_dependencies(u);
1934 }
5de9682c 1935
cd0504d0 1936 /* stop unneeded units regardless if going down was expected or not */
b33918c2 1937 if (UNIT_IS_INACTIVE_OR_DEACTIVATING(ns))
cd0504d0
MS
1938 check_unneeded_dependencies(u);
1939
bdbf9951 1940 if (ns != os && ns == UNIT_FAILED) {
f2341e0a 1941 log_unit_notice(u, "Unit entered failed state.");
3ecaa09b 1942 unit_start_on_failure(u);
cd6d0a45 1943 }
3b2775c5 1944 }
e537352b 1945
3b2775c5
LP
1946 /* Some names are special */
1947 if (UNIT_IS_ACTIVE_OR_RELOADING(ns)) {
1948
1949 if (unit_has_name(u, SPECIAL_DBUS_SERVICE))
865cc19a 1950 /* The bus might have just become available,
3b2775c5
LP
1951 * hence try to connect to it, if we aren't
1952 * yet connected. */
546ac4f0 1953 bus_init(m, true);
3b2775c5 1954
ac155bb8 1955 if (u->type == UNIT_SERVICE &&
3b2775c5 1956 !UNIT_IS_ACTIVE_OR_RELOADING(os) &&
546ac4f0 1957 m->n_reloading <= 0) {
3b2775c5 1958 /* Write audit record if we have just finished starting up */
546ac4f0 1959 manager_send_unit_audit(m, u, AUDIT_SERVICE_START, true);
ac155bb8 1960 u->in_audit = true;
3b2775c5 1961 }
e983b760 1962
3b2775c5 1963 if (!UNIT_IS_ACTIVE_OR_RELOADING(os))
546ac4f0 1964 manager_send_unit_plymouth(m, u);
bdbf9951 1965
3b2775c5 1966 } else {
bdbf9951 1967
3b2775c5
LP
1968 /* We don't care about D-Bus here, since we'll get an
1969 * asynchronous notification for it anyway. */
cd6d0a45 1970
ac155bb8 1971 if (u->type == UNIT_SERVICE &&
3b2775c5
LP
1972 UNIT_IS_INACTIVE_OR_FAILED(ns) &&
1973 !UNIT_IS_INACTIVE_OR_FAILED(os) &&
546ac4f0 1974 m->n_reloading <= 0) {
4927fcae 1975
3b2775c5
LP
1976 /* Hmm, if there was no start record written
1977 * write it now, so that we always have a nice
1978 * pair */
ac155bb8 1979 if (!u->in_audit) {
546ac4f0 1980 manager_send_unit_audit(m, u, AUDIT_SERVICE_START, ns == UNIT_INACTIVE);
cd6d0a45 1981
3b2775c5 1982 if (ns == UNIT_INACTIVE)
546ac4f0 1983 manager_send_unit_audit(m, u, AUDIT_SERVICE_STOP, true);
3b2775c5
LP
1984 } else
1985 /* Write audit record if we have just finished shutting down */
546ac4f0 1986 manager_send_unit_audit(m, u, AUDIT_SERVICE_STOP, ns == UNIT_INACTIVE);
bdbf9951 1987
ac155bb8 1988 u->in_audit = false;
cd6d0a45 1989 }
f278026d
LP
1990 }
1991
546ac4f0 1992 manager_recheck_journal(m);
3ecaa09b 1993 unit_trigger_notify(u);
3b2775c5 1994
ff502445
LP
1995 if (u->manager->n_reloading <= 0) {
1996 /* Maybe we finished startup and are now ready for
1997 * being stopped because unneeded? */
bf6dcfa6 1998 unit_check_unneeded(u);
c1e1601e 1999
ff502445
LP
2000 /* Maybe we finished startup, but something we needed
2001 * has vanished? Let's die then. (This happens when
2002 * something BindsTo= to a Type=oneshot unit, as these
2003 * units go directly from starting to inactive,
2004 * without ever entering started.) */
2005 unit_check_binds_to(u);
2006 }
2007
c1e1601e 2008 unit_add_to_dbus_queue(u);
701cc384 2009 unit_add_to_gc_queue(u);
87f0e418
LP
2010}
2011
87f0e418 2012int unit_watch_pid(Unit *u, pid_t pid) {
a911bb9a
LP
2013 int q, r;
2014
87f0e418
LP
2015 assert(u);
2016 assert(pid >= 1);
2017
5ba6985b
LP
2018 /* Watch a specific PID. We only support one or two units
2019 * watching each PID for now, not more. */
2020
d5099efc 2021 r = set_ensure_allocated(&u->pids, NULL);
5ba6985b
LP
2022 if (r < 0)
2023 return r;
2024
d5099efc 2025 r = hashmap_ensure_allocated(&u->manager->watch_pids1, NULL);
a911bb9a
LP
2026 if (r < 0)
2027 return r;
2028
fea72cc0 2029 r = hashmap_put(u->manager->watch_pids1, PID_TO_PTR(pid), u);
5ba6985b 2030 if (r == -EEXIST) {
d5099efc 2031 r = hashmap_ensure_allocated(&u->manager->watch_pids2, NULL);
5ba6985b
LP
2032 if (r < 0)
2033 return r;
05e343b7 2034
fea72cc0 2035 r = hashmap_put(u->manager->watch_pids2, PID_TO_PTR(pid), u);
5ba6985b 2036 }
a911bb9a 2037
fea72cc0 2038 q = set_put(u->pids, PID_TO_PTR(pid));
a911bb9a
LP
2039 if (q < 0)
2040 return q;
2041
2042 return r;
87f0e418
LP
2043}
2044
2045void unit_unwatch_pid(Unit *u, pid_t pid) {
2046 assert(u);
2047 assert(pid >= 1);
2048
fea72cc0
LP
2049 (void) hashmap_remove_value(u->manager->watch_pids1, PID_TO_PTR(pid), u);
2050 (void) hashmap_remove_value(u->manager->watch_pids2, PID_TO_PTR(pid), u);
2051 (void) set_remove(u->pids, PID_TO_PTR(pid));
a911bb9a
LP
2052}
2053
bd44e61b
LP
2054void unit_unwatch_all_pids(Unit *u) {
2055 assert(u);
2056
2057 while (!set_isempty(u->pids))
fea72cc0 2058 unit_unwatch_pid(u, PTR_TO_PID(set_first(u->pids)));
bd44e61b 2059
efdb0237 2060 u->pids = set_free(u->pids);
a911bb9a
LP
2061}
2062
2063void unit_tidy_watch_pids(Unit *u, pid_t except1, pid_t except2) {
2064 Iterator i;
2065 void *e;
2066
2067 assert(u);
2068
2069 /* Cleans dead PIDs from our list */
2070
2071 SET_FOREACH(e, u->pids, i) {
fea72cc0 2072 pid_t pid = PTR_TO_PID(e);
a911bb9a
LP
2073
2074 if (pid == except1 || pid == except2)
2075 continue;
2076
9f5650ae 2077 if (!pid_is_unwaited(pid))
bd44e61b 2078 unit_unwatch_pid(u, pid);
a911bb9a 2079 }
87f0e418
LP
2080}
2081
87f0e418
LP
2082bool unit_job_is_applicable(Unit *u, JobType j) {
2083 assert(u);
2084 assert(j >= 0 && j < _JOB_TYPE_MAX);
2085
2086 switch (j) {
2087
2088 case JOB_VERIFY_ACTIVE:
2089 case JOB_START:
57339f47 2090 case JOB_STOP:
e0209d83 2091 case JOB_NOP:
87f0e418
LP
2092 return true;
2093
87f0e418
LP
2094 case JOB_RESTART:
2095 case JOB_TRY_RESTART:
2096 return unit_can_start(u);
2097
2098 case JOB_RELOAD:
2099 return unit_can_reload(u);
2100
2101 case JOB_RELOAD_OR_START:
2102 return unit_can_reload(u) && unit_can_start(u);
2103
2104 default:
2105 assert_not_reached("Invalid job type");
2106 }
2107}
2108
f2341e0a
LP
2109static void maybe_warn_about_dependency(Unit *u, const char *other, UnitDependency dependency) {
2110 assert(u);
d1fab3fe 2111
f2341e0a
LP
2112 /* Only warn about some unit types */
2113 if (!IN_SET(dependency, UNIT_CONFLICTS, UNIT_CONFLICTED_BY, UNIT_BEFORE, UNIT_AFTER, UNIT_ON_FAILURE, UNIT_TRIGGERS, UNIT_TRIGGERED_BY))
2114 return;
3f3cc397 2115
f2341e0a
LP
2116 if (streq_ptr(u->id, other))
2117 log_unit_warning(u, "Dependency %s=%s dropped", unit_dependency_to_string(dependency), u->id);
2118 else
2119 log_unit_warning(u, "Dependency %s=%s dropped, merged into %s", unit_dependency_to_string(dependency), strna(other), u->id);
d1fab3fe
ZJS
2120}
2121
701cc384 2122int unit_add_dependency(Unit *u, UnitDependency d, Unit *other, bool add_reference) {
87f0e418
LP
2123
2124 static const UnitDependency inverse_table[_UNIT_DEPENDENCY_MAX] = {
2125 [UNIT_REQUIRES] = UNIT_REQUIRED_BY,
87f0e418 2126 [UNIT_WANTS] = UNIT_WANTED_BY,
be7d9ff7 2127 [UNIT_REQUISITE] = UNIT_REQUISITE_OF,
7f2cddae 2128 [UNIT_BINDS_TO] = UNIT_BOUND_BY,
60649f17 2129 [UNIT_PART_OF] = UNIT_CONSISTS_OF,
be7d9ff7 2130 [UNIT_REQUIRED_BY] = UNIT_REQUIRES,
be7d9ff7 2131 [UNIT_REQUISITE_OF] = UNIT_REQUISITE,
be7d9ff7 2132 [UNIT_WANTED_BY] = UNIT_WANTS,
7f2cddae 2133 [UNIT_BOUND_BY] = UNIT_BINDS_TO,
60649f17 2134 [UNIT_CONSISTS_OF] = UNIT_PART_OF,
69dd2852
LP
2135 [UNIT_CONFLICTS] = UNIT_CONFLICTED_BY,
2136 [UNIT_CONFLICTED_BY] = UNIT_CONFLICTS,
87f0e418 2137 [UNIT_BEFORE] = UNIT_AFTER,
701cc384 2138 [UNIT_AFTER] = UNIT_BEFORE,
5de9682c 2139 [UNIT_ON_FAILURE] = _UNIT_DEPENDENCY_INVALID,
701cc384 2140 [UNIT_REFERENCES] = UNIT_REFERENCED_BY,
57020a3a
LP
2141 [UNIT_REFERENCED_BY] = UNIT_REFERENCES,
2142 [UNIT_TRIGGERS] = UNIT_TRIGGERED_BY,
4dcc1cb4 2143 [UNIT_TRIGGERED_BY] = UNIT_TRIGGERS,
7f2cddae 2144 [UNIT_PROPAGATES_RELOAD_TO] = UNIT_RELOAD_PROPAGATED_FROM,
85e9a101 2145 [UNIT_RELOAD_PROPAGATED_FROM] = UNIT_PROPAGATES_RELOAD_TO,
613b411c 2146 [UNIT_JOINS_NAMESPACE_OF] = UNIT_JOINS_NAMESPACE_OF,
87f0e418 2147 };
701cc384 2148 int r, q = 0, v = 0, w = 0;
d1fab3fe 2149 Unit *orig_u = u, *orig_other = other;
87f0e418
LP
2150
2151 assert(u);
2152 assert(d >= 0 && d < _UNIT_DEPENDENCY_MAX);
87f0e418
LP
2153 assert(other);
2154
9f151f29
LP
2155 u = unit_follow_merge(u);
2156 other = unit_follow_merge(other);
2157
87f0e418
LP
2158 /* We won't allow dependencies on ourselves. We will not
2159 * consider them an error however. */
d1fab3fe 2160 if (u == other) {
f2341e0a 2161 maybe_warn_about_dependency(orig_u, orig_other->id, d);
87f0e418 2162 return 0;
d1fab3fe 2163 }
87f0e418 2164
d5099efc 2165 r = set_ensure_allocated(&u->dependencies[d], NULL);
613b411c 2166 if (r < 0)
87f0e418
LP
2167 return r;
2168
613b411c 2169 if (inverse_table[d] != _UNIT_DEPENDENCY_INVALID) {
d5099efc 2170 r = set_ensure_allocated(&other->dependencies[inverse_table[d]], NULL);
613b411c
LP
2171 if (r < 0)
2172 return r;
2173 }
2174
2175 if (add_reference) {
d5099efc 2176 r = set_ensure_allocated(&u->dependencies[UNIT_REFERENCES], NULL);
613b411c 2177 if (r < 0)
5de9682c
LP
2178 return r;
2179
d5099efc 2180 r = set_ensure_allocated(&other->dependencies[UNIT_REFERENCED_BY], NULL);
613b411c 2181 if (r < 0)
701cc384 2182 return r;
613b411c 2183 }
87f0e418 2184
613b411c
LP
2185 q = set_put(u->dependencies[d], other);
2186 if (q < 0)
701cc384 2187 return q;
87f0e418 2188
613b411c
LP
2189 if (inverse_table[d] != _UNIT_DEPENDENCY_INVALID && inverse_table[d] != d) {
2190 v = set_put(other->dependencies[inverse_table[d]], u);
2191 if (v < 0) {
5de9682c
LP
2192 r = v;
2193 goto fail;
2194 }
613b411c 2195 }
701cc384
LP
2196
2197 if (add_reference) {
613b411c
LP
2198 w = set_put(u->dependencies[UNIT_REFERENCES], other);
2199 if (w < 0) {
701cc384
LP
2200 r = w;
2201 goto fail;
2202 }
2203
613b411c
LP
2204 r = set_put(other->dependencies[UNIT_REFERENCED_BY], u);
2205 if (r < 0)
701cc384 2206 goto fail;
87f0e418
LP
2207 }
2208
c1e1601e 2209 unit_add_to_dbus_queue(u);
87f0e418 2210 return 0;
701cc384
LP
2211
2212fail:
2213 if (q > 0)
ac155bb8 2214 set_remove(u->dependencies[d], other);
701cc384
LP
2215
2216 if (v > 0)
ac155bb8 2217 set_remove(other->dependencies[inverse_table[d]], u);
701cc384
LP
2218
2219 if (w > 0)
ac155bb8 2220 set_remove(u->dependencies[UNIT_REFERENCES], other);
701cc384
LP
2221
2222 return r;
87f0e418 2223}
0301abf4 2224
2c966c03
LP
2225int unit_add_two_dependencies(Unit *u, UnitDependency d, UnitDependency e, Unit *other, bool add_reference) {
2226 int r;
2227
2228 assert(u);
2229
3f3cc397
LP
2230 r = unit_add_dependency(u, d, other, add_reference);
2231 if (r < 0)
2c966c03
LP
2232 return r;
2233
7410616c 2234 return unit_add_dependency(u, e, other, add_reference);
2c966c03
LP
2235}
2236
7410616c
LP
2237static int resolve_template(Unit *u, const char *name, const char*path, char **buf, const char **ret) {
2238 int r;
9e2f7c11
LP
2239
2240 assert(u);
2241 assert(name || path);
7410616c
LP
2242 assert(buf);
2243 assert(ret);
9e2f7c11
LP
2244
2245 if (!name)
2b6bf07d 2246 name = basename(path);
9e2f7c11 2247
7410616c
LP
2248 if (!unit_name_is_valid(name, UNIT_NAME_TEMPLATE)) {
2249 *buf = NULL;
2250 *ret = name;
2251 return 0;
9e2f7c11
LP
2252 }
2253
ac155bb8 2254 if (u->instance)
7410616c 2255 r = unit_name_replace_instance(name, u->instance, buf);
9e2f7c11 2256 else {
ae018d9b 2257 _cleanup_free_ char *i = NULL;
9e2f7c11 2258
7410616c
LP
2259 r = unit_name_to_prefix(u->id, &i);
2260 if (r < 0)
2261 return r;
9e2f7c11 2262
7410616c 2263 r = unit_name_replace_instance(name, i, buf);
9e2f7c11 2264 }
7410616c
LP
2265 if (r < 0)
2266 return r;
9e2f7c11 2267
7410616c
LP
2268 *ret = *buf;
2269 return 0;
9e2f7c11
LP
2270}
2271
701cc384 2272int unit_add_dependency_by_name(Unit *u, UnitDependency d, const char *name, const char *path, bool add_reference) {
7410616c 2273 _cleanup_free_ char *buf = NULL;
09b6b09f
LP
2274 Unit *other;
2275 int r;
2276
9e2f7c11
LP
2277 assert(u);
2278 assert(name || path);
09b6b09f 2279
7410616c
LP
2280 r = resolve_template(u, name, path, &buf, &name);
2281 if (r < 0)
2282 return r;
09b6b09f 2283
8afbb8e1
LP
2284 r = manager_load_unit(u->manager, name, path, NULL, &other);
2285 if (r < 0)
2286 return r;
9e2f7c11 2287
8afbb8e1 2288 return unit_add_dependency(u, d, other, add_reference);
09b6b09f
LP
2289}
2290
2c966c03 2291int unit_add_two_dependencies_by_name(Unit *u, UnitDependency d, UnitDependency e, const char *name, const char *path, bool add_reference) {
7410616c 2292 _cleanup_free_ char *buf = NULL;
2c966c03
LP
2293 Unit *other;
2294 int r;
2c966c03
LP
2295
2296 assert(u);
2297 assert(name || path);
2298
7410616c
LP
2299 r = resolve_template(u, name, path, &buf, &name);
2300 if (r < 0)
2301 return r;
2c966c03 2302
3f3cc397
LP
2303 r = manager_load_unit(u->manager, name, path, NULL, &other);
2304 if (r < 0)
68eda4bd 2305 return r;
2c966c03 2306
3f3cc397 2307 return unit_add_two_dependencies(u, d, e, other, add_reference);
2c966c03
LP
2308}
2309
0301abf4 2310int set_unit_path(const char *p) {
0301abf4 2311 /* This is mostly for debug purposes */
cbe46ead 2312 if (setenv("SYSTEMD_UNIT_PATH", p, 1) < 0)
26d04f86 2313 return -errno;
0301abf4
LP
2314
2315 return 0;
2316}
88066b3a 2317
ea430986 2318char *unit_dbus_path(Unit *u) {
ea430986
LP
2319 assert(u);
2320
ac155bb8 2321 if (!u->id)
04ade7d2
LP
2322 return NULL;
2323
48899192 2324 return unit_dbus_path_from_name(u->id);
ea430986
LP
2325}
2326
d79200e2
LP
2327int unit_set_slice(Unit *u, Unit *slice) {
2328 assert(u);
2329 assert(slice);
2330
2331 /* Sets the unit slice if it has not been set before. Is extra
2332 * careful, to only allow this for units that actually have a
2333 * cgroup context. Also, we don't allow to set this for slices
2334 * (since the parent slice is derived from the name). Make
2335 * sure the unit we set is actually a slice. */
2336
2337 if (!UNIT_HAS_CGROUP_CONTEXT(u))
2338 return -EOPNOTSUPP;
2339
2340 if (u->type == UNIT_SLICE)
2341 return -EINVAL;
2342
102ef982
LP
2343 if (unit_active_state(u) != UNIT_INACTIVE)
2344 return -EBUSY;
2345
d79200e2
LP
2346 if (slice->type != UNIT_SLICE)
2347 return -EINVAL;
2348
efdb0237
LP
2349 if (unit_has_name(u, SPECIAL_INIT_SCOPE) &&
2350 !unit_has_name(slice, SPECIAL_ROOT_SLICE))
2351 return -EPERM;
2352
d79200e2
LP
2353 if (UNIT_DEREF(u->slice) == slice)
2354 return 0;
2355
2356 if (UNIT_ISSET(u->slice))
2357 return -EBUSY;
2358
2359 unit_ref_set(&u->slice, slice);
2360 return 1;
2361}
2362
2363int unit_set_default_slice(Unit *u) {
a8833944
LP
2364 _cleanup_free_ char *b = NULL;
2365 const char *slice_name;
a016b922
LP
2366 Unit *slice;
2367 int r;
2368
2369 assert(u);
2370
9444b1f2 2371 if (UNIT_ISSET(u->slice))
a016b922
LP
2372 return 0;
2373
a8833944
LP
2374 if (u->instance) {
2375 _cleanup_free_ char *prefix = NULL, *escaped = NULL;
68eda4bd 2376
a8833944
LP
2377 /* Implicitly place all instantiated units in their
2378 * own per-template slice */
2379
7410616c
LP
2380 r = unit_name_to_prefix(u->id, &prefix);
2381 if (r < 0)
2382 return r;
a8833944
LP
2383
2384 /* The prefix is already escaped, but it might include
2385 * "-" which has a special meaning for slice units,
2386 * hence escape it here extra. */
7410616c 2387 escaped = unit_name_escape(prefix);
a8833944
LP
2388 if (!escaped)
2389 return -ENOMEM;
2390
b2c23da8 2391 if (u->manager->running_as == MANAGER_SYSTEM)
a8833944
LP
2392 b = strjoin("system-", escaped, ".slice", NULL);
2393 else
2394 b = strappend(escaped, ".slice");
2395 if (!b)
2396 return -ENOMEM;
2397
2398 slice_name = b;
2399 } else
2400 slice_name =
efdb0237 2401 u->manager->running_as == MANAGER_SYSTEM && !unit_has_name(u, SPECIAL_INIT_SCOPE)
a8833944
LP
2402 ? SPECIAL_SYSTEM_SLICE
2403 : SPECIAL_ROOT_SLICE;
2404
2405 r = manager_load_unit(u->manager, slice_name, NULL, NULL, &slice);
a016b922
LP
2406 if (r < 0)
2407 return r;
2408
d79200e2 2409 return unit_set_slice(u, slice);
a016b922
LP
2410}
2411
9444b1f2
LP
2412const char *unit_slice_name(Unit *u) {
2413 assert(u);
2414
2415 if (!UNIT_ISSET(u->slice))
2416 return NULL;
2417
2418 return UNIT_DEREF(u->slice)->id;
2419}
2420
f6ff8c29 2421int unit_load_related_unit(Unit *u, const char *type, Unit **_found) {
78edb35a 2422 _cleanup_free_ char *t = NULL;
f6ff8c29
LP
2423 int r;
2424
2425 assert(u);
2426 assert(type);
2427 assert(_found);
2428
7410616c
LP
2429 r = unit_name_change_suffix(u->id, type, &t);
2430 if (r < 0)
2431 return r;
2432 if (unit_has_name(u, t))
2433 return -EINVAL;
f6ff8c29 2434
ac155bb8 2435 r = manager_load_unit(u->manager, t, NULL, NULL, _found);
9e2f7c11 2436 assert(r < 0 || *_found != u);
f6ff8c29
LP
2437 return r;
2438}
2439
bbc29086
DM
2440static int signal_name_owner_changed(sd_bus_message *message, void *userdata, sd_bus_error *error) {
2441 const char *name, *old_owner, *new_owner;
2442 Unit *u = userdata;
2443 int r;
2444
2445 assert(message);
2446 assert(u);
2447
2448 r = sd_bus_message_read(message, "sss", &name, &old_owner, &new_owner);
2449 if (r < 0) {
2450 bus_log_parse_error(r);
2451 return 0;
2452 }
2453
2454 if (UNIT_VTABLE(u)->bus_name_owner_change)
2455 UNIT_VTABLE(u)->bus_name_owner_change(u, name, old_owner, new_owner);
2456
2457 return 0;
2458}
2459
9806e87d
LP
2460int unit_install_bus_match(Unit *u, sd_bus *bus, const char *name) {
2461 const char *match;
bbc29086 2462
9806e87d
LP
2463 assert(u);
2464 assert(bus);
2465 assert(name);
bbc29086
DM
2466
2467 if (u->match_bus_slot)
2468 return -EBUSY;
2469
9806e87d 2470 match = strjoina("type='signal',"
bbc29086
DM
2471 "sender='org.freedesktop.DBus',"
2472 "path='/org/freedesktop/DBus',"
2473 "interface='org.freedesktop.DBus',"
2474 "member='NameOwnerChanged',"
9806e87d 2475 "arg0='", name, "'",
bbc29086 2476 NULL);
bbc29086
DM
2477
2478 return sd_bus_add_match(bus, &u->match_bus_slot, match, signal_name_owner_changed, u);
2479}
2480
05e343b7 2481int unit_watch_bus_name(Unit *u, const char *name) {
bbc29086
DM
2482 int r;
2483
05e343b7
LP
2484 assert(u);
2485 assert(name);
2486
2487 /* Watch a specific name on the bus. We only support one unit
2488 * watching each name for now. */
2489
bbc29086
DM
2490 if (u->manager->api_bus) {
2491 /* If the bus is already available, install the match directly.
2492 * Otherwise, just put the name in the list. bus_setup_api() will take care later. */
9806e87d 2493 r = unit_install_bus_match(u, u->manager->api_bus, name);
bbc29086 2494 if (r < 0)
8ea823b6 2495 return log_warning_errno(r, "Failed to subscribe to NameOwnerChanged signal for '%s': %m", name);
bbc29086
DM
2496 }
2497
2498 r = hashmap_put(u->manager->watch_bus, name, u);
2499 if (r < 0) {
2500 u->match_bus_slot = sd_bus_slot_unref(u->match_bus_slot);
2501 return log_warning_errno(r, "Failed to put bus name to hashmap: %m");
2502 }
2503
2504 return 0;
05e343b7
LP
2505}
2506
2507void unit_unwatch_bus_name(Unit *u, const char *name) {
2508 assert(u);
2509 assert(name);
2510
ac155bb8 2511 hashmap_remove_value(u->manager->watch_bus, name, u);
bbc29086 2512 u->match_bus_slot = sd_bus_slot_unref(u->match_bus_slot);
05e343b7
LP
2513}
2514
a16e1123
LP
2515bool unit_can_serialize(Unit *u) {
2516 assert(u);
2517
2518 return UNIT_VTABLE(u)->serialize && UNIT_VTABLE(u)->deserialize_item;
2519}
2520
6b78f9b4 2521int unit_serialize(Unit *u, FILE *f, FDSet *fds, bool serialize_jobs) {
a16e1123
LP
2522 int r;
2523
2524 assert(u);
2525 assert(f);
2526 assert(fds);
2527
9bdb98c5
LP
2528 if (unit_can_serialize(u)) {
2529 ExecRuntime *rt;
a16e1123 2530
9bdb98c5 2531 r = UNIT_VTABLE(u)->serialize(u, f, fds);
613b411c
LP
2532 if (r < 0)
2533 return r;
9bdb98c5
LP
2534
2535 rt = unit_get_exec_runtime(u);
2536 if (rt) {
f2341e0a 2537 r = exec_runtime_serialize(u, rt, f, fds);
9bdb98c5
LP
2538 if (r < 0)
2539 return r;
2540 }
e0209d83
MS
2541 }
2542
ac155bb8
MS
2543 dual_timestamp_serialize(f, "inactive-exit-timestamp", &u->inactive_exit_timestamp);
2544 dual_timestamp_serialize(f, "active-enter-timestamp", &u->active_enter_timestamp);
2545 dual_timestamp_serialize(f, "active-exit-timestamp", &u->active_exit_timestamp);
2546 dual_timestamp_serialize(f, "inactive-enter-timestamp", &u->inactive_enter_timestamp);
2547 dual_timestamp_serialize(f, "condition-timestamp", &u->condition_timestamp);
59fccdc5 2548 dual_timestamp_serialize(f, "assert-timestamp", &u->assert_timestamp);
2791a8f8 2549
ac155bb8
MS
2550 if (dual_timestamp_is_set(&u->condition_timestamp))
2551 unit_serialize_item(u, f, "condition-result", yes_no(u->condition_result));
10717a1a 2552
59fccdc5
LP
2553 if (dual_timestamp_is_set(&u->assert_timestamp))
2554 unit_serialize_item(u, f, "assert-result", yes_no(u->assert_result));
2555
c2756a68 2556 unit_serialize_item(u, f, "transient", yes_no(u->transient));
5ad096b3 2557 unit_serialize_item_format(u, f, "cpuacct-usage-base", "%" PRIu64, u->cpuacct_usage_base);
c2756a68
LP
2558
2559 if (u->cgroup_path)
2560 unit_serialize_item(u, f, "cgroup", u->cgroup_path);
de1d4f9b 2561 unit_serialize_item(u, f, "cgroup-realized", yes_no(u->cgroup_realized));
c2756a68 2562
32ee7d33
DM
2563 if (u->cgroup_netclass_id)
2564 unit_serialize_item_format(u, f, "netclass-id", "%" PRIu32, u->cgroup_netclass_id);
2565
613b411c
LP
2566 if (serialize_jobs) {
2567 if (u->job) {
2568 fprintf(f, "job\n");
2569 job_serialize(u->job, f, fds);
2570 }
2571
2572 if (u->nop_job) {
2573 fprintf(f, "job\n");
2574 job_serialize(u->nop_job, f, fds);
2575 }
2576 }
2577
a16e1123
LP
2578 /* End marker */
2579 fputc('\n', f);
2580 return 0;
2581}
2582
a34ceba6
LP
2583int unit_serialize_item(Unit *u, FILE *f, const char *key, const char *value) {
2584 assert(u);
2585 assert(f);
2586 assert(key);
2587
2588 if (!value)
2589 return 0;
2590
2591 fputs(key, f);
2592 fputc('=', f);
2593 fputs(value, f);
2594 fputc('\n', f);
2595
2596 return 1;
2597}
2598
2599int unit_serialize_item_escaped(Unit *u, FILE *f, const char *key, const char *value) {
2600 _cleanup_free_ char *c = NULL;
2601
2602 assert(u);
2603 assert(f);
2604 assert(key);
2605
2606 if (!value)
2607 return 0;
2608
2609 c = cescape(value);
2610 if (!c)
2611 return -ENOMEM;
2612
2613 fputs(key, f);
2614 fputc('=', f);
2615 fputs(c, f);
2616 fputc('\n', f);
2617
2618 return 1;
2619}
2620
2621int unit_serialize_item_fd(Unit *u, FILE *f, FDSet *fds, const char *key, int fd) {
2622 int copy;
2623
2624 assert(u);
2625 assert(f);
2626 assert(key);
2627
2628 if (fd < 0)
2629 return 0;
2630
2631 copy = fdset_put_dup(fds, fd);
2632 if (copy < 0)
2633 return copy;
2634
2635 fprintf(f, "%s=%i\n", key, copy);
2636 return 1;
2637}
2638
a16e1123
LP
2639void unit_serialize_item_format(Unit *u, FILE *f, const char *key, const char *format, ...) {
2640 va_list ap;
2641
2642 assert(u);
2643 assert(f);
2644 assert(key);
2645 assert(format);
2646
2647 fputs(key, f);
2648 fputc('=', f);
2649
2650 va_start(ap, format);
2651 vfprintf(f, format, ap);
2652 va_end(ap);
2653
2654 fputc('\n', f);
2655}
2656
a16e1123 2657int unit_deserialize(Unit *u, FILE *f, FDSet *fds) {
28b99ccd 2658 ExecRuntime **rt = NULL;
9bdb98c5 2659 size_t offset;
a16e1123
LP
2660 int r;
2661
2662 assert(u);
2663 assert(f);
2664 assert(fds);
2665
613b411c
LP
2666 offset = UNIT_VTABLE(u)->exec_runtime_offset;
2667 if (offset > 0)
2668 rt = (ExecRuntime**) ((uint8_t*) u + offset);
2669
a16e1123 2670 for (;;) {
20c03b7b 2671 char line[LINE_MAX], *l, *v;
a16e1123
LP
2672 size_t k;
2673
2674 if (!fgets(line, sizeof(line), f)) {
2675 if (feof(f))
2676 return 0;
2677 return -errno;
2678 }
2679
10f8e83c 2680 char_array_0(line);
a16e1123
LP
2681 l = strstrip(line);
2682
2683 /* End marker */
e911de99 2684 if (isempty(l))
a16e1123
LP
2685 return 0;
2686
2687 k = strcspn(l, "=");
2688
2689 if (l[k] == '=') {
2690 l[k] = 0;
2691 v = l+k+1;
2692 } else
2693 v = l+k;
2694
cca098b0 2695 if (streq(l, "job")) {
39a18c60
MS
2696 if (v[0] == '\0') {
2697 /* new-style serialized job */
9c3349e2
LP
2698 Job *j;
2699
2700 j = job_new_raw(u);
39a18c60 2701 if (!j)
e911de99 2702 return log_oom();
39a18c60
MS
2703
2704 r = job_deserialize(j, f, fds);
2705 if (r < 0) {
2706 job_free(j);
2707 return r;
2708 }
cca098b0 2709
39a18c60
MS
2710 r = hashmap_put(u->manager->jobs, UINT32_TO_PTR(j->id), j);
2711 if (r < 0) {
2712 job_free(j);
2713 return r;
2714 }
e0209d83
MS
2715
2716 r = job_install_deserialized(j);
2717 if (r < 0) {
2718 hashmap_remove(u->manager->jobs, UINT32_TO_PTR(j->id));
2719 job_free(j);
2720 return r;
2721 }
ed10fa8c
LP
2722 } else /* legacy for pre-44 */
2723 log_unit_warning(u, "Update from too old systemd versions are unsupported, cannot deserialize job: %s", v);
cca098b0 2724 continue;
8aaf019b 2725 } else if (streq(l, "inactive-exit-timestamp")) {
ac155bb8 2726 dual_timestamp_deserialize(v, &u->inactive_exit_timestamp);
8aaf019b
LP
2727 continue;
2728 } else if (streq(l, "active-enter-timestamp")) {
ac155bb8 2729 dual_timestamp_deserialize(v, &u->active_enter_timestamp);
8aaf019b
LP
2730 continue;
2731 } else if (streq(l, "active-exit-timestamp")) {
ac155bb8 2732 dual_timestamp_deserialize(v, &u->active_exit_timestamp);
8aaf019b
LP
2733 continue;
2734 } else if (streq(l, "inactive-enter-timestamp")) {
ac155bb8 2735 dual_timestamp_deserialize(v, &u->inactive_enter_timestamp);
8aaf019b 2736 continue;
2791a8f8 2737 } else if (streq(l, "condition-timestamp")) {
ac155bb8 2738 dual_timestamp_deserialize(v, &u->condition_timestamp);
2791a8f8 2739 continue;
59fccdc5
LP
2740 } else if (streq(l, "assert-timestamp")) {
2741 dual_timestamp_deserialize(v, &u->assert_timestamp);
2742 continue;
2791a8f8 2743 } else if (streq(l, "condition-result")) {
2791a8f8 2744
e911de99
LP
2745 r = parse_boolean(v);
2746 if (r < 0)
f2341e0a 2747 log_unit_debug(u, "Failed to parse condition result value %s, ignoring.", v);
2791a8f8 2748 else
e911de99 2749 u->condition_result = r;
efbac6d2
LP
2750
2751 continue;
c2756a68 2752
59fccdc5 2753 } else if (streq(l, "assert-result")) {
59fccdc5 2754
e911de99
LP
2755 r = parse_boolean(v);
2756 if (r < 0)
f2341e0a 2757 log_unit_debug(u, "Failed to parse assert result value %s, ignoring.", v);
59fccdc5 2758 else
e911de99 2759 u->assert_result = r;
59fccdc5
LP
2760
2761 continue;
2762
c2756a68 2763 } else if (streq(l, "transient")) {
c2756a68 2764
e911de99
LP
2765 r = parse_boolean(v);
2766 if (r < 0)
f2341e0a 2767 log_unit_debug(u, "Failed to parse transient bool %s, ignoring.", v);
c2756a68 2768 else
e911de99 2769 u->transient = r;
c2756a68
LP
2770
2771 continue;
e911de99 2772
5ad096b3
LP
2773 } else if (streq(l, "cpuacct-usage-base")) {
2774
2775 r = safe_atou64(v, &u->cpuacct_usage_base);
2776 if (r < 0)
f2341e0a 2777 log_unit_debug(u, "Failed to parse CPU usage %s, ignoring.", v);
5ad096b3 2778
0f908397 2779 continue;
4e595329 2780
e911de99 2781 } else if (streq(l, "cgroup")) {
72673e86 2782
e911de99
LP
2783 r = unit_set_cgroup_path(u, v);
2784 if (r < 0)
f2341e0a 2785 log_unit_debug_errno(u, r, "Failed to set cgroup path %s, ignoring: %m", v);
4e595329 2786
efdb0237
LP
2787 (void) unit_watch_cgroup(u);
2788
de1d4f9b
WF
2789 continue;
2790 } else if (streq(l, "cgroup-realized")) {
2791 int b;
2792
2793 b = parse_boolean(v);
2794 if (b < 0)
2795 log_unit_debug(u, "Failed to parse cgroup-realized bool %s, ignoring.", v);
2796 else
2797 u->cgroup_realized = b;
2798
32ee7d33
DM
2799 continue;
2800 } else if (streq(l, "netclass-id")) {
2801 r = safe_atou32(v, &u->cgroup_netclass_id);
2802 if (r < 0)
2803 log_unit_debug(u, "Failed to parse netclass ID %s, ignoring.", v);
2804 else {
2805 r = unit_add_to_netclass_cgroup(u);
2806 if (r < 0)
2807 log_unit_debug_errno(u, r, "Failed to add unit to netclass cgroup, ignoring: %m");
2808 }
2809
c2756a68 2810 continue;
8aaf019b 2811 }
cca098b0 2812
9bdb98c5
LP
2813 if (unit_can_serialize(u)) {
2814 if (rt) {
f2341e0a 2815 r = exec_runtime_deserialize_item(u, rt, l, v, fds);
e911de99 2816 if (r < 0) {
f2341e0a 2817 log_unit_warning(u, "Failed to deserialize runtime parameter '%s', ignoring.", l);
e911de99
LP
2818 continue;
2819 }
2820
2821 /* Returns positive if key was handled by the call */
9bdb98c5
LP
2822 if (r > 0)
2823 continue;
2824 }
2825
2826 r = UNIT_VTABLE(u)->deserialize_item(u, l, v, fds);
613b411c 2827 if (r < 0)
f2341e0a 2828 log_unit_warning(u, "Failed to deserialize unit parameter '%s', ignoring.", l);
613b411c 2829 }
a16e1123
LP
2830 }
2831}
2832
6e2ef85b
LP
2833int unit_add_node_link(Unit *u, const char *what, bool wants) {
2834 Unit *device;
68eda4bd 2835 _cleanup_free_ char *e = NULL;
6e2ef85b
LP
2836 int r;
2837
2838 assert(u);
2839
6e2ef85b 2840 /* Adds in links to the device node that this unit is based on */
47bc12e1
LP
2841 if (isempty(what))
2842 return 0;
6e2ef85b 2843
8407a5d0 2844 if (!is_device_path(what))
6e2ef85b
LP
2845 return 0;
2846
47bc12e1
LP
2847 /* When device units aren't supported (such as in a
2848 * container), don't create dependencies on them. */
1c2e9646 2849 if (!unit_type_supported(UNIT_DEVICE))
47bc12e1
LP
2850 return 0;
2851
7410616c
LP
2852 r = unit_name_from_path(what, ".device", &e);
2853 if (r < 0)
2854 return r;
6e2ef85b 2855
ac155bb8 2856 r = manager_load_unit(u->manager, e, NULL, NULL, &device);
6e2ef85b
LP
2857 if (r < 0)
2858 return r;
2859
b2c23da8 2860 r = unit_add_two_dependencies(u, UNIT_AFTER, u->manager->running_as == MANAGER_SYSTEM ? UNIT_BINDS_TO : UNIT_WANTS, device, true);
faa368e3 2861 if (r < 0)
6e2ef85b
LP
2862 return r;
2863
faa368e3
LP
2864 if (wants) {
2865 r = unit_add_dependency(device, UNIT_WANTS, u, false);
2866 if (r < 0)
6e2ef85b 2867 return r;
faa368e3 2868 }
6e2ef85b
LP
2869
2870 return 0;
2871}
a16e1123 2872
be847e82 2873int unit_coldplug(Unit *u) {
5a6158b6 2874 int r = 0, q = 0;
cca098b0
LP
2875
2876 assert(u);
2877
f78f265f
LP
2878 /* Make sure we don't enter a loop, when coldplugging
2879 * recursively. */
2880 if (u->coldplugged)
2881 return 0;
2882
2883 u->coldplugged = true;
2884
5a6158b6 2885 if (UNIT_VTABLE(u)->coldplug)
f78f265f 2886 r = UNIT_VTABLE(u)->coldplug(u);
cca098b0 2887
5a6158b6
LP
2888 if (u->job)
2889 q = job_coldplug(u->job);
2890
2891 if (r < 0)
2892 return r;
2893 if (q < 0)
2894 return q;
cca098b0
LP
2895
2896 return 0;
2897}
2898
49b1d377 2899void unit_status_printf(Unit *u, const char *status, const char *unit_status_msg_format) {
bcfce235 2900 DISABLE_WARNING_FORMAT_NONLITERAL;
127d5fd1
ZJS
2901 manager_status_printf(u->manager, STATUS_TYPE_NORMAL,
2902 status, unit_status_msg_format, unit_description(u));
bcfce235 2903 REENABLE_WARNING;
49b1d377
MS
2904}
2905
45fb0699 2906bool unit_need_daemon_reload(Unit *u) {
ae7a7182
OS
2907 _cleanup_strv_free_ char **t = NULL;
2908 char **path;
1b64d026 2909 struct stat st;
ae7a7182 2910 unsigned loaded_cnt, current_cnt;
1b64d026 2911
45fb0699
LP
2912 assert(u);
2913
ac155bb8 2914 if (u->fragment_path) {
5f4b19f4 2915 zero(st);
ac155bb8 2916 if (stat(u->fragment_path, &st) < 0)
5f4b19f4
LP
2917 /* What, cannot access this anymore? */
2918 return true;
45fb0699 2919
ac155bb8
MS
2920 if (u->fragment_mtime > 0 &&
2921 timespec_load(&st.st_mtim) != u->fragment_mtime)
5f4b19f4
LP
2922 return true;
2923 }
2924
1b64d026
LP
2925 if (u->source_path) {
2926 zero(st);
2927 if (stat(u->source_path, &st) < 0)
2928 return true;
2929
2930 if (u->source_mtime > 0 &&
2931 timespec_load(&st.st_mtim) != u->source_mtime)
2932 return true;
2933 }
5f4b19f4 2934
1a7f1b38 2935 (void) unit_find_dropin_paths(u, &t);
ae7a7182
OS
2936 loaded_cnt = strv_length(t);
2937 current_cnt = strv_length(u->dropin_paths);
2938
2939 if (loaded_cnt == current_cnt) {
2940 if (loaded_cnt == 0)
2941 return false;
2942
2943 if (strv_overlap(u->dropin_paths, t)) {
2944 STRV_FOREACH(path, u->dropin_paths) {
2945 zero(st);
2946 if (stat(*path, &st) < 0)
2947 return true;
2948
2949 if (u->dropin_mtime > 0 &&
2950 timespec_load(&st.st_mtim) > u->dropin_mtime)
2951 return true;
2952 }
2953
2954 return false;
2955 } else
2956 return true;
2957 } else
2958 return true;
45fb0699
LP
2959}
2960
fdf20a31 2961void unit_reset_failed(Unit *u) {
5632e374
LP
2962 assert(u);
2963
fdf20a31
MM
2964 if (UNIT_VTABLE(u)->reset_failed)
2965 UNIT_VTABLE(u)->reset_failed(u);
5632e374
LP
2966}
2967
a7f241db
LP
2968Unit *unit_following(Unit *u) {
2969 assert(u);
2970
2971 if (UNIT_VTABLE(u)->following)
2972 return UNIT_VTABLE(u)->following(u);
2973
2974 return NULL;
2975}
2976
31afa0a4 2977bool unit_stop_pending(Unit *u) {
18ffdfda
LP
2978 assert(u);
2979
31afa0a4
LP
2980 /* This call does check the current state of the unit. It's
2981 * hence useful to be called from state change calls of the
2982 * unit itself, where the state isn't updated yet. This is
2983 * different from unit_inactive_or_pending() which checks both
2984 * the current state and for a queued job. */
18ffdfda 2985
31afa0a4
LP
2986 return u->job && u->job->type == JOB_STOP;
2987}
2988
2989bool unit_inactive_or_pending(Unit *u) {
2990 assert(u);
2991
2992 /* Returns true if the unit is inactive or going down */
18ffdfda 2993
d956ac29
LP
2994 if (UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(u)))
2995 return true;
2996
31afa0a4 2997 if (unit_stop_pending(u))
18ffdfda
LP
2998 return true;
2999
3000 return false;
3001}
3002
31afa0a4 3003bool unit_active_or_pending(Unit *u) {
f976f3f6
LP
3004 assert(u);
3005
f60c2665 3006 /* Returns true if the unit is active or going up */
f976f3f6
LP
3007
3008 if (UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u)))
3009 return true;
3010
ac155bb8
MS
3011 if (u->job &&
3012 (u->job->type == JOB_START ||
3013 u->job->type == JOB_RELOAD_OR_START ||
3014 u->job->type == JOB_RESTART))
f976f3f6
LP
3015 return true;
3016
3017 return false;
3018}
3019
718db961 3020int unit_kill(Unit *u, KillWho w, int signo, sd_bus_error *error) {
8a0867d6
LP
3021 assert(u);
3022 assert(w >= 0 && w < _KILL_WHO_MAX);
8a0867d6
LP
3023 assert(signo > 0);
3024 assert(signo < _NSIG);
3025
8a0867d6 3026 if (!UNIT_VTABLE(u)->kill)
15411c0c 3027 return -EOPNOTSUPP;
8a0867d6 3028
c74f17d9 3029 return UNIT_VTABLE(u)->kill(u, w, signo, error);
8a0867d6
LP
3030}
3031
82659fd7
LP
3032static Set *unit_pid_set(pid_t main_pid, pid_t control_pid) {
3033 Set *pid_set;
3034 int r;
3035
d5099efc 3036 pid_set = set_new(NULL);
82659fd7
LP
3037 if (!pid_set)
3038 return NULL;
3039
3040 /* Exclude the main/control pids from being killed via the cgroup */
3041 if (main_pid > 0) {
fea72cc0 3042 r = set_put(pid_set, PID_TO_PTR(main_pid));
82659fd7
LP
3043 if (r < 0)
3044 goto fail;
3045 }
3046
3047 if (control_pid > 0) {
fea72cc0 3048 r = set_put(pid_set, PID_TO_PTR(control_pid));
82659fd7
LP
3049 if (r < 0)
3050 goto fail;
3051 }
3052
3053 return pid_set;
3054
3055fail:
3056 set_free(pid_set);
3057 return NULL;
3058}
3059
d91c34f2
LP
3060int unit_kill_common(
3061 Unit *u,
3062 KillWho who,
3063 int signo,
3064 pid_t main_pid,
3065 pid_t control_pid,
718db961 3066 sd_bus_error *error) {
d91c34f2 3067
814cc562 3068 int r = 0;
ac5e3a50 3069 bool killed = false;
814cc562 3070
ac5e3a50 3071 if (IN_SET(who, KILL_MAIN, KILL_MAIN_FAIL)) {
814cc562 3072 if (main_pid < 0)
7358dc02 3073 return sd_bus_error_setf(error, BUS_ERROR_NO_SUCH_PROCESS, "%s units have no main processes", unit_type_to_string(u->type));
52f448c3 3074 else if (main_pid == 0)
7358dc02 3075 return sd_bus_error_set_const(error, BUS_ERROR_NO_SUCH_PROCESS, "No main process to kill");
814cc562
MS
3076 }
3077
ac5e3a50 3078 if (IN_SET(who, KILL_CONTROL, KILL_CONTROL_FAIL)) {
814cc562 3079 if (control_pid < 0)
7358dc02 3080 return sd_bus_error_setf(error, BUS_ERROR_NO_SUCH_PROCESS, "%s units have no control processes", unit_type_to_string(u->type));
52f448c3 3081 else if (control_pid == 0)
7358dc02 3082 return sd_bus_error_set_const(error, BUS_ERROR_NO_SUCH_PROCESS, "No control process to kill");
814cc562
MS
3083 }
3084
ac5e3a50
JS
3085 if (IN_SET(who, KILL_CONTROL, KILL_CONTROL_FAIL, KILL_ALL, KILL_ALL_FAIL))
3086 if (control_pid > 0) {
814cc562
MS
3087 if (kill(control_pid, signo) < 0)
3088 r = -errno;
ac5e3a50
JS
3089 else
3090 killed = true;
3091 }
814cc562 3092
ac5e3a50
JS
3093 if (IN_SET(who, KILL_MAIN, KILL_MAIN_FAIL, KILL_ALL, KILL_ALL_FAIL))
3094 if (main_pid > 0) {
814cc562
MS
3095 if (kill(main_pid, signo) < 0)
3096 r = -errno;
ac5e3a50
JS
3097 else
3098 killed = true;
3099 }
814cc562 3100
ac5e3a50 3101 if (IN_SET(who, KILL_ALL, KILL_ALL_FAIL) && u->cgroup_path) {
814cc562
MS
3102 _cleanup_set_free_ Set *pid_set = NULL;
3103 int q;
3104
82659fd7
LP
3105 /* Exclude the main/control pids from being killed via the cgroup */
3106 pid_set = unit_pid_set(main_pid, control_pid);
814cc562
MS
3107 if (!pid_set)
3108 return -ENOMEM;
3109
d0667321 3110 q = cg_kill_recursive(SYSTEMD_CGROUP_CONTROLLER, u->cgroup_path, signo, false, false, false, pid_set);
814cc562
MS
3111 if (q < 0 && q != -EAGAIN && q != -ESRCH && q != -ENOENT)
3112 r = q;
ac5e3a50
JS
3113 else
3114 killed = true;
814cc562
MS
3115 }
3116
ac5e3a50
JS
3117 if (r == 0 && !killed && IN_SET(who, KILL_ALL_FAIL, KILL_CONTROL_FAIL, KILL_ALL_FAIL))
3118 return -ESRCH;
3119
814cc562
MS
3120 return r;
3121}
3122
6210e7fc
LP
3123int unit_following_set(Unit *u, Set **s) {
3124 assert(u);
3125 assert(s);
3126
3127 if (UNIT_VTABLE(u)->following_set)
3128 return UNIT_VTABLE(u)->following_set(u, s);
3129
3130 *s = NULL;
3131 return 0;
3132}
3133
a4375746 3134UnitFileState unit_get_unit_file_state(Unit *u) {
0ec0deaa
LP
3135 int r;
3136
a4375746
LP
3137 assert(u);
3138
0ec0deaa
LP
3139 if (u->unit_file_state < 0 && u->fragment_path) {
3140 r = unit_file_get_state(
b2c23da8 3141 u->manager->running_as == MANAGER_SYSTEM ? UNIT_FILE_SYSTEM : UNIT_FILE_USER,
0ec0deaa
LP
3142 NULL,
3143 basename(u->fragment_path),
3144 &u->unit_file_state);
3145 if (r < 0)
3146 u->unit_file_state = UNIT_FILE_BAD;
3147 }
a4375746 3148
ac155bb8 3149 return u->unit_file_state;
a4375746
LP
3150}
3151
d2dc52db
LP
3152int unit_get_unit_file_preset(Unit *u) {
3153 assert(u);
3154
3155 if (u->unit_file_preset < 0 && u->fragment_path)
3156 u->unit_file_preset = unit_file_query_preset(
b2c23da8 3157 u->manager->running_as == MANAGER_SYSTEM ? UNIT_FILE_SYSTEM : UNIT_FILE_USER,
0ec0deaa
LP
3158 NULL,
3159 basename(u->fragment_path));
d2dc52db
LP
3160
3161 return u->unit_file_preset;
3162}
3163
57020a3a
LP
3164Unit* unit_ref_set(UnitRef *ref, Unit *u) {
3165 assert(ref);
3166 assert(u);
3167
3168 if (ref->unit)
3169 unit_ref_unset(ref);
3170
3171 ref->unit = u;
71fda00f 3172 LIST_PREPEND(refs, u->refs, ref);
57020a3a
LP
3173 return u;
3174}
3175
3176void unit_ref_unset(UnitRef *ref) {
3177 assert(ref);
3178
3179 if (!ref->unit)
3180 return;
3181
71fda00f 3182 LIST_REMOVE(refs, ref->unit->refs, ref);
57020a3a
LP
3183 ref->unit = NULL;
3184}
3185
598459ce
LP
3186int unit_patch_contexts(Unit *u) {
3187 CGroupContext *cc;
3188 ExecContext *ec;
cba6e062
LP
3189 unsigned i;
3190 int r;
3191
e06c73cc 3192 assert(u);
e06c73cc 3193
598459ce
LP
3194 /* Patch in the manager defaults into the exec and cgroup
3195 * contexts, _after_ the rest of the settings have been
3196 * initialized */
085afe36 3197
598459ce
LP
3198 ec = unit_get_exec_context(u);
3199 if (ec) {
3200 /* This only copies in the ones that need memory */
3201 for (i = 0; i < _RLIMIT_MAX; i++)
3202 if (u->manager->rlimit[i] && !ec->rlimit[i]) {
3203 ec->rlimit[i] = newdup(struct rlimit, u->manager->rlimit[i], 1);
3204 if (!ec->rlimit[i])
3205 return -ENOMEM;
3206 }
3207
b2c23da8 3208 if (u->manager->running_as == MANAGER_USER &&
598459ce
LP
3209 !ec->working_directory) {
3210
3211 r = get_home_dir(&ec->working_directory);
3212 if (r < 0)
3213 return r;
4c08c824
LP
3214
3215 /* Allow user services to run, even if the
3216 * home directory is missing */
3217 ec->working_directory_missing_ok = true;
cba6e062
LP
3218 }
3219
b2c23da8 3220 if (u->manager->running_as == MANAGER_USER &&
598459ce
LP
3221 (ec->syscall_whitelist ||
3222 !set_isempty(ec->syscall_filter) ||
3223 !set_isempty(ec->syscall_archs) ||
3224 ec->address_families_whitelist ||
3225 !set_isempty(ec->address_families)))
3226 ec->no_new_privileges = true;
e06c73cc 3227
598459ce
LP
3228 if (ec->private_devices)
3229 ec->capability_bounding_set_drop |= (uint64_t) 1ULL << (uint64_t) CAP_MKNOD;
cba6e062
LP
3230 }
3231
598459ce
LP
3232 cc = unit_get_cgroup_context(u);
3233 if (cc) {
f513e420 3234
598459ce
LP
3235 if (ec &&
3236 ec->private_devices &&
3237 cc->device_policy == CGROUP_AUTO)
3238 cc->device_policy = CGROUP_CLOSED;
3239 }
f1660f96 3240
cba6e062 3241 return 0;
e06c73cc
LP
3242}
3243
3ef63c31
LP
3244ExecContext *unit_get_exec_context(Unit *u) {
3245 size_t offset;
3246 assert(u);
3247
598459ce
LP
3248 if (u->type < 0)
3249 return NULL;
3250
3ef63c31
LP
3251 offset = UNIT_VTABLE(u)->exec_context_offset;
3252 if (offset <= 0)
3253 return NULL;
3254
3255 return (ExecContext*) ((uint8_t*) u + offset);
3256}
3257
718db961
LP
3258KillContext *unit_get_kill_context(Unit *u) {
3259 size_t offset;
3260 assert(u);
3261
598459ce
LP
3262 if (u->type < 0)
3263 return NULL;
3264
718db961
LP
3265 offset = UNIT_VTABLE(u)->kill_context_offset;
3266 if (offset <= 0)
3267 return NULL;
3268
3269 return (KillContext*) ((uint8_t*) u + offset);
3270}
3271
4ad49000
LP
3272CGroupContext *unit_get_cgroup_context(Unit *u) {
3273 size_t offset;
3274
598459ce
LP
3275 if (u->type < 0)
3276 return NULL;
3277
4ad49000
LP
3278 offset = UNIT_VTABLE(u)->cgroup_context_offset;
3279 if (offset <= 0)
3280 return NULL;
3281
3282 return (CGroupContext*) ((uint8_t*) u + offset);
3283}
3284
613b411c
LP
3285ExecRuntime *unit_get_exec_runtime(Unit *u) {
3286 size_t offset;
3287
598459ce
LP
3288 if (u->type < 0)
3289 return NULL;
3290
613b411c
LP
3291 offset = UNIT_VTABLE(u)->exec_runtime_offset;
3292 if (offset <= 0)
3293 return NULL;
3294
3295 return *(ExecRuntime**) ((uint8_t*) u + offset);
3296}
3297
29686440 3298static int unit_drop_in_dir(Unit *u, UnitSetPropertiesMode mode, bool transient, char **dir) {
3f5e8115
LP
3299 assert(u);
3300
b2c23da8 3301 if (u->manager->running_as == MANAGER_USER) {
29686440 3302 int r;
26d04f86 3303
718880ba
SA
3304 if (mode == UNIT_PERSISTENT && !transient)
3305 r = user_config_home(dir);
3306 else
4d5dec23 3307 r = user_runtime_dir(dir);
26d04f86
LP
3308 if (r == 0)
3309 return -ENOENT;
3f5e8115 3310
29686440
ZJS
3311 return r;
3312 }
26d04f86 3313
29686440
ZJS
3314 if (mode == UNIT_PERSISTENT && !transient)
3315 *dir = strdup("/etc/systemd/system");
8e2af478 3316 else
29686440
ZJS
3317 *dir = strdup("/run/systemd/system");
3318 if (!*dir)
71645aca
LP
3319 return -ENOMEM;
3320
26d04f86 3321 return 0;
71645aca
LP
3322}
3323
8e2af478 3324int unit_write_drop_in(Unit *u, UnitSetPropertiesMode mode, const char *name, const char *data) {
29686440 3325
adb76a70 3326 _cleanup_free_ char *dir = NULL, *p = NULL, *q = NULL;
26d04f86 3327 int r;
71645aca
LP
3328
3329 assert(u);
3330
6d235724 3331 if (!IN_SET(mode, UNIT_PERSISTENT, UNIT_RUNTIME))
8e2af478
LP
3332 return 0;
3333
29686440 3334 r = unit_drop_in_dir(u, mode, u->transient, &dir);
26d04f86
LP
3335 if (r < 0)
3336 return r;
71645aca 3337
adb76a70
WC
3338 r = write_drop_in(dir, u->id, 50, name, data);
3339 if (r < 0)
3340 return r;
3341
3342 r = drop_in_file(dir, u->id, 50, name, &p, &q);
3343 if (r < 0)
3344 return r;
3345
3346 r = strv_extend(&u->dropin_paths, q);
3347 if (r < 0)
3348 return r;
3349
3350 strv_sort(u->dropin_paths);
3351 strv_uniq(u->dropin_paths);
3352
3353 u->dropin_mtime = now(CLOCK_REALTIME);
3354
3355 return 0;
26d04f86 3356}
71645aca 3357
b9ec9359
LP
3358int unit_write_drop_in_format(Unit *u, UnitSetPropertiesMode mode, const char *name, const char *format, ...) {
3359 _cleanup_free_ char *p = NULL;
3360 va_list ap;
3361 int r;
3362
3363 assert(u);
3364 assert(name);
3365 assert(format);
3366
6d235724 3367 if (!IN_SET(mode, UNIT_PERSISTENT, UNIT_RUNTIME))
b9ec9359
LP
3368 return 0;
3369
3370 va_start(ap, format);
3371 r = vasprintf(&p, format, ap);
3372 va_end(ap);
3373
3374 if (r < 0)
3375 return -ENOMEM;
3376
3377 return unit_write_drop_in(u, mode, name, p);
3378}
3379
3380int unit_write_drop_in_private(Unit *u, UnitSetPropertiesMode mode, const char *name, const char *data) {
b42defe3
LP
3381 _cleanup_free_ char *ndata = NULL;
3382
3383 assert(u);
3384 assert(name);
3385 assert(data);
3386
3387 if (!UNIT_VTABLE(u)->private_section)
3388 return -EINVAL;
3389
6d235724 3390 if (!IN_SET(mode, UNIT_PERSISTENT, UNIT_RUNTIME))
b9ec9359
LP
3391 return 0;
3392
b42defe3
LP
3393 ndata = strjoin("[", UNIT_VTABLE(u)->private_section, "]\n", data, NULL);
3394 if (!ndata)
3395 return -ENOMEM;
3396
3397 return unit_write_drop_in(u, mode, name, ndata);
3398}
3399
b9ec9359
LP
3400int unit_write_drop_in_private_format(Unit *u, UnitSetPropertiesMode mode, const char *name, const char *format, ...) {
3401 _cleanup_free_ char *p = NULL;
3402 va_list ap;
3403 int r;
3404
3405 assert(u);
3406 assert(name);
3407 assert(format);
3408
6d235724 3409 if (!IN_SET(mode, UNIT_PERSISTENT, UNIT_RUNTIME))
b9ec9359
LP
3410 return 0;
3411
3412 va_start(ap, format);
3413 r = vasprintf(&p, format, ap);
3414 va_end(ap);
3415
3416 if (r < 0)
3417 return -ENOMEM;
3418
3419 return unit_write_drop_in_private(u, mode, name, p);
3420}
71645aca 3421
c2756a68 3422int unit_make_transient(Unit *u) {
c2756a68
LP
3423 assert(u);
3424
3f5e8115
LP
3425 if (!UNIT_VTABLE(u)->can_transient)
3426 return -EOPNOTSUPP;
3427
c2756a68
LP
3428 u->load_state = UNIT_STUB;
3429 u->load_error = 0;
3430 u->transient = true;
3f5e8115 3431 u->fragment_path = mfree(u->fragment_path);
c2756a68 3432
3f5e8115 3433 return 0;
c2756a68
LP
3434}
3435
cd2086fe
LP
3436int unit_kill_context(
3437 Unit *u,
3438 KillContext *c,
db2cb23b 3439 KillOperation k,
cd2086fe
LP
3440 pid_t main_pid,
3441 pid_t control_pid,
3442 bool main_pid_alien) {
3443
b821a397
LP
3444 bool wait_for_exit = false;
3445 int sig, r;
cd2086fe
LP
3446
3447 assert(u);
3448 assert(c);
3449
3450 if (c->kill_mode == KILL_NONE)
3451 return 0;
3452
db2cb23b
UTL
3453 switch (k) {
3454 case KILL_KILL:
3455 sig = SIGKILL;
3456 break;
3457 case KILL_ABORT:
3458 sig = SIGABRT;
3459 break;
3460 case KILL_TERMINATE:
3461 sig = c->kill_signal;
3462 break;
3463 default:
3464 assert_not_reached("KillOperation unknown");
3465 }
cd2086fe
LP
3466
3467 if (main_pid > 0) {
3468 r = kill_and_sigcont(main_pid, sig);
3469
3470 if (r < 0 && r != -ESRCH) {
3471 _cleanup_free_ char *comm = NULL;
3472 get_process_comm(main_pid, &comm);
3473
b821a397 3474 log_unit_warning_errno(u, r, "Failed to kill main process " PID_FMT " (%s), ignoring: %m", main_pid, strna(comm));
82659fd7 3475 } else {
bc6aed7b
LP
3476 if (!main_pid_alien)
3477 wait_for_exit = true;
82659fd7 3478
d0667321
LP
3479 if (c->send_sighup && k == KILL_TERMINATE)
3480 (void) kill(main_pid, SIGHUP);
82659fd7 3481 }
cd2086fe
LP
3482 }
3483
3484 if (control_pid > 0) {
3485 r = kill_and_sigcont(control_pid, sig);
3486
3487 if (r < 0 && r != -ESRCH) {
3488 _cleanup_free_ char *comm = NULL;
3489 get_process_comm(control_pid, &comm);
3490
b821a397 3491 log_unit_warning_errno(u, r, "Failed to kill control process " PID_FMT " (%s), ignoring: %m", control_pid, strna(comm));
82659fd7 3492 } else {
cd2086fe 3493 wait_for_exit = true;
82659fd7 3494
d0667321
LP
3495 if (c->send_sighup && k == KILL_TERMINATE)
3496 (void) kill(control_pid, SIGHUP);
82659fd7 3497 }
cd2086fe
LP
3498 }
3499
b821a397
LP
3500 if (u->cgroup_path &&
3501 (c->kill_mode == KILL_CONTROL_GROUP || (c->kill_mode == KILL_MIXED && k == KILL_KILL))) {
cd2086fe
LP
3502 _cleanup_set_free_ Set *pid_set = NULL;
3503
82659fd7
LP
3504 /* Exclude the main/control pids from being killed via the cgroup */
3505 pid_set = unit_pid_set(main_pid, control_pid);
cd2086fe
LP
3506 if (!pid_set)
3507 return -ENOMEM;
3508
d0667321 3509 r = cg_kill_recursive(SYSTEMD_CGROUP_CONTROLLER, u->cgroup_path, sig, true, k != KILL_TERMINATE, false, pid_set);
cd2086fe
LP
3510 if (r < 0) {
3511 if (r != -EAGAIN && r != -ESRCH && r != -ENOENT)
b821a397
LP
3512 log_unit_warning_errno(u, r, "Failed to kill control group %s, ignoring: %m", u->cgroup_path);
3513
82659fd7 3514 } else if (r > 0) {
bc6aed7b 3515
efdb0237
LP
3516 /* FIXME: For now, on the legacy hierarchy, we
3517 * will not wait for the cgroup members to die
3518 * if we are running in a container or if this
3519 * is a delegation unit, simply because cgroup
3520 * notification is unreliable in these
3521 * cases. It doesn't work at all in
3522 * containers, and outside of containers it
3523 * can be confused easily by left-over
3524 * directories in the cgroup -- which however
3525 * should not exist in non-delegated units. On
3526 * the unified hierarchy that's different,
3527 * there we get proper events. Hence rely on
3528 * them.*/
3529
3530 if (cg_unified() > 0 ||
75f86906 3531 (detect_container() == 0 && !unit_cgroup_delegate(u)))
e9db43d5 3532 wait_for_exit = true;
58ea275a 3533
db2cb23b 3534 if (c->send_sighup && k != KILL_KILL) {
82659fd7
LP
3535 set_free(pid_set);
3536
3537 pid_set = unit_pid_set(main_pid, control_pid);
3538 if (!pid_set)
3539 return -ENOMEM;
3540
8190da36 3541 cg_kill_recursive(SYSTEMD_CGROUP_CONTROLLER, u->cgroup_path, SIGHUP, false, true, false, pid_set);
82659fd7
LP
3542 }
3543 }
cd2086fe
LP
3544 }
3545
3546 return wait_for_exit;
3547}
3548
a57f7e2c
LP
3549int unit_require_mounts_for(Unit *u, const char *path) {
3550 char prefix[strlen(path) + 1], *p;
3551 int r;
3552
3553 assert(u);
3554 assert(path);
3555
3556 /* Registers a unit for requiring a certain path and all its
3557 * prefixes. We keep a simple array of these paths in the
3558 * unit, since its usually short. However, we build a prefix
3559 * table for all possible prefixes so that new appearing mount
3560 * units can easily determine which units to make themselves a
3561 * dependency of. */
3562
70b64bd3
ZJS
3563 if (!path_is_absolute(path))
3564 return -EINVAL;
3565
a57f7e2c
LP
3566 p = strdup(path);
3567 if (!p)
3568 return -ENOMEM;
3569
3570 path_kill_slashes(p);
3571
a57f7e2c
LP
3572 if (!path_is_safe(p)) {
3573 free(p);
3574 return -EPERM;
3575 }
3576
3577 if (strv_contains(u->requires_mounts_for, p)) {
3578 free(p);
3579 return 0;
3580 }
3581
6e18964d
ZJS
3582 r = strv_consume(&u->requires_mounts_for, p);
3583 if (r < 0)
a57f7e2c 3584 return r;
a57f7e2c
LP
3585
3586 PATH_FOREACH_PREFIX_MORE(prefix, p) {
3587 Set *x;
3588
3589 x = hashmap_get(u->manager->units_requiring_mounts_for, prefix);
3590 if (!x) {
3591 char *q;
3592
742f41ad
LP
3593 r = hashmap_ensure_allocated(&u->manager->units_requiring_mounts_for, &string_hash_ops);
3594 if (r < 0)
3595 return r;
a57f7e2c
LP
3596
3597 q = strdup(prefix);
3598 if (!q)
3599 return -ENOMEM;
3600
d5099efc 3601 x = set_new(NULL);
a57f7e2c
LP
3602 if (!x) {
3603 free(q);
3604 return -ENOMEM;
3605 }
3606
3607 r = hashmap_put(u->manager->units_requiring_mounts_for, q, x);
3608 if (r < 0) {
3609 free(q);
3610 set_free(x);
3611 return r;
3612 }
3613 }
3614
3615 r = set_put(x, u);
3616 if (r < 0)
3617 return r;
3618 }
3619
3620 return 0;
3621}
3622
613b411c
LP
3623int unit_setup_exec_runtime(Unit *u) {
3624 ExecRuntime **rt;
3625 size_t offset;
3626 Iterator i;
3627 Unit *other;
3628
3629 offset = UNIT_VTABLE(u)->exec_runtime_offset;
3630 assert(offset > 0);
3631
06b643e7 3632 /* Check if there already is an ExecRuntime for this unit? */
613b411c
LP
3633 rt = (ExecRuntime**) ((uint8_t*) u + offset);
3634 if (*rt)
3635 return 0;
3636
3637 /* Try to get it from somebody else */
3638 SET_FOREACH(other, u->dependencies[UNIT_JOINS_NAMESPACE_OF], i) {
3639
3640 *rt = unit_get_exec_runtime(other);
3641 if (*rt) {
3642 exec_runtime_ref(*rt);
3643 return 0;
3644 }
3645 }
3646
3647 return exec_runtime_make(rt, unit_get_exec_context(u), u->id);
3648}
3649
1c2e9646
LP
3650bool unit_type_supported(UnitType t) {
3651 if (_unlikely_(t < 0))
3652 return false;
3653 if (_unlikely_(t >= _UNIT_TYPE_MAX))
3654 return false;
3655
3656 if (!unit_vtable[t]->supported)
3657 return true;
3658
3659 return unit_vtable[t]->supported();
3660}
3661
8b4305c7
LP
3662void unit_warn_if_dir_nonempty(Unit *u, const char* where) {
3663 int r;
3664
3665 assert(u);
3666 assert(where);
3667
3668 r = dir_is_empty(where);
3669 if (r > 0)
3670 return;
3671 if (r < 0) {
3672 log_unit_warning_errno(u, r, "Failed to check directory %s: %m", where);
3673 return;
3674 }
3675
3676 log_struct(LOG_NOTICE,
3677 LOG_MESSAGE_ID(SD_MESSAGE_OVERMOUNTING),
3678 LOG_UNIT_ID(u),
3679 LOG_UNIT_MESSAGE(u, "Directory %s to mount over is not empty, mounting anyway.", where),
3680 "WHERE=%s", where,
3681 NULL);
3682}
3683
3684int unit_fail_if_symlink(Unit *u, const char* where) {
3685 int r;
3686
3687 assert(u);
3688 assert(where);
3689
3690 r = is_symlink(where);
3691 if (r < 0) {
3692 log_unit_debug_errno(u, r, "Failed to check symlink %s, ignoring: %m", where);
3693 return 0;
3694 }
3695 if (r == 0)
3696 return 0;
3697
3698 log_struct(LOG_ERR,
3699 LOG_MESSAGE_ID(SD_MESSAGE_OVERMOUNTING),
3700 LOG_UNIT_ID(u),
3701 LOG_UNIT_MESSAGE(u, "Mount on symlink %s not allowed.", where),
3702 "WHERE=%s", where,
3703 NULL);
3704
3705 return -ELOOP;
3706}
0f13f3bd
LP
3707
3708bool unit_is_pristine(Unit *u) {
3709 assert(u);
3710
3711 /* Check if the unit already exists or is already referenced,
3712 * in a number of different ways. Note that to cater for unit
3713 * types such as slice, we are generally fine with units that
3714 * are marked UNIT_LOADED even even though nothing was
3715 * actually loaded, as those unit types don't require a file
3716 * on disk to validly load. */
3717
3718 return !(!IN_SET(u->load_state, UNIT_NOT_FOUND, UNIT_LOADED) ||
3719 u->fragment_path ||
3720 u->source_path ||
3721 !strv_isempty(u->dropin_paths) ||
3722 u->refs ||
3723 set_size(u->dependencies[UNIT_REFERENCED_BY]) > 0 ||
3724 u->job ||
3725 u->merged_into);
3726}