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