]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/core/unit.c
core: unify code for checking whether unit to trigger is loaded
[thirdparty/systemd.git] / src / core / unit.c
CommitLineData
53e1b683 1/* SPDX-License-Identifier: LGPL-2.1+ */
a7334b09 2
87f0e418 3#include <errno.h>
0301abf4 4#include <stdlib.h>
4f5dd394 5#include <string.h>
4c253ed1 6#include <sys/prctl.h>
45fb0699 7#include <sys/stat.h>
4f5dd394 8#include <unistd.h>
87f0e418 9
718db961
LP
10#include "sd-id128.h"
11#include "sd-messages.h"
4f5dd394 12
57b7a260 13#include "all-units.h"
d68c645b 14#include "alloc-util.h"
4f5dd394
LP
15#include "bus-common-errors.h"
16#include "bus-util.h"
c6c18be3 17#include "cgroup-util.h"
4f5dd394
LP
18#include "dbus-unit.h"
19#include "dbus.h"
20#include "dropin.h"
21#include "escape.h"
22#include "execute.h"
6a48d82f 23#include "fd-util.h"
a5c32cff 24#include "fileio-label.h"
ee228be1 25#include "fileio.h"
f97b34a6 26#include "format-util.h"
d3070fbd 27#include "fs-util.h"
4b58153d 28#include "id128-util.h"
915b1d01 29#include "io-util.h"
4f5dd394
LP
30#include "load-dropin.h"
31#include "load-fragment.h"
32#include "log.h"
33#include "macro.h"
34#include "missing.h"
35#include "mkdir.h"
6bedfcbb 36#include "parse-util.h"
4f5dd394 37#include "path-util.h"
0b452006 38#include "process-util.h"
d68c645b 39#include "serialize.h"
4f5dd394 40#include "set.h"
6eb7c172 41#include "signal-util.h"
d3070fbd 42#include "sparse-endian.h"
e9db43d5 43#include "special.h"
2e59b241 44#include "specifier.h"
8fcde012 45#include "stat-util.h"
d054f0a4 46#include "stdio-util.h"
5afe510c 47#include "string-table.h"
07630cea 48#include "string-util.h"
4f5dd394 49#include "strv.h"
5b262f74 50#include "terminal-util.h"
e4de7287 51#include "tmpfile-util.h"
4f4afc88 52#include "umask-util.h"
4f5dd394 53#include "unit-name.h"
e9db43d5 54#include "unit.h"
b1d4f8e1
LP
55#include "user-util.h"
56#include "virt.h"
87f0e418
LP
57
58const UnitVTable * const unit_vtable[_UNIT_TYPE_MAX] = {
59 [UNIT_SERVICE] = &service_vtable,
87f0e418
LP
60 [UNIT_SOCKET] = &socket_vtable,
61 [UNIT_TARGET] = &target_vtable,
62 [UNIT_DEVICE] = &device_vtable,
63 [UNIT_MOUNT] = &mount_vtable,
64 [UNIT_AUTOMOUNT] = &automount_vtable,
01f78473 65 [UNIT_SWAP] = &swap_vtable,
e821075a 66 [UNIT_TIMER] = &timer_vtable,
a016b922 67 [UNIT_PATH] = &path_vtable,
6c12b52e 68 [UNIT_SLICE] = &slice_vtable,
5afe510c 69 [UNIT_SCOPE] = &scope_vtable,
87f0e418
LP
70};
71
f2341e0a 72static void maybe_warn_about_dependency(Unit *u, const char *other, UnitDependency dependency);
d1fab3fe 73
7d17cfbc 74Unit *unit_new(Manager *m, size_t size) {
87f0e418
LP
75 Unit *u;
76
77 assert(m);
ac155bb8 78 assert(size >= sizeof(Unit));
87f0e418 79
7d17cfbc
MS
80 u = malloc0(size);
81 if (!u)
87f0e418
LP
82 return NULL;
83
d5099efc 84 u->names = set_new(&string_hash_ops);
6b430fdb
ZJS
85 if (!u->names)
86 return mfree(u);
87f0e418 87
ac155bb8
MS
88 u->manager = m;
89 u->type = _UNIT_TYPE_INVALID;
ac155bb8
MS
90 u->default_dependencies = true;
91 u->unit_file_state = _UNIT_FILE_STATE_INVALID;
d2dc52db 92 u->unit_file_preset = -1;
d420282b 93 u->on_failure_job_mode = JOB_REPLACE;
efdb0237 94 u->cgroup_inotify_wd = -1;
36c16a7c 95 u->job_timeout = USEC_INFINITY;
a2df3ea4 96 u->job_running_timeout = USEC_INFINITY;
00d9ef85
LP
97 u->ref_uid = UID_INVALID;
98 u->ref_gid = GID_INVALID;
fe700f46 99 u->cpu_usage_last = NSEC_INFINITY;
17f14955 100 u->cgroup_invalidated_mask |= CGROUP_MASK_BPF_FIREWALL;
7af67e9a 101 u->failure_action_exit_status = u->success_action_exit_status = -1;
87f0e418 102
6a48d82f
DM
103 u->ip_accounting_ingress_map_fd = -1;
104 u->ip_accounting_egress_map_fd = -1;
105 u->ipv4_allow_map_fd = -1;
106 u->ipv6_allow_map_fd = -1;
107 u->ipv4_deny_map_fd = -1;
108 u->ipv6_deny_map_fd = -1;
109
2e59b241
LP
110 u->last_section_private = -1;
111
6bf0f408 112 RATELIMIT_INIT(u->start_limit, m->default_start_limit_interval, m->default_start_limit_burst);
67bfdc97 113 RATELIMIT_INIT(u->auto_stop_ratelimit, 10 * USEC_PER_SEC, 16);
bea355da 114
87f0e418
LP
115 return u;
116}
117
a581e45a 118int unit_new_for_name(Manager *m, size_t size, const char *name, Unit **ret) {
dc409696 119 _cleanup_(unit_freep) Unit *u = NULL;
a581e45a
LP
120 int r;
121
122 u = unit_new(m, size);
123 if (!u)
124 return -ENOMEM;
125
126 r = unit_add_name(u, name);
dc409696 127 if (r < 0)
a581e45a 128 return r;
a581e45a 129
1cc6c93a
YW
130 *ret = TAKE_PTR(u);
131
a581e45a
LP
132 return r;
133}
134
303ee601 135bool unit_has_name(const Unit *u, const char *name) {
f278026d
LP
136 assert(u);
137 assert(name);
138
390bc2b1 139 return set_contains(u->names, (char*) name);
f278026d
LP
140}
141
598459ce
LP
142static void unit_init(Unit *u) {
143 CGroupContext *cc;
144 ExecContext *ec;
145 KillContext *kc;
146
147 assert(u);
148 assert(u->manager);
149 assert(u->type >= 0);
150
151 cc = unit_get_cgroup_context(u);
152 if (cc) {
153 cgroup_context_init(cc);
154
155 /* Copy in the manager defaults into the cgroup
156 * context, _before_ the rest of the settings have
157 * been initialized */
158
159 cc->cpu_accounting = u->manager->default_cpu_accounting;
13c31542 160 cc->io_accounting = u->manager->default_io_accounting;
377bfd2d 161 cc->ip_accounting = u->manager->default_ip_accounting;
598459ce
LP
162 cc->blockio_accounting = u->manager->default_blockio_accounting;
163 cc->memory_accounting = u->manager->default_memory_accounting;
03a7b521 164 cc->tasks_accounting = u->manager->default_tasks_accounting;
6a48d82f 165 cc->ip_accounting = u->manager->default_ip_accounting;
0af20ea2
LP
166
167 if (u->type != UNIT_SLICE)
168 cc->tasks_max = u->manager->default_tasks_max;
598459ce
LP
169 }
170
171 ec = unit_get_exec_context(u);
b1edf445 172 if (ec) {
598459ce
LP
173 exec_context_init(ec);
174
b1edf445 175 ec->keyring_mode = MANAGER_IS_SYSTEM(u->manager) ?
00f5ad93 176 EXEC_KEYRING_SHARED : EXEC_KEYRING_INHERIT;
b1edf445
LP
177 }
178
598459ce
LP
179 kc = unit_get_kill_context(u);
180 if (kc)
181 kill_context_init(kc);
182
183 if (UNIT_VTABLE(u)->init)
184 UNIT_VTABLE(u)->init(u);
185}
186
87f0e418 187int unit_add_name(Unit *u, const char *text) {
598459ce 188 _cleanup_free_ char *s = NULL, *i = NULL;
87f0e418 189 UnitType t;
87f0e418
LP
190 int r;
191
192 assert(u);
193 assert(text);
194
7410616c 195 if (unit_name_is_valid(text, UNIT_NAME_TEMPLATE)) {
598459ce 196
ac155bb8 197 if (!u->instance)
9e2f7c11 198 return -EINVAL;
87f0e418 199
7410616c
LP
200 r = unit_name_replace_instance(text, u->instance, &s);
201 if (r < 0)
202 return r;
203 } else {
9e2f7c11 204 s = strdup(text);
7410616c
LP
205 if (!s)
206 return -ENOMEM;
207 }
87f0e418 208
7410616c
LP
209 if (set_contains(u->names, s))
210 return 0;
211 if (hashmap_contains(u->manager->units, s))
212 return -EEXIST;
213
214 if (!unit_name_is_valid(s, UNIT_NAME_PLAIN|UNIT_NAME_INSTANCE))
598459ce 215 return -EINVAL;
e537352b 216
7410616c
LP
217 t = unit_name_to_type(s);
218 if (t < 0)
219 return -EINVAL;
87f0e418 220
598459ce
LP
221 if (u->type != _UNIT_TYPE_INVALID && t != u->type)
222 return -EINVAL;
87f0e418 223
e48614c4
ZJS
224 r = unit_name_to_instance(s, &i);
225 if (r < 0)
598459ce 226 return r;
87f0e418 227
ce99c68a 228 if (i && !unit_type_may_template(t))
598459ce 229 return -EINVAL;
9e2f7c11 230
276c3e78 231 /* Ensure that this unit is either instanced or not instanced,
7410616c
LP
232 * but not both. Note that we do allow names with different
233 * instance names however! */
598459ce
LP
234 if (u->type != _UNIT_TYPE_INVALID && !u->instance != !i)
235 return -EINVAL;
9e2f7c11 236
8a993b61 237 if (!unit_type_may_alias(t) && !set_isempty(u->names))
598459ce 238 return -EEXIST;
9e2f7c11 239
598459ce
LP
240 if (hashmap_size(u->manager->units) >= MANAGER_MAX_NAMES)
241 return -E2BIG;
4f0f902f 242
e48614c4 243 r = set_put(u->names, s);
7410616c 244 if (r < 0)
598459ce 245 return r;
7410616c 246 assert(r > 0);
87f0e418 247
e48614c4
ZJS
248 r = hashmap_put(u->manager->units, s, u);
249 if (r < 0) {
7410616c 250 (void) set_remove(u->names, s);
598459ce 251 return r;
87f0e418
LP
252 }
253
ac155bb8 254 if (u->type == _UNIT_TYPE_INVALID) {
ac155bb8
MS
255 u->type = t;
256 u->id = s;
1cc6c93a 257 u->instance = TAKE_PTR(i);
9e2f7c11 258
71fda00f 259 LIST_PREPEND(units_by_type, u->manager->units_by_type[t], u);
e537352b 260
598459ce 261 unit_init(u);
598459ce 262 }
9e2f7c11 263
598459ce 264 s = NULL;
9e2f7c11 265
598459ce
LP
266 unit_add_to_dbus_queue(u);
267 return 0;
87f0e418
LP
268}
269
0ae97ec1 270int unit_choose_id(Unit *u, const char *name) {
68eda4bd 271 _cleanup_free_ char *t = NULL;
598459ce 272 char *s, *i;
276c3e78 273 int r;
0ae97ec1
LP
274
275 assert(u);
276 assert(name);
277
7410616c 278 if (unit_name_is_valid(name, UNIT_NAME_TEMPLATE)) {
9e2f7c11 279
ac155bb8 280 if (!u->instance)
9e2f7c11
LP
281 return -EINVAL;
282
7410616c
LP
283 r = unit_name_replace_instance(name, u->instance, &t);
284 if (r < 0)
285 return r;
9e2f7c11
LP
286
287 name = t;
288 }
289
0ae97ec1 290 /* Selects one of the names of this unit as the id */
ac155bb8 291 s = set_get(u->names, (char*) name);
9e2f7c11 292 if (!s)
0ae97ec1
LP
293 return -ENOENT;
294
7410616c 295 /* Determine the new instance from the new id */
e48614c4
ZJS
296 r = unit_name_to_instance(s, &i);
297 if (r < 0)
276c3e78
LP
298 return r;
299
ac155bb8 300 u->id = s;
276c3e78 301
ac155bb8
MS
302 free(u->instance);
303 u->instance = i;
276c3e78 304
c1e1601e 305 unit_add_to_dbus_queue(u);
9e2f7c11 306
0ae97ec1
LP
307 return 0;
308}
309
f50e0a01 310int unit_set_description(Unit *u, const char *description) {
84b26d51 311 int r;
f50e0a01
LP
312
313 assert(u);
314
84b26d51
LP
315 r = free_and_strdup(&u->description, empty_to_null(description));
316 if (r < 0)
317 return r;
318 if (r > 0)
319 unit_add_to_dbus_queue(u);
c1e1601e 320
f50e0a01
LP
321 return 0;
322}
323
f2f725e5 324bool unit_may_gc(Unit *u) {
a354329f 325 UnitActiveState state;
e98b2fbb 326 int r;
5afe510c 327
701cc384
LP
328 assert(u);
329
f2f725e5
ZJS
330 /* Checks whether the unit is ready to be unloaded for garbage collection.
331 * Returns true when the unit may be collected, and false if there's some
2641f02e
ZJS
332 * reason to keep it loaded.
333 *
334 * References from other units are *not* checked here. Instead, this is done
335 * in unit_gc_sweep(), but using markers to properly collect dependency loops.
336 */
5afe510c 337
a354329f 338 if (u->job)
f2f725e5 339 return false;
701cc384 340
a354329f 341 if (u->nop_job)
f2f725e5 342 return false;
6c073082 343
a354329f
LP
344 state = unit_active_state(u);
345
7eb2a8a1 346 /* If the unit is inactive and failed and no job is queued for it, then release its runtime resources */
a354329f
LP
347 if (UNIT_IS_INACTIVE_OR_FAILED(state) &&
348 UNIT_VTABLE(u)->release_resources)
7eb2a8a1 349 UNIT_VTABLE(u)->release_resources(u);
a354329f 350
f5869324 351 if (u->perpetual)
f2f725e5 352 return false;
9d576438 353
05a98afd 354 if (sd_bus_track_count(u->bus_track) > 0)
f2f725e5 355 return false;
05a98afd 356
5afe510c
LP
357 /* But we keep the unit object around for longer when it is referenced or configured to not be gc'ed */
358 switch (u->collect_mode) {
359
360 case COLLECT_INACTIVE:
361 if (state != UNIT_INACTIVE)
f2f725e5 362 return false;
5afe510c
LP
363
364 break;
365
366 case COLLECT_INACTIVE_OR_FAILED:
367 if (!IN_SET(state, UNIT_INACTIVE, UNIT_FAILED))
f2f725e5 368 return false;
5afe510c
LP
369
370 break;
371
372 default:
373 assert_not_reached("Unknown garbage collection mode");
374 }
375
e98b2fbb
LP
376 if (u->cgroup_path) {
377 /* If the unit has a cgroup, then check whether there's anything in it. If so, we should stay
378 * around. Units with active processes should never be collected. */
379
380 r = cg_is_empty_recursive(SYSTEMD_CGROUP_CONTROLLER, u->cgroup_path);
381 if (r < 0)
382 log_unit_debug_errno(u, r, "Failed to determine whether cgroup %s is empty: %m", u->cgroup_path);
383 if (r <= 0)
f2f725e5 384 return false;
e98b2fbb
LP
385 }
386
f2f725e5
ZJS
387 if (UNIT_VTABLE(u)->may_gc && !UNIT_VTABLE(u)->may_gc(u))
388 return false;
701cc384 389
f2f725e5 390 return true;
701cc384
LP
391}
392
87f0e418
LP
393void unit_add_to_load_queue(Unit *u) {
394 assert(u);
ac155bb8 395 assert(u->type != _UNIT_TYPE_INVALID);
87f0e418 396
ac155bb8 397 if (u->load_state != UNIT_STUB || u->in_load_queue)
87f0e418
LP
398 return;
399
71fda00f 400 LIST_PREPEND(load_queue, u->manager->load_queue, u);
ac155bb8 401 u->in_load_queue = true;
87f0e418
LP
402}
403
23a177ef
LP
404void unit_add_to_cleanup_queue(Unit *u) {
405 assert(u);
406
ac155bb8 407 if (u->in_cleanup_queue)
23a177ef
LP
408 return;
409
71fda00f 410 LIST_PREPEND(cleanup_queue, u->manager->cleanup_queue, u);
ac155bb8 411 u->in_cleanup_queue = true;
23a177ef
LP
412}
413
701cc384
LP
414void unit_add_to_gc_queue(Unit *u) {
415 assert(u);
416
ac155bb8 417 if (u->in_gc_queue || u->in_cleanup_queue)
701cc384
LP
418 return;
419
f2f725e5 420 if (!unit_may_gc(u))
701cc384
LP
421 return;
422
c5a97ed1 423 LIST_PREPEND(gc_queue, u->manager->gc_unit_queue, u);
ac155bb8 424 u->in_gc_queue = true;
701cc384
LP
425}
426
c1e1601e
LP
427void unit_add_to_dbus_queue(Unit *u) {
428 assert(u);
ac155bb8 429 assert(u->type != _UNIT_TYPE_INVALID);
c1e1601e 430
ac155bb8 431 if (u->load_state == UNIT_STUB || u->in_dbus_queue)
c1e1601e
LP
432 return;
433
a567261a 434 /* Shortcut things if nobody cares */
8f8f05a9 435 if (sd_bus_track_count(u->manager->subscribed) <= 0 &&
ae572acd 436 sd_bus_track_count(u->bus_track) <= 0 &&
8f8f05a9 437 set_isempty(u->manager->private_buses)) {
ac155bb8 438 u->sent_dbus_new_signal = true;
94b6dfa2
LP
439 return;
440 }
441
71fda00f 442 LIST_PREPEND(dbus_queue, u->manager->dbus_unit_queue, u);
ac155bb8 443 u->in_dbus_queue = true;
c1e1601e
LP
444}
445
fda09318 446void unit_submit_to_stop_when_unneeded_queue(Unit *u) {
a3c1168a
LP
447 assert(u);
448
449 if (u->in_stop_when_unneeded_queue)
450 return;
451
452 if (!u->stop_when_unneeded)
453 return;
454
455 if (!UNIT_IS_ACTIVE_OR_RELOADING(unit_active_state(u)))
456 return;
457
458 LIST_PREPEND(stop_when_unneeded_queue, u->manager->stop_when_unneeded_queue, u);
459 u->in_stop_when_unneeded_queue = true;
460}
461
eef85c4a 462static void bidi_set_free(Unit *u, Hashmap *h) {
87f0e418 463 Unit *other;
eef85c4a
LP
464 Iterator i;
465 void *v;
87f0e418
LP
466
467 assert(u);
468
eef85c4a 469 /* Frees the hashmap and makes sure we are dropped from the inverse pointers */
87f0e418 470
eef85c4a 471 HASHMAP_FOREACH_KEY(v, other, h, i) {
87f0e418
LP
472 UnitDependency d;
473
474 for (d = 0; d < _UNIT_DEPENDENCY_MAX; d++)
eef85c4a 475 hashmap_remove(other->dependencies[d], u);
701cc384
LP
476
477 unit_add_to_gc_queue(other);
87f0e418
LP
478 }
479
eef85c4a 480 hashmap_free(h);
87f0e418
LP
481}
482
c2756a68
LP
483static void unit_remove_transient(Unit *u) {
484 char **i;
485
486 assert(u);
487
488 if (!u->transient)
489 return;
490
491 if (u->fragment_path)
3f5e8115 492 (void) unlink(u->fragment_path);
c2756a68
LP
493
494 STRV_FOREACH(i, u->dropin_paths) {
39591351 495 _cleanup_free_ char *p = NULL, *pp = NULL;
c2756a68 496
39591351
LP
497 p = dirname_malloc(*i); /* Get the drop-in directory from the drop-in file */
498 if (!p)
499 continue;
500
501 pp = dirname_malloc(p); /* Get the config directory from the drop-in directory */
502 if (!pp)
503 continue;
504
505 /* Only drop transient drop-ins */
506 if (!path_equal(u->manager->lookup_paths.transient, pp))
507 continue;
c2756a68 508
39591351
LP
509 (void) unlink(*i);
510 (void) rmdir(p);
c2756a68
LP
511 }
512}
513
a57f7e2c 514static void unit_free_requires_mounts_for(Unit *u) {
eef85c4a 515 assert(u);
a57f7e2c 516
eef85c4a
LP
517 for (;;) {
518 _cleanup_free_ char *path;
a57f7e2c 519
eef85c4a
LP
520 path = hashmap_steal_first_key(u->requires_mounts_for);
521 if (!path)
522 break;
523 else {
524 char s[strlen(path) + 1];
a57f7e2c 525
eef85c4a
LP
526 PATH_FOREACH_PREFIX_MORE(s, path) {
527 char *y;
528 Set *x;
529
530 x = hashmap_get2(u->manager->units_requiring_mounts_for, s, (void**) &y);
531 if (!x)
532 continue;
a57f7e2c 533
eef85c4a 534 (void) set_remove(x, u);
a57f7e2c 535
eef85c4a
LP
536 if (set_isempty(x)) {
537 (void) hashmap_remove(u->manager->units_requiring_mounts_for, y);
538 free(y);
539 set_free(x);
540 }
a57f7e2c
LP
541 }
542 }
543 }
544
eef85c4a 545 u->requires_mounts_for = hashmap_free(u->requires_mounts_for);
a57f7e2c
LP
546}
547
598459ce
LP
548static void unit_done(Unit *u) {
549 ExecContext *ec;
550 CGroupContext *cc;
551
552 assert(u);
553
554 if (u->type < 0)
555 return;
556
557 if (UNIT_VTABLE(u)->done)
558 UNIT_VTABLE(u)->done(u);
559
560 ec = unit_get_exec_context(u);
561 if (ec)
562 exec_context_done(ec);
563
564 cc = unit_get_cgroup_context(u);
565 if (cc)
566 cgroup_context_done(cc);
567}
568
87f0e418
LP
569void unit_free(Unit *u) {
570 UnitDependency d;
571 Iterator i;
572 char *t;
573
c9d5c9c0
LP
574 if (!u)
575 return;
87f0e418 576
b8b6f321
LP
577 if (UNIT_ISSET(u->slice)) {
578 /* A unit is being dropped from the tree, make sure our parent slice recalculates the member mask */
579 unit_invalidate_cgroup_members_masks(UNIT_DEREF(u->slice));
580
581 /* And make sure the parent is realized again, updating cgroup memberships */
582 unit_add_to_cgroup_realize_queue(UNIT_DEREF(u->slice));
583 }
584
50fb00b7 585 u->transient_file = safe_fclose(u->transient_file);
4f4afc88 586
2c289ea8 587 if (!MANAGER_IS_RELOADING(u->manager))
c2756a68
LP
588 unit_remove_transient(u);
589
c1e1601e
LP
590 bus_unit_send_removed_signal(u);
591
598459ce 592 unit_done(u);
a013b84b 593
50be4f4a 594 unit_dequeue_rewatch_pids(u);
cf9fd508 595
50be4f4a 596 sd_bus_slot_unref(u->match_bus_slot);
05a98afd
LP
597 sd_bus_track_unref(u->bus_track);
598 u->deserialized_refs = strv_free(u->deserialized_refs);
599
a57f7e2c
LP
600 unit_free_requires_mounts_for(u);
601
ac155bb8
MS
602 SET_FOREACH(t, u->names, i)
603 hashmap_remove_value(u->manager->units, t, u);
87f0e418 604
4b58153d
LP
605 if (!sd_id128_is_null(u->invocation_id))
606 hashmap_remove_value(u->manager->units_by_invocation_id, &u->invocation_id, u);
607
97e7d748
MS
608 if (u->job) {
609 Job *j = u->job;
610 job_uninstall(j);
611 job_free(j);
612 }
964e0949 613
e0209d83
MS
614 if (u->nop_job) {
615 Job *j = u->nop_job;
616 job_uninstall(j);
617 job_free(j);
618 }
619
964e0949 620 for (d = 0; d < _UNIT_DEPENDENCY_MAX; d++)
ac155bb8 621 bidi_set_free(u, u->dependencies[d]);
964e0949 622
adefcf28
LP
623 if (u->on_console)
624 manager_unref_console(u->manager);
625
efdb0237 626 unit_release_cgroup(u);
72673e86 627
d3070fbd
LP
628 if (!MANAGER_IS_RELOADING(u->manager))
629 unit_unlink_state_files(u);
630
00d9ef85
LP
631 unit_unref_uid_gid(u, false);
632
5269eb6b 633 (void) manager_update_failed_units(u->manager, u, false);
db785129 634 set_remove(u->manager->startup_units, u);
f755e3b7 635
a911bb9a
LP
636 unit_unwatch_all_pids(u);
637
702a2d8f 638 unit_ref_unset(&u->slice);
7f7d01ed
ZJS
639 while (u->refs_by_target)
640 unit_ref_unset(u->refs_by_target);
57020a3a 641
ac155bb8 642 if (u->type != _UNIT_TYPE_INVALID)
71fda00f 643 LIST_REMOVE(units_by_type, u->manager->units_by_type[u->type], u);
ef734fd6 644
ac155bb8 645 if (u->in_load_queue)
71fda00f 646 LIST_REMOVE(load_queue, u->manager->load_queue, u);
87f0e418 647
ac155bb8 648 if (u->in_dbus_queue)
71fda00f 649 LIST_REMOVE(dbus_queue, u->manager->dbus_unit_queue, u);
c1e1601e 650
a2d72e26 651 if (u->in_gc_queue)
c5a97ed1 652 LIST_REMOVE(gc_queue, u->manager->gc_unit_queue, u);
701cc384 653
91a6073e
LP
654 if (u->in_cgroup_realize_queue)
655 LIST_REMOVE(cgroup_realize_queue, u->manager->cgroup_realize_queue, u);
87f0e418 656
09e24654
LP
657 if (u->in_cgroup_empty_queue)
658 LIST_REMOVE(cgroup_empty_queue, u->manager->cgroup_empty_queue, u);
659
1bdf2790
ZJS
660 if (u->in_cleanup_queue)
661 LIST_REMOVE(cleanup_queue, u->manager->cleanup_queue, u);
adefcf28 662
19496554
MS
663 if (u->in_target_deps_queue)
664 LIST_REMOVE(target_deps_queue, u->manager->target_deps_queue, u);
665
a3c1168a
LP
666 if (u->in_stop_when_unneeded_queue)
667 LIST_REMOVE(stop_when_unneeded_queue, u->manager->stop_when_unneeded_queue, u);
668
6a48d82f
DM
669 safe_close(u->ip_accounting_ingress_map_fd);
670 safe_close(u->ip_accounting_egress_map_fd);
72673e86 671
6a48d82f
DM
672 safe_close(u->ipv4_allow_map_fd);
673 safe_close(u->ipv6_allow_map_fd);
674 safe_close(u->ipv4_deny_map_fd);
675 safe_close(u->ipv6_deny_map_fd);
d3070fbd 676
6a48d82f 677 bpf_program_unref(u->ip_bpf_ingress);
aa2b6f1d 678 bpf_program_unref(u->ip_bpf_ingress_installed);
6a48d82f 679 bpf_program_unref(u->ip_bpf_egress);
aa2b6f1d 680 bpf_program_unref(u->ip_bpf_egress_installed);
00d9ef85 681
084c7007
RG
682 bpf_program_unref(u->bpf_device_control_installed);
683
a946fa9b
ZJS
684 condition_free_list(u->conditions);
685 condition_free_list(u->asserts);
f755e3b7 686
ac155bb8 687 free(u->description);
49dbfa7b 688 strv_free(u->documentation);
ac155bb8 689 free(u->fragment_path);
1b64d026 690 free(u->source_path);
ae7a7182 691 strv_free(u->dropin_paths);
ac155bb8 692 free(u->instance);
87f0e418 693
f189ab18
LP
694 free(u->job_timeout_reboot_arg);
695
ac155bb8 696 set_free_free(u->names);
87f0e418 697
6bf0f408
LP
698 free(u->reboot_arg);
699
87f0e418
LP
700 free(u);
701}
702
703UnitActiveState unit_active_state(Unit *u) {
704 assert(u);
705
ac155bb8 706 if (u->load_state == UNIT_MERGED)
6124958c
LP
707 return unit_active_state(unit_follow_merge(u));
708
709 /* After a reload it might happen that a unit is not correctly
710 * loaded but still has a process around. That's why we won't
fdf20a31 711 * shortcut failed loading to UNIT_INACTIVE_FAILED. */
87f0e418
LP
712
713 return UNIT_VTABLE(u)->active_state(u);
714}
715
10a94420
LP
716const char* unit_sub_state_to_string(Unit *u) {
717 assert(u);
718
719 return UNIT_VTABLE(u)->sub_state_to_string(u);
720}
721
eef85c4a
LP
722static int set_complete_move(Set **s, Set **other) {
723 assert(s);
724 assert(other);
725
726 if (!other)
727 return 0;
728
729 if (*s)
730 return set_move(*s, *other);
ae2a15bc
LP
731 else
732 *s = TAKE_PTR(*other);
7c0b05e5 733
eef85c4a
LP
734 return 0;
735}
736
737static int hashmap_complete_move(Hashmap **s, Hashmap **other) {
23a177ef
LP
738 assert(s);
739 assert(other);
87f0e418 740
23a177ef 741 if (!*other)
7c0b05e5 742 return 0;
87f0e418 743
eef85c4a
LP
744 if (*s)
745 return hashmap_move(*s, *other);
ae2a15bc
LP
746 else
747 *s = TAKE_PTR(*other);
7c0b05e5
MS
748
749 return 0;
23a177ef 750}
87f0e418 751
7c0b05e5 752static int merge_names(Unit *u, Unit *other) {
23a177ef
LP
753 char *t;
754 Iterator i;
7c0b05e5 755 int r;
87f0e418 756
23a177ef
LP
757 assert(u);
758 assert(other);
759
eef85c4a 760 r = set_complete_move(&u->names, &other->names);
7c0b05e5
MS
761 if (r < 0)
762 return r;
23a177ef 763
ac155bb8
MS
764 set_free_free(other->names);
765 other->names = NULL;
766 other->id = NULL;
23a177ef 767
ac155bb8
MS
768 SET_FOREACH(t, u->names, i)
769 assert_se(hashmap_replace(u->manager->units, t, u) == 0);
7c0b05e5
MS
770
771 return 0;
87f0e418
LP
772}
773
09a65f92
MS
774static int reserve_dependencies(Unit *u, Unit *other, UnitDependency d) {
775 unsigned n_reserve;
776
777 assert(u);
778 assert(other);
779 assert(d < _UNIT_DEPENDENCY_MAX);
780
781 /*
782 * If u does not have this dependency set allocated, there is no need
f131770b 783 * to reserve anything. In that case other's set will be transferred
09a65f92
MS
784 * as a whole to u by complete_move().
785 */
786 if (!u->dependencies[d])
787 return 0;
788
789 /* merge_dependencies() will skip a u-on-u dependency */
eef85c4a 790 n_reserve = hashmap_size(other->dependencies[d]) - !!hashmap_get(other->dependencies[d], u);
09a65f92 791
eef85c4a 792 return hashmap_reserve(u->dependencies[d], n_reserve);
09a65f92
MS
793}
794
d1fab3fe 795static void merge_dependencies(Unit *u, Unit *other, const char *other_id, UnitDependency d) {
23a177ef
LP
796 Iterator i;
797 Unit *back;
eef85c4a 798 void *v;
87f0e418 799 int r;
23a177ef 800
eef85c4a
LP
801 /* Merges all dependencies of type 'd' of the unit 'other' into the deps of the unit 'u' */
802
23a177ef
LP
803 assert(u);
804 assert(other);
805 assert(d < _UNIT_DEPENDENCY_MAX);
806
eef85c4a
LP
807 /* Fix backwards pointers. Let's iterate through all dependendent units of the other unit. */
808 HASHMAP_FOREACH_KEY(v, back, other->dependencies[d], i) {
23a177ef
LP
809 UnitDependency k;
810
eef85c4a
LP
811 /* Let's now iterate through the dependencies of that dependencies of the other units, looking for
812 * pointers back, and let's fix them up, to instead point to 'u'. */
813
e48614c4 814 for (k = 0; k < _UNIT_DEPENDENCY_MAX; k++) {
e66047ff 815 if (back == u) {
eef85c4a
LP
816 /* Do not add dependencies between u and itself. */
817 if (hashmap_remove(back->dependencies[k], other))
f2341e0a 818 maybe_warn_about_dependency(u, other_id, k);
e66047ff 819 } else {
eef85c4a
LP
820 UnitDependencyInfo di_u, di_other, di_merged;
821
822 /* Let's drop this dependency between "back" and "other", and let's create it between
823 * "back" and "u" instead. Let's merge the bit masks of the dependency we are moving,
824 * and any such dependency which might already exist */
825
826 di_other.data = hashmap_get(back->dependencies[k], other);
827 if (!di_other.data)
828 continue; /* dependency isn't set, let's try the next one */
829
830 di_u.data = hashmap_get(back->dependencies[k], u);
831
832 di_merged = (UnitDependencyInfo) {
833 .origin_mask = di_u.origin_mask | di_other.origin_mask,
834 .destination_mask = di_u.destination_mask | di_other.destination_mask,
835 };
836
837 r = hashmap_remove_and_replace(back->dependencies[k], other, u, di_merged.data);
838 if (r < 0)
839 log_warning_errno(r, "Failed to remove/replace: back=%s other=%s u=%s: %m", back->id, other_id, u->id);
840 assert(r >= 0);
841
842 /* assert_se(hashmap_remove_and_replace(back->dependencies[k], other, u, di_merged.data) >= 0); */
e66047ff 843 }
e48614c4 844 }
eef85c4a 845
23a177ef
LP
846 }
847
e66047ff 848 /* Also do not move dependencies on u to itself */
eef85c4a 849 back = hashmap_remove(other->dependencies[d], u);
d1fab3fe 850 if (back)
f2341e0a 851 maybe_warn_about_dependency(u, other_id, d);
e66047ff 852
7c0b05e5 853 /* The move cannot fail. The caller must have performed a reservation. */
eef85c4a 854 assert_se(hashmap_complete_move(&u->dependencies[d], &other->dependencies[d]) == 0);
23a177ef 855
eef85c4a 856 other->dependencies[d] = hashmap_free(other->dependencies[d]);
23a177ef
LP
857}
858
859int unit_merge(Unit *u, Unit *other) {
87f0e418 860 UnitDependency d;
d1fab3fe 861 const char *other_id = NULL;
09a65f92 862 int r;
87f0e418
LP
863
864 assert(u);
865 assert(other);
ac155bb8
MS
866 assert(u->manager == other->manager);
867 assert(u->type != _UNIT_TYPE_INVALID);
87f0e418 868
cc916967
LP
869 other = unit_follow_merge(other);
870
23a177ef
LP
871 if (other == u)
872 return 0;
873
ac155bb8 874 if (u->type != other->type)
9e2f7c11
LP
875 return -EINVAL;
876
ac155bb8 877 if (!u->instance != !other->instance)
87f0e418
LP
878 return -EINVAL;
879
8a993b61 880 if (!unit_type_may_alias(u->type)) /* Merging only applies to unit names that support aliases */
934e749e
LP
881 return -EEXIST;
882
ec2ce0c5 883 if (!IN_SET(other->load_state, UNIT_STUB, UNIT_NOT_FOUND))
23a177ef 884 return -EEXIST;
87f0e418 885
ac155bb8 886 if (other->job)
819e213f
LP
887 return -EEXIST;
888
e0209d83
MS
889 if (other->nop_job)
890 return -EEXIST;
891
fdf20a31 892 if (!UNIT_IS_INACTIVE_OR_FAILED(unit_active_state(other)))
819e213f
LP
893 return -EEXIST;
894
d1fab3fe
ZJS
895 if (other->id)
896 other_id = strdupa(other->id);
897
09a65f92
MS
898 /* Make reservations to ensure merge_dependencies() won't fail */
899 for (d = 0; d < _UNIT_DEPENDENCY_MAX; d++) {
900 r = reserve_dependencies(u, other, d);
901 /*
902 * We don't rollback reservations if we fail. We don't have
903 * a way to undo reservations. A reservation is not a leak.
904 */
905 if (r < 0)
906 return r;
907 }
908
87f0e418 909 /* Merge names */
7c0b05e5
MS
910 r = merge_names(u, other);
911 if (r < 0)
912 return r;
87f0e418 913
57020a3a 914 /* Redirect all references */
7f7d01ed
ZJS
915 while (other->refs_by_target)
916 unit_ref_set(other->refs_by_target, other->refs_by_target->source, u);
57020a3a 917
87f0e418
LP
918 /* Merge dependencies */
919 for (d = 0; d < _UNIT_DEPENDENCY_MAX; d++)
d1fab3fe 920 merge_dependencies(u, other, other_id, d);
87f0e418 921
ac155bb8
MS
922 other->load_state = UNIT_MERGED;
923 other->merged_into = u;
23a177ef 924
3616a49c
LP
925 /* If there is still some data attached to the other node, we
926 * don't need it anymore, and can free it. */
ac155bb8 927 if (other->load_state != UNIT_STUB)
3616a49c
LP
928 if (UNIT_VTABLE(other)->done)
929 UNIT_VTABLE(other)->done(other);
930
931 unit_add_to_dbus_queue(u);
23a177ef
LP
932 unit_add_to_cleanup_queue(other);
933
934 return 0;
935}
936
937int unit_merge_by_name(Unit *u, const char *name) {
934e749e 938 _cleanup_free_ char *s = NULL;
23a177ef 939 Unit *other;
9e2f7c11 940 int r;
23a177ef
LP
941
942 assert(u);
943 assert(name);
944
7410616c 945 if (unit_name_is_valid(name, UNIT_NAME_TEMPLATE)) {
ac155bb8 946 if (!u->instance)
9e2f7c11
LP
947 return -EINVAL;
948
7410616c
LP
949 r = unit_name_replace_instance(name, u->instance, &s);
950 if (r < 0)
951 return r;
9e2f7c11
LP
952
953 name = s;
954 }
955
c2756a68 956 other = manager_get_unit(u->manager, name);
7410616c
LP
957 if (other)
958 return unit_merge(u, other);
23a177ef 959
7410616c 960 return unit_add_name(u, name);
23a177ef
LP
961}
962
963Unit* unit_follow_merge(Unit *u) {
964 assert(u);
965
ac155bb8
MS
966 while (u->load_state == UNIT_MERGED)
967 assert_se(u = u->merged_into);
23a177ef
LP
968
969 return u;
970}
971
972int unit_add_exec_dependencies(Unit *u, ExecContext *c) {
ada5e276
YW
973 ExecDirectoryType dt;
974 char **dp;
23a177ef
LP
975 int r;
976
977 assert(u);
978 assert(c);
979
e1e74614 980 if (c->working_directory && !c->working_directory_missing_ok) {
eef85c4a 981 r = unit_require_mounts_for(u, c->working_directory, UNIT_DEPENDENCY_FILE);
36be24c8
ZJS
982 if (r < 0)
983 return r;
984 }
985
986 if (c->root_directory) {
eef85c4a 987 r = unit_require_mounts_for(u, c->root_directory, UNIT_DEPENDENCY_FILE);
36be24c8
ZJS
988 if (r < 0)
989 return r;
990 }
991
915e6d16 992 if (c->root_image) {
eef85c4a 993 r = unit_require_mounts_for(u, c->root_image, UNIT_DEPENDENCY_FILE);
915e6d16
LP
994 if (r < 0)
995 return r;
996 }
997
72fd1768 998 for (dt = 0; dt < _EXEC_DIRECTORY_TYPE_MAX; dt++) {
ada5e276
YW
999 if (!u->manager->prefix[dt])
1000 continue;
1001
1002 STRV_FOREACH(dp, c->directories[dt].paths) {
1003 _cleanup_free_ char *p;
1004
1005 p = strjoin(u->manager->prefix[dt], "/", *dp);
1006 if (!p)
1007 return -ENOMEM;
1008
eef85c4a 1009 r = unit_require_mounts_for(u, p, UNIT_DEPENDENCY_FILE);
ada5e276
YW
1010 if (r < 0)
1011 return r;
1012 }
1013 }
1014
463d0d15 1015 if (!MANAGER_IS_SYSTEM(u->manager))
b46a529c
LP
1016 return 0;
1017
1018 if (c->private_tmp) {
d71f0505
LP
1019 const char *p;
1020
1021 FOREACH_STRING(p, "/tmp", "/var/tmp") {
eef85c4a 1022 r = unit_require_mounts_for(u, p, UNIT_DEPENDENCY_FILE);
d71f0505
LP
1023 if (r < 0)
1024 return r;
1025 }
b46a529c 1026
35d8c19a 1027 r = unit_add_dependency_by_name(u, UNIT_AFTER, SPECIAL_TMPFILES_SETUP_SERVICE, true, UNIT_DEPENDENCY_FILE);
b46a529c
LP
1028 if (r < 0)
1029 return r;
1030 }
1031
52c239d7
LB
1032 if (!IN_SET(c->std_output,
1033 EXEC_OUTPUT_JOURNAL, EXEC_OUTPUT_JOURNAL_AND_CONSOLE,
1034 EXEC_OUTPUT_KMSG, EXEC_OUTPUT_KMSG_AND_CONSOLE,
1035 EXEC_OUTPUT_SYSLOG, EXEC_OUTPUT_SYSLOG_AND_CONSOLE) &&
1036 !IN_SET(c->std_error,
1037 EXEC_OUTPUT_JOURNAL, EXEC_OUTPUT_JOURNAL_AND_CONSOLE,
1038 EXEC_OUTPUT_KMSG, EXEC_OUTPUT_KMSG_AND_CONSOLE,
1039 EXEC_OUTPUT_SYSLOG, EXEC_OUTPUT_SYSLOG_AND_CONSOLE))
23a177ef
LP
1040 return 0;
1041
1042 /* If syslog or kernel logging is requested, make sure our own
1043 * logging daemon is run first. */
1044
35d8c19a 1045 r = unit_add_dependency_by_name(u, UNIT_AFTER, SPECIAL_JOURNALD_SOCKET, true, UNIT_DEPENDENCY_FILE);
b46a529c
LP
1046 if (r < 0)
1047 return r;
23a177ef 1048
87f0e418
LP
1049 return 0;
1050}
1051
87f0e418
LP
1052const char *unit_description(Unit *u) {
1053 assert(u);
1054
ac155bb8
MS
1055 if (u->description)
1056 return u->description;
87f0e418 1057
ac155bb8 1058 return strna(u->id);
87f0e418
LP
1059}
1060
eef85c4a
LP
1061static void print_unit_dependency_mask(FILE *f, const char *kind, UnitDependencyMask mask, bool *space) {
1062 const struct {
1063 UnitDependencyMask mask;
1064 const char *name;
1065 } table[] = {
1066 { UNIT_DEPENDENCY_FILE, "file" },
1067 { UNIT_DEPENDENCY_IMPLICIT, "implicit" },
1068 { UNIT_DEPENDENCY_DEFAULT, "default" },
1069 { UNIT_DEPENDENCY_UDEV, "udev" },
1070 { UNIT_DEPENDENCY_PATH, "path" },
1071 { UNIT_DEPENDENCY_MOUNTINFO_IMPLICIT, "mountinfo-implicit" },
1072 { UNIT_DEPENDENCY_MOUNTINFO_DEFAULT, "mountinfo-default" },
1073 { UNIT_DEPENDENCY_PROC_SWAP, "proc-swap" },
1074 };
1075 size_t i;
1076
1077 assert(f);
1078 assert(kind);
1079 assert(space);
1080
1081 for (i = 0; i < ELEMENTSOF(table); i++) {
1082
1083 if (mask == 0)
1084 break;
1085
d94a24ca 1086 if (FLAGS_SET(mask, table[i].mask)) {
eef85c4a
LP
1087 if (*space)
1088 fputc(' ', f);
1089 else
1090 *space = true;
1091
1092 fputs(kind, f);
1093 fputs("-", f);
1094 fputs(table[i].name, f);
1095
1096 mask &= ~table[i].mask;
1097 }
1098 }
1099
1100 assert(mask == 0);
1101}
1102
87f0e418 1103void unit_dump(Unit *u, FILE *f, const char *prefix) {
49dbfa7b 1104 char *t, **j;
87f0e418
LP
1105 UnitDependency d;
1106 Iterator i;
47be870b 1107 const char *prefix2;
173e3821 1108 char
a483fb59 1109 timestamp0[FORMAT_TIMESTAMP_MAX],
173e3821
LP
1110 timestamp1[FORMAT_TIMESTAMP_MAX],
1111 timestamp2[FORMAT_TIMESTAMP_MAX],
1112 timestamp3[FORMAT_TIMESTAMP_MAX],
faf919f1
LP
1113 timestamp4[FORMAT_TIMESTAMP_MAX],
1114 timespan[FORMAT_TIMESPAN_MAX];
a7f241db 1115 Unit *following;
eeaedb7c 1116 _cleanup_set_free_ Set *following_set = NULL;
05a98afd 1117 const char *n;
02638280
LP
1118 CGroupMask m;
1119 int r;
87f0e418
LP
1120
1121 assert(u);
ac155bb8 1122 assert(u->type >= 0);
87f0e418 1123
4c940960 1124 prefix = strempty(prefix);
63c372cb 1125 prefix2 = strjoina(prefix, "\t");
87f0e418
LP
1126
1127 fprintf(f,
40d50879 1128 "%s-> Unit %s:\n"
87f0e418 1129 "%s\tDescription: %s\n"
9e2f7c11 1130 "%s\tInstance: %s\n"
87f0e418 1131 "%s\tUnit Load State: %s\n"
2fad8195 1132 "%s\tUnit Active State: %s\n"
b895d155 1133 "%s\tState Change Timestamp: %s\n"
173e3821 1134 "%s\tInactive Exit Timestamp: %s\n"
2fad8195 1135 "%s\tActive Enter Timestamp: %s\n"
701cc384 1136 "%s\tActive Exit Timestamp: %s\n"
173e3821 1137 "%s\tInactive Enter Timestamp: %s\n"
f2f725e5 1138 "%s\tMay GC: %s\n"
9444b1f2 1139 "%s\tNeed Daemon Reload: %s\n"
c2756a68 1140 "%s\tTransient: %s\n"
f5869324 1141 "%s\tPerpetual: %s\n"
5afe510c 1142 "%s\tGarbage Collection Mode: %s\n"
4ad49000
LP
1143 "%s\tSlice: %s\n"
1144 "%s\tCGroup: %s\n"
aae7e17f 1145 "%s\tCGroup realized: %s\n",
ac155bb8 1146 prefix, u->id,
87f0e418 1147 prefix, unit_description(u),
ac155bb8
MS
1148 prefix, strna(u->instance),
1149 prefix, unit_load_state_to_string(u->load_state),
2fad8195 1150 prefix, unit_active_state_to_string(unit_active_state(u)),
a483fb59 1151 prefix, strna(format_timestamp(timestamp0, sizeof(timestamp0), u->state_change_timestamp.realtime)),
ac155bb8
MS
1152 prefix, strna(format_timestamp(timestamp1, sizeof(timestamp1), u->inactive_exit_timestamp.realtime)),
1153 prefix, strna(format_timestamp(timestamp2, sizeof(timestamp2), u->active_enter_timestamp.realtime)),
1154 prefix, strna(format_timestamp(timestamp3, sizeof(timestamp3), u->active_exit_timestamp.realtime)),
1155 prefix, strna(format_timestamp(timestamp4, sizeof(timestamp4), u->inactive_enter_timestamp.realtime)),
f2f725e5 1156 prefix, yes_no(unit_may_gc(u)),
9444b1f2 1157 prefix, yes_no(unit_need_daemon_reload(u)),
c2756a68 1158 prefix, yes_no(u->transient),
f5869324 1159 prefix, yes_no(u->perpetual),
5afe510c 1160 prefix, collect_mode_to_string(u->collect_mode),
4ad49000
LP
1161 prefix, strna(unit_slice_name(u)),
1162 prefix, strna(u->cgroup_path),
aae7e17f
FB
1163 prefix, yes_no(u->cgroup_realized));
1164
1165 if (u->cgroup_realized_mask != 0) {
1166 _cleanup_free_ char *s = NULL;
1167 (void) cg_mask_to_string(u->cgroup_realized_mask, &s);
02638280
LP
1168 fprintf(f, "%s\tCGroup realized mask: %s\n", prefix, strnull(s));
1169 }
0adf88b6 1170
02638280
LP
1171 if (u->cgroup_enabled_mask != 0) {
1172 _cleanup_free_ char *s = NULL;
1173 (void) cg_mask_to_string(u->cgroup_enabled_mask, &s);
1174 fprintf(f, "%s\tCGroup enabled mask: %s\n", prefix, strnull(s));
1175 }
0adf88b6 1176
02638280
LP
1177 m = unit_get_own_mask(u);
1178 if (m != 0) {
1179 _cleanup_free_ char *s = NULL;
1180 (void) cg_mask_to_string(m, &s);
1181 fprintf(f, "%s\tCGroup own mask: %s\n", prefix, strnull(s));
aae7e17f 1182 }
0adf88b6 1183
02638280
LP
1184 m = unit_get_members_mask(u);
1185 if (m != 0) {
aae7e17f 1186 _cleanup_free_ char *s = NULL;
02638280 1187 (void) cg_mask_to_string(m, &s);
aae7e17f
FB
1188 fprintf(f, "%s\tCGroup members mask: %s\n", prefix, strnull(s));
1189 }
0301abf4 1190
0adf88b6
LP
1191 m = unit_get_delegate_mask(u);
1192 if (m != 0) {
1193 _cleanup_free_ char *s = NULL;
1194 (void) cg_mask_to_string(m, &s);
1195 fprintf(f, "%s\tCGroup delegate mask: %s\n", prefix, strnull(s));
1196 }
1197
ac155bb8 1198 SET_FOREACH(t, u->names, i)
87f0e418
LP
1199 fprintf(f, "%s\tName: %s\n", prefix, t);
1200
4b58153d
LP
1201 if (!sd_id128_is_null(u->invocation_id))
1202 fprintf(f, "%s\tInvocation ID: " SD_ID128_FORMAT_STR "\n",
1203 prefix, SD_ID128_FORMAT_VAL(u->invocation_id));
1204
49dbfa7b
LP
1205 STRV_FOREACH(j, u->documentation)
1206 fprintf(f, "%s\tDocumentation: %s\n", prefix, *j);
1207
eeaedb7c
LP
1208 following = unit_following(u);
1209 if (following)
ac155bb8 1210 fprintf(f, "%s\tFollowing: %s\n", prefix, following->id);
8fe914ec 1211
eeaedb7c
LP
1212 r = unit_following_set(u, &following_set);
1213 if (r >= 0) {
1214 Unit *other;
1215
1216 SET_FOREACH(other, following_set, i)
1217 fprintf(f, "%s\tFollowing Set Member: %s\n", prefix, other->id);
1218 }
1219
ac155bb8
MS
1220 if (u->fragment_path)
1221 fprintf(f, "%s\tFragment Path: %s\n", prefix, u->fragment_path);
23a177ef 1222
1b64d026
LP
1223 if (u->source_path)
1224 fprintf(f, "%s\tSource Path: %s\n", prefix, u->source_path);
1225
ae7a7182 1226 STRV_FOREACH(j, u->dropin_paths)
2875e22b 1227 fprintf(f, "%s\tDropIn Path: %s\n", prefix, *j);
ae7a7182 1228
e7dfbb4e
LP
1229 if (u->failure_action != EMERGENCY_ACTION_NONE)
1230 fprintf(f, "%s\tFailure Action: %s\n", prefix, emergency_action_to_string(u->failure_action));
7af67e9a
LP
1231 if (u->failure_action_exit_status >= 0)
1232 fprintf(f, "%s\tFailure Action Exit Status: %i\n", prefix, u->failure_action_exit_status);
e7dfbb4e
LP
1233 if (u->success_action != EMERGENCY_ACTION_NONE)
1234 fprintf(f, "%s\tSuccess Action: %s\n", prefix, emergency_action_to_string(u->success_action));
7af67e9a
LP
1235 if (u->success_action_exit_status >= 0)
1236 fprintf(f, "%s\tSuccess Action Exit Status: %i\n", prefix, u->success_action_exit_status);
e7dfbb4e 1237
36c16a7c 1238 if (u->job_timeout != USEC_INFINITY)
2fa4092c 1239 fprintf(f, "%s\tJob Timeout: %s\n", prefix, format_timespan(timespan, sizeof(timespan), u->job_timeout, 0));
faf919f1 1240
87a47f99
LN
1241 if (u->job_timeout_action != EMERGENCY_ACTION_NONE)
1242 fprintf(f, "%s\tJob Timeout Action: %s\n", prefix, emergency_action_to_string(u->job_timeout_action));
f189ab18
LP
1243
1244 if (u->job_timeout_reboot_arg)
1245 fprintf(f, "%s\tJob Timeout Reboot Argument: %s\n", prefix, u->job_timeout_reboot_arg);
1246
59fccdc5
LP
1247 condition_dump_list(u->conditions, f, prefix, condition_type_to_string);
1248 condition_dump_list(u->asserts, f, prefix, assert_type_to_string);
52661efd 1249
ac155bb8 1250 if (dual_timestamp_is_set(&u->condition_timestamp))
2791a8f8
LP
1251 fprintf(f,
1252 "%s\tCondition Timestamp: %s\n"
1253 "%s\tCondition Result: %s\n",
ac155bb8
MS
1254 prefix, strna(format_timestamp(timestamp1, sizeof(timestamp1), u->condition_timestamp.realtime)),
1255 prefix, yes_no(u->condition_result));
2791a8f8 1256
59fccdc5
LP
1257 if (dual_timestamp_is_set(&u->assert_timestamp))
1258 fprintf(f,
1259 "%s\tAssert Timestamp: %s\n"
1260 "%s\tAssert Result: %s\n",
1261 prefix, strna(format_timestamp(timestamp1, sizeof(timestamp1), u->assert_timestamp.realtime)),
1262 prefix, yes_no(u->assert_result));
1263
87f0e418 1264 for (d = 0; d < _UNIT_DEPENDENCY_MAX; d++) {
eef85c4a 1265 UnitDependencyInfo di;
87f0e418
LP
1266 Unit *other;
1267
eef85c4a
LP
1268 HASHMAP_FOREACH_KEY(di.data, other, u->dependencies[d], i) {
1269 bool space = false;
1270
1271 fprintf(f, "%s\t%s: %s (", prefix, unit_dependency_to_string(d), other->id);
1272
1273 print_unit_dependency_mask(f, "origin", di.origin_mask, &space);
1274 print_unit_dependency_mask(f, "destination", di.destination_mask, &space);
1275
1276 fputs(")\n", f);
1277 }
87f0e418
LP
1278 }
1279
eef85c4a
LP
1280 if (!hashmap_isempty(u->requires_mounts_for)) {
1281 UnitDependencyInfo di;
1282 const char *path;
1283
1284 HASHMAP_FOREACH_KEY(di.data, path, u->requires_mounts_for, i) {
1285 bool space = false;
7c8fa05c 1286
eef85c4a 1287 fprintf(f, "%s\tRequiresMountsFor: %s (", prefix, path);
7c8fa05c 1288
eef85c4a
LP
1289 print_unit_dependency_mask(f, "origin", di.origin_mask, &space);
1290 print_unit_dependency_mask(f, "destination", di.destination_mask, &space);
1291
1292 fputs(")\n", f);
1293 }
7c8fa05c
LP
1294 }
1295
ac155bb8 1296 if (u->load_state == UNIT_LOADED) {
ab1f0633 1297
b0650475 1298 fprintf(f,
a40eb732 1299 "%s\tStopWhenUnneeded: %s\n"
b5e9dba8
LP
1300 "%s\tRefuseManualStart: %s\n"
1301 "%s\tRefuseManualStop: %s\n"
222ae6a8 1302 "%s\tDefaultDependencies: %s\n"
d420282b 1303 "%s\tOnFailureJobMode: %s\n"
36b4a7ba 1304 "%s\tIgnoreOnIsolate: %s\n",
ac155bb8
MS
1305 prefix, yes_no(u->stop_when_unneeded),
1306 prefix, yes_no(u->refuse_manual_start),
1307 prefix, yes_no(u->refuse_manual_stop),
1308 prefix, yes_no(u->default_dependencies),
d420282b 1309 prefix, job_mode_to_string(u->on_failure_job_mode),
36b4a7ba 1310 prefix, yes_no(u->ignore_on_isolate));
ac155bb8 1311
23a177ef
LP
1312 if (UNIT_VTABLE(u)->dump)
1313 UNIT_VTABLE(u)->dump(u, f, prefix2);
b0650475 1314
ac155bb8 1315 } else if (u->load_state == UNIT_MERGED)
b0650475
LP
1316 fprintf(f,
1317 "%s\tMerged into: %s\n",
ac155bb8
MS
1318 prefix, u->merged_into->id);
1319 else if (u->load_state == UNIT_ERROR)
1320 fprintf(f, "%s\tLoad Error Code: %s\n", prefix, strerror(-u->load_error));
8821a00f 1321
05a98afd
LP
1322 for (n = sd_bus_track_first(u->bus_track); n; n = sd_bus_track_next(u->bus_track))
1323 fprintf(f, "%s\tBus Ref: %s\n", prefix, n);
87f0e418 1324
ac155bb8
MS
1325 if (u->job)
1326 job_dump(u->job, f, prefix2);
87f0e418 1327
e0209d83
MS
1328 if (u->nop_job)
1329 job_dump(u->nop_job, f, prefix2);
87f0e418
LP
1330}
1331
1332/* Common implementation for multiple backends */
e537352b 1333int unit_load_fragment_and_dropin(Unit *u) {
23a177ef
LP
1334 int r;
1335
1336 assert(u);
23a177ef 1337
e48614c4 1338 /* Load a .{service,socket,...} file */
4ad49000
LP
1339 r = unit_load_fragment(u);
1340 if (r < 0)
23a177ef
LP
1341 return r;
1342
ac155bb8 1343 if (u->load_state == UNIT_STUB)
23a177ef
LP
1344 return -ENOENT;
1345
9e4ea9cc
ZJS
1346 /* Load drop-in directory data. If u is an alias, we might be reloading the
1347 * target unit needlessly. But we cannot be sure which drops-ins have already
1348 * been loaded and which not, at least without doing complicated book-keeping,
1349 * so let's always reread all drop-ins. */
1350 return unit_load_dropin(unit_follow_merge(u));
23a177ef
LP
1351}
1352
1353/* Common implementation for multiple backends */
e537352b 1354int unit_load_fragment_and_dropin_optional(Unit *u) {
23a177ef 1355 int r;
87f0e418
LP
1356
1357 assert(u);
1358
23a177ef
LP
1359 /* Same as unit_load_fragment_and_dropin(), but whether
1360 * something can be loaded or not doesn't matter. */
1361
e9e8cbc8 1362 /* Load a .service/.socket/.slice/… file */
4ad49000
LP
1363 r = unit_load_fragment(u);
1364 if (r < 0)
87f0e418
LP
1365 return r;
1366
ac155bb8
MS
1367 if (u->load_state == UNIT_STUB)
1368 u->load_state = UNIT_LOADED;
d46de8a1 1369
9e4ea9cc
ZJS
1370 /* Load drop-in directory data */
1371 return unit_load_dropin(unit_follow_merge(u));
87f0e418
LP
1372}
1373
19496554
MS
1374void unit_add_to_target_deps_queue(Unit *u) {
1375 Manager *m = u->manager;
1376
1377 assert(u);
1378
1379 if (u->in_target_deps_queue)
1380 return;
1381
1382 LIST_PREPEND(target_deps_queue, m->target_deps_queue, u);
1383 u->in_target_deps_queue = true;
1384}
1385
bba34eed 1386int unit_add_default_target_dependency(Unit *u, Unit *target) {
98bc2000
LP
1387 assert(u);
1388 assert(target);
1389
ac155bb8 1390 if (target->type != UNIT_TARGET)
98bc2000
LP
1391 return 0;
1392
35b8ca3a 1393 /* Only add the dependency if both units are loaded, so that
bba34eed 1394 * that loop check below is reliable */
ac155bb8
MS
1395 if (u->load_state != UNIT_LOADED ||
1396 target->load_state != UNIT_LOADED)
bba34eed
LP
1397 return 0;
1398
21256a2b
LP
1399 /* If either side wants no automatic dependencies, then let's
1400 * skip this */
ac155bb8
MS
1401 if (!u->default_dependencies ||
1402 !target->default_dependencies)
21256a2b
LP
1403 return 0;
1404
98bc2000 1405 /* Don't create loops */
eef85c4a 1406 if (hashmap_get(target->dependencies[UNIT_BEFORE], u))
98bc2000
LP
1407 return 0;
1408
eef85c4a 1409 return unit_add_dependency(target, UNIT_AFTER, u, true, UNIT_DEPENDENCY_DEFAULT);
98bc2000
LP
1410}
1411
e954c9cf 1412static int unit_add_slice_dependencies(Unit *u) {
eef85c4a 1413 UnitDependencyMask mask;
e954c9cf 1414 assert(u);
b81884e7 1415
35b7ff80 1416 if (!UNIT_HAS_CGROUP_CONTEXT(u))
e954c9cf
LP
1417 return 0;
1418
eef85c4a
LP
1419 /* Slice units are implicitly ordered against their parent slices (as this relationship is encoded in the
1420 name), while all other units are ordered based on configuration (as in their case Slice= configures the
1421 relationship). */
1422 mask = u->type == UNIT_SLICE ? UNIT_DEPENDENCY_IMPLICIT : UNIT_DEPENDENCY_FILE;
1423
e954c9cf 1424 if (UNIT_ISSET(u->slice))
eef85c4a 1425 return unit_add_two_dependencies(u, UNIT_AFTER, UNIT_REQUIRES, UNIT_DEREF(u->slice), true, mask);
e954c9cf 1426
8c8da0e0 1427 if (unit_has_name(u, SPECIAL_ROOT_SLICE))
d1fab3fe
ZJS
1428 return 0;
1429
5a724170 1430 return unit_add_two_dependencies_by_name(u, UNIT_AFTER, UNIT_REQUIRES, SPECIAL_ROOT_SLICE, true, mask);
98bc2000
LP
1431}
1432
e954c9cf 1433static int unit_add_mount_dependencies(Unit *u) {
eef85c4a
LP
1434 UnitDependencyInfo di;
1435 const char *path;
1436 Iterator i;
9588bc32
LP
1437 int r;
1438
1439 assert(u);
1440
eef85c4a
LP
1441 HASHMAP_FOREACH_KEY(di.data, path, u->requires_mounts_for, i) {
1442 char prefix[strlen(path) + 1];
9588bc32 1443
eef85c4a 1444 PATH_FOREACH_PREFIX_MORE(prefix, path) {
c7c89abb 1445 _cleanup_free_ char *p = NULL;
9588bc32
LP
1446 Unit *m;
1447
c7c89abb 1448 r = unit_name_from_path(prefix, ".mount", &p);
9588bc32
LP
1449 if (r < 0)
1450 return r;
c7c89abb
FB
1451
1452 m = manager_get_unit(u->manager, p);
1453 if (!m) {
1454 /* Make sure to load the mount unit if
1455 * it exists. If so the dependencies
1456 * on this unit will be added later
1457 * during the loading of the mount
1458 * unit. */
1459 (void) manager_load_unit_prepare(u->manager, p, NULL, NULL, &m);
9588bc32 1460 continue;
c7c89abb 1461 }
9588bc32
LP
1462 if (m == u)
1463 continue;
1464
1465 if (m->load_state != UNIT_LOADED)
1466 continue;
1467
eef85c4a 1468 r = unit_add_dependency(u, UNIT_AFTER, m, true, di.origin_mask);
9588bc32
LP
1469 if (r < 0)
1470 return r;
1471
1472 if (m->fragment_path) {
eef85c4a 1473 r = unit_add_dependency(u, UNIT_REQUIRES, m, true, di.origin_mask);
9588bc32
LP
1474 if (r < 0)
1475 return r;
1476 }
1477 }
1478 }
1479
1480 return 0;
1481}
1482
95ae05c0
WC
1483static int unit_add_startup_units(Unit *u) {
1484 CGroupContext *c;
5269eb6b 1485 int r;
95ae05c0
WC
1486
1487 c = unit_get_cgroup_context(u);
db785129
LP
1488 if (!c)
1489 return 0;
1490
d53d9474 1491 if (c->startup_cpu_shares == CGROUP_CPU_SHARES_INVALID &&
13c31542 1492 c->startup_io_weight == CGROUP_WEIGHT_INVALID &&
d53d9474 1493 c->startup_blockio_weight == CGROUP_BLKIO_WEIGHT_INVALID)
db785129
LP
1494 return 0;
1495
5269eb6b
LP
1496 r = set_ensure_allocated(&u->manager->startup_units, NULL);
1497 if (r < 0)
1498 return r;
1499
756c09e6 1500 return set_put(u->manager->startup_units, u);
95ae05c0
WC
1501}
1502
87f0e418
LP
1503int unit_load(Unit *u) {
1504 int r;
1505
1506 assert(u);
1507
ac155bb8 1508 if (u->in_load_queue) {
71fda00f 1509 LIST_REMOVE(load_queue, u->manager->load_queue, u);
ac155bb8 1510 u->in_load_queue = false;
87f0e418
LP
1511 }
1512
ac155bb8 1513 if (u->type == _UNIT_TYPE_INVALID)
e537352b
LP
1514 return -EINVAL;
1515
ac155bb8 1516 if (u->load_state != UNIT_STUB)
87f0e418
LP
1517 return 0;
1518
4f4afc88 1519 if (u->transient_file) {
66fa4bdd
LP
1520 /* Finalize transient file: if this is a transient unit file, as soon as we reach unit_load() the setup
1521 * is complete, hence let's synchronize the unit file we just wrote to disk. */
1522
4f4afc88
LP
1523 r = fflush_and_check(u->transient_file);
1524 if (r < 0)
1525 goto fail;
1526
50fb00b7 1527 u->transient_file = safe_fclose(u->transient_file);
f76707da 1528 u->fragment_mtime = now(CLOCK_REALTIME);
4f4afc88
LP
1529 }
1530
c2756a68
LP
1531 if (UNIT_VTABLE(u)->load) {
1532 r = UNIT_VTABLE(u)->load(u);
1533 if (r < 0)
87f0e418 1534 goto fail;
c2756a68 1535 }
23a177ef 1536
ac155bb8 1537 if (u->load_state == UNIT_STUB) {
23a177ef
LP
1538 r = -ENOENT;
1539 goto fail;
1540 }
1541
7c8fa05c 1542 if (u->load_state == UNIT_LOADED) {
19496554 1543 unit_add_to_target_deps_queue(u);
e954c9cf
LP
1544
1545 r = unit_add_slice_dependencies(u);
1546 if (r < 0)
1547 goto fail;
c2756a68 1548
e954c9cf 1549 r = unit_add_mount_dependencies(u);
7c8fa05c 1550 if (r < 0)
c2756a68 1551 goto fail;
7c8fa05c 1552
95ae05c0
WC
1553 r = unit_add_startup_units(u);
1554 if (r < 0)
1555 goto fail;
1556
eef85c4a 1557 if (u->on_failure_job_mode == JOB_ISOLATE && hashmap_size(u->dependencies[UNIT_ON_FAILURE]) > 1) {
f2341e0a 1558 log_unit_error(u, "More than one OnFailure= dependencies specified but OnFailureJobMode=isolate set. Refusing.");
6f40aa45 1559 r = -ENOEXEC;
c2756a68
LP
1560 goto fail;
1561 }
bc432dc7 1562
a2df3ea4
MK
1563 if (u->job_running_timeout != USEC_INFINITY && u->job_running_timeout > u->job_timeout)
1564 log_unit_warning(u, "JobRunningTimeoutSec= is greater than JobTimeoutSec=, it has no effect.");
1565
5af88058
LP
1566 /* We finished loading, let's ensure our parents recalculate the members mask */
1567 unit_invalidate_cgroup_members_masks(u);
f68319bb
LP
1568 }
1569
ac155bb8 1570 assert((u->load_state != UNIT_MERGED) == !u->merged_into);
23a177ef
LP
1571
1572 unit_add_to_dbus_queue(unit_follow_merge(u));
701cc384 1573 unit_add_to_gc_queue(u);
87f0e418 1574
87f0e418
LP
1575 return 0;
1576
1577fail:
c4555ad8
LP
1578 /* We convert ENOEXEC errors to the UNIT_BAD_SETTING load state here. Configuration parsing code should hence
1579 * return ENOEXEC to ensure units are placed in this state after loading */
1580
1581 u->load_state = u->load_state == UNIT_STUB ? UNIT_NOT_FOUND :
1582 r == -ENOEXEC ? UNIT_BAD_SETTING :
1583 UNIT_ERROR;
ac155bb8 1584 u->load_error = r;
c4555ad8 1585
c1e1601e 1586 unit_add_to_dbus_queue(u);
9a46fc3b 1587 unit_add_to_gc_queue(u);
23a177ef 1588
c4555ad8 1589 return log_unit_debug_errno(u, r, "Failed to load configuration: %m");
87f0e418
LP
1590}
1591
49365733
LP
1592static bool unit_condition_test_list(Unit *u, Condition *first, const char *(*to_string)(ConditionType t)) {
1593 Condition *c;
1594 int triggered = -1;
1595
1596 assert(u);
1597 assert(to_string);
1598
1599 /* If the condition list is empty, then it is true */
1600 if (!first)
1601 return true;
1602
1603 /* Otherwise, if all of the non-trigger conditions apply and
1604 * if any of the trigger conditions apply (unless there are
1605 * none) we return true */
1606 LIST_FOREACH(conditions, c, first) {
1607 int r;
1608
1609 r = condition_test(c);
1610 if (r < 0)
f2341e0a
LP
1611 log_unit_warning(u,
1612 "Couldn't determine result for %s=%s%s%s, assuming failed: %m",
49365733
LP
1613 to_string(c->type),
1614 c->trigger ? "|" : "",
1615 c->negate ? "!" : "",
f2341e0a 1616 c->parameter);
49365733 1617 else
f2341e0a
LP
1618 log_unit_debug(u,
1619 "%s=%s%s%s %s.",
49365733
LP
1620 to_string(c->type),
1621 c->trigger ? "|" : "",
1622 c->negate ? "!" : "",
1623 c->parameter,
f2341e0a 1624 condition_result_to_string(c->result));
49365733
LP
1625
1626 if (!c->trigger && r <= 0)
1627 return false;
1628
1629 if (c->trigger && triggered <= 0)
1630 triggered = r > 0;
1631 }
1632
1633 return triggered != 0;
1634}
1635
97a3f4ee 1636static bool unit_test_condition(Unit *u) {
90bbc946
LP
1637 assert(u);
1638
ac155bb8 1639 dual_timestamp_get(&u->condition_timestamp);
49365733 1640 u->condition_result = unit_condition_test_list(u, u->conditions, condition_type_to_string);
90bbc946 1641
e18f8852
LP
1642 unit_add_to_dbus_queue(u);
1643
ac155bb8 1644 return u->condition_result;
90bbc946
LP
1645}
1646
97a3f4ee 1647static bool unit_test_assert(Unit *u) {
59fccdc5
LP
1648 assert(u);
1649
1650 dual_timestamp_get(&u->assert_timestamp);
49365733 1651 u->assert_result = unit_condition_test_list(u, u->asserts, assert_type_to_string);
59fccdc5 1652
e18f8852
LP
1653 unit_add_to_dbus_queue(u);
1654
59fccdc5
LP
1655 return u->assert_result;
1656}
1657
df446f96 1658void unit_status_printf(Unit *u, const char *status, const char *unit_status_msg_format) {
5b262f74
LP
1659 const char *d;
1660
1661 d = unit_description(u);
1662 if (log_get_show_color())
1663 d = strjoina(ANSI_HIGHLIGHT, d, ANSI_NORMAL);
1664
df446f96 1665 DISABLE_WARNING_FORMAT_NONLITERAL;
5b262f74 1666 manager_status_printf(u->manager, STATUS_TYPE_NORMAL, status, unit_status_msg_format, d);
df446f96
LP
1667 REENABLE_WARNING;
1668}
1669
97a3f4ee 1670int unit_test_start_limit(Unit *u) {
429926e9
TR
1671 const char *reason;
1672
6bf0f408
LP
1673 assert(u);
1674
7994ac1d 1675 if (ratelimit_below(&u->start_limit)) {
6bf0f408
LP
1676 u->start_limit_hit = false;
1677 return 0;
1678 }
1679
1680 log_unit_warning(u, "Start request repeated too quickly.");
1681 u->start_limit_hit = true;
1682
429926e9
TR
1683 reason = strjoina("unit ", u->id, " failed");
1684
c7adcb1a
ZJS
1685 return emergency_action(u->manager, u->start_limit_action,
1686 EMERGENCY_ACTION_IS_WATCHDOG|EMERGENCY_ACTION_WARN,
7af67e9a 1687 u->reboot_arg, -1, reason);
6bf0f408
LP
1688}
1689
c891efaf 1690bool unit_shall_confirm_spawn(Unit *u) {
631b676b 1691 assert(u);
c891efaf
FB
1692
1693 if (manager_is_confirm_spawn_disabled(u->manager))
1694 return false;
1695
1696 /* For some reasons units remaining in the same process group
1697 * as PID 1 fail to acquire the console even if it's not used
1698 * by any process. So skip the confirmation question for them. */
1699 return !unit_get_exec_context(u)->same_pgrp;
1700}
1701
631b676b
LP
1702static bool unit_verify_deps(Unit *u) {
1703 Unit *other;
1704 Iterator j;
eef85c4a 1705 void *v;
631b676b
LP
1706
1707 assert(u);
1708
1709 /* Checks whether all BindsTo= dependencies of this unit are fulfilled — if they are also combined with
1710 * After=. We do not check Requires= or Requisite= here as they only should have an effect on the job
1711 * processing, but do not have any effect afterwards. We don't check BindsTo= dependencies that are not used in
1712 * conjunction with After= as for them any such check would make things entirely racy. */
1713
eef85c4a 1714 HASHMAP_FOREACH_KEY(v, other, u->dependencies[UNIT_BINDS_TO], j) {
631b676b 1715
eef85c4a 1716 if (!hashmap_contains(u->dependencies[UNIT_AFTER], other))
631b676b
LP
1717 continue;
1718
1719 if (!UNIT_IS_ACTIVE_OR_RELOADING(unit_active_state(other))) {
1720 log_unit_notice(u, "Bound to unit %s, but unit isn't active.", other->id);
1721 return false;
1722 }
1723 }
1724
1725 return true;
1726}
1727
87f0e418 1728/* Errors:
6bf0f408
LP
1729 * -EBADR: This unit type does not support starting.
1730 * -EALREADY: Unit is already started.
1731 * -EAGAIN: An operation is already in progress. Retry later.
1732 * -ECANCELED: Too many requests for now.
9e30cf74 1733 * -ECOMM: Condition failed
6bf0f408
LP
1734 * -EPROTO: Assert failed
1735 * -EINVAL: Unit not loaded
1736 * -EOPNOTSUPP: Unit type not supported
631b676b 1737 * -ENOLINK: The necessary dependencies are not fulfilled.
d4fd1cf2 1738 * -ESTALE: This unit has been started before and can't be started a second time
a4191c9f 1739 * -ENOENT: This is a triggering unit and unit to trigger is not loaded
87f0e418
LP
1740 */
1741int unit_start(Unit *u) {
1742 UnitActiveState state;
92ab323c 1743 Unit *following;
87f0e418
LP
1744
1745 assert(u);
1746
a82e5507
LP
1747 /* If this is already started, then this will succeed. Note
1748 * that this will even succeed if this unit is not startable
1749 * by the user. This is relied on to detect when we need to
1750 * wait for units and when waiting is finished. */
87f0e418
LP
1751 state = unit_active_state(u);
1752 if (UNIT_IS_ACTIVE_OR_RELOADING(state))
1753 return -EALREADY;
1754
6bf0f408
LP
1755 /* Units that aren't loaded cannot be started */
1756 if (u->load_state != UNIT_LOADED)
1757 return -EINVAL;
1758
d4fd1cf2
LP
1759 /* Refuse starting scope units more than once */
1760 if (UNIT_VTABLE(u)->once_only && dual_timestamp_is_set(&u->inactive_enter_timestamp))
1761 return -ESTALE;
1762
a82e5507
LP
1763 /* If the conditions failed, don't do anything at all. If we
1764 * already are activating this call might still be useful to
1765 * speed up activation in case there is some hold-off time,
1766 * but we don't want to recheck the condition in that case. */
1767 if (state != UNIT_ACTIVATING &&
97a3f4ee 1768 !unit_test_condition(u)) {
f2341e0a 1769 log_unit_debug(u, "Starting requested but condition failed. Not starting unit.");
6e64994d 1770 return -ECOMM;
52661efd
LP
1771 }
1772
59fccdc5
LP
1773 /* If the asserts failed, fail the entire job */
1774 if (state != UNIT_ACTIVATING &&
97a3f4ee 1775 !unit_test_assert(u)) {
f2341e0a 1776 log_unit_notice(u, "Starting requested but asserts failed.");
59fccdc5
LP
1777 return -EPROTO;
1778 }
1779
d11a7645
LP
1780 /* Units of types that aren't supported cannot be
1781 * started. Note that we do this test only after the condition
1782 * checks, so that we rather return condition check errors
1783 * (which are usually not considered a true failure) than "not
1784 * supported" errors (which are considered a failure).
1785 */
1786 if (!unit_supported(u))
1787 return -EOPNOTSUPP;
1788
631b676b
LP
1789 /* Let's make sure that the deps really are in order before we start this. Normally the job engine should have
1790 * taken care of this already, but let's check this here again. After all, our dependencies might not be in
1791 * effect anymore, due to a reload or due to a failed condition. */
1792 if (!unit_verify_deps(u))
1793 return -ENOLINK;
1794
92ab323c 1795 /* Forward to the main object, if we aren't it. */
52990c2e
ZJS
1796 following = unit_following(u);
1797 if (following) {
f2341e0a 1798 log_unit_debug(u, "Redirecting start request from %s to %s.", u->id, following->id);
92ab323c
LP
1799 return unit_start(following);
1800 }
1801
1802 /* If it is stopped, but we cannot start it, then fail */
1803 if (!UNIT_VTABLE(u)->start)
1804 return -EBADR;
1805
87f0e418
LP
1806 /* We don't suppress calls to ->start() here when we are
1807 * already starting, to allow this request to be used as a
1808 * "hurry up" call, for example when the unit is in some "auto
1809 * restart" state where it waits for a holdoff timer to elapse
1810 * before it will start again. */
1811
c1e1601e 1812 unit_add_to_dbus_queue(u);
9e58ff9c 1813
d1a34ae9 1814 return UNIT_VTABLE(u)->start(u);
87f0e418
LP
1815}
1816
1817bool unit_can_start(Unit *u) {
1818 assert(u);
1819
8ff4d2ab
LP
1820 if (u->load_state != UNIT_LOADED)
1821 return false;
1822
1823 if (!unit_supported(u))
1824 return false;
1825
d4fd1cf2
LP
1826 /* Scope units may be started only once */
1827 if (UNIT_VTABLE(u)->once_only && dual_timestamp_is_set(&u->inactive_exit_timestamp))
1828 return false;
1829
87f0e418
LP
1830 return !!UNIT_VTABLE(u)->start;
1831}
1832
2528a7a6
LP
1833bool unit_can_isolate(Unit *u) {
1834 assert(u);
1835
1836 return unit_can_start(u) &&
ac155bb8 1837 u->allow_isolate;
2528a7a6
LP
1838}
1839
87f0e418
LP
1840/* Errors:
1841 * -EBADR: This unit type does not support stopping.
1842 * -EALREADY: Unit is already stopped.
1843 * -EAGAIN: An operation is already in progress. Retry later.
1844 */
1845int unit_stop(Unit *u) {
1846 UnitActiveState state;
92ab323c 1847 Unit *following;
87f0e418
LP
1848
1849 assert(u);
1850
87f0e418 1851 state = unit_active_state(u);
fdf20a31 1852 if (UNIT_IS_INACTIVE_OR_FAILED(state))
87f0e418
LP
1853 return -EALREADY;
1854
0faacd47
LP
1855 following = unit_following(u);
1856 if (following) {
f2341e0a 1857 log_unit_debug(u, "Redirecting stop request from %s to %s.", u->id, following->id);
92ab323c
LP
1858 return unit_stop(following);
1859 }
1860
7898b0cf
LP
1861 if (!UNIT_VTABLE(u)->stop)
1862 return -EBADR;
1863
c1e1601e 1864 unit_add_to_dbus_queue(u);
9e58ff9c 1865
d1a34ae9 1866 return UNIT_VTABLE(u)->stop(u);
87f0e418
LP
1867}
1868
f5869324
LP
1869bool unit_can_stop(Unit *u) {
1870 assert(u);
1871
1872 if (!unit_supported(u))
1873 return false;
1874
1875 if (u->perpetual)
1876 return false;
1877
1878 return !!UNIT_VTABLE(u)->stop;
1879}
1880
87f0e418
LP
1881/* Errors:
1882 * -EBADR: This unit type does not support reloading.
1883 * -ENOEXEC: Unit is not started.
1884 * -EAGAIN: An operation is already in progress. Retry later.
1885 */
1886int unit_reload(Unit *u) {
1887 UnitActiveState state;
92ab323c 1888 Unit *following;
87f0e418
LP
1889
1890 assert(u);
1891
ac155bb8 1892 if (u->load_state != UNIT_LOADED)
6124958c
LP
1893 return -EINVAL;
1894
87f0e418
LP
1895 if (!unit_can_reload(u))
1896 return -EBADR;
1897
1898 state = unit_active_state(u);
e364ad06 1899 if (state == UNIT_RELOADING)
6255af75 1900 return -EAGAIN;
87f0e418 1901
6a371e23 1902 if (state != UNIT_ACTIVE) {
f2341e0a 1903 log_unit_warning(u, "Unit cannot be reloaded because it is inactive.");
87f0e418 1904 return -ENOEXEC;
6a371e23 1905 }
87f0e418 1906
e48614c4
ZJS
1907 following = unit_following(u);
1908 if (following) {
f2341e0a 1909 log_unit_debug(u, "Redirecting reload request from %s to %s.", u->id, following->id);
92ab323c
LP
1910 return unit_reload(following);
1911 }
1912
c1e1601e 1913 unit_add_to_dbus_queue(u);
82a2b6bb 1914
f54bcca5
JR
1915 if (!UNIT_VTABLE(u)->reload) {
1916 /* Unit doesn't have a reload function, but we need to propagate the reload anyway */
2ad2e41a 1917 unit_notify(u, unit_active_state(u), unit_active_state(u), 0);
f54bcca5
JR
1918 return 0;
1919 }
1920
d1a34ae9 1921 return UNIT_VTABLE(u)->reload(u);
87f0e418
LP
1922}
1923
1924bool unit_can_reload(Unit *u) {
1925 assert(u);
1926
f54bcca5
JR
1927 if (UNIT_VTABLE(u)->can_reload)
1928 return UNIT_VTABLE(u)->can_reload(u);
87f0e418 1929
eef85c4a 1930 if (!hashmap_isempty(u->dependencies[UNIT_PROPAGATES_RELOAD_TO]))
87f0e418
LP
1931 return true;
1932
f54bcca5 1933 return UNIT_VTABLE(u)->reload;
87f0e418
LP
1934}
1935
a3c1168a
LP
1936bool unit_is_unneeded(Unit *u) {
1937 static const UnitDependency deps[] = {
be7d9ff7 1938 UNIT_REQUIRED_BY,
084918ba 1939 UNIT_REQUISITE_OF,
be7d9ff7
LP
1940 UNIT_WANTED_BY,
1941 UNIT_BOUND_BY,
1942 };
a3c1168a 1943 size_t j;
f3bff0eb
LP
1944
1945 assert(u);
1946
ac155bb8 1947 if (!u->stop_when_unneeded)
a3c1168a 1948 return false;
f3bff0eb 1949
a3c1168a
LP
1950 /* Don't clean up while the unit is transitioning or is even inactive. */
1951 if (!UNIT_IS_ACTIVE_OR_RELOADING(unit_active_state(u)))
1952 return false;
1953 if (u->job)
1954 return false;
f3bff0eb 1955
a3c1168a 1956 for (j = 0; j < ELEMENTSOF(deps); j++) {
eef85c4a
LP
1957 Unit *other;
1958 Iterator i;
1959 void *v;
1960
fda09318 1961 /* If a dependent unit has a job queued, is active or transitioning, or is marked for
a3c1168a 1962 * restart, then don't clean this one up. */
b81884e7 1963
a3c1168a 1964 HASHMAP_FOREACH_KEY(v, other, u->dependencies[deps[j]], i) {
93d4cb09 1965 if (other->job)
a3c1168a
LP
1966 return false;
1967
1968 if (!UNIT_IS_INACTIVE_OR_FAILED(unit_active_state(other)))
1969 return false;
1970
1971 if (unit_will_restart(other))
1972 return false;
1973 }
bea355da
LP
1974 }
1975
a3c1168a
LP
1976 return true;
1977}
f3bff0eb 1978
a3c1168a
LP
1979static void check_unneeded_dependencies(Unit *u) {
1980
1981 static const UnitDependency deps[] = {
1982 UNIT_REQUIRES,
1983 UNIT_REQUISITE,
1984 UNIT_WANTS,
1985 UNIT_BINDS_TO,
1986 };
1987 size_t j;
1988
1989 assert(u);
1990
1991 /* Add all units this unit depends on to the queue that processes StopWhenUnneeded= behaviour. */
1992
1993 for (j = 0; j < ELEMENTSOF(deps); j++) {
1994 Unit *other;
1995 Iterator i;
1996 void *v;
1997
1998 HASHMAP_FOREACH_KEY(v, other, u->dependencies[deps[j]], i)
fda09318 1999 unit_submit_to_stop_when_unneeded_queue(other);
a3c1168a 2000 }
f3bff0eb
LP
2001}
2002
ff502445 2003static void unit_check_binds_to(Unit *u) {
4afd3348 2004 _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
ff502445
LP
2005 bool stop = false;
2006 Unit *other;
2007 Iterator i;
eef85c4a 2008 void *v;
67bfdc97 2009 int r;
ff502445
LP
2010
2011 assert(u);
2012
2013 if (u->job)
2014 return;
2015
2016 if (unit_active_state(u) != UNIT_ACTIVE)
2017 return;
2018
eef85c4a 2019 HASHMAP_FOREACH_KEY(v, other, u->dependencies[UNIT_BINDS_TO], i) {
ff502445
LP
2020 if (other->job)
2021 continue;
13ddc3fc
ZJS
2022
2023 if (!other->coldplugged)
2024 /* We might yet create a job for the other unit… */
2025 continue;
ff502445
LP
2026
2027 if (!UNIT_IS_INACTIVE_OR_FAILED(unit_active_state(other)))
2028 continue;
2029
2030 stop = true;
98f738b6 2031 break;
ff502445
LP
2032 }
2033
2034 if (!stop)
2035 return;
2036
595bfe7d 2037 /* If stopping a unit fails continuously we might enter a stop
67bfdc97
LP
2038 * loop here, hence stop acting on the service being
2039 * unnecessary after a while. */
7994ac1d 2040 if (!ratelimit_below(&u->auto_stop_ratelimit)) {
67bfdc97
LP
2041 log_unit_warning(u, "Unit is bound to inactive unit %s, but not stopping since we tried this too often recently.", other->id);
2042 return;
2043 }
2044
98f738b6 2045 assert(other);
f2341e0a 2046 log_unit_info(u, "Unit is bound to inactive unit %s. Stopping, too.", other->id);
ff502445
LP
2047
2048 /* A unit we need to run is gone. Sniff. Let's stop this. */
4bd29fe5 2049 r = manager_add_job(u->manager, JOB_STOP, u, JOB_FAIL, &error, NULL);
67bfdc97 2050 if (r < 0)
4bd29fe5 2051 log_unit_warning_errno(u, r, "Failed to enqueue stop job, ignoring: %s", bus_error_message(&error, r));
ff502445
LP
2052}
2053
87f0e418
LP
2054static void retroactively_start_dependencies(Unit *u) {
2055 Iterator i;
2056 Unit *other;
eef85c4a 2057 void *v;
87f0e418
LP
2058
2059 assert(u);
2060 assert(UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u)));
2061
eef85c4a
LP
2062 HASHMAP_FOREACH_KEY(v, other, u->dependencies[UNIT_REQUIRES], i)
2063 if (!hashmap_get(u->dependencies[UNIT_AFTER], other) &&
b81884e7 2064 !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other)))
4bd29fe5 2065 manager_add_job(u->manager, JOB_START, other, JOB_REPLACE, NULL, NULL);
b81884e7 2066
eef85c4a
LP
2067 HASHMAP_FOREACH_KEY(v, other, u->dependencies[UNIT_BINDS_TO], i)
2068 if (!hashmap_get(u->dependencies[UNIT_AFTER], other) &&
b81884e7 2069 !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other)))
4bd29fe5 2070 manager_add_job(u->manager, JOB_START, other, JOB_REPLACE, NULL, NULL);
87f0e418 2071
eef85c4a
LP
2072 HASHMAP_FOREACH_KEY(v, other, u->dependencies[UNIT_WANTS], i)
2073 if (!hashmap_get(u->dependencies[UNIT_AFTER], other) &&
b81884e7 2074 !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other)))
4bd29fe5 2075 manager_add_job(u->manager, JOB_START, other, JOB_FAIL, NULL, NULL);
87f0e418 2076
eef85c4a 2077 HASHMAP_FOREACH_KEY(v, other, u->dependencies[UNIT_CONFLICTS], i)
b81884e7 2078 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
4bd29fe5 2079 manager_add_job(u->manager, JOB_STOP, other, JOB_REPLACE, NULL, NULL);
69dd2852 2080
eef85c4a 2081 HASHMAP_FOREACH_KEY(v, other, u->dependencies[UNIT_CONFLICTED_BY], i)
b81884e7 2082 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
4bd29fe5 2083 manager_add_job(u->manager, JOB_STOP, other, JOB_REPLACE, NULL, NULL);
87f0e418
LP
2084}
2085
2086static void retroactively_stop_dependencies(Unit *u) {
87f0e418 2087 Unit *other;
eef85c4a
LP
2088 Iterator i;
2089 void *v;
87f0e418
LP
2090
2091 assert(u);
2092 assert(UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(u)));
2093
b81884e7 2094 /* Pull down units which are bound to us recursively if enabled */
eef85c4a 2095 HASHMAP_FOREACH_KEY(v, other, u->dependencies[UNIT_BOUND_BY], i)
b81884e7 2096 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
4bd29fe5 2097 manager_add_job(u->manager, JOB_STOP, other, JOB_REPLACE, NULL, NULL);
cd0504d0
MS
2098}
2099
3ecaa09b 2100void unit_start_on_failure(Unit *u) {
c0daa706
LP
2101 Unit *other;
2102 Iterator i;
eef85c4a 2103 void *v;
7f66b026 2104 int r;
c0daa706
LP
2105
2106 assert(u);
2107
eef85c4a 2108 if (hashmap_size(u->dependencies[UNIT_ON_FAILURE]) <= 0)
222ae6a8
LP
2109 return;
2110
f2341e0a 2111 log_unit_info(u, "Triggering OnFailure= dependencies.");
222ae6a8 2112
eef85c4a 2113 HASHMAP_FOREACH_KEY(v, other, u->dependencies[UNIT_ON_FAILURE], i) {
7f66b026 2114 _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
222ae6a8 2115
7f66b026 2116 r = manager_add_job(u->manager, JOB_START, other, u->on_failure_job_mode, &error, NULL);
c1b6628d 2117 if (r < 0)
7f66b026 2118 log_unit_warning_errno(u, r, "Failed to enqueue OnFailure= job, ignoring: %s", bus_error_message(&error, r));
222ae6a8 2119 }
c0daa706
LP
2120}
2121
3ecaa09b
LP
2122void unit_trigger_notify(Unit *u) {
2123 Unit *other;
2124 Iterator i;
eef85c4a 2125 void *v;
3ecaa09b
LP
2126
2127 assert(u);
2128
eef85c4a 2129 HASHMAP_FOREACH_KEY(v, other, u->dependencies[UNIT_TRIGGERED_BY], i)
3ecaa09b
LP
2130 if (UNIT_VTABLE(other)->trigger_notify)
2131 UNIT_VTABLE(other)->trigger_notify(other, u);
2132}
2133
915b1d01 2134static int unit_log_resources(Unit *u) {
915b1d01 2135 struct iovec iovec[1 + _CGROUP_IP_ACCOUNTING_METRIC_MAX + 4];
82044702 2136 bool any_traffic = false, have_ip_accounting = false;
a87b1faa 2137 _cleanup_free_ char *igress = NULL, *egress = NULL;
915b1d01
LP
2138 size_t n_message_parts = 0, n_iovec = 0;
2139 char* message_parts[3 + 1], *t;
2140 nsec_t nsec = NSEC_INFINITY;
2141 CGroupIPAccountingMetric m;
2142 size_t i;
2143 int r;
2144 const char* const ip_fields[_CGROUP_IP_ACCOUNTING_METRIC_MAX] = {
2145 [CGROUP_IP_INGRESS_BYTES] = "IP_METRIC_INGRESS_BYTES",
2146 [CGROUP_IP_INGRESS_PACKETS] = "IP_METRIC_INGRESS_PACKETS",
2147 [CGROUP_IP_EGRESS_BYTES] = "IP_METRIC_EGRESS_BYTES",
2148 [CGROUP_IP_EGRESS_PACKETS] = "IP_METRIC_EGRESS_PACKETS",
2149 };
2150
2151 assert(u);
2152
2153 /* Invoked whenever a unit enters failed or dead state. Logs information about consumed resources if resource
2154 * accounting was enabled for a unit. It does this in two ways: a friendly human readable string with reduced
2155 * information and the complete data in structured fields. */
2156
2157 (void) unit_get_cpu_usage(u, &nsec);
2158 if (nsec != NSEC_INFINITY) {
2159 char buf[FORMAT_TIMESPAN_MAX] = "";
2160
2161 /* Format the CPU time for inclusion in the structured log message */
2162 if (asprintf(&t, "CPU_USAGE_NSEC=%" PRIu64, nsec) < 0) {
2163 r = log_oom();
2164 goto finish;
2165 }
2166 iovec[n_iovec++] = IOVEC_MAKE_STRING(t);
2167
2168 /* Format the CPU time for inclusion in the human language message string */
2169 format_timespan(buf, sizeof(buf), nsec / NSEC_PER_USEC, USEC_PER_MSEC);
ec9d636b 2170 t = strjoin("consumed ", buf, " CPU time");
915b1d01
LP
2171 if (!t) {
2172 r = log_oom();
2173 goto finish;
2174 }
2175
2176 message_parts[n_message_parts++] = t;
2177 }
2178
2179 for (m = 0; m < _CGROUP_IP_ACCOUNTING_METRIC_MAX; m++) {
2180 char buf[FORMAT_BYTES_MAX] = "";
2181 uint64_t value = UINT64_MAX;
2182
2183 assert(ip_fields[m]);
2184
2185 (void) unit_get_ip_accounting(u, m, &value);
2186 if (value == UINT64_MAX)
2187 continue;
82044702
LP
2188
2189 have_ip_accounting = true;
a87b1faa
LP
2190 if (value > 0)
2191 any_traffic = true;
915b1d01
LP
2192
2193 /* Format IP accounting data for inclusion in the structured log message */
2194 if (asprintf(&t, "%s=%" PRIu64, ip_fields[m], value) < 0) {
2195 r = log_oom();
2196 goto finish;
2197 }
2198 iovec[n_iovec++] = IOVEC_MAKE_STRING(t);
2199
2200 /* Format the IP accounting data for inclusion in the human language message string, but only for the
2201 * bytes counters (and not for the packets counters) */
a87b1faa
LP
2202 if (m == CGROUP_IP_INGRESS_BYTES) {
2203 assert(!igress);
ec9d636b 2204 igress = strjoin("received ", format_bytes(buf, sizeof(buf), value), " IP traffic");
a87b1faa
LP
2205 if (!igress) {
2206 r = log_oom();
2207 goto finish;
2208 }
2209 } else if (m == CGROUP_IP_EGRESS_BYTES) {
2210 assert(!egress);
ec9d636b 2211 egress = strjoin("sent ", format_bytes(buf, sizeof(buf), value), " IP traffic");
a87b1faa
LP
2212 if (!egress) {
2213 r = log_oom();
2214 goto finish;
2215 }
2216 }
2217 }
2218
82044702
LP
2219 if (have_ip_accounting) {
2220 if (any_traffic) {
2221 if (igress)
2222 message_parts[n_message_parts++] = TAKE_PTR(igress);
2223 if (egress)
2224 message_parts[n_message_parts++] = TAKE_PTR(egress);
a87b1faa 2225
82044702
LP
2226 } else {
2227 char *k;
915b1d01 2228
82044702
LP
2229 k = strdup("no IP traffic");
2230 if (!k) {
2231 r = log_oom();
2232 goto finish;
2233 }
2234
2235 message_parts[n_message_parts++] = k;
2236 }
915b1d01
LP
2237 }
2238
2239 /* Is there any accounting data available at all? */
2240 if (n_iovec == 0) {
2241 r = 0;
2242 goto finish;
2243 }
2244
2245 if (n_message_parts == 0)
a87b1faa 2246 t = strjoina("MESSAGE=", u->id, ": Completed.");
915b1d01
LP
2247 else {
2248 _cleanup_free_ char *joined;
2249
2250 message_parts[n_message_parts] = NULL;
2251
2252 joined = strv_join(message_parts, ", ");
2253 if (!joined) {
2254 r = log_oom();
2255 goto finish;
2256 }
2257
ec9d636b 2258 joined[0] = ascii_toupper(joined[0]);
a87b1faa 2259 t = strjoina("MESSAGE=", u->id, ": ", joined, ".");
915b1d01
LP
2260 }
2261
2262 /* The following four fields we allocate on the stack or are static strings, we hence don't want to free them,
2263 * and hence don't increase n_iovec for them */
2264 iovec[n_iovec] = IOVEC_MAKE_STRING(t);
2265 iovec[n_iovec + 1] = IOVEC_MAKE_STRING("MESSAGE_ID=" SD_MESSAGE_UNIT_RESOURCES_STR);
2266
2267 t = strjoina(u->manager->unit_log_field, u->id);
2268 iovec[n_iovec + 2] = IOVEC_MAKE_STRING(t);
2269
2270 t = strjoina(u->manager->invocation_log_field, u->invocation_id_string);
2271 iovec[n_iovec + 3] = IOVEC_MAKE_STRING(t);
2272
2273 log_struct_iovec(LOG_INFO, iovec, n_iovec + 4);
2274 r = 0;
2275
2276finish:
2277 for (i = 0; i < n_message_parts; i++)
2278 free(message_parts[i]);
2279
2280 for (i = 0; i < n_iovec; i++)
2281 free(iovec[i].iov_base);
2282
2283 return r;
2284
2285}
2286
adefcf28
LP
2287static void unit_update_on_console(Unit *u) {
2288 bool b;
2289
2290 assert(u);
2291
2292 b = unit_needs_console(u);
2293 if (u->on_console == b)
2294 return;
2295
2296 u->on_console = b;
2297 if (b)
2298 manager_ref_console(u->manager);
2299 else
2300 manager_unref_console(u->manager);
adefcf28
LP
2301}
2302
6eb65e7c
LP
2303static void unit_emit_audit_start(Unit *u) {
2304 assert(u);
2305
2306 if (u->type != UNIT_SERVICE)
2307 return;
2308
2309 /* Write audit record if we have just finished starting up */
2310 manager_send_unit_audit(u->manager, u, AUDIT_SERVICE_START, true);
2311 u->in_audit = true;
2312}
2313
2314static void unit_emit_audit_stop(Unit *u, UnitActiveState state) {
2315 assert(u);
2316
2317 if (u->type != UNIT_SERVICE)
2318 return;
2319
2320 if (u->in_audit) {
2321 /* Write audit record if we have just finished shutting down */
2322 manager_send_unit_audit(u->manager, u, AUDIT_SERVICE_STOP, state == UNIT_INACTIVE);
2323 u->in_audit = false;
2324 } else {
2325 /* Hmm, if there was no start record written write it now, so that we always have a nice pair */
2326 manager_send_unit_audit(u->manager, u, AUDIT_SERVICE_START, state == UNIT_INACTIVE);
2327
2328 if (state == UNIT_INACTIVE)
2329 manager_send_unit_audit(u->manager, u, AUDIT_SERVICE_STOP, true);
2330 }
2331}
2332
16c74914
LP
2333static bool unit_process_job(Job *j, UnitActiveState ns, UnitNotifyFlags flags) {
2334 bool unexpected = false;
2335
2336 assert(j);
2337
2338 if (j->state == JOB_WAITING)
2339
2340 /* So we reached a different state for this job. Let's see if we can run it now if it failed previously
2341 * due to EAGAIN. */
2342 job_add_to_run_queue(j);
2343
2344 /* Let's check whether the unit's new state constitutes a finished job, or maybe contradicts a running job and
2345 * hence needs to invalidate jobs. */
2346
2347 switch (j->type) {
2348
2349 case JOB_START:
2350 case JOB_VERIFY_ACTIVE:
2351
2352 if (UNIT_IS_ACTIVE_OR_RELOADING(ns))
2353 job_finish_and_invalidate(j, JOB_DONE, true, false);
2354 else if (j->state == JOB_RUNNING && ns != UNIT_ACTIVATING) {
2355 unexpected = true;
2356
2357 if (UNIT_IS_INACTIVE_OR_FAILED(ns))
2358 job_finish_and_invalidate(j, ns == UNIT_FAILED ? JOB_FAILED : JOB_DONE, true, false);
2359 }
2360
2361 break;
2362
2363 case JOB_RELOAD:
2364 case JOB_RELOAD_OR_START:
2365 case JOB_TRY_RELOAD:
2366
2367 if (j->state == JOB_RUNNING) {
2368 if (ns == UNIT_ACTIVE)
2369 job_finish_and_invalidate(j, (flags & UNIT_NOTIFY_RELOAD_FAILURE) ? JOB_FAILED : JOB_DONE, true, false);
2370 else if (!IN_SET(ns, UNIT_ACTIVATING, UNIT_RELOADING)) {
2371 unexpected = true;
2372
2373 if (UNIT_IS_INACTIVE_OR_FAILED(ns))
2374 job_finish_and_invalidate(j, ns == UNIT_FAILED ? JOB_FAILED : JOB_DONE, true, false);
2375 }
2376 }
2377
2378 break;
2379
2380 case JOB_STOP:
2381 case JOB_RESTART:
2382 case JOB_TRY_RESTART:
2383
2384 if (UNIT_IS_INACTIVE_OR_FAILED(ns))
2385 job_finish_and_invalidate(j, JOB_DONE, true, false);
2386 else if (j->state == JOB_RUNNING && ns != UNIT_DEACTIVATING) {
2387 unexpected = true;
2388 job_finish_and_invalidate(j, JOB_FAILED, true, false);
2389 }
2390
2391 break;
2392
2393 default:
2394 assert_not_reached("Job type unknown");
2395 }
2396
2397 return unexpected;
2398}
2399
2ad2e41a 2400void unit_notify(Unit *u, UnitActiveState os, UnitActiveState ns, UnitNotifyFlags flags) {
429926e9 2401 const char *reason;
8559b3b7 2402 Manager *m;
a096ed36 2403
87f0e418
LP
2404 assert(u);
2405 assert(os < _UNIT_ACTIVE_STATE_MAX);
2406 assert(ns < _UNIT_ACTIVE_STATE_MAX);
87f0e418 2407
8559b3b7
LP
2408 /* Note that this is called for all low-level state changes, even if they might map to the same high-level
2409 * UnitActiveState! That means that ns == os is an expected behavior here. For example: if a mount point is
2410 * remounted this function will be called too! */
87f0e418 2411
546ac4f0
MS
2412 m = u->manager;
2413
3c4832ad
LP
2414 /* Let's enqueue the change signal early. In case this unit has a job associated we want that this unit is in
2415 * the bus queue, so that any job change signal queued will force out the unit change signal first. */
2416 unit_add_to_dbus_queue(u);
2417
f755e3b7 2418 /* Update timestamps for state changes */
2c289ea8 2419 if (!MANAGER_IS_RELOADING(m)) {
a483fb59 2420 dual_timestamp_get(&u->state_change_timestamp);
173e3821 2421
bdbf9951 2422 if (UNIT_IS_INACTIVE_OR_FAILED(os) && !UNIT_IS_INACTIVE_OR_FAILED(ns))
a483fb59 2423 u->inactive_exit_timestamp = u->state_change_timestamp;
bdbf9951 2424 else if (!UNIT_IS_INACTIVE_OR_FAILED(os) && UNIT_IS_INACTIVE_OR_FAILED(ns))
a483fb59 2425 u->inactive_enter_timestamp = u->state_change_timestamp;
bdbf9951
LP
2426
2427 if (!UNIT_IS_ACTIVE_OR_RELOADING(os) && UNIT_IS_ACTIVE_OR_RELOADING(ns))
a483fb59 2428 u->active_enter_timestamp = u->state_change_timestamp;
bdbf9951 2429 else if (UNIT_IS_ACTIVE_OR_RELOADING(os) && !UNIT_IS_ACTIVE_OR_RELOADING(ns))
a483fb59 2430 u->active_exit_timestamp = u->state_change_timestamp;
bdbf9951 2431 }
87f0e418 2432
865cc19a 2433 /* Keep track of failed units */
8724defe 2434 (void) manager_update_failed_units(m, u, ns == UNIT_FAILED);
f755e3b7 2435
d3070fbd
LP
2436 /* Make sure the cgroup and state files are always removed when we become inactive */
2437 if (UNIT_IS_INACTIVE_OR_FAILED(ns)) {
efdb0237 2438 unit_prune_cgroup(u);
d3070fbd
LP
2439 unit_unlink_state_files(u);
2440 }
fb385181 2441
adefcf28 2442 unit_update_on_console(u);
7ed9f6cd 2443
2c289ea8 2444 if (!MANAGER_IS_RELOADING(m)) {
a1c7334b
LP
2445 bool unexpected;
2446
2447 /* Let's propagate state changes to the job */
2448 if (u->job)
2449 unexpected = unit_process_job(u->job, ns, flags);
2450 else
2451 unexpected = true;
f3bff0eb 2452
a1c7334b
LP
2453 /* If this state change happened without being requested by a job, then let's retroactively start or
2454 * stop dependencies. We skip that step when deserializing, since we don't want to create any
2455 * additional jobs just because something is already activated. */
bdbf9951
LP
2456
2457 if (unexpected) {
2458 if (UNIT_IS_INACTIVE_OR_FAILED(os) && UNIT_IS_ACTIVE_OR_ACTIVATING(ns))
2459 retroactively_start_dependencies(u);
2460 else if (UNIT_IS_ACTIVE_OR_ACTIVATING(os) && UNIT_IS_INACTIVE_OR_DEACTIVATING(ns))
2461 retroactively_stop_dependencies(u);
2462 }
5de9682c 2463
cd0504d0 2464 /* stop unneeded units regardless if going down was expected or not */
a3c1168a 2465 if (UNIT_IS_INACTIVE_OR_FAILED(ns))
cd0504d0
MS
2466 check_unneeded_dependencies(u);
2467
bdbf9951 2468 if (ns != os && ns == UNIT_FAILED) {
ed77d407 2469 log_unit_debug(u, "Unit entered failed state.");
2ad2e41a
LP
2470
2471 if (!(flags & UNIT_NOTIFY_WILL_AUTO_RESTART))
2472 unit_start_on_failure(u);
cd6d0a45 2473 }
e537352b 2474
256f65d0
LP
2475 if (UNIT_IS_ACTIVE_OR_RELOADING(ns) && !UNIT_IS_ACTIVE_OR_RELOADING(os)) {
2476 /* This unit just finished starting up */
3b2775c5 2477
6eb65e7c 2478 unit_emit_audit_start(u);
546ac4f0 2479 manager_send_unit_plymouth(m, u);
256f65d0 2480 }
bdbf9951 2481
256f65d0 2482 if (UNIT_IS_INACTIVE_OR_FAILED(ns) && !UNIT_IS_INACTIVE_OR_FAILED(os)) {
915b1d01 2483 /* This unit just stopped/failed. */
256f65d0 2484
6eb65e7c 2485 unit_emit_audit_stop(u, ns);
915b1d01 2486 unit_log_resources(u);
cd6d0a45 2487 }
f278026d
LP
2488 }
2489
31dc1ca3
LP
2490 manager_recheck_journal(m);
2491 manager_recheck_dbus(m);
e63ebf71 2492
3ecaa09b 2493 unit_trigger_notify(u);
3b2775c5 2494
8724defe 2495 if (!MANAGER_IS_RELOADING(m)) {
8559b3b7 2496 /* Maybe we finished startup and are now ready for being stopped because unneeded? */
fda09318 2497 unit_submit_to_stop_when_unneeded_queue(u);
c1e1601e 2498
8559b3b7
LP
2499 /* Maybe we finished startup, but something we needed has vanished? Let's die then. (This happens when
2500 * something BindsTo= to a Type=oneshot unit, as these units go directly from starting to inactive,
ff502445
LP
2501 * without ever entering started.) */
2502 unit_check_binds_to(u);
53c35a76 2503
429926e9
TR
2504 if (os != UNIT_FAILED && ns == UNIT_FAILED) {
2505 reason = strjoina("unit ", u->id, " failed");
7af67e9a 2506 (void) emergency_action(m, u->failure_action, 0, u->reboot_arg, unit_failure_action_exit_status(u), reason);
429926e9
TR
2507 } else if (!UNIT_IS_INACTIVE_OR_FAILED(os) && ns == UNIT_INACTIVE) {
2508 reason = strjoina("unit ", u->id, " succeeded");
7af67e9a 2509 (void) emergency_action(m, u->success_action, 0, u->reboot_arg, unit_success_action_exit_status(u), reason);
429926e9 2510 }
ff502445
LP
2511 }
2512
701cc384 2513 unit_add_to_gc_queue(u);
87f0e418
LP
2514}
2515
87f0e418 2516int unit_watch_pid(Unit *u, pid_t pid) {
62a76913 2517 int r;
a911bb9a 2518
87f0e418 2519 assert(u);
62a76913 2520 assert(pid_is_valid(pid));
87f0e418 2521
62a76913 2522 /* Watch a specific PID */
5ba6985b 2523
d5099efc 2524 r = set_ensure_allocated(&u->pids, NULL);
5ba6985b
LP
2525 if (r < 0)
2526 return r;
2527
62a76913 2528 r = hashmap_ensure_allocated(&u->manager->watch_pids, NULL);
a911bb9a
LP
2529 if (r < 0)
2530 return r;
2531
62a76913
LP
2532 /* First try, let's add the unit keyed by "pid". */
2533 r = hashmap_put(u->manager->watch_pids, PID_TO_PTR(pid), u);
2534 if (r == -EEXIST) {
2535 Unit **array;
2536 bool found = false;
2537 size_t n = 0;
05e343b7 2538
62a76913
LP
2539 /* OK, the "pid" key is already assigned to a different unit. Let's see if the "-pid" key (which points
2540 * to an array of Units rather than just a Unit), lists us already. */
a911bb9a 2541
62a76913
LP
2542 array = hashmap_get(u->manager->watch_pids, PID_TO_PTR(-pid));
2543 if (array)
2544 for (; array[n]; n++)
2545 if (array[n] == u)
2546 found = true;
a911bb9a 2547
62a76913
LP
2548 if (found) /* Found it already? if so, do nothing */
2549 r = 0;
2550 else {
2551 Unit **new_array;
2552
2553 /* Allocate a new array */
2554 new_array = new(Unit*, n + 2);
2555 if (!new_array)
2556 return -ENOMEM;
2557
2558 memcpy_safe(new_array, array, sizeof(Unit*) * n);
2559 new_array[n] = u;
2560 new_array[n+1] = NULL;
2561
2562 /* Add or replace the old array */
2563 r = hashmap_replace(u->manager->watch_pids, PID_TO_PTR(-pid), new_array);
2564 if (r < 0) {
2565 free(new_array);
2566 return r;
2567 }
2568
2569 free(array);
2570 }
2571 } else if (r < 0)
2572 return r;
2573
2574 r = set_put(u->pids, PID_TO_PTR(pid));
2575 if (r < 0)
2576 return r;
2577
2578 return 0;
87f0e418
LP
2579}
2580
2581void unit_unwatch_pid(Unit *u, pid_t pid) {
62a76913
LP
2582 Unit **array;
2583
87f0e418 2584 assert(u);
62a76913
LP
2585 assert(pid_is_valid(pid));
2586
2587 /* First let's drop the unit in case it's keyed as "pid". */
2588 (void) hashmap_remove_value(u->manager->watch_pids, PID_TO_PTR(pid), u);
2589
2590 /* Then, let's also drop the unit, in case it's in the array keyed by -pid */
2591 array = hashmap_get(u->manager->watch_pids, PID_TO_PTR(-pid));
2592 if (array) {
2593 size_t n, m = 0;
2594
2595 /* Let's iterate through the array, dropping our own entry */
2596 for (n = 0; array[n]; n++)
2597 if (array[n] != u)
2598 array[m++] = array[n];
2599 array[m] = NULL;
2600
2601 if (m == 0) {
2602 /* The array is now empty, remove the entire entry */
2603 assert(hashmap_remove(u->manager->watch_pids, PID_TO_PTR(-pid)) == array);
2604 free(array);
2605 }
2606 }
87f0e418 2607
fea72cc0 2608 (void) set_remove(u->pids, PID_TO_PTR(pid));
a911bb9a
LP
2609}
2610
bd44e61b
LP
2611void unit_unwatch_all_pids(Unit *u) {
2612 assert(u);
2613
2614 while (!set_isempty(u->pids))
fea72cc0 2615 unit_unwatch_pid(u, PTR_TO_PID(set_first(u->pids)));
bd44e61b 2616
efdb0237 2617 u->pids = set_free(u->pids);
a911bb9a
LP
2618}
2619
50be4f4a
LP
2620static void unit_tidy_watch_pids(Unit *u) {
2621 pid_t except1, except2;
a911bb9a
LP
2622 Iterator i;
2623 void *e;
2624
2625 assert(u);
2626
2627 /* Cleans dead PIDs from our list */
2628
50be4f4a
LP
2629 except1 = unit_main_pid(u);
2630 except2 = unit_control_pid(u);
2631
a911bb9a 2632 SET_FOREACH(e, u->pids, i) {
fea72cc0 2633 pid_t pid = PTR_TO_PID(e);
a911bb9a
LP
2634
2635 if (pid == except1 || pid == except2)
2636 continue;
2637
9f5650ae 2638 if (!pid_is_unwaited(pid))
bd44e61b 2639 unit_unwatch_pid(u, pid);
a911bb9a 2640 }
87f0e418
LP
2641}
2642
50be4f4a
LP
2643static int on_rewatch_pids_event(sd_event_source *s, void *userdata) {
2644 Unit *u = userdata;
2645
2646 assert(s);
2647 assert(u);
2648
2649 unit_tidy_watch_pids(u);
2650 unit_watch_all_pids(u);
2651
2652 /* If the PID set is empty now, then let's finish this off. */
2653 unit_synthesize_cgroup_empty_event(u);
2654
2655 return 0;
2656}
2657
2658int unit_enqueue_rewatch_pids(Unit *u) {
2659 int r;
2660
2661 assert(u);
2662
2663 if (!u->cgroup_path)
2664 return -ENOENT;
2665
2666 r = cg_unified_controller(SYSTEMD_CGROUP_CONTROLLER);
2667 if (r < 0)
2668 return r;
2669 if (r > 0) /* On unified we can use proper notifications */
2670 return 0;
2671
2672 /* Enqueues a low-priority job that will clean up dead PIDs from our list of PIDs to watch and subscribe to new
2673 * PIDs that might have appeared. We do this in a delayed job because the work might be quite slow, as it
2674 * involves issuing kill(pid, 0) on all processes we watch. */
2675
2676 if (!u->rewatch_pids_event_source) {
2677 _cleanup_(sd_event_source_unrefp) sd_event_source *s = NULL;
2678
2679 r = sd_event_add_defer(u->manager->event, &s, on_rewatch_pids_event, u);
2680 if (r < 0)
2681 return log_error_errno(r, "Failed to allocate event source for tidying watched PIDs: %m");
2682
2683 r = sd_event_source_set_priority(s, SD_EVENT_PRIORITY_IDLE);
2684 if (r < 0)
2685 return log_error_errno(r, "Failed to adjust priority of event source for tidying watched PIDs: m");
2686
2687 (void) sd_event_source_set_description(s, "tidy-watch-pids");
2688
2689 u->rewatch_pids_event_source = TAKE_PTR(s);
2690 }
2691
2692 r = sd_event_source_set_enabled(u->rewatch_pids_event_source, SD_EVENT_ONESHOT);
2693 if (r < 0)
2694 return log_error_errno(r, "Failed to enable event source for tidying watched PIDs: %m");
2695
2696 return 0;
2697}
2698
2699void unit_dequeue_rewatch_pids(Unit *u) {
2700 int r;
2701 assert(u);
2702
2703 if (!u->rewatch_pids_event_source)
2704 return;
2705
2706 r = sd_event_source_set_enabled(u->rewatch_pids_event_source, SD_EVENT_OFF);
2707 if (r < 0)
2708 log_warning_errno(r, "Failed to disable event source for tidying watched PIDs, ignoring: %m");
2709
2710 u->rewatch_pids_event_source = sd_event_source_unref(u->rewatch_pids_event_source);
2711}
2712
87f0e418
LP
2713bool unit_job_is_applicable(Unit *u, JobType j) {
2714 assert(u);
2715 assert(j >= 0 && j < _JOB_TYPE_MAX);
2716
2717 switch (j) {
2718
2719 case JOB_VERIFY_ACTIVE:
2720 case JOB_START:
e0209d83 2721 case JOB_NOP:
f5869324
LP
2722 /* Note that we don't check unit_can_start() here. That's because .device units and suchlike are not
2723 * startable by us but may appear due to external events, and it thus makes sense to permit enqueing
2724 * jobs for it. */
87f0e418
LP
2725 return true;
2726
f5869324
LP
2727 case JOB_STOP:
2728 /* Similar as above. However, perpetual units can never be stopped (neither explicitly nor due to
2729 * external events), hence it makes no sense to permit enqueing such a request either. */
2730 return !u->perpetual;
2731
87f0e418
LP
2732 case JOB_RESTART:
2733 case JOB_TRY_RESTART:
f5869324 2734 return unit_can_stop(u) && unit_can_start(u);
87f0e418
LP
2735
2736 case JOB_RELOAD:
3282591d 2737 case JOB_TRY_RELOAD:
87f0e418
LP
2738 return unit_can_reload(u);
2739
2740 case JOB_RELOAD_OR_START:
2741 return unit_can_reload(u) && unit_can_start(u);
2742
2743 default:
2744 assert_not_reached("Invalid job type");
2745 }
2746}
2747
f2341e0a
LP
2748static void maybe_warn_about_dependency(Unit *u, const char *other, UnitDependency dependency) {
2749 assert(u);
d1fab3fe 2750
f2341e0a
LP
2751 /* Only warn about some unit types */
2752 if (!IN_SET(dependency, UNIT_CONFLICTS, UNIT_CONFLICTED_BY, UNIT_BEFORE, UNIT_AFTER, UNIT_ON_FAILURE, UNIT_TRIGGERS, UNIT_TRIGGERED_BY))
2753 return;
3f3cc397 2754
f2341e0a
LP
2755 if (streq_ptr(u->id, other))
2756 log_unit_warning(u, "Dependency %s=%s dropped", unit_dependency_to_string(dependency), u->id);
2757 else
2758 log_unit_warning(u, "Dependency %s=%s dropped, merged into %s", unit_dependency_to_string(dependency), strna(other), u->id);
d1fab3fe
ZJS
2759}
2760
eef85c4a
LP
2761static int unit_add_dependency_hashmap(
2762 Hashmap **h,
2763 Unit *other,
2764 UnitDependencyMask origin_mask,
2765 UnitDependencyMask destination_mask) {
2766
2767 UnitDependencyInfo info;
2768 int r;
2769
2770 assert(h);
2771 assert(other);
2772 assert(origin_mask < _UNIT_DEPENDENCY_MASK_FULL);
2773 assert(destination_mask < _UNIT_DEPENDENCY_MASK_FULL);
2774 assert(origin_mask > 0 || destination_mask > 0);
2775
2776 r = hashmap_ensure_allocated(h, NULL);
2777 if (r < 0)
2778 return r;
2779
2780 assert_cc(sizeof(void*) == sizeof(info));
2781
2782 info.data = hashmap_get(*h, other);
2783 if (info.data) {
2784 /* Entry already exists. Add in our mask. */
2785
d94a24ca
ZJS
2786 if (FLAGS_SET(origin_mask, info.origin_mask) &&
2787 FLAGS_SET(destination_mask, info.destination_mask))
eef85c4a
LP
2788 return 0; /* NOP */
2789
2790 info.origin_mask |= origin_mask;
2791 info.destination_mask |= destination_mask;
2792
2793 r = hashmap_update(*h, other, info.data);
2794 } else {
2795 info = (UnitDependencyInfo) {
2796 .origin_mask = origin_mask,
2797 .destination_mask = destination_mask,
2798 };
2799
2800 r = hashmap_put(*h, other, info.data);
2801 }
2802 if (r < 0)
2803 return r;
2804
2805 return 1;
2806}
2807
2808int unit_add_dependency(
2809 Unit *u,
2810 UnitDependency d,
2811 Unit *other,
2812 bool add_reference,
2813 UnitDependencyMask mask) {
87f0e418
LP
2814
2815 static const UnitDependency inverse_table[_UNIT_DEPENDENCY_MAX] = {
2816 [UNIT_REQUIRES] = UNIT_REQUIRED_BY,
87f0e418 2817 [UNIT_WANTS] = UNIT_WANTED_BY,
be7d9ff7 2818 [UNIT_REQUISITE] = UNIT_REQUISITE_OF,
7f2cddae 2819 [UNIT_BINDS_TO] = UNIT_BOUND_BY,
60649f17 2820 [UNIT_PART_OF] = UNIT_CONSISTS_OF,
be7d9ff7 2821 [UNIT_REQUIRED_BY] = UNIT_REQUIRES,
be7d9ff7 2822 [UNIT_REQUISITE_OF] = UNIT_REQUISITE,
be7d9ff7 2823 [UNIT_WANTED_BY] = UNIT_WANTS,
7f2cddae 2824 [UNIT_BOUND_BY] = UNIT_BINDS_TO,
60649f17 2825 [UNIT_CONSISTS_OF] = UNIT_PART_OF,
69dd2852
LP
2826 [UNIT_CONFLICTS] = UNIT_CONFLICTED_BY,
2827 [UNIT_CONFLICTED_BY] = UNIT_CONFLICTS,
87f0e418 2828 [UNIT_BEFORE] = UNIT_AFTER,
701cc384 2829 [UNIT_AFTER] = UNIT_BEFORE,
5de9682c 2830 [UNIT_ON_FAILURE] = _UNIT_DEPENDENCY_INVALID,
701cc384 2831 [UNIT_REFERENCES] = UNIT_REFERENCED_BY,
57020a3a
LP
2832 [UNIT_REFERENCED_BY] = UNIT_REFERENCES,
2833 [UNIT_TRIGGERS] = UNIT_TRIGGERED_BY,
4dcc1cb4 2834 [UNIT_TRIGGERED_BY] = UNIT_TRIGGERS,
7f2cddae 2835 [UNIT_PROPAGATES_RELOAD_TO] = UNIT_RELOAD_PROPAGATED_FROM,
85e9a101 2836 [UNIT_RELOAD_PROPAGATED_FROM] = UNIT_PROPAGATES_RELOAD_TO,
613b411c 2837 [UNIT_JOINS_NAMESPACE_OF] = UNIT_JOINS_NAMESPACE_OF,
87f0e418 2838 };
eef85c4a
LP
2839 Unit *original_u = u, *original_other = other;
2840 int r;
87f0e418
LP
2841
2842 assert(u);
2843 assert(d >= 0 && d < _UNIT_DEPENDENCY_MAX);
87f0e418
LP
2844 assert(other);
2845
9f151f29
LP
2846 u = unit_follow_merge(u);
2847 other = unit_follow_merge(other);
2848
87f0e418
LP
2849 /* We won't allow dependencies on ourselves. We will not
2850 * consider them an error however. */
d1fab3fe 2851 if (u == other) {
eef85c4a 2852 maybe_warn_about_dependency(original_u, original_other->id, d);
87f0e418 2853 return 0;
d1fab3fe 2854 }
87f0e418 2855
eef85c4a
LP
2856 if ((d == UNIT_BEFORE && other->type == UNIT_DEVICE) ||
2857 (d == UNIT_AFTER && u->type == UNIT_DEVICE)) {
dd5e7000
ZJS
2858 log_unit_warning(u, "Dependency Before=%s ignored (.device units cannot be delayed)", other->id);
2859 return 0;
2860 }
2861
eef85c4a 2862 r = unit_add_dependency_hashmap(u->dependencies + d, other, mask, 0);
613b411c 2863 if (r < 0)
87f0e418
LP
2864 return r;
2865
eef85c4a
LP
2866 if (inverse_table[d] != _UNIT_DEPENDENCY_INVALID && inverse_table[d] != d) {
2867 r = unit_add_dependency_hashmap(other->dependencies + inverse_table[d], u, 0, mask);
613b411c
LP
2868 if (r < 0)
2869 return r;
2870 }
2871
2872 if (add_reference) {
eef85c4a 2873 r = unit_add_dependency_hashmap(u->dependencies + UNIT_REFERENCES, other, mask, 0);
613b411c 2874 if (r < 0)
5de9682c
LP
2875 return r;
2876
eef85c4a 2877 r = unit_add_dependency_hashmap(other->dependencies + UNIT_REFERENCED_BY, u, 0, mask);
613b411c 2878 if (r < 0)
701cc384 2879 return r;
613b411c 2880 }
87f0e418 2881
c1e1601e 2882 unit_add_to_dbus_queue(u);
87f0e418
LP
2883 return 0;
2884}
0301abf4 2885
eef85c4a 2886int unit_add_two_dependencies(Unit *u, UnitDependency d, UnitDependency e, Unit *other, bool add_reference, UnitDependencyMask mask) {
2c966c03
LP
2887 int r;
2888
2889 assert(u);
2890
eef85c4a 2891 r = unit_add_dependency(u, d, other, add_reference, mask);
3f3cc397 2892 if (r < 0)
2c966c03
LP
2893 return r;
2894
eef85c4a 2895 return unit_add_dependency(u, e, other, add_reference, mask);
2c966c03
LP
2896}
2897
23e8c796 2898static int resolve_template(Unit *u, const char *name, char **buf, const char **ret) {
7410616c 2899 int r;
9e2f7c11
LP
2900
2901 assert(u);
23e8c796 2902 assert(name);
7410616c
LP
2903 assert(buf);
2904 assert(ret);
9e2f7c11 2905
7410616c
LP
2906 if (!unit_name_is_valid(name, UNIT_NAME_TEMPLATE)) {
2907 *buf = NULL;
2908 *ret = name;
2909 return 0;
9e2f7c11
LP
2910 }
2911
ac155bb8 2912 if (u->instance)
7410616c 2913 r = unit_name_replace_instance(name, u->instance, buf);
9e2f7c11 2914 else {
ae018d9b 2915 _cleanup_free_ char *i = NULL;
9e2f7c11 2916
7410616c
LP
2917 r = unit_name_to_prefix(u->id, &i);
2918 if (r < 0)
2919 return r;
9e2f7c11 2920
7410616c 2921 r = unit_name_replace_instance(name, i, buf);
9e2f7c11 2922 }
7410616c
LP
2923 if (r < 0)
2924 return r;
9e2f7c11 2925
7410616c
LP
2926 *ret = *buf;
2927 return 0;
9e2f7c11
LP
2928}
2929
35d8c19a 2930int unit_add_dependency_by_name(Unit *u, UnitDependency d, const char *name, bool add_reference, UnitDependencyMask mask) {
7410616c 2931 _cleanup_free_ char *buf = NULL;
09b6b09f
LP
2932 Unit *other;
2933 int r;
2934
9e2f7c11 2935 assert(u);
35d8c19a 2936 assert(name);
09b6b09f 2937
23e8c796 2938 r = resolve_template(u, name, &buf, &name);
7410616c
LP
2939 if (r < 0)
2940 return r;
09b6b09f 2941
35d8c19a 2942 r = manager_load_unit(u->manager, name, NULL, NULL, &other);
8afbb8e1
LP
2943 if (r < 0)
2944 return r;
9e2f7c11 2945
eef85c4a 2946 return unit_add_dependency(u, d, other, add_reference, mask);
09b6b09f
LP
2947}
2948
5a724170 2949int unit_add_two_dependencies_by_name(Unit *u, UnitDependency d, UnitDependency e, const char *name, bool add_reference, UnitDependencyMask mask) {
7410616c 2950 _cleanup_free_ char *buf = NULL;
2c966c03
LP
2951 Unit *other;
2952 int r;
2c966c03
LP
2953
2954 assert(u);
5a724170 2955 assert(name);
2c966c03 2956
23e8c796 2957 r = resolve_template(u, name, &buf, &name);
7410616c
LP
2958 if (r < 0)
2959 return r;
2c966c03 2960
5a724170 2961 r = manager_load_unit(u->manager, name, NULL, NULL, &other);
3f3cc397 2962 if (r < 0)
68eda4bd 2963 return r;
2c966c03 2964
eef85c4a 2965 return unit_add_two_dependencies(u, d, e, other, add_reference, mask);
2c966c03
LP
2966}
2967
0301abf4 2968int set_unit_path(const char *p) {
0301abf4 2969 /* This is mostly for debug purposes */
cbe46ead 2970 if (setenv("SYSTEMD_UNIT_PATH", p, 1) < 0)
26d04f86 2971 return -errno;
0301abf4
LP
2972
2973 return 0;
2974}
88066b3a 2975
ea430986 2976char *unit_dbus_path(Unit *u) {
ea430986
LP
2977 assert(u);
2978
ac155bb8 2979 if (!u->id)
04ade7d2
LP
2980 return NULL;
2981
48899192 2982 return unit_dbus_path_from_name(u->id);
ea430986
LP
2983}
2984
4b58153d
LP
2985char *unit_dbus_path_invocation_id(Unit *u) {
2986 assert(u);
2987
2988 if (sd_id128_is_null(u->invocation_id))
2989 return NULL;
2990
2991 return unit_dbus_path_from_name(u->invocation_id_string);
2992}
2993
d79200e2
LP
2994int unit_set_slice(Unit *u, Unit *slice) {
2995 assert(u);
2996 assert(slice);
2997
2998 /* Sets the unit slice if it has not been set before. Is extra
2999 * careful, to only allow this for units that actually have a
3000 * cgroup context. Also, we don't allow to set this for slices
3001 * (since the parent slice is derived from the name). Make
3002 * sure the unit we set is actually a slice. */
3003
3004 if (!UNIT_HAS_CGROUP_CONTEXT(u))
3005 return -EOPNOTSUPP;
3006
3007 if (u->type == UNIT_SLICE)
3008 return -EINVAL;
3009
102ef982
LP
3010 if (unit_active_state(u) != UNIT_INACTIVE)
3011 return -EBUSY;
3012
d79200e2
LP
3013 if (slice->type != UNIT_SLICE)
3014 return -EINVAL;
3015
efdb0237
LP
3016 if (unit_has_name(u, SPECIAL_INIT_SCOPE) &&
3017 !unit_has_name(slice, SPECIAL_ROOT_SLICE))
3018 return -EPERM;
3019
d79200e2
LP
3020 if (UNIT_DEREF(u->slice) == slice)
3021 return 0;
3022
99e66921
TH
3023 /* Disallow slice changes if @u is already bound to cgroups */
3024 if (UNIT_ISSET(u->slice) && u->cgroup_realized)
d79200e2
LP
3025 return -EBUSY;
3026
7f7d01ed 3027 unit_ref_set(&u->slice, u, slice);
d79200e2
LP
3028 return 1;
3029}
3030
3031int unit_set_default_slice(Unit *u) {
a8833944 3032 const char *slice_name;
a016b922
LP
3033 Unit *slice;
3034 int r;
3035
3036 assert(u);
3037
9444b1f2 3038 if (UNIT_ISSET(u->slice))
a016b922
LP
3039 return 0;
3040
a8833944
LP
3041 if (u->instance) {
3042 _cleanup_free_ char *prefix = NULL, *escaped = NULL;
68eda4bd 3043
a8833944
LP
3044 /* Implicitly place all instantiated units in their
3045 * own per-template slice */
3046
7410616c
LP
3047 r = unit_name_to_prefix(u->id, &prefix);
3048 if (r < 0)
3049 return r;
a8833944
LP
3050
3051 /* The prefix is already escaped, but it might include
3052 * "-" which has a special meaning for slice units,
3053 * hence escape it here extra. */
7410616c 3054 escaped = unit_name_escape(prefix);
a8833944
LP
3055 if (!escaped)
3056 return -ENOMEM;
3057
463d0d15 3058 if (MANAGER_IS_SYSTEM(u->manager))
00e7b3c8 3059 slice_name = strjoina("system-", escaped, ".slice");
a8833944 3060 else
00e7b3c8 3061 slice_name = strjoina(escaped, ".slice");
a8833944
LP
3062 } else
3063 slice_name =
463d0d15 3064 MANAGER_IS_SYSTEM(u->manager) && !unit_has_name(u, SPECIAL_INIT_SCOPE)
a8833944
LP
3065 ? SPECIAL_SYSTEM_SLICE
3066 : SPECIAL_ROOT_SLICE;
3067
3068 r = manager_load_unit(u->manager, slice_name, NULL, NULL, &slice);
a016b922
LP
3069 if (r < 0)
3070 return r;
3071
d79200e2 3072 return unit_set_slice(u, slice);
a016b922
LP
3073}
3074
9444b1f2
LP
3075const char *unit_slice_name(Unit *u) {
3076 assert(u);
3077
3078 if (!UNIT_ISSET(u->slice))
3079 return NULL;
3080
3081 return UNIT_DEREF(u->slice)->id;
3082}
3083
f6ff8c29 3084int unit_load_related_unit(Unit *u, const char *type, Unit **_found) {
78edb35a 3085 _cleanup_free_ char *t = NULL;
f6ff8c29
LP
3086 int r;
3087
3088 assert(u);
3089 assert(type);
3090 assert(_found);
3091
7410616c
LP
3092 r = unit_name_change_suffix(u->id, type, &t);
3093 if (r < 0)
3094 return r;
3095 if (unit_has_name(u, t))
3096 return -EINVAL;
f6ff8c29 3097
ac155bb8 3098 r = manager_load_unit(u->manager, t, NULL, NULL, _found);
9e2f7c11 3099 assert(r < 0 || *_found != u);
f6ff8c29
LP
3100 return r;
3101}
3102
bbc29086
DM
3103static int signal_name_owner_changed(sd_bus_message *message, void *userdata, sd_bus_error *error) {
3104 const char *name, *old_owner, *new_owner;
3105 Unit *u = userdata;
3106 int r;
3107
3108 assert(message);
3109 assert(u);
3110
3111 r = sd_bus_message_read(message, "sss", &name, &old_owner, &new_owner);
3112 if (r < 0) {
3113 bus_log_parse_error(r);
3114 return 0;
3115 }
3116
a8ea93a5
LP
3117 old_owner = empty_to_null(old_owner);
3118 new_owner = empty_to_null(new_owner);
b0076268 3119
bbc29086
DM
3120 if (UNIT_VTABLE(u)->bus_name_owner_change)
3121 UNIT_VTABLE(u)->bus_name_owner_change(u, name, old_owner, new_owner);
3122
3123 return 0;
3124}
3125
9806e87d
LP
3126int unit_install_bus_match(Unit *u, sd_bus *bus, const char *name) {
3127 const char *match;
bbc29086 3128
9806e87d
LP
3129 assert(u);
3130 assert(bus);
3131 assert(name);
bbc29086
DM
3132
3133 if (u->match_bus_slot)
3134 return -EBUSY;
3135
9806e87d 3136 match = strjoina("type='signal',"
81d62103
ZJS
3137 "sender='org.freedesktop.DBus',"
3138 "path='/org/freedesktop/DBus',"
3139 "interface='org.freedesktop.DBus',"
3140 "member='NameOwnerChanged',"
3141 "arg0='", name, "'");
bbc29086 3142
75152a4d 3143 return sd_bus_add_match_async(bus, &u->match_bus_slot, match, signal_name_owner_changed, NULL, u);
bbc29086
DM
3144}
3145
05e343b7 3146int unit_watch_bus_name(Unit *u, const char *name) {
bbc29086
DM
3147 int r;
3148
05e343b7
LP
3149 assert(u);
3150 assert(name);
3151
3152 /* Watch a specific name on the bus. We only support one unit
3153 * watching each name for now. */
3154
bbc29086
DM
3155 if (u->manager->api_bus) {
3156 /* If the bus is already available, install the match directly.
3157 * Otherwise, just put the name in the list. bus_setup_api() will take care later. */
9806e87d 3158 r = unit_install_bus_match(u, u->manager->api_bus, name);
bbc29086 3159 if (r < 0)
8ea823b6 3160 return log_warning_errno(r, "Failed to subscribe to NameOwnerChanged signal for '%s': %m", name);
bbc29086
DM
3161 }
3162
3163 r = hashmap_put(u->manager->watch_bus, name, u);
3164 if (r < 0) {
3165 u->match_bus_slot = sd_bus_slot_unref(u->match_bus_slot);
3166 return log_warning_errno(r, "Failed to put bus name to hashmap: %m");
3167 }
3168
3169 return 0;
05e343b7
LP
3170}
3171
3172void unit_unwatch_bus_name(Unit *u, const char *name) {
3173 assert(u);
3174 assert(name);
3175
8367fea5 3176 (void) hashmap_remove_value(u->manager->watch_bus, name, u);
bbc29086 3177 u->match_bus_slot = sd_bus_slot_unref(u->match_bus_slot);
05e343b7
LP
3178}
3179
a16e1123
LP
3180bool unit_can_serialize(Unit *u) {
3181 assert(u);
3182
3183 return UNIT_VTABLE(u)->serialize && UNIT_VTABLE(u)->deserialize_item;
3184}
3185
d68c645b 3186static int serialize_cgroup_mask(FILE *f, const char *key, CGroupMask mask) {
8b108bd0 3187 _cleanup_free_ char *s = NULL;
d68c645b 3188 int r;
8b108bd0
FB
3189
3190 assert(f);
3191 assert(key);
3192
d68c645b
LP
3193 if (mask == 0)
3194 return 0;
3195
3196 r = cg_mask_to_string(mask, &s);
3197 if (r < 0)
3198 return log_error_errno(r, "Failed to format cgroup mask: %m");
3199
3200 return serialize_item(f, key, s);
8b108bd0
FB
3201}
3202
6b659ed8
LP
3203static const char *ip_accounting_metric_field[_CGROUP_IP_ACCOUNTING_METRIC_MAX] = {
3204 [CGROUP_IP_INGRESS_BYTES] = "ip-accounting-ingress-bytes",
3205 [CGROUP_IP_INGRESS_PACKETS] = "ip-accounting-ingress-packets",
3206 [CGROUP_IP_EGRESS_BYTES] = "ip-accounting-egress-bytes",
3207 [CGROUP_IP_EGRESS_PACKETS] = "ip-accounting-egress-packets",
3208};
3209
6b78f9b4 3210int unit_serialize(Unit *u, FILE *f, FDSet *fds, bool serialize_jobs) {
6b659ed8 3211 CGroupIPAccountingMetric m;
a16e1123
LP
3212 int r;
3213
3214 assert(u);
3215 assert(f);
3216 assert(fds);
3217
9bdb98c5 3218 if (unit_can_serialize(u)) {
9bdb98c5 3219 r = UNIT_VTABLE(u)->serialize(u, f, fds);
613b411c
LP
3220 if (r < 0)
3221 return r;
e0209d83
MS
3222 }
3223
d68c645b 3224 (void) serialize_dual_timestamp(f, "state-change-timestamp", &u->state_change_timestamp);
a483fb59 3225
d68c645b
LP
3226 (void) serialize_dual_timestamp(f, "inactive-exit-timestamp", &u->inactive_exit_timestamp);
3227 (void) serialize_dual_timestamp(f, "active-enter-timestamp", &u->active_enter_timestamp);
3228 (void) serialize_dual_timestamp(f, "active-exit-timestamp", &u->active_exit_timestamp);
3229 (void) serialize_dual_timestamp(f, "inactive-enter-timestamp", &u->inactive_enter_timestamp);
a483fb59 3230
d68c645b
LP
3231 (void) serialize_dual_timestamp(f, "condition-timestamp", &u->condition_timestamp);
3232 (void) serialize_dual_timestamp(f, "assert-timestamp", &u->assert_timestamp);
2791a8f8 3233
ac155bb8 3234 if (dual_timestamp_is_set(&u->condition_timestamp))
d68c645b 3235 (void) serialize_bool(f, "condition-result", u->condition_result);
10717a1a 3236
59fccdc5 3237 if (dual_timestamp_is_set(&u->assert_timestamp))
d68c645b 3238 (void) serialize_bool(f, "assert-result", u->assert_result);
59fccdc5 3239
d68c645b
LP
3240 (void) serialize_bool(f, "transient", u->transient);
3241 (void) serialize_bool(f, "in-audit", u->in_audit);
fe700f46 3242
d68c645b
LP
3243 (void) serialize_bool(f, "exported-invocation-id", u->exported_invocation_id);
3244 (void) serialize_bool(f, "exported-log-level-max", u->exported_log_level_max);
3245 (void) serialize_bool(f, "exported-log-extra-fields", u->exported_log_extra_fields);
3246 (void) serialize_bool(f, "exported-log-rate-limit-interval", u->exported_log_rate_limit_interval);
3247 (void) serialize_bool(f, "exported-log-rate-limit-burst", u->exported_log_rate_limit_burst);
0e699122 3248
d68c645b 3249 (void) serialize_item_format(f, "cpu-usage-base", "%" PRIu64, u->cpu_usage_base);
fe700f46 3250 if (u->cpu_usage_last != NSEC_INFINITY)
d68c645b 3251 (void) serialize_item_format(f, "cpu-usage-last", "%" PRIu64, u->cpu_usage_last);
c2756a68
LP
3252
3253 if (u->cgroup_path)
d68c645b
LP
3254 (void) serialize_item(f, "cgroup", u->cgroup_path);
3255
3256 (void) serialize_bool(f, "cgroup-realized", u->cgroup_realized);
3257 (void) serialize_cgroup_mask(f, "cgroup-realized-mask", u->cgroup_realized_mask);
3258 (void) serialize_cgroup_mask(f, "cgroup-enabled-mask", u->cgroup_enabled_mask);
3259 (void) serialize_cgroup_mask(f, "cgroup-invalidated-mask", u->cgroup_invalidated_mask);
c2756a68 3260
00d9ef85 3261 if (uid_is_valid(u->ref_uid))
d68c645b 3262 (void) serialize_item_format(f, "ref-uid", UID_FMT, u->ref_uid);
00d9ef85 3263 if (gid_is_valid(u->ref_gid))
d68c645b 3264 (void) serialize_item_format(f, "ref-gid", GID_FMT, u->ref_gid);
00d9ef85 3265
4b58153d 3266 if (!sd_id128_is_null(u->invocation_id))
d68c645b 3267 (void) serialize_item_format(f, "invocation-id", SD_ID128_FORMAT_STR, SD_ID128_FORMAT_VAL(u->invocation_id));
4b58153d 3268
05a98afd
LP
3269 bus_track_serialize(u->bus_track, f, "ref");
3270
6b659ed8
LP
3271 for (m = 0; m < _CGROUP_IP_ACCOUNTING_METRIC_MAX; m++) {
3272 uint64_t v;
3273
3274 r = unit_get_ip_accounting(u, m, &v);
3275 if (r >= 0)
d68c645b 3276 (void) serialize_item_format(f, ip_accounting_metric_field[m], "%" PRIu64, v);
6b659ed8
LP
3277 }
3278
613b411c
LP
3279 if (serialize_jobs) {
3280 if (u->job) {
d68c645b 3281 fputs("job\n", f);
05a98afd 3282 job_serialize(u->job, f);
613b411c
LP
3283 }
3284
3285 if (u->nop_job) {
d68c645b 3286 fputs("job\n", f);
05a98afd 3287 job_serialize(u->nop_job, f);
613b411c
LP
3288 }
3289 }
3290
a16e1123
LP
3291 /* End marker */
3292 fputc('\n', f);
3293 return 0;
3294}
3295
b17c9620
LP
3296static int unit_deserialize_job(Unit *u, FILE *f) {
3297 _cleanup_(job_freep) Job *j = NULL;
3298 int r;
3299
3300 assert(u);
3301 assert(f);
3302
3303 j = job_new_raw(u);
3304 if (!j)
3305 return log_oom();
3306
3307 r = job_deserialize(j, f);
3308 if (r < 0)
3309 return r;
3310
3311 r = job_install_deserialized(j);
3312 if (r < 0)
3313 return r;
3314
3315 TAKE_PTR(j);
3316 return 0;
3317}
3318
a16e1123
LP
3319int unit_deserialize(Unit *u, FILE *f, FDSet *fds) {
3320 int r;
3321
3322 assert(u);
3323 assert(f);
3324 assert(fds);
3325
a16e1123 3326 for (;;) {
8948b341 3327 _cleanup_free_ char *line = NULL;
6b659ed8 3328 CGroupIPAccountingMetric m;
8948b341 3329 char *l, *v;
a16e1123
LP
3330 size_t k;
3331
8948b341
LP
3332 r = read_line(f, LONG_LINE_MAX, &line);
3333 if (r < 0)
3334 return log_error_errno(r, "Failed to read serialization line: %m");
3335 if (r == 0) /* eof */
3336 break;
a16e1123
LP
3337
3338 l = strstrip(line);
8948b341 3339 if (isempty(l)) /* End marker */
a483fb59 3340 break;
a16e1123
LP
3341
3342 k = strcspn(l, "=");
3343
3344 if (l[k] == '=') {
3345 l[k] = 0;
3346 v = l+k+1;
3347 } else
3348 v = l+k;
3349
cca098b0 3350 if (streq(l, "job")) {
39a18c60 3351 if (v[0] == '\0') {
b17c9620
LP
3352 /* New-style serialized job */
3353 r = unit_deserialize_job(u, f);
3354 if (r < 0)
e0209d83 3355 return r;
b17c9620 3356 } else /* Legacy for pre-44 */
ed10fa8c 3357 log_unit_warning(u, "Update from too old systemd versions are unsupported, cannot deserialize job: %s", v);
cca098b0 3358 continue;
a483fb59 3359 } else if (streq(l, "state-change-timestamp")) {
d68c645b 3360 (void) deserialize_dual_timestamp(v, &u->state_change_timestamp);
a483fb59 3361 continue;
8aaf019b 3362 } else if (streq(l, "inactive-exit-timestamp")) {
d68c645b 3363 (void) deserialize_dual_timestamp(v, &u->inactive_exit_timestamp);
8aaf019b
LP
3364 continue;
3365 } else if (streq(l, "active-enter-timestamp")) {
d68c645b 3366 (void) deserialize_dual_timestamp(v, &u->active_enter_timestamp);
8aaf019b
LP
3367 continue;
3368 } else if (streq(l, "active-exit-timestamp")) {
d68c645b 3369 (void) deserialize_dual_timestamp(v, &u->active_exit_timestamp);
8aaf019b
LP
3370 continue;
3371 } else if (streq(l, "inactive-enter-timestamp")) {
d68c645b 3372 (void) deserialize_dual_timestamp(v, &u->inactive_enter_timestamp);
8aaf019b 3373 continue;
2791a8f8 3374 } else if (streq(l, "condition-timestamp")) {
d68c645b 3375 (void) deserialize_dual_timestamp(v, &u->condition_timestamp);
2791a8f8 3376 continue;
59fccdc5 3377 } else if (streq(l, "assert-timestamp")) {
d68c645b 3378 (void) deserialize_dual_timestamp(v, &u->assert_timestamp);
59fccdc5 3379 continue;
2791a8f8 3380 } else if (streq(l, "condition-result")) {
2791a8f8 3381
e911de99
LP
3382 r = parse_boolean(v);
3383 if (r < 0)
f2341e0a 3384 log_unit_debug(u, "Failed to parse condition result value %s, ignoring.", v);
2791a8f8 3385 else
e911de99 3386 u->condition_result = r;
efbac6d2
LP
3387
3388 continue;
c2756a68 3389
59fccdc5 3390 } else if (streq(l, "assert-result")) {
59fccdc5 3391
e911de99
LP
3392 r = parse_boolean(v);
3393 if (r < 0)
f2341e0a 3394 log_unit_debug(u, "Failed to parse assert result value %s, ignoring.", v);
59fccdc5 3395 else
e911de99 3396 u->assert_result = r;
59fccdc5
LP
3397
3398 continue;
3399
c2756a68 3400 } else if (streq(l, "transient")) {
c2756a68 3401
e911de99
LP
3402 r = parse_boolean(v);
3403 if (r < 0)
f2341e0a 3404 log_unit_debug(u, "Failed to parse transient bool %s, ignoring.", v);
c2756a68 3405 else
e911de99 3406 u->transient = r;
c2756a68
LP
3407
3408 continue;
e911de99 3409
0e699122
LP
3410 } else if (streq(l, "in-audit")) {
3411
3412 r = parse_boolean(v);
3413 if (r < 0)
3414 log_unit_debug(u, "Failed to parse in-audit bool %s, ignoring.", v);
3415 else
3416 u->in_audit = r;
3417
3418 continue;
3419
d3070fbd
LP
3420 } else if (streq(l, "exported-invocation-id")) {
3421
3422 r = parse_boolean(v);
3423 if (r < 0)
3424 log_unit_debug(u, "Failed to parse exported invocation ID bool %s, ignoring.", v);
3425 else
3426 u->exported_invocation_id = r;
3427
3428 continue;
3429
3430 } else if (streq(l, "exported-log-level-max")) {
3431
3432 r = parse_boolean(v);
3433 if (r < 0)
3434 log_unit_debug(u, "Failed to parse exported log level max bool %s, ignoring.", v);
3435 else
3436 u->exported_log_level_max = r;
3437
3438 continue;
3439
3440 } else if (streq(l, "exported-log-extra-fields")) {
3441
3442 r = parse_boolean(v);
3443 if (r < 0)
3444 log_unit_debug(u, "Failed to parse exported log extra fields bool %s, ignoring.", v);
3445 else
3446 u->exported_log_extra_fields = r;
3447
3448 continue;
3449
90fc172e
AZ
3450 } else if (streq(l, "exported-log-rate-limit-interval")) {
3451
3452 r = parse_boolean(v);
3453 if (r < 0)
3454 log_unit_debug(u, "Failed to parse exported log rate limit interval %s, ignoring.", v);
3455 else
3456 u->exported_log_rate_limit_interval = r;
3457
3458 continue;
3459
3460 } else if (streq(l, "exported-log-rate-limit-burst")) {
3461
3462 r = parse_boolean(v);
3463 if (r < 0)
3464 log_unit_debug(u, "Failed to parse exported log rate limit burst %s, ignoring.", v);
3465 else
3466 u->exported_log_rate_limit_burst = r;
3467
3468 continue;
3469
fe700f46 3470 } else if (STR_IN_SET(l, "cpu-usage-base", "cpuacct-usage-base")) {
5ad096b3 3471
66ebf6c0 3472 r = safe_atou64(v, &u->cpu_usage_base);
5ad096b3 3473 if (r < 0)
fe700f46
LP
3474 log_unit_debug(u, "Failed to parse CPU usage base %s, ignoring.", v);
3475
3476 continue;
3477
3478 } else if (streq(l, "cpu-usage-last")) {
3479
3480 r = safe_atou64(v, &u->cpu_usage_last);
3481 if (r < 0)
3482 log_unit_debug(u, "Failed to read CPU usage last %s, ignoring.", v);
5ad096b3 3483
0f908397 3484 continue;
4e595329 3485
e911de99 3486 } else if (streq(l, "cgroup")) {
72673e86 3487
e911de99
LP
3488 r = unit_set_cgroup_path(u, v);
3489 if (r < 0)
f2341e0a 3490 log_unit_debug_errno(u, r, "Failed to set cgroup path %s, ignoring: %m", v);
4e595329 3491
efdb0237
LP
3492 (void) unit_watch_cgroup(u);
3493
de1d4f9b
WF
3494 continue;
3495 } else if (streq(l, "cgroup-realized")) {
3496 int b;
3497
3498 b = parse_boolean(v);
3499 if (b < 0)
3500 log_unit_debug(u, "Failed to parse cgroup-realized bool %s, ignoring.", v);
3501 else
3502 u->cgroup_realized = b;
3503
c2756a68 3504 continue;
00d9ef85 3505
8b108bd0
FB
3506 } else if (streq(l, "cgroup-realized-mask")) {
3507
3508 r = cg_mask_from_string(v, &u->cgroup_realized_mask);
3509 if (r < 0)
3510 log_unit_debug(u, "Failed to parse cgroup-realized-mask %s, ignoring.", v);
3511 continue;
3512
3513 } else if (streq(l, "cgroup-enabled-mask")) {
3514
3515 r = cg_mask_from_string(v, &u->cgroup_enabled_mask);
3516 if (r < 0)
3517 log_unit_debug(u, "Failed to parse cgroup-enabled-mask %s, ignoring.", v);
3518 continue;
3519
17f14955 3520 } else if (streq(l, "cgroup-invalidated-mask")) {
906c06f6 3521
17f14955 3522 r = cg_mask_from_string(v, &u->cgroup_invalidated_mask);
906c06f6 3523 if (r < 0)
17f14955 3524 log_unit_debug(u, "Failed to parse cgroup-invalidated-mask %s, ignoring.", v);
906c06f6
DM
3525 continue;
3526
00d9ef85
LP
3527 } else if (streq(l, "ref-uid")) {
3528 uid_t uid;
3529
3530 r = parse_uid(v, &uid);
3531 if (r < 0)
3532 log_unit_debug(u, "Failed to parse referenced UID %s, ignoring.", v);
3533 else
3534 unit_ref_uid_gid(u, uid, GID_INVALID);
3535
3536 continue;
3537
3538 } else if (streq(l, "ref-gid")) {
3539 gid_t gid;
3540
3541 r = parse_gid(v, &gid);
3542 if (r < 0)
3543 log_unit_debug(u, "Failed to parse referenced GID %s, ignoring.", v);
3544 else
3545 unit_ref_uid_gid(u, UID_INVALID, gid);
3546
5f616d5f
LP
3547 continue;
3548
05a98afd
LP
3549 } else if (streq(l, "ref")) {
3550
3551 r = strv_extend(&u->deserialized_refs, v);
3552 if (r < 0)
d68c645b 3553 return log_oom();
05a98afd 3554
4b58153d
LP
3555 continue;
3556 } else if (streq(l, "invocation-id")) {
3557 sd_id128_t id;
3558
3559 r = sd_id128_from_string(v, &id);
3560 if (r < 0)
3561 log_unit_debug(u, "Failed to parse invocation id %s, ignoring.", v);
3562 else {
3563 r = unit_set_invocation_id(u, id);
3564 if (r < 0)
3565 log_unit_warning_errno(u, r, "Failed to set invocation ID for unit: %m");
3566 }
3567
00d9ef85 3568 continue;
8aaf019b 3569 }
cca098b0 3570
6b659ed8
LP
3571 /* Check if this is an IP accounting metric serialization field */
3572 for (m = 0; m < _CGROUP_IP_ACCOUNTING_METRIC_MAX; m++)
3573 if (streq(l, ip_accounting_metric_field[m]))
3574 break;
3575 if (m < _CGROUP_IP_ACCOUNTING_METRIC_MAX) {
3576 uint64_t c;
3577
3578 r = safe_atou64(v, &c);
3579 if (r < 0)
3580 log_unit_debug(u, "Failed to parse IP accounting value %s, ignoring.", v);
3581 else
3582 u->ip_accounting_extra[m] = c;
3583 continue;
3584 }
3585
9bdb98c5 3586 if (unit_can_serialize(u)) {
e8a565cb
YW
3587 r = exec_runtime_deserialize_compat(u, l, v, fds);
3588 if (r < 0) {
3589 log_unit_warning(u, "Failed to deserialize runtime parameter '%s', ignoring.", l);
3590 continue;
9bdb98c5
LP
3591 }
3592
e8a565cb
YW
3593 /* Returns positive if key was handled by the call */
3594 if (r > 0)
3595 continue;
3596
9bdb98c5 3597 r = UNIT_VTABLE(u)->deserialize_item(u, l, v, fds);
613b411c 3598 if (r < 0)
f2341e0a 3599 log_unit_warning(u, "Failed to deserialize unit parameter '%s', ignoring.", l);
613b411c 3600 }
a16e1123 3601 }
a483fb59
LP
3602
3603 /* Versions before 228 did not carry a state change timestamp. In this case, take the current time. This is
3604 * useful, so that timeouts based on this timestamp don't trigger too early, and is in-line with the logic from
1f133e0d 3605 * before 228 where the base for timeouts was not persistent across reboots. */
a483fb59
LP
3606
3607 if (!dual_timestamp_is_set(&u->state_change_timestamp))
3608 dual_timestamp_get(&u->state_change_timestamp);
3609
58d83430
LP
3610 /* Let's make sure that everything that is deserialized also gets any potential new cgroup settings applied
3611 * after we are done. For that we invalidate anything already realized, so that we can realize it again. */
3612 unit_invalidate_cgroup(u, _CGROUP_MASK_ALL);
3613 unit_invalidate_cgroup_bpf(u);
3614
a483fb59 3615 return 0;
a16e1123
LP
3616}
3617
8948b341
LP
3618int unit_deserialize_skip(FILE *f) {
3619 int r;
07429866
ZJS
3620 assert(f);
3621
3622 /* Skip serialized data for this unit. We don't know what it is. */
3623
3624 for (;;) {
8948b341
LP
3625 _cleanup_free_ char *line = NULL;
3626 char *l;
07429866 3627
8948b341
LP
3628 r = read_line(f, LONG_LINE_MAX, &line);
3629 if (r < 0)
3630 return log_error_errno(r, "Failed to read serialization line: %m");
3631 if (r == 0)
3632 return 0;
07429866 3633
07429866
ZJS
3634 l = strstrip(line);
3635
3636 /* End marker */
3637 if (isempty(l))
8948b341 3638 return 1;
07429866
ZJS
3639 }
3640}
3641
eef85c4a 3642int unit_add_node_dependency(Unit *u, const char *what, bool wants, UnitDependency dep, UnitDependencyMask mask) {
6e2ef85b 3643 Unit *device;
68eda4bd 3644 _cleanup_free_ char *e = NULL;
6e2ef85b
LP
3645 int r;
3646
3647 assert(u);
3648
6e2ef85b 3649 /* Adds in links to the device node that this unit is based on */
47bc12e1
LP
3650 if (isempty(what))
3651 return 0;
6e2ef85b 3652
8407a5d0 3653 if (!is_device_path(what))
6e2ef85b
LP
3654 return 0;
3655
47bc12e1
LP
3656 /* When device units aren't supported (such as in a
3657 * container), don't create dependencies on them. */
1c2e9646 3658 if (!unit_type_supported(UNIT_DEVICE))
47bc12e1
LP
3659 return 0;
3660
7410616c
LP
3661 r = unit_name_from_path(what, ".device", &e);
3662 if (r < 0)
3663 return r;
6e2ef85b 3664
ac155bb8 3665 r = manager_load_unit(u->manager, e, NULL, NULL, &device);
6e2ef85b
LP
3666 if (r < 0)
3667 return r;
3668
ebc8968b
FB
3669 if (dep == UNIT_REQUIRES && device_shall_be_bound_by(device, u))
3670 dep = UNIT_BINDS_TO;
3671
9d06297e 3672 r = unit_add_two_dependencies(u, UNIT_AFTER,
463d0d15 3673 MANAGER_IS_SYSTEM(u->manager) ? dep : UNIT_WANTS,
eef85c4a 3674 device, true, mask);
faa368e3 3675 if (r < 0)
6e2ef85b
LP
3676 return r;
3677
faa368e3 3678 if (wants) {
eef85c4a 3679 r = unit_add_dependency(device, UNIT_WANTS, u, false, mask);
faa368e3 3680 if (r < 0)
6e2ef85b 3681 return r;
faa368e3 3682 }
6e2ef85b
LP
3683
3684 return 0;
3685}
a16e1123 3686
be847e82 3687int unit_coldplug(Unit *u) {
05a98afd
LP
3688 int r = 0, q;
3689 char **i;
cca098b0
LP
3690
3691 assert(u);
3692
f0831ed2 3693 /* Make sure we don't enter a loop, when coldplugging recursively. */
f78f265f
LP
3694 if (u->coldplugged)
3695 return 0;
3696
3697 u->coldplugged = true;
3698
05a98afd
LP
3699 STRV_FOREACH(i, u->deserialized_refs) {
3700 q = bus_unit_track_add_name(u, *i);
3701 if (q < 0 && r >= 0)
3702 r = q;
3703 }
3704 u->deserialized_refs = strv_free(u->deserialized_refs);
cca098b0 3705
05a98afd
LP
3706 if (UNIT_VTABLE(u)->coldplug) {
3707 q = UNIT_VTABLE(u)->coldplug(u);
3708 if (q < 0 && r >= 0)
3709 r = q;
3710 }
5a6158b6 3711
05a98afd
LP
3712 if (u->job) {
3713 q = job_coldplug(u->job);
3714 if (q < 0 && r >= 0)
3715 r = q;
3716 }
cca098b0 3717
05a98afd 3718 return r;
cca098b0
LP
3719}
3720
f0831ed2
LP
3721void unit_catchup(Unit *u) {
3722 assert(u);
3723
3724 if (UNIT_VTABLE(u)->catchup)
3725 UNIT_VTABLE(u)->catchup(u);
3726}
3727
ba25d39e 3728static bool fragment_mtime_newer(const char *path, usec_t mtime, bool path_masked) {
21b95806
ZJS
3729 struct stat st;
3730
3731 if (!path)
3732 return false;
3733
77969722
LP
3734 /* If the source is some virtual kernel file system, then we assume we watch it anyway, and hence pretend we
3735 * are never out-of-date. */
3736 if (PATH_STARTSWITH_SET(path, "/proc", "/sys"))
3737 return false;
3738
21b95806
ZJS
3739 if (stat(path, &st) < 0)
3740 /* What, cannot access this anymore? */
3741 return true;
3742
ba25d39e
ZJS
3743 if (path_masked)
3744 /* For masked files check if they are still so */
3745 return !null_or_empty(&st);
3746 else
3a8db9fe 3747 /* For non-empty files check the mtime */
87ec20ef 3748 return timespec_load(&st.st_mtim) > mtime;
21b95806
ZJS
3749
3750 return false;
3751}
3752
45fb0699 3753bool unit_need_daemon_reload(Unit *u) {
ae7a7182
OS
3754 _cleanup_strv_free_ char **t = NULL;
3755 char **path;
1b64d026 3756
45fb0699
LP
3757 assert(u);
3758
ba25d39e
ZJS
3759 /* For unit files, we allow masking… */
3760 if (fragment_mtime_newer(u->fragment_path, u->fragment_mtime,
3761 u->load_state == UNIT_MASKED))
21b95806 3762 return true;
5f4b19f4 3763
ba25d39e
ZJS
3764 /* Source paths should not be masked… */
3765 if (fragment_mtime_newer(u->source_path, u->source_mtime, false))
ab932a62 3766 return true;
ae7a7182 3767
19a44dfe
LR
3768 if (u->load_state == UNIT_LOADED)
3769 (void) unit_find_dropin_paths(u, &t);
ab932a62
LP
3770 if (!strv_equal(u->dropin_paths, t))
3771 return true;
6d10d308 3772
ba25d39e 3773 /* … any drop-ins that are masked are simply omitted from the list. */
ab932a62 3774 STRV_FOREACH(path, u->dropin_paths)
ba25d39e 3775 if (fragment_mtime_newer(*path, u->dropin_mtime, false))
ab932a62 3776 return true;
21b95806 3777
ab932a62 3778 return false;
45fb0699
LP
3779}
3780
fdf20a31 3781void unit_reset_failed(Unit *u) {
5632e374
LP
3782 assert(u);
3783
fdf20a31
MM
3784 if (UNIT_VTABLE(u)->reset_failed)
3785 UNIT_VTABLE(u)->reset_failed(u);
6bf0f408
LP
3786
3787 RATELIMIT_RESET(u->start_limit);
3788 u->start_limit_hit = false;
5632e374
LP
3789}
3790
a7f241db
LP
3791Unit *unit_following(Unit *u) {
3792 assert(u);
3793
3794 if (UNIT_VTABLE(u)->following)
3795 return UNIT_VTABLE(u)->following(u);
3796
3797 return NULL;
3798}
3799
31afa0a4 3800bool unit_stop_pending(Unit *u) {
18ffdfda
LP
3801 assert(u);
3802
31afa0a4
LP
3803 /* This call does check the current state of the unit. It's
3804 * hence useful to be called from state change calls of the
3805 * unit itself, where the state isn't updated yet. This is
3806 * different from unit_inactive_or_pending() which checks both
3807 * the current state and for a queued job. */
18ffdfda 3808
31afa0a4
LP
3809 return u->job && u->job->type == JOB_STOP;
3810}
3811
3812bool unit_inactive_or_pending(Unit *u) {
3813 assert(u);
3814
3815 /* Returns true if the unit is inactive or going down */
18ffdfda 3816
d956ac29
LP
3817 if (UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(u)))
3818 return true;
3819
31afa0a4 3820 if (unit_stop_pending(u))
18ffdfda
LP
3821 return true;
3822
3823 return false;
3824}
3825
31afa0a4 3826bool unit_active_or_pending(Unit *u) {
f976f3f6
LP
3827 assert(u);
3828
f60c2665 3829 /* Returns true if the unit is active or going up */
f976f3f6
LP
3830
3831 if (UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u)))
3832 return true;
3833
ac155bb8 3834 if (u->job &&
3742095b 3835 IN_SET(u->job->type, JOB_START, JOB_RELOAD_OR_START, JOB_RESTART))
f976f3f6
LP
3836 return true;
3837
3838 return false;
3839}
3840
deb4e708
MK
3841bool unit_will_restart(Unit *u) {
3842 assert(u);
3843
3844 if (!UNIT_VTABLE(u)->will_restart)
3845 return false;
3846
3847 return UNIT_VTABLE(u)->will_restart(u);
3848}
3849
718db961 3850int unit_kill(Unit *u, KillWho w, int signo, sd_bus_error *error) {
8a0867d6
LP
3851 assert(u);
3852 assert(w >= 0 && w < _KILL_WHO_MAX);
6eb7c172 3853 assert(SIGNAL_VALID(signo));
8a0867d6 3854
8a0867d6 3855 if (!UNIT_VTABLE(u)->kill)
15411c0c 3856 return -EOPNOTSUPP;
8a0867d6 3857
c74f17d9 3858 return UNIT_VTABLE(u)->kill(u, w, signo, error);
8a0867d6
LP
3859}
3860
82659fd7 3861static Set *unit_pid_set(pid_t main_pid, pid_t control_pid) {
af4fa99d 3862 _cleanup_set_free_ Set *pid_set = NULL;
82659fd7
LP
3863 int r;
3864
d5099efc 3865 pid_set = set_new(NULL);
82659fd7
LP
3866 if (!pid_set)
3867 return NULL;
3868
3869 /* Exclude the main/control pids from being killed via the cgroup */
3870 if (main_pid > 0) {
fea72cc0 3871 r = set_put(pid_set, PID_TO_PTR(main_pid));
82659fd7 3872 if (r < 0)
95f14a3e 3873 return NULL;
82659fd7
LP
3874 }
3875
3876 if (control_pid > 0) {
fea72cc0 3877 r = set_put(pid_set, PID_TO_PTR(control_pid));
82659fd7 3878 if (r < 0)
95f14a3e 3879 return NULL;
82659fd7
LP
3880 }
3881
95f14a3e 3882 return TAKE_PTR(pid_set);
82659fd7
LP
3883}
3884
d91c34f2
LP
3885int unit_kill_common(
3886 Unit *u,
3887 KillWho who,
3888 int signo,
3889 pid_t main_pid,
3890 pid_t control_pid,
718db961 3891 sd_bus_error *error) {
d91c34f2 3892
814cc562 3893 int r = 0;
ac5e3a50 3894 bool killed = false;
814cc562 3895
ac5e3a50 3896 if (IN_SET(who, KILL_MAIN, KILL_MAIN_FAIL)) {
814cc562 3897 if (main_pid < 0)
7358dc02 3898 return sd_bus_error_setf(error, BUS_ERROR_NO_SUCH_PROCESS, "%s units have no main processes", unit_type_to_string(u->type));
52f448c3 3899 else if (main_pid == 0)
7358dc02 3900 return sd_bus_error_set_const(error, BUS_ERROR_NO_SUCH_PROCESS, "No main process to kill");
814cc562
MS
3901 }
3902
ac5e3a50 3903 if (IN_SET(who, KILL_CONTROL, KILL_CONTROL_FAIL)) {
814cc562 3904 if (control_pid < 0)
7358dc02 3905 return sd_bus_error_setf(error, BUS_ERROR_NO_SUCH_PROCESS, "%s units have no control processes", unit_type_to_string(u->type));
52f448c3 3906 else if (control_pid == 0)
7358dc02 3907 return sd_bus_error_set_const(error, BUS_ERROR_NO_SUCH_PROCESS, "No control process to kill");
814cc562
MS
3908 }
3909
ac5e3a50
JS
3910 if (IN_SET(who, KILL_CONTROL, KILL_CONTROL_FAIL, KILL_ALL, KILL_ALL_FAIL))
3911 if (control_pid > 0) {
814cc562
MS
3912 if (kill(control_pid, signo) < 0)
3913 r = -errno;
ac5e3a50
JS
3914 else
3915 killed = true;
3916 }
814cc562 3917
ac5e3a50
JS
3918 if (IN_SET(who, KILL_MAIN, KILL_MAIN_FAIL, KILL_ALL, KILL_ALL_FAIL))
3919 if (main_pid > 0) {
814cc562
MS
3920 if (kill(main_pid, signo) < 0)
3921 r = -errno;
ac5e3a50
JS
3922 else
3923 killed = true;
3924 }
814cc562 3925
ac5e3a50 3926 if (IN_SET(who, KILL_ALL, KILL_ALL_FAIL) && u->cgroup_path) {
814cc562
MS
3927 _cleanup_set_free_ Set *pid_set = NULL;
3928 int q;
3929
82659fd7
LP
3930 /* Exclude the main/control pids from being killed via the cgroup */
3931 pid_set = unit_pid_set(main_pid, control_pid);
814cc562
MS
3932 if (!pid_set)
3933 return -ENOMEM;
3934
1d98fef1 3935 q = cg_kill_recursive(SYSTEMD_CGROUP_CONTROLLER, u->cgroup_path, signo, 0, pid_set, NULL, NULL);
4c701096 3936 if (q < 0 && !IN_SET(q, -EAGAIN, -ESRCH, -ENOENT))
814cc562 3937 r = q;
ac5e3a50
JS
3938 else
3939 killed = true;
814cc562
MS
3940 }
3941
201f0c91 3942 if (r == 0 && !killed && IN_SET(who, KILL_ALL_FAIL, KILL_CONTROL_FAIL))
ac5e3a50
JS
3943 return -ESRCH;
3944
814cc562
MS
3945 return r;
3946}
3947
6210e7fc
LP
3948int unit_following_set(Unit *u, Set **s) {
3949 assert(u);
3950 assert(s);
3951
3952 if (UNIT_VTABLE(u)->following_set)
3953 return UNIT_VTABLE(u)->following_set(u, s);
3954
3955 *s = NULL;
3956 return 0;
3957}
3958
a4375746 3959UnitFileState unit_get_unit_file_state(Unit *u) {
0ec0deaa
LP
3960 int r;
3961
a4375746
LP
3962 assert(u);
3963
0ec0deaa
LP
3964 if (u->unit_file_state < 0 && u->fragment_path) {
3965 r = unit_file_get_state(
463d0d15 3966 u->manager->unit_file_scope,
0ec0deaa 3967 NULL,
9ea3a0e7 3968 u->id,
0ec0deaa
LP
3969 &u->unit_file_state);
3970 if (r < 0)
3971 u->unit_file_state = UNIT_FILE_BAD;
3972 }
a4375746 3973
ac155bb8 3974 return u->unit_file_state;
a4375746
LP
3975}
3976
d2dc52db
LP
3977int unit_get_unit_file_preset(Unit *u) {
3978 assert(u);
3979
3980 if (u->unit_file_preset < 0 && u->fragment_path)
3981 u->unit_file_preset = unit_file_query_preset(
463d0d15 3982 u->manager->unit_file_scope,
0ec0deaa
LP
3983 NULL,
3984 basename(u->fragment_path));
d2dc52db
LP
3985
3986 return u->unit_file_preset;
3987}
3988
7f7d01ed 3989Unit* unit_ref_set(UnitRef *ref, Unit *source, Unit *target) {
57020a3a 3990 assert(ref);
7f7d01ed
ZJS
3991 assert(source);
3992 assert(target);
57020a3a 3993
7f7d01ed 3994 if (ref->target)
57020a3a
LP
3995 unit_ref_unset(ref);
3996
7f7d01ed
ZJS
3997 ref->source = source;
3998 ref->target = target;
3999 LIST_PREPEND(refs_by_target, target->refs_by_target, ref);
4000 return target;
57020a3a
LP
4001}
4002
4003void unit_ref_unset(UnitRef *ref) {
4004 assert(ref);
4005
7f7d01ed 4006 if (!ref->target)
57020a3a
LP
4007 return;
4008
b75102e5
LP
4009 /* We are about to drop a reference to the unit, make sure the garbage collection has a look at it as it might
4010 * be unreferenced now. */
7f7d01ed 4011 unit_add_to_gc_queue(ref->target);
b75102e5 4012
7f7d01ed
ZJS
4013 LIST_REMOVE(refs_by_target, ref->target->refs_by_target, ref);
4014 ref->source = ref->target = NULL;
57020a3a
LP
4015}
4016
29206d46
LP
4017static int user_from_unit_name(Unit *u, char **ret) {
4018
4019 static const uint8_t hash_key[] = {
4020 0x58, 0x1a, 0xaf, 0xe6, 0x28, 0x58, 0x4e, 0x96,
4021 0xb4, 0x4e, 0xf5, 0x3b, 0x8c, 0x92, 0x07, 0xec
4022 };
4023
4024 _cleanup_free_ char *n = NULL;
4025 int r;
4026
4027 r = unit_name_to_prefix(u->id, &n);
4028 if (r < 0)
4029 return r;
4030
4031 if (valid_user_group_name(n)) {
ae2a15bc 4032 *ret = TAKE_PTR(n);
29206d46
LP
4033 return 0;
4034 }
4035
4036 /* If we can't use the unit name as a user name, then let's hash it and use that */
4037 if (asprintf(ret, "_du%016" PRIx64, siphash24(n, strlen(n), hash_key)) < 0)
4038 return -ENOMEM;
4039
4040 return 0;
4041}
4042
598459ce
LP
4043int unit_patch_contexts(Unit *u) {
4044 CGroupContext *cc;
4045 ExecContext *ec;
cba6e062
LP
4046 unsigned i;
4047 int r;
4048
e06c73cc 4049 assert(u);
e06c73cc 4050
598459ce
LP
4051 /* Patch in the manager defaults into the exec and cgroup
4052 * contexts, _after_ the rest of the settings have been
4053 * initialized */
085afe36 4054
598459ce
LP
4055 ec = unit_get_exec_context(u);
4056 if (ec) {
4057 /* This only copies in the ones that need memory */
4058 for (i = 0; i < _RLIMIT_MAX; i++)
4059 if (u->manager->rlimit[i] && !ec->rlimit[i]) {
4060 ec->rlimit[i] = newdup(struct rlimit, u->manager->rlimit[i], 1);
4061 if (!ec->rlimit[i])
4062 return -ENOMEM;
4063 }
4064
463d0d15 4065 if (MANAGER_IS_USER(u->manager) &&
598459ce
LP
4066 !ec->working_directory) {
4067
4068 r = get_home_dir(&ec->working_directory);
4069 if (r < 0)
4070 return r;
4c08c824
LP
4071
4072 /* Allow user services to run, even if the
4073 * home directory is missing */
4074 ec->working_directory_missing_ok = true;
cba6e062
LP
4075 }
4076
598459ce 4077 if (ec->private_devices)
2cd0a735 4078 ec->capability_bounding_set &= ~((UINT64_C(1) << CAP_MKNOD) | (UINT64_C(1) << CAP_SYS_RAWIO));
502d704e
DH
4079
4080 if (ec->protect_kernel_modules)
4081 ec->capability_bounding_set &= ~(UINT64_C(1) << CAP_SYS_MODULE);
29206d46
LP
4082
4083 if (ec->dynamic_user) {
4084 if (!ec->user) {
4085 r = user_from_unit_name(u, &ec->user);
4086 if (r < 0)
4087 return r;
4088 }
4089
4090 if (!ec->group) {
4091 ec->group = strdup(ec->user);
4092 if (!ec->group)
4093 return -ENOMEM;
4094 }
4095
63bb64a0
LP
4096 /* If the dynamic user option is on, let's make sure that the unit can't leave its UID/GID
4097 * around in the file system or on IPC objects. Hence enforce a strict sandbox. */
4098
29206d46 4099 ec->private_tmp = true;
00d9ef85 4100 ec->remove_ipc = true;
63bb64a0
LP
4101 ec->protect_system = PROTECT_SYSTEM_STRICT;
4102 if (ec->protect_home == PROTECT_HOME_NO)
4103 ec->protect_home = PROTECT_HOME_READ_ONLY;
29206d46 4104 }
cba6e062
LP
4105 }
4106
598459ce 4107 cc = unit_get_cgroup_context(u);
fe65e88b 4108 if (cc && ec) {
f513e420 4109
fe65e88b 4110 if (ec->private_devices &&
598459ce
LP
4111 cc->device_policy == CGROUP_AUTO)
4112 cc->device_policy = CGROUP_CLOSED;
fe65e88b
YW
4113
4114 if (ec->root_image &&
4115 (cc->device_policy != CGROUP_AUTO || cc->device_allow)) {
4116
4117 /* When RootImage= is specified, the following devices are touched. */
4118 r = cgroup_add_device_allow(cc, "/dev/loop-control", "rw");
4119 if (r < 0)
4120 return r;
4121
4122 r = cgroup_add_device_allow(cc, "block-loop", "rwm");
4123 if (r < 0)
4124 return r;
4125
4126 r = cgroup_add_device_allow(cc, "block-blkext", "rwm");
4127 if (r < 0)
4128 return r;
4129 }
598459ce 4130 }
f1660f96 4131
cba6e062 4132 return 0;
e06c73cc
LP
4133}
4134
3ef63c31
LP
4135ExecContext *unit_get_exec_context(Unit *u) {
4136 size_t offset;
4137 assert(u);
4138
598459ce
LP
4139 if (u->type < 0)
4140 return NULL;
4141
3ef63c31
LP
4142 offset = UNIT_VTABLE(u)->exec_context_offset;
4143 if (offset <= 0)
4144 return NULL;
4145
4146 return (ExecContext*) ((uint8_t*) u + offset);
4147}
4148
718db961
LP
4149KillContext *unit_get_kill_context(Unit *u) {
4150 size_t offset;
4151 assert(u);
4152
598459ce
LP
4153 if (u->type < 0)
4154 return NULL;
4155
718db961
LP
4156 offset = UNIT_VTABLE(u)->kill_context_offset;
4157 if (offset <= 0)
4158 return NULL;
4159
4160 return (KillContext*) ((uint8_t*) u + offset);
4161}
4162
4ad49000
LP
4163CGroupContext *unit_get_cgroup_context(Unit *u) {
4164 size_t offset;
4165
598459ce
LP
4166 if (u->type < 0)
4167 return NULL;
4168
4ad49000
LP
4169 offset = UNIT_VTABLE(u)->cgroup_context_offset;
4170 if (offset <= 0)
4171 return NULL;
4172
4173 return (CGroupContext*) ((uint8_t*) u + offset);
4174}
4175
613b411c
LP
4176ExecRuntime *unit_get_exec_runtime(Unit *u) {
4177 size_t offset;
4178
598459ce
LP
4179 if (u->type < 0)
4180 return NULL;
4181
613b411c
LP
4182 offset = UNIT_VTABLE(u)->exec_runtime_offset;
4183 if (offset <= 0)
4184 return NULL;
4185
4186 return *(ExecRuntime**) ((uint8_t*) u + offset);
4187}
4188
2e59b241 4189static const char* unit_drop_in_dir(Unit *u, UnitWriteFlags flags) {
3f5e8115
LP
4190 assert(u);
4191
2e59b241 4192 if (UNIT_WRITE_FLAGS_NOOP(flags))
4f4afc88
LP
4193 return NULL;
4194
39591351
LP
4195 if (u->transient) /* Redirect drop-ins for transient units always into the transient directory. */
4196 return u->manager->lookup_paths.transient;
26d04f86 4197
2e59b241 4198 if (flags & UNIT_PERSISTENT)
4f4afc88 4199 return u->manager->lookup_paths.persistent_control;
26d04f86 4200
2e59b241
LP
4201 if (flags & UNIT_RUNTIME)
4202 return u->manager->lookup_paths.runtime_control;
4203
39591351 4204 return NULL;
71645aca
LP
4205}
4206
2e59b241
LP
4207char* unit_escape_setting(const char *s, UnitWriteFlags flags, char **buf) {
4208 char *ret = NULL;
4209
4210 if (!s)
4211 return NULL;
4212
4213 /* Escapes the input string as requested. Returns the escaped string. If 'buf' is specified then the allocated
4214 * return buffer pointer is also written to *buf, except if no escaping was necessary, in which case *buf is
4215 * set to NULL, and the input pointer is returned as-is. This means the return value always contains a properly
4216 * escaped version, but *buf when passed only contains a pointer if an allocation was necessary. If *buf is
4217 * not specified, then the return value always needs to be freed. Callers can use this to optimize memory
4218 * allocations. */
4219
4220 if (flags & UNIT_ESCAPE_SPECIFIERS) {
4221 ret = specifier_escape(s);
4222 if (!ret)
4223 return NULL;
4224
4225 s = ret;
4226 }
4227
4228 if (flags & UNIT_ESCAPE_C) {
4229 char *a;
4230
4231 a = cescape(s);
4232 free(ret);
4233 if (!a)
4234 return NULL;
4235
4236 ret = a;
4237 }
4238
4239 if (buf) {
4240 *buf = ret;
4241 return ret ?: (char*) s;
4242 }
4243
4244 return ret ?: strdup(s);
4245}
4246
4247char* unit_concat_strv(char **l, UnitWriteFlags flags) {
4248 _cleanup_free_ char *result = NULL;
4249 size_t n = 0, allocated = 0;
ae2a15bc 4250 char **i;
2e59b241
LP
4251
4252 /* Takes a list of strings, escapes them, and concatenates them. This may be used to format command lines in a
4253 * way suitable for ExecStart= stanzas */
4254
4255 STRV_FOREACH(i, l) {
4256 _cleanup_free_ char *buf = NULL;
4257 const char *p;
4258 size_t a;
4259 char *q;
4260
4261 p = unit_escape_setting(*i, flags, &buf);
4262 if (!p)
4263 return NULL;
4264
4265 a = (n > 0) + 1 + strlen(p) + 1; /* separating space + " + entry + " */
4266 if (!GREEDY_REALLOC(result, allocated, n + a + 1))
4267 return NULL;
4268
4269 q = result + n;
4270 if (n > 0)
4271 *(q++) = ' ';
4272
4273 *(q++) = '"';
4274 q = stpcpy(q, p);
4275 *(q++) = '"';
4276
4277 n += a;
4278 }
4279
4280 if (!GREEDY_REALLOC(result, allocated, n + 1))
4281 return NULL;
4282
4283 result[n] = 0;
4284
ae2a15bc 4285 return TAKE_PTR(result);
2e59b241
LP
4286}
4287
4288int unit_write_setting(Unit *u, UnitWriteFlags flags, const char *name, const char *data) {
4289 _cleanup_free_ char *p = NULL, *q = NULL, *escaped = NULL;
2a9a6f8a 4290 const char *dir, *wrapped;
26d04f86 4291 int r;
71645aca
LP
4292
4293 assert(u);
2e59b241
LP
4294 assert(name);
4295 assert(data);
4296
4297 if (UNIT_WRITE_FLAGS_NOOP(flags))
4298 return 0;
4299
4300 data = unit_escape_setting(data, flags, &escaped);
4301 if (!data)
4302 return -ENOMEM;
4303
4304 /* Prefix the section header. If we are writing this out as transient file, then let's suppress this if the
4305 * previous section header is the same */
4306
4307 if (flags & UNIT_PRIVATE) {
4308 if (!UNIT_VTABLE(u)->private_section)
4309 return -EINVAL;
4310
4311 if (!u->transient_file || u->last_section_private < 0)
4312 data = strjoina("[", UNIT_VTABLE(u)->private_section, "]\n", data);
4313 else if (u->last_section_private == 0)
4314 data = strjoina("\n[", UNIT_VTABLE(u)->private_section, "]\n", data);
4315 } else {
4316 if (!u->transient_file || u->last_section_private < 0)
4317 data = strjoina("[Unit]\n", data);
4318 else if (u->last_section_private > 0)
4319 data = strjoina("\n[Unit]\n", data);
4320 }
71645aca 4321
4f4afc88
LP
4322 if (u->transient_file) {
4323 /* When this is a transient unit file in creation, then let's not create a new drop-in but instead
4324 * write to the transient unit file. */
4325 fputs(data, u->transient_file);
4f4afc88 4326
2e59b241
LP
4327 if (!endswith(data, "\n"))
4328 fputc('\n', u->transient_file);
4329
4330 /* Remember which section we wrote this entry to */
4331 u->last_section_private = !!(flags & UNIT_PRIVATE);
8e2af478 4332 return 0;
2e59b241 4333 }
8e2af478 4334
2e59b241 4335 dir = unit_drop_in_dir(u, flags);
39591351
LP
4336 if (!dir)
4337 return -EINVAL;
71645aca 4338
2a9a6f8a 4339 wrapped = strjoina("# This is a drop-in unit file extension, created via \"systemctl set-property\"\n"
3f71dec5 4340 "# or an equivalent operation. Do not edit.\n",
2a9a6f8a
ZJS
4341 data,
4342 "\n");
e20b2a86 4343
815b09d3 4344 r = drop_in_file(dir, u->id, 50, name, &p, &q);
adb76a70
WC
4345 if (r < 0)
4346 return r;
4347
45639f1b 4348 (void) mkdir_p_label(p, 0755);
2a9a6f8a 4349 r = write_string_file_atomic_label(q, wrapped);
adb76a70
WC
4350 if (r < 0)
4351 return r;
4352
815b09d3 4353 r = strv_push(&u->dropin_paths, q);
adb76a70
WC
4354 if (r < 0)
4355 return r;
815b09d3 4356 q = NULL;
adb76a70 4357
adb76a70
WC
4358 strv_uniq(u->dropin_paths);
4359
4360 u->dropin_mtime = now(CLOCK_REALTIME);
4361
4362 return 0;
26d04f86 4363}
71645aca 4364
2e59b241 4365int unit_write_settingf(Unit *u, UnitWriteFlags flags, const char *name, const char *format, ...) {
b9ec9359
LP
4366 _cleanup_free_ char *p = NULL;
4367 va_list ap;
4368 int r;
4369
4370 assert(u);
4371 assert(name);
4372 assert(format);
4373
2e59b241 4374 if (UNIT_WRITE_FLAGS_NOOP(flags))
b9ec9359
LP
4375 return 0;
4376
4377 va_start(ap, format);
4378 r = vasprintf(&p, format, ap);
4379 va_end(ap);
4380
4381 if (r < 0)
4382 return -ENOMEM;
4383
2e59b241 4384 return unit_write_setting(u, flags, name, p);
b9ec9359 4385}
71645aca 4386
c2756a68 4387int unit_make_transient(Unit *u) {
0126c8f3 4388 _cleanup_free_ char *path = NULL;
4f4afc88 4389 FILE *f;
4f4afc88 4390
c2756a68
LP
4391 assert(u);
4392
3f5e8115
LP
4393 if (!UNIT_VTABLE(u)->can_transient)
4394 return -EOPNOTSUPP;
4395
45639f1b
LP
4396 (void) mkdir_p_label(u->manager->lookup_paths.transient, 0755);
4397
605405c6 4398 path = strjoin(u->manager->lookup_paths.transient, "/", u->id);
4f4afc88
LP
4399 if (!path)
4400 return -ENOMEM;
4401
4402 /* Let's open the file we'll write the transient settings into. This file is kept open as long as we are
4403 * creating the transient, and is closed in unit_load(), as soon as we start loading the file. */
4404
78e334b5 4405 RUN_WITH_UMASK(0022) {
4f4afc88 4406 f = fopen(path, "we");
0126c8f3 4407 if (!f)
78e334b5 4408 return -errno;
4f4afc88
LP
4409 }
4410
0126c8f3 4411 safe_fclose(u->transient_file);
4f4afc88
LP
4412 u->transient_file = f;
4413
0126c8f3 4414 free_and_replace(u->fragment_path, path);
7c65093a 4415
7c65093a
LP
4416 u->source_path = mfree(u->source_path);
4417 u->dropin_paths = strv_free(u->dropin_paths);
4418 u->fragment_mtime = u->source_mtime = u->dropin_mtime = 0;
4419
4f4afc88
LP
4420 u->load_state = UNIT_STUB;
4421 u->load_error = 0;
4422 u->transient = true;
4423
7c65093a
LP
4424 unit_add_to_dbus_queue(u);
4425 unit_add_to_gc_queue(u);
c2756a68 4426
4f4afc88
LP
4427 fputs("# This is a transient unit file, created programmatically via the systemd API. Do not edit.\n",
4428 u->transient_file);
4429
3f5e8115 4430 return 0;
c2756a68
LP
4431}
4432
c53d2d54 4433static int log_kill(pid_t pid, int sig, void *userdata) {
1d98fef1
LP
4434 _cleanup_free_ char *comm = NULL;
4435
4436 (void) get_process_comm(pid, &comm);
4437
4438 /* Don't log about processes marked with brackets, under the assumption that these are temporary processes
4439 only, like for example systemd's own PAM stub process. */
4440 if (comm && comm[0] == '(')
c53d2d54 4441 return 0;
1d98fef1
LP
4442
4443 log_unit_notice(userdata,
4444 "Killing process " PID_FMT " (%s) with signal SIG%s.",
4445 pid,
4446 strna(comm),
4447 signal_to_string(sig));
c53d2d54
DB
4448
4449 return 1;
1d98fef1
LP
4450}
4451
4452static int operation_to_signal(KillContext *c, KillOperation k) {
4453 assert(c);
4454
4455 switch (k) {
4456
4457 case KILL_TERMINATE:
4458 case KILL_TERMINATE_AND_LOG:
4459 return c->kill_signal;
4460
4461 case KILL_KILL:
fbb48d4c 4462 return c->final_kill_signal;
1d98fef1 4463
c87700a1
AZ
4464 case KILL_WATCHDOG:
4465 return c->watchdog_signal;
1d98fef1
LP
4466
4467 default:
4468 assert_not_reached("KillOperation unknown");
4469 }
4470}
4471
cd2086fe
LP
4472int unit_kill_context(
4473 Unit *u,
4474 KillContext *c,
db2cb23b 4475 KillOperation k,
cd2086fe
LP
4476 pid_t main_pid,
4477 pid_t control_pid,
4478 bool main_pid_alien) {
4479
1d98fef1 4480 bool wait_for_exit = false, send_sighup;
59ec09a8 4481 cg_kill_log_func_t log_func = NULL;
b821a397 4482 int sig, r;
cd2086fe
LP
4483
4484 assert(u);
4485 assert(c);
4486
59ec09a8
ZJS
4487 /* Kill the processes belonging to this unit, in preparation for shutting the unit down.
4488 * Returns > 0 if we killed something worth waiting for, 0 otherwise. */
1d98fef1 4489
cd2086fe
LP
4490 if (c->kill_mode == KILL_NONE)
4491 return 0;
4492
1d98fef1
LP
4493 sig = operation_to_signal(c, k);
4494
4495 send_sighup =
4496 c->send_sighup &&
4497 IN_SET(k, KILL_TERMINATE, KILL_TERMINATE_AND_LOG) &&
4498 sig != SIGHUP;
4499
59ec09a8
ZJS
4500 if (k != KILL_TERMINATE || IN_SET(sig, SIGKILL, SIGABRT))
4501 log_func = log_kill;
cd2086fe
LP
4502
4503 if (main_pid > 0) {
1d98fef1
LP
4504 if (log_func)
4505 log_func(main_pid, sig, u);
cd2086fe 4506
1d98fef1 4507 r = kill_and_sigcont(main_pid, sig);
cd2086fe
LP
4508 if (r < 0 && r != -ESRCH) {
4509 _cleanup_free_ char *comm = NULL;
1d98fef1 4510 (void) get_process_comm(main_pid, &comm);
cd2086fe 4511
b821a397 4512 log_unit_warning_errno(u, r, "Failed to kill main process " PID_FMT " (%s), ignoring: %m", main_pid, strna(comm));
82659fd7 4513 } else {
bc6aed7b
LP
4514 if (!main_pid_alien)
4515 wait_for_exit = true;
82659fd7 4516
1d98fef1 4517 if (r != -ESRCH && send_sighup)
d0667321 4518 (void) kill(main_pid, SIGHUP);
82659fd7 4519 }
cd2086fe
LP
4520 }
4521
4522 if (control_pid > 0) {
1d98fef1
LP
4523 if (log_func)
4524 log_func(control_pid, sig, u);
cd2086fe 4525
1d98fef1 4526 r = kill_and_sigcont(control_pid, sig);
cd2086fe
LP
4527 if (r < 0 && r != -ESRCH) {
4528 _cleanup_free_ char *comm = NULL;
1d98fef1 4529 (void) get_process_comm(control_pid, &comm);
cd2086fe 4530
b821a397 4531 log_unit_warning_errno(u, r, "Failed to kill control process " PID_FMT " (%s), ignoring: %m", control_pid, strna(comm));
82659fd7 4532 } else {
cd2086fe 4533 wait_for_exit = true;
82659fd7 4534
1d98fef1 4535 if (r != -ESRCH && send_sighup)
d0667321 4536 (void) kill(control_pid, SIGHUP);
82659fd7 4537 }
cd2086fe
LP
4538 }
4539
b821a397
LP
4540 if (u->cgroup_path &&
4541 (c->kill_mode == KILL_CONTROL_GROUP || (c->kill_mode == KILL_MIXED && k == KILL_KILL))) {
cd2086fe
LP
4542 _cleanup_set_free_ Set *pid_set = NULL;
4543
82659fd7
LP
4544 /* Exclude the main/control pids from being killed via the cgroup */
4545 pid_set = unit_pid_set(main_pid, control_pid);
cd2086fe
LP
4546 if (!pid_set)
4547 return -ENOMEM;
4548
1d98fef1
LP
4549 r = cg_kill_recursive(SYSTEMD_CGROUP_CONTROLLER, u->cgroup_path,
4550 sig,
4551 CGROUP_SIGCONT|CGROUP_IGNORE_SELF,
4552 pid_set,
4553 log_func, u);
cd2086fe 4554 if (r < 0) {
4c701096 4555 if (!IN_SET(r, -EAGAIN, -ESRCH, -ENOENT))
b821a397
LP
4556 log_unit_warning_errno(u, r, "Failed to kill control group %s, ignoring: %m", u->cgroup_path);
4557
82659fd7 4558 } else if (r > 0) {
bc6aed7b 4559
1d9cc876
LP
4560 /* FIXME: For now, on the legacy hierarchy, we will not wait for the cgroup members to die if
4561 * we are running in a container or if this is a delegation unit, simply because cgroup
4562 * notification is unreliable in these cases. It doesn't work at all in containers, and outside
4563 * of containers it can be confused easily by left-over directories in the cgroup — which
4564 * however should not exist in non-delegated units. On the unified hierarchy that's different,
4565 * there we get proper events. Hence rely on them. */
efdb0237 4566
c22800e4 4567 if (cg_unified_controller(SYSTEMD_CGROUP_CONTROLLER) > 0 ||
1d9cc876 4568 (detect_container() == 0 && !unit_cgroup_delegate(u)))
e9db43d5 4569 wait_for_exit = true;
58ea275a 4570
1d98fef1 4571 if (send_sighup) {
82659fd7
LP
4572 set_free(pid_set);
4573
4574 pid_set = unit_pid_set(main_pid, control_pid);
4575 if (!pid_set)
4576 return -ENOMEM;
4577
1d98fef1
LP
4578 cg_kill_recursive(SYSTEMD_CGROUP_CONTROLLER, u->cgroup_path,
4579 SIGHUP,
4580 CGROUP_IGNORE_SELF,
4581 pid_set,
4582 NULL, NULL);
82659fd7
LP
4583 }
4584 }
cd2086fe
LP
4585 }
4586
4587 return wait_for_exit;
4588}
4589
eef85c4a 4590int unit_require_mounts_for(Unit *u, const char *path, UnitDependencyMask mask) {
ca8700e9 4591 _cleanup_free_ char *p = NULL;
eef85c4a 4592 UnitDependencyInfo di;
a57f7e2c
LP
4593 int r;
4594
4595 assert(u);
4596 assert(path);
4597
eef85c4a
LP
4598 /* Registers a unit for requiring a certain path and all its prefixes. We keep a hashtable of these paths in
4599 * the unit (from the path to the UnitDependencyInfo structure indicating how to the dependency came to
4600 * be). However, we build a prefix table for all possible prefixes so that new appearing mount units can easily
4601 * determine which units to make themselves a dependency of. */
a57f7e2c 4602
70b64bd3
ZJS
4603 if (!path_is_absolute(path))
4604 return -EINVAL;
4605
548f6937 4606 r = hashmap_ensure_allocated(&u->requires_mounts_for, &path_hash_ops);
eef85c4a
LP
4607 if (r < 0)
4608 return r;
4609
a57f7e2c
LP
4610 p = strdup(path);
4611 if (!p)
4612 return -ENOMEM;
4613
106bf8e4 4614 path = path_simplify(p, true);
a57f7e2c 4615
ca8700e9 4616 if (!path_is_normalized(path))
a57f7e2c 4617 return -EPERM;
a57f7e2c 4618
ca8700e9 4619 if (hashmap_contains(u->requires_mounts_for, path))
a57f7e2c 4620 return 0;
a57f7e2c 4621
eef85c4a
LP
4622 di = (UnitDependencyInfo) {
4623 .origin_mask = mask
4624 };
4625
ca8700e9
ZJS
4626 r = hashmap_put(u->requires_mounts_for, path, di.data);
4627 if (r < 0)
a57f7e2c 4628 return r;
ca8700e9 4629 p = NULL;
a57f7e2c 4630
4cb06c59 4631 char prefix[strlen(path) + 1];
ca8700e9 4632 PATH_FOREACH_PREFIX_MORE(prefix, path) {
a57f7e2c
LP
4633 Set *x;
4634
4635 x = hashmap_get(u->manager->units_requiring_mounts_for, prefix);
4636 if (!x) {
ca8700e9 4637 _cleanup_free_ char *q = NULL;
a57f7e2c 4638
548f6937 4639 r = hashmap_ensure_allocated(&u->manager->units_requiring_mounts_for, &path_hash_ops);
742f41ad
LP
4640 if (r < 0)
4641 return r;
a57f7e2c
LP
4642
4643 q = strdup(prefix);
4644 if (!q)
4645 return -ENOMEM;
4646
d5099efc 4647 x = set_new(NULL);
ca8700e9 4648 if (!x)
a57f7e2c 4649 return -ENOMEM;
a57f7e2c
LP
4650
4651 r = hashmap_put(u->manager->units_requiring_mounts_for, q, x);
4652 if (r < 0) {
a57f7e2c
LP
4653 set_free(x);
4654 return r;
4655 }
ca8700e9 4656 q = NULL;
a57f7e2c
LP
4657 }
4658
4659 r = set_put(x, u);
4660 if (r < 0)
4661 return r;
4662 }
4663
4664 return 0;
4665}
4666
613b411c
LP
4667int unit_setup_exec_runtime(Unit *u) {
4668 ExecRuntime **rt;
4669 size_t offset;
613b411c 4670 Unit *other;
eef85c4a
LP
4671 Iterator i;
4672 void *v;
e8a565cb 4673 int r;
613b411c
LP
4674
4675 offset = UNIT_VTABLE(u)->exec_runtime_offset;
4676 assert(offset > 0);
4677
06b643e7 4678 /* Check if there already is an ExecRuntime for this unit? */
613b411c
LP
4679 rt = (ExecRuntime**) ((uint8_t*) u + offset);
4680 if (*rt)
4681 return 0;
4682
4683 /* Try to get it from somebody else */
eef85c4a 4684 HASHMAP_FOREACH_KEY(v, other, u->dependencies[UNIT_JOINS_NAMESPACE_OF], i) {
e8a565cb
YW
4685 r = exec_runtime_acquire(u->manager, NULL, other->id, false, rt);
4686 if (r == 1)
4687 return 1;
613b411c
LP
4688 }
4689
e8a565cb 4690 return exec_runtime_acquire(u->manager, unit_get_exec_context(u), u->id, true, rt);
613b411c
LP
4691}
4692
29206d46
LP
4693int unit_setup_dynamic_creds(Unit *u) {
4694 ExecContext *ec;
4695 DynamicCreds *dcreds;
4696 size_t offset;
4697
4698 assert(u);
4699
4700 offset = UNIT_VTABLE(u)->dynamic_creds_offset;
4701 assert(offset > 0);
4702 dcreds = (DynamicCreds*) ((uint8_t*) u + offset);
4703
4704 ec = unit_get_exec_context(u);
4705 assert(ec);
4706
4707 if (!ec->dynamic_user)
4708 return 0;
4709
4710 return dynamic_creds_acquire(dcreds, u->manager, ec->user, ec->group);
4711}
4712
1c2e9646
LP
4713bool unit_type_supported(UnitType t) {
4714 if (_unlikely_(t < 0))
4715 return false;
4716 if (_unlikely_(t >= _UNIT_TYPE_MAX))
4717 return false;
4718
4719 if (!unit_vtable[t]->supported)
4720 return true;
4721
4722 return unit_vtable[t]->supported();
4723}
4724
8b4305c7
LP
4725void unit_warn_if_dir_nonempty(Unit *u, const char* where) {
4726 int r;
4727
4728 assert(u);
4729 assert(where);
4730
4731 r = dir_is_empty(where);
3f602115 4732 if (r > 0 || r == -ENOTDIR)
8b4305c7
LP
4733 return;
4734 if (r < 0) {
4735 log_unit_warning_errno(u, r, "Failed to check directory %s: %m", where);
4736 return;
4737 }
4738
4739 log_struct(LOG_NOTICE,
2b044526 4740 "MESSAGE_ID=" SD_MESSAGE_OVERMOUNTING_STR,
8b4305c7 4741 LOG_UNIT_ID(u),
f1c50bec 4742 LOG_UNIT_INVOCATION_ID(u),
8b4305c7 4743 LOG_UNIT_MESSAGE(u, "Directory %s to mount over is not empty, mounting anyway.", where),
a1230ff9 4744 "WHERE=%s", where);
8b4305c7
LP
4745}
4746
25cd4964 4747int unit_fail_if_noncanonical(Unit *u, const char* where) {
58d9d89b 4748 _cleanup_free_ char *canonical_where = NULL;
8b4305c7
LP
4749 int r;
4750
4751 assert(u);
4752 assert(where);
4753
25cd4964 4754 r = chase_symlinks(where, NULL, CHASE_NONEXISTENT, &canonical_where);
8b4305c7 4755 if (r < 0) {
25cd4964 4756 log_unit_debug_errno(u, r, "Failed to check %s for symlinks, ignoring: %m", where);
8b4305c7
LP
4757 return 0;
4758 }
25cd4964
AJ
4759
4760 /* We will happily ignore a trailing slash (or any redundant slashes) */
4761 if (path_equal(where, canonical_where))
8b4305c7
LP
4762 return 0;
4763
25cd4964 4764 /* No need to mention "." or "..", they would already have been rejected by unit_name_from_path() */
8b4305c7 4765 log_struct(LOG_ERR,
2b044526 4766 "MESSAGE_ID=" SD_MESSAGE_OVERMOUNTING_STR,
8b4305c7 4767 LOG_UNIT_ID(u),
f1c50bec 4768 LOG_UNIT_INVOCATION_ID(u),
25cd4964 4769 LOG_UNIT_MESSAGE(u, "Mount path %s is not canonical (contains a symlink).", where),
a1230ff9 4770 "WHERE=%s", where);
8b4305c7
LP
4771
4772 return -ELOOP;
4773}
0f13f3bd
LP
4774
4775bool unit_is_pristine(Unit *u) {
4776 assert(u);
4777
7c65093a 4778 /* Check if the unit already exists or is already around,
0f13f3bd
LP
4779 * in a number of different ways. Note that to cater for unit
4780 * types such as slice, we are generally fine with units that
e9e8cbc8
ZJS
4781 * are marked UNIT_LOADED even though nothing was actually
4782 * loaded, as those unit types don't require a file on disk. */
0f13f3bd
LP
4783
4784 return !(!IN_SET(u->load_state, UNIT_NOT_FOUND, UNIT_LOADED) ||
4785 u->fragment_path ||
4786 u->source_path ||
4787 !strv_isempty(u->dropin_paths) ||
0f13f3bd
LP
4788 u->job ||
4789 u->merged_into);
4790}
291d565a
LP
4791
4792pid_t unit_control_pid(Unit *u) {
4793 assert(u);
4794
4795 if (UNIT_VTABLE(u)->control_pid)
4796 return UNIT_VTABLE(u)->control_pid(u);
4797
4798 return 0;
4799}
4800
4801pid_t unit_main_pid(Unit *u) {
4802 assert(u);
4803
4804 if (UNIT_VTABLE(u)->main_pid)
4805 return UNIT_VTABLE(u)->main_pid(u);
4806
4807 return 0;
4808}
00d9ef85
LP
4809
4810static void unit_unref_uid_internal(
4811 Unit *u,
4812 uid_t *ref_uid,
4813 bool destroy_now,
4814 void (*_manager_unref_uid)(Manager *m, uid_t uid, bool destroy_now)) {
4815
4816 assert(u);
4817 assert(ref_uid);
4818 assert(_manager_unref_uid);
4819
4820 /* Generic implementation of both unit_unref_uid() and unit_unref_gid(), under the assumption that uid_t and
4821 * gid_t are actually the same time, with the same validity rules.
4822 *
4823 * Drops a reference to UID/GID from a unit. */
4824
4825 assert_cc(sizeof(uid_t) == sizeof(gid_t));
4826 assert_cc(UID_INVALID == (uid_t) GID_INVALID);
4827
4828 if (!uid_is_valid(*ref_uid))
4829 return;
4830
4831 _manager_unref_uid(u->manager, *ref_uid, destroy_now);
4832 *ref_uid = UID_INVALID;
4833}
4834
4835void unit_unref_uid(Unit *u, bool destroy_now) {
4836 unit_unref_uid_internal(u, &u->ref_uid, destroy_now, manager_unref_uid);
4837}
4838
4839void unit_unref_gid(Unit *u, bool destroy_now) {
4840 unit_unref_uid_internal(u, (uid_t*) &u->ref_gid, destroy_now, manager_unref_gid);
4841}
4842
4843static int unit_ref_uid_internal(
4844 Unit *u,
4845 uid_t *ref_uid,
4846 uid_t uid,
4847 bool clean_ipc,
4848 int (*_manager_ref_uid)(Manager *m, uid_t uid, bool clean_ipc)) {
4849
4850 int r;
4851
4852 assert(u);
4853 assert(ref_uid);
4854 assert(uid_is_valid(uid));
4855 assert(_manager_ref_uid);
4856
4857 /* Generic implementation of both unit_ref_uid() and unit_ref_guid(), under the assumption that uid_t and gid_t
4858 * are actually the same type, and have the same validity rules.
4859 *
4860 * Adds a reference on a specific UID/GID to this unit. Each unit referencing the same UID/GID maintains a
4861 * reference so that we can destroy the UID/GID's IPC resources as soon as this is requested and the counter
4862 * drops to zero. */
4863
4864 assert_cc(sizeof(uid_t) == sizeof(gid_t));
4865 assert_cc(UID_INVALID == (uid_t) GID_INVALID);
4866
4867 if (*ref_uid == uid)
4868 return 0;
4869
4870 if (uid_is_valid(*ref_uid)) /* Already set? */
4871 return -EBUSY;
4872
4873 r = _manager_ref_uid(u->manager, uid, clean_ipc);
4874 if (r < 0)
4875 return r;
4876
4877 *ref_uid = uid;
4878 return 1;
4879}
4880
4881int unit_ref_uid(Unit *u, uid_t uid, bool clean_ipc) {
4882 return unit_ref_uid_internal(u, &u->ref_uid, uid, clean_ipc, manager_ref_uid);
4883}
4884
4885int unit_ref_gid(Unit *u, gid_t gid, bool clean_ipc) {
4886 return unit_ref_uid_internal(u, (uid_t*) &u->ref_gid, (uid_t) gid, clean_ipc, manager_ref_gid);
4887}
4888
4889static int unit_ref_uid_gid_internal(Unit *u, uid_t uid, gid_t gid, bool clean_ipc) {
4890 int r = 0, q = 0;
4891
4892 assert(u);
4893
4894 /* Reference both a UID and a GID in one go. Either references both, or neither. */
4895
4896 if (uid_is_valid(uid)) {
4897 r = unit_ref_uid(u, uid, clean_ipc);
4898 if (r < 0)
4899 return r;
4900 }
4901
4902 if (gid_is_valid(gid)) {
4903 q = unit_ref_gid(u, gid, clean_ipc);
4904 if (q < 0) {
4905 if (r > 0)
4906 unit_unref_uid(u, false);
4907
4908 return q;
4909 }
4910 }
4911
4912 return r > 0 || q > 0;
4913}
4914
4915int unit_ref_uid_gid(Unit *u, uid_t uid, gid_t gid) {
4916 ExecContext *c;
4917 int r;
4918
4919 assert(u);
4920
4921 c = unit_get_exec_context(u);
4922
4923 r = unit_ref_uid_gid_internal(u, uid, gid, c ? c->remove_ipc : false);
4924 if (r < 0)
4925 return log_unit_warning_errno(u, r, "Couldn't add UID/GID reference to unit, proceeding without: %m");
4926
4927 return r;
4928}
4929
4930void unit_unref_uid_gid(Unit *u, bool destroy_now) {
4931 assert(u);
4932
4933 unit_unref_uid(u, destroy_now);
4934 unit_unref_gid(u, destroy_now);
4935}
4936
4937void unit_notify_user_lookup(Unit *u, uid_t uid, gid_t gid) {
4938 int r;
4939
4940 assert(u);
4941
4942 /* This is invoked whenever one of the forked off processes let's us know the UID/GID its user name/group names
4943 * resolved to. We keep track of which UID/GID is currently assigned in order to be able to destroy its IPC
4944 * objects when no service references the UID/GID anymore. */
4945
4946 r = unit_ref_uid_gid(u, uid, gid);
4947 if (r > 0)
37d0b962 4948 unit_add_to_dbus_queue(u);
00d9ef85 4949}
4b58153d
LP
4950
4951int unit_set_invocation_id(Unit *u, sd_id128_t id) {
4952 int r;
4953
4954 assert(u);
4955
4956 /* Set the invocation ID for this unit. If we cannot, this will not roll back, but reset the whole thing. */
4957
4958 if (sd_id128_equal(u->invocation_id, id))
4959 return 0;
4960
4961 if (!sd_id128_is_null(u->invocation_id))
4962 (void) hashmap_remove_value(u->manager->units_by_invocation_id, &u->invocation_id, u);
4963
4964 if (sd_id128_is_null(id)) {
4965 r = 0;
4966 goto reset;
4967 }
4968
4969 r = hashmap_ensure_allocated(&u->manager->units_by_invocation_id, &id128_hash_ops);
4970 if (r < 0)
4971 goto reset;
4972
4973 u->invocation_id = id;
4974 sd_id128_to_string(id, u->invocation_id_string);
4975
4976 r = hashmap_put(u->manager->units_by_invocation_id, &u->invocation_id, u);
4977 if (r < 0)
4978 goto reset;
4979
4980 return 0;
4981
4982reset:
4983 u->invocation_id = SD_ID128_NULL;
4984 u->invocation_id_string[0] = 0;
4985 return r;
4986}
4987
4988int unit_acquire_invocation_id(Unit *u) {
4989 sd_id128_t id;
4990 int r;
4991
4992 assert(u);
4993
4994 r = sd_id128_randomize(&id);
4995 if (r < 0)
4996 return log_unit_error_errno(u, r, "Failed to generate invocation ID for unit: %m");
4997
4998 r = unit_set_invocation_id(u, id);
4999 if (r < 0)
5000 return log_unit_error_errno(u, r, "Failed to set invocation ID for unit: %m");
5001
af92c603 5002 unit_add_to_dbus_queue(u);
4b58153d
LP
5003 return 0;
5004}
f0d47797 5005
1ad6e8b3
LP
5006int unit_set_exec_params(Unit *u, ExecParameters *p) {
5007 int r;
5008
7960b0c7
LP
5009 assert(u);
5010 assert(p);
f0d47797 5011
004c7f16 5012 /* Copy parameters from manager */
1ad6e8b3
LP
5013 r = manager_get_effective_environment(u->manager, &p->environment);
5014 if (r < 0)
5015 return r;
5016
004c7f16
LP
5017 p->confirm_spawn = manager_get_confirm_spawn(u->manager);
5018 p->cgroup_supported = u->manager->cgroup_supported;
5019 p->prefix = u->manager->prefix;
5020 SET_FLAG(p->flags, EXEC_PASS_LOG_UNIT|EXEC_CHOWN_DIRECTORIES, MANAGER_IS_SYSTEM(u->manager));
5021
5022 /* Copy paramaters from unit */
7960b0c7 5023 p->cgroup_path = u->cgroup_path;
1d9cc876 5024 SET_FLAG(p->flags, EXEC_CGROUP_DELEGATE, unit_cgroup_delegate(u));
1ad6e8b3
LP
5025
5026 return 0;
f0d47797 5027}
a79279c7 5028
4c253ed1 5029int unit_fork_helper_process(Unit *u, const char *name, pid_t *ret) {
a79279c7
LP
5030 int r;
5031
5032 assert(u);
5033 assert(ret);
5034
5035 /* Forks off a helper process and makes sure it is a member of the unit's cgroup. Returns == 0 in the child,
5036 * and > 0 in the parent. The pid parameter is always filled in with the child's PID. */
5037
5038 (void) unit_realize_cgroup(u);
5039
4c253ed1
LP
5040 r = safe_fork(name, FORK_REOPEN_LOG, ret);
5041 if (r != 0)
5042 return r;
a79279c7 5043
4c253ed1
LP
5044 (void) default_signals(SIGNALS_CRASH_HANDLER, SIGNALS_IGNORE, -1);
5045 (void) ignore_signals(SIGPIPE, -1);
a79279c7 5046
4c253ed1 5047 (void) prctl(PR_SET_PDEATHSIG, SIGTERM);
a79279c7 5048
4c253ed1
LP
5049 if (u->cgroup_path) {
5050 r = cg_attach_everywhere(u->manager->cgroup_supported, u->cgroup_path, 0, NULL, NULL);
5051 if (r < 0) {
5052 log_unit_error_errno(u, r, "Failed to join unit cgroup %s: %m", u->cgroup_path);
5053 _exit(EXIT_CGROUP);
a79279c7 5054 }
a79279c7
LP
5055 }
5056
4c253ed1 5057 return 0;
a79279c7 5058}
c999cf38
LP
5059
5060static void unit_update_dependency_mask(Unit *u, UnitDependency d, Unit *other, UnitDependencyInfo di) {
5061 assert(u);
5062 assert(d >= 0);
5063 assert(d < _UNIT_DEPENDENCY_MAX);
5064 assert(other);
5065
5066 if (di.origin_mask == 0 && di.destination_mask == 0) {
5067 /* No bit set anymore, let's drop the whole entry */
5068 assert_se(hashmap_remove(u->dependencies[d], other));
5069 log_unit_debug(u, "%s lost dependency %s=%s", u->id, unit_dependency_to_string(d), other->id);
5070 } else
5071 /* Mask was reduced, let's update the entry */
5072 assert_se(hashmap_update(u->dependencies[d], other, di.data) == 0);
5073}
5074
5075void unit_remove_dependencies(Unit *u, UnitDependencyMask mask) {
5076 UnitDependency d;
5077
5078 assert(u);
5079
5080 /* Removes all dependencies u has on other units marked for ownership by 'mask'. */
5081
5082 if (mask == 0)
5083 return;
5084
5085 for (d = 0; d < _UNIT_DEPENDENCY_MAX; d++) {
5086 bool done;
5087
5088 do {
5089 UnitDependencyInfo di;
5090 Unit *other;
5091 Iterator i;
5092
5093 done = true;
5094
5095 HASHMAP_FOREACH_KEY(di.data, other, u->dependencies[d], i) {
5096 UnitDependency q;
5097
5098 if ((di.origin_mask & ~mask) == di.origin_mask)
5099 continue;
5100 di.origin_mask &= ~mask;
5101 unit_update_dependency_mask(u, d, other, di);
5102
5103 /* We updated the dependency from our unit to the other unit now. But most dependencies
5104 * imply a reverse dependency. Hence, let's delete that one too. For that we go through
5105 * all dependency types on the other unit and delete all those which point to us and
5106 * have the right mask set. */
5107
5108 for (q = 0; q < _UNIT_DEPENDENCY_MAX; q++) {
5109 UnitDependencyInfo dj;
5110
5111 dj.data = hashmap_get(other->dependencies[q], u);
5112 if ((dj.destination_mask & ~mask) == dj.destination_mask)
5113 continue;
5114 dj.destination_mask &= ~mask;
5115
5116 unit_update_dependency_mask(other, q, u, dj);
5117 }
5118
5119 unit_add_to_gc_queue(other);
5120
5121 done = false;
5122 break;
5123 }
5124
5125 } while (!done);
5126 }
5127}
d3070fbd
LP
5128
5129static int unit_export_invocation_id(Unit *u) {
5130 const char *p;
5131 int r;
5132
5133 assert(u);
5134
5135 if (u->exported_invocation_id)
5136 return 0;
5137
5138 if (sd_id128_is_null(u->invocation_id))
5139 return 0;
5140
5141 p = strjoina("/run/systemd/units/invocation:", u->id);
5142 r = symlink_atomic(u->invocation_id_string, p);
5143 if (r < 0)
5144 return log_unit_debug_errno(u, r, "Failed to create invocation ID symlink %s: %m", p);
5145
5146 u->exported_invocation_id = true;
5147 return 0;
5148}
5149
5150static int unit_export_log_level_max(Unit *u, const ExecContext *c) {
5151 const char *p;
5152 char buf[2];
5153 int r;
5154
5155 assert(u);
5156 assert(c);
5157
5158 if (u->exported_log_level_max)
5159 return 0;
5160
5161 if (c->log_level_max < 0)
5162 return 0;
5163
5164 assert(c->log_level_max <= 7);
5165
5166 buf[0] = '0' + c->log_level_max;
5167 buf[1] = 0;
5168
5169 p = strjoina("/run/systemd/units/log-level-max:", u->id);
5170 r = symlink_atomic(buf, p);
5171 if (r < 0)
5172 return log_unit_debug_errno(u, r, "Failed to create maximum log level symlink %s: %m", p);
5173
5174 u->exported_log_level_max = true;
5175 return 0;
5176}
5177
5178static int unit_export_log_extra_fields(Unit *u, const ExecContext *c) {
5179 _cleanup_close_ int fd = -1;
5180 struct iovec *iovec;
5181 const char *p;
5182 char *pattern;
5183 le64_t *sizes;
5184 ssize_t n;
5185 size_t i;
5186 int r;
5187
5188 if (u->exported_log_extra_fields)
5189 return 0;
5190
5191 if (c->n_log_extra_fields <= 0)
5192 return 0;
5193
5194 sizes = newa(le64_t, c->n_log_extra_fields);
5195 iovec = newa(struct iovec, c->n_log_extra_fields * 2);
5196
5197 for (i = 0; i < c->n_log_extra_fields; i++) {
5198 sizes[i] = htole64(c->log_extra_fields[i].iov_len);
5199
5200 iovec[i*2] = IOVEC_MAKE(sizes + i, sizeof(le64_t));
5201 iovec[i*2+1] = c->log_extra_fields[i];
5202 }
5203
5204 p = strjoina("/run/systemd/units/log-extra-fields:", u->id);
5205 pattern = strjoina(p, ".XXXXXX");
5206
5207 fd = mkostemp_safe(pattern);
5208 if (fd < 0)
5209 return log_unit_debug_errno(u, fd, "Failed to create extra fields file %s: %m", p);
5210
5211 n = writev(fd, iovec, c->n_log_extra_fields*2);
5212 if (n < 0) {
5213 r = log_unit_debug_errno(u, errno, "Failed to write extra fields: %m");
5214 goto fail;
5215 }
5216
5217 (void) fchmod(fd, 0644);
5218
5219 if (rename(pattern, p) < 0) {
5220 r = log_unit_debug_errno(u, errno, "Failed to rename extra fields file: %m");
5221 goto fail;
5222 }
5223
5224 u->exported_log_extra_fields = true;
5225 return 0;
5226
5227fail:
5228 (void) unlink(pattern);
5229 return r;
5230}
5231
90fc172e
AZ
5232static int unit_export_log_rate_limit_interval(Unit *u, const ExecContext *c) {
5233 _cleanup_free_ char *buf = NULL;
5234 const char *p;
5235 int r;
5236
5237 assert(u);
5238 assert(c);
5239
5240 if (u->exported_log_rate_limit_interval)
5241 return 0;
5242
5243 if (c->log_rate_limit_interval_usec == 0)
5244 return 0;
5245
5246 p = strjoina("/run/systemd/units/log-rate-limit-interval:", u->id);
5247
5248 if (asprintf(&buf, "%" PRIu64, c->log_rate_limit_interval_usec) < 0)
5249 return log_oom();
5250
5251 r = symlink_atomic(buf, p);
5252 if (r < 0)
5253 return log_unit_debug_errno(u, r, "Failed to create log rate limit interval symlink %s: %m", p);
5254
5255 u->exported_log_rate_limit_interval = true;
5256 return 0;
5257}
5258
5259static int unit_export_log_rate_limit_burst(Unit *u, const ExecContext *c) {
5260 _cleanup_free_ char *buf = NULL;
5261 const char *p;
5262 int r;
5263
5264 assert(u);
5265 assert(c);
5266
5267 if (u->exported_log_rate_limit_burst)
5268 return 0;
5269
5270 if (c->log_rate_limit_burst == 0)
5271 return 0;
5272
5273 p = strjoina("/run/systemd/units/log-rate-limit-burst:", u->id);
5274
5275 if (asprintf(&buf, "%u", c->log_rate_limit_burst) < 0)
5276 return log_oom();
5277
5278 r = symlink_atomic(buf, p);
5279 if (r < 0)
5280 return log_unit_debug_errno(u, r, "Failed to create log rate limit burst symlink %s: %m", p);
5281
5282 u->exported_log_rate_limit_burst = true;
5283 return 0;
5284}
5285
d3070fbd
LP
5286void unit_export_state_files(Unit *u) {
5287 const ExecContext *c;
5288
5289 assert(u);
5290
5291 if (!u->id)
5292 return;
5293
5294 if (!MANAGER_IS_SYSTEM(u->manager))
5295 return;
5296
638cece4 5297 if (MANAGER_IS_TEST_RUN(u->manager))
8f632531
LP
5298 return;
5299
d3070fbd
LP
5300 /* Exports a couple of unit properties to /run/systemd/units/, so that journald can quickly query this data
5301 * from there. Ideally, journald would use IPC to query this, like everybody else, but that's hard, as long as
5302 * the IPC system itself and PID 1 also log to the journal.
5303 *
5304 * Note that these files really shouldn't be considered API for anyone else, as use a runtime file system as
5305 * IPC replacement is not compatible with today's world of file system namespaces. However, this doesn't really
5306 * apply to communication between the journal and systemd, as we assume that these two daemons live in the same
5307 * namespace at least.
5308 *
5309 * Note that some of the "files" exported here are actually symlinks and not regular files. Symlinks work
5310 * better for storing small bits of data, in particular as we can write them with two system calls, and read
5311 * them with one. */
5312
5313 (void) unit_export_invocation_id(u);
5314
5315 c = unit_get_exec_context(u);
5316 if (c) {
5317 (void) unit_export_log_level_max(u, c);
5318 (void) unit_export_log_extra_fields(u, c);
90fc172e
AZ
5319 (void) unit_export_log_rate_limit_interval(u, c);
5320 (void) unit_export_log_rate_limit_burst(u, c);
d3070fbd
LP
5321 }
5322}
5323
5324void unit_unlink_state_files(Unit *u) {
5325 const char *p;
5326
5327 assert(u);
5328
5329 if (!u->id)
5330 return;
5331
5332 if (!MANAGER_IS_SYSTEM(u->manager))
5333 return;
5334
5335 /* Undoes the effect of unit_export_state() */
5336
5337 if (u->exported_invocation_id) {
5338 p = strjoina("/run/systemd/units/invocation:", u->id);
5339 (void) unlink(p);
5340
5341 u->exported_invocation_id = false;
5342 }
5343
5344 if (u->exported_log_level_max) {
5345 p = strjoina("/run/systemd/units/log-level-max:", u->id);
5346 (void) unlink(p);
5347
5348 u->exported_log_level_max = false;
5349 }
5350
5351 if (u->exported_log_extra_fields) {
5352 p = strjoina("/run/systemd/units/extra-fields:", u->id);
5353 (void) unlink(p);
5354
5355 u->exported_log_extra_fields = false;
5356 }
90fc172e
AZ
5357
5358 if (u->exported_log_rate_limit_interval) {
5359 p = strjoina("/run/systemd/units/log-rate-limit-interval:", u->id);
5360 (void) unlink(p);
5361
5362 u->exported_log_rate_limit_interval = false;
5363 }
5364
5365 if (u->exported_log_rate_limit_burst) {
5366 p = strjoina("/run/systemd/units/log-rate-limit-burst:", u->id);
5367 (void) unlink(p);
5368
5369 u->exported_log_rate_limit_burst = false;
5370 }
d3070fbd 5371}
5afe510c 5372
3c7416b6
LP
5373int unit_prepare_exec(Unit *u) {
5374 int r;
5375
5376 assert(u);
5377
5378 /* Prepares everything so that we can fork of a process for this unit */
5379
5380 (void) unit_realize_cgroup(u);
5381
5382 if (u->reset_accounting) {
5383 (void) unit_reset_cpu_accounting(u);
5384 (void) unit_reset_ip_accounting(u);
5385 u->reset_accounting = false;
5386 }
5387
5388 unit_export_state_files(u);
5389
5390 r = unit_setup_exec_runtime(u);
5391 if (r < 0)
5392 return r;
5393
5394 r = unit_setup_dynamic_creds(u);
5395 if (r < 0)
5396 return r;
5397
5398 return 0;
5399}
5400
c53d2d54 5401static int log_leftover(pid_t pid, int sig, void *userdata) {
a4634b21
LP
5402 _cleanup_free_ char *comm = NULL;
5403
5404 (void) get_process_comm(pid, &comm);
5405
5406 if (comm && comm[0] == '(') /* Most likely our own helper process (PAM?), ignore */
c53d2d54 5407 return 0;
a4634b21
LP
5408
5409 log_unit_warning(userdata,
5410 "Found left-over process " PID_FMT " (%s) in control group while starting unit. Ignoring.\n"
5411 "This usually indicates unclean termination of a previous run, or service implementation deficiencies.",
5412 pid, strna(comm));
c53d2d54
DB
5413
5414 return 1;
a4634b21
LP
5415}
5416
c53d2d54 5417int unit_warn_leftover_processes(Unit *u) {
a4634b21
LP
5418 assert(u);
5419
5420 (void) unit_pick_cgroup_path(u);
5421
5422 if (!u->cgroup_path)
c53d2d54 5423 return 0;
a4634b21 5424
c53d2d54 5425 return cg_kill_recursive(SYSTEMD_CGROUP_CONTROLLER, u->cgroup_path, 0, 0, NULL, log_leftover, u);
a4634b21
LP
5426}
5427
bb2c7685
LP
5428bool unit_needs_console(Unit *u) {
5429 ExecContext *ec;
5430 UnitActiveState state;
5431
5432 assert(u);
5433
5434 state = unit_active_state(u);
5435
5436 if (UNIT_IS_INACTIVE_OR_FAILED(state))
5437 return false;
5438
5439 if (UNIT_VTABLE(u)->needs_console)
5440 return UNIT_VTABLE(u)->needs_console(u);
5441
5442 /* If this unit type doesn't implement this call, let's use a generic fallback implementation: */
5443 ec = unit_get_exec_context(u);
5444 if (!ec)
5445 return false;
5446
5447 return exec_context_may_touch_console(ec);
5448}
5449
81e9871e
LP
5450const char *unit_label_path(Unit *u) {
5451 const char *p;
5452
5453 /* Returns the file system path to use for MAC access decisions, i.e. the file to read the SELinux label off
5454 * when validating access checks. */
5455
5456 p = u->source_path ?: u->fragment_path;
5457 if (!p)
5458 return NULL;
5459
5460 /* If a unit is masked, then don't read the SELinux label of /dev/null, as that really makes no sense */
5461 if (path_equal(p, "/dev/null"))
5462 return NULL;
5463
5464 return p;
5465}
5466
6592b975
LP
5467int unit_pid_attachable(Unit *u, pid_t pid, sd_bus_error *error) {
5468 int r;
5469
5470 assert(u);
5471
5472 /* Checks whether the specified PID is generally good for attaching, i.e. a valid PID, not our manager itself,
5473 * and not a kernel thread either */
5474
5475 /* First, a simple range check */
5476 if (!pid_is_valid(pid))
5477 return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Process identifier " PID_FMT " is not valid.", pid);
5478
5479 /* Some extra safety check */
5480 if (pid == 1 || pid == getpid_cached())
3fe91079 5481 return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Process " PID_FMT " is a manager process, refusing.", pid);
6592b975
LP
5482
5483 /* Don't even begin to bother with kernel threads */
5484 r = is_kernel_thread(pid);
5485 if (r == -ESRCH)
5486 return sd_bus_error_setf(error, SD_BUS_ERROR_UNIX_PROCESS_ID_UNKNOWN, "Process with ID " PID_FMT " does not exist.", pid);
5487 if (r < 0)
5488 return sd_bus_error_set_errnof(error, r, "Failed to determine whether process " PID_FMT " is a kernel thread: %m", pid);
5489 if (r > 0)
5490 return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Process " PID_FMT " is a kernel thread, refusing.", pid);
5491
5492 return 0;
5493}
5494
523ee2d4
LP
5495void unit_log_success(Unit *u) {
5496 assert(u);
5497
5498 log_struct(LOG_INFO,
5499 "MESSAGE_ID=" SD_MESSAGE_UNIT_SUCCESS_STR,
5500 LOG_UNIT_ID(u),
5501 LOG_UNIT_INVOCATION_ID(u),
5502 LOG_UNIT_MESSAGE(u, "Succeeded."));
5503}
5504
7c047d74
LP
5505void unit_log_failure(Unit *u, const char *result) {
5506 assert(u);
5507 assert(result);
5508
5509 log_struct(LOG_WARNING,
5510 "MESSAGE_ID=" SD_MESSAGE_UNIT_FAILURE_RESULT_STR,
5511 LOG_UNIT_ID(u),
5512 LOG_UNIT_INVOCATION_ID(u),
5513 LOG_UNIT_MESSAGE(u, "Failed with result '%s'.", result),
5514 "UNIT_RESULT=%s", result);
5515}
5516
91bbd9b7
LP
5517void unit_log_process_exit(
5518 Unit *u,
5519 int level,
5520 const char *kind,
5521 const char *command,
5522 int code,
5523 int status) {
5524
5525 assert(u);
5526 assert(kind);
5527
5528 if (code != CLD_EXITED)
5529 level = LOG_WARNING;
5530
5531 log_struct(level,
5532 "MESSAGE_ID=" SD_MESSAGE_UNIT_PROCESS_EXIT_STR,
5533 LOG_UNIT_MESSAGE(u, "%s exited, code=%s, status=%i/%s",
5534 kind,
5535 sigchld_code_to_string(code), status,
5536 strna(code == CLD_EXITED
5537 ? exit_status_to_string(status, EXIT_STATUS_FULL)
5538 : signal_to_string(status))),
5539 "EXIT_CODE=%s", sigchld_code_to_string(code),
5540 "EXIT_STATUS=%i", status,
5541 "COMMAND=%s", strna(command),
5542 LOG_UNIT_ID(u),
5543 LOG_UNIT_INVOCATION_ID(u));
5544}
5545
7af67e9a
LP
5546int unit_exit_status(Unit *u) {
5547 assert(u);
5548
5549 /* Returns the exit status to propagate for the most recent cycle of this unit. Returns a value in the range
5550 * 0…255 if there's something to propagate. EOPNOTSUPP if the concept does not apply to this unit type, ENODATA
5551 * if no data is currently known (for example because the unit hasn't deactivated yet) and EBADE if the main
5552 * service process has exited abnormally (signal/coredump). */
5553
5554 if (!UNIT_VTABLE(u)->exit_status)
5555 return -EOPNOTSUPP;
5556
5557 return UNIT_VTABLE(u)->exit_status(u);
5558}
5559
5560int unit_failure_action_exit_status(Unit *u) {
5561 int r;
5562
5563 assert(u);
5564
5565 /* Returns the exit status to propagate on failure, or an error if there's nothing to propagate */
5566
5567 if (u->failure_action_exit_status >= 0)
5568 return u->failure_action_exit_status;
5569
5570 r = unit_exit_status(u);
5571 if (r == -EBADE) /* Exited, but not cleanly (i.e. by signal or such) */
5572 return 255;
5573
5574 return r;
5575}
5576
5577int unit_success_action_exit_status(Unit *u) {
5578 int r;
5579
5580 assert(u);
5581
5582 /* Returns the exit status to propagate on success, or an error if there's nothing to propagate */
5583
5584 if (u->success_action_exit_status >= 0)
5585 return u->success_action_exit_status;
5586
5587 r = unit_exit_status(u);
5588 if (r == -EBADE) /* Exited, but not cleanly (i.e. by signal or such) */
5589 return 255;
5590
5591 return r;
5592}
5593
a4191c9f
LP
5594int unit_test_trigger_loaded(Unit *u) {
5595 Unit *trigger;
5596
5597 /* Tests whether the unit to trigger is loaded */
5598
5599 trigger = UNIT_TRIGGER(u);
5600 if (!trigger)
5601 return log_unit_error_errno(u, SYNTHETIC_ERRNO(ENOENT), "Refusing to start, unit to trigger not loaded.");
5602 if (trigger->load_state != UNIT_LOADED)
5603 return log_unit_error_errno(u, SYNTHETIC_ERRNO(ENOENT), "Refusing to start, unit %s to trigger not loaded.", u->id);
5604
5605 return 0;
5606}
5607
5afe510c
LP
5608static const char* const collect_mode_table[_COLLECT_MODE_MAX] = {
5609 [COLLECT_INACTIVE] = "inactive",
5610 [COLLECT_INACTIVE_OR_FAILED] = "inactive-or-failed",
5611};
5612
5613DEFINE_STRING_TABLE_LOOKUP(collect_mode, CollectMode);