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