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