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