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