]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/core/unit.c
units: turn on RestrictSUIDSGID= in most of our long-running daemons
[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
f9f88198
YW
1592_printf_(7, 8)
1593static int log_unit_internal(void *userdata, int level, int error, const char *file, int line, const char *func, const char *format, ...) {
1594 Unit *u = userdata;
1595 va_list ap;
1596 int r;
49365733 1597
f9f88198
YW
1598 va_start(ap, format);
1599 if (u)
1600 r = log_object_internalv(level, error, file, line, func,
1601 u->manager->unit_log_field,
1602 u->id,
1603 u->manager->invocation_log_field,
1604 u->invocation_id_string,
1605 format, ap);
1606 else
1607 r = log_internalv(level, error, file, line, func, format, ap);
1608 va_end(ap);
49365733 1609
f9f88198 1610 return r;
49365733
LP
1611}
1612
97a3f4ee 1613static bool unit_test_condition(Unit *u) {
90bbc946
LP
1614 assert(u);
1615
ac155bb8 1616 dual_timestamp_get(&u->condition_timestamp);
f9f88198 1617 u->condition_result = condition_test_list(u->conditions, condition_type_to_string, log_unit_internal, u);
90bbc946 1618
e18f8852
LP
1619 unit_add_to_dbus_queue(u);
1620
ac155bb8 1621 return u->condition_result;
90bbc946
LP
1622}
1623
97a3f4ee 1624static bool unit_test_assert(Unit *u) {
59fccdc5
LP
1625 assert(u);
1626
1627 dual_timestamp_get(&u->assert_timestamp);
f9f88198 1628 u->assert_result = condition_test_list(u->asserts, assert_type_to_string, log_unit_internal, u);
59fccdc5 1629
e18f8852
LP
1630 unit_add_to_dbus_queue(u);
1631
59fccdc5
LP
1632 return u->assert_result;
1633}
1634
df446f96 1635void unit_status_printf(Unit *u, const char *status, const char *unit_status_msg_format) {
5b262f74
LP
1636 const char *d;
1637
1638 d = unit_description(u);
1639 if (log_get_show_color())
1640 d = strjoina(ANSI_HIGHLIGHT, d, ANSI_NORMAL);
1641
df446f96 1642 DISABLE_WARNING_FORMAT_NONLITERAL;
5b262f74 1643 manager_status_printf(u->manager, STATUS_TYPE_NORMAL, status, unit_status_msg_format, d);
df446f96
LP
1644 REENABLE_WARNING;
1645}
1646
97a3f4ee 1647int unit_test_start_limit(Unit *u) {
429926e9
TR
1648 const char *reason;
1649
6bf0f408
LP
1650 assert(u);
1651
7994ac1d 1652 if (ratelimit_below(&u->start_limit)) {
6bf0f408
LP
1653 u->start_limit_hit = false;
1654 return 0;
1655 }
1656
1657 log_unit_warning(u, "Start request repeated too quickly.");
1658 u->start_limit_hit = true;
1659
429926e9
TR
1660 reason = strjoina("unit ", u->id, " failed");
1661
36c4dc08
LP
1662 emergency_action(u->manager, u->start_limit_action,
1663 EMERGENCY_ACTION_IS_WATCHDOG|EMERGENCY_ACTION_WARN,
1664 u->reboot_arg, -1, reason);
1665
1666 return -ECANCELED;
6bf0f408
LP
1667}
1668
c891efaf 1669bool unit_shall_confirm_spawn(Unit *u) {
631b676b 1670 assert(u);
c891efaf
FB
1671
1672 if (manager_is_confirm_spawn_disabled(u->manager))
1673 return false;
1674
1675 /* For some reasons units remaining in the same process group
1676 * as PID 1 fail to acquire the console even if it's not used
1677 * by any process. So skip the confirmation question for them. */
1678 return !unit_get_exec_context(u)->same_pgrp;
1679}
1680
631b676b
LP
1681static bool unit_verify_deps(Unit *u) {
1682 Unit *other;
1683 Iterator j;
eef85c4a 1684 void *v;
631b676b
LP
1685
1686 assert(u);
1687
1688 /* Checks whether all BindsTo= dependencies of this unit are fulfilled — if they are also combined with
1689 * After=. We do not check Requires= or Requisite= here as they only should have an effect on the job
1690 * processing, but do not have any effect afterwards. We don't check BindsTo= dependencies that are not used in
1691 * conjunction with After= as for them any such check would make things entirely racy. */
1692
eef85c4a 1693 HASHMAP_FOREACH_KEY(v, other, u->dependencies[UNIT_BINDS_TO], j) {
631b676b 1694
eef85c4a 1695 if (!hashmap_contains(u->dependencies[UNIT_AFTER], other))
631b676b
LP
1696 continue;
1697
1698 if (!UNIT_IS_ACTIVE_OR_RELOADING(unit_active_state(other))) {
1699 log_unit_notice(u, "Bound to unit %s, but unit isn't active.", other->id);
1700 return false;
1701 }
1702 }
1703
1704 return true;
1705}
1706
9adb6959 1707/* Errors that aren't really errors:
6bf0f408 1708 * -EALREADY: Unit is already started.
9adb6959 1709 * -ECOMM: Condition failed
6bf0f408 1710 * -EAGAIN: An operation is already in progress. Retry later.
9adb6959
LP
1711 *
1712 * Errors that are real errors:
1713 * -EBADR: This unit type does not support starting.
2de9b979 1714 * -ECANCELED: Start limit hit, too many requests for now
6bf0f408
LP
1715 * -EPROTO: Assert failed
1716 * -EINVAL: Unit not loaded
1717 * -EOPNOTSUPP: Unit type not supported
631b676b 1718 * -ENOLINK: The necessary dependencies are not fulfilled.
d4fd1cf2 1719 * -ESTALE: This unit has been started before and can't be started a second time
a4191c9f 1720 * -ENOENT: This is a triggering unit and unit to trigger is not loaded
87f0e418
LP
1721 */
1722int unit_start(Unit *u) {
1723 UnitActiveState state;
92ab323c 1724 Unit *following;
2de9b979 1725 int r;
87f0e418
LP
1726
1727 assert(u);
1728
5766aca8
LP
1729 /* If this is already started, then this will succeed. Note that this will even succeed if this unit
1730 * is not startable by the user. This is relied on to detect when we need to wait for units and when
1731 * waiting is finished. */
87f0e418
LP
1732 state = unit_active_state(u);
1733 if (UNIT_IS_ACTIVE_OR_RELOADING(state))
1734 return -EALREADY;
1735
6bf0f408
LP
1736 /* Units that aren't loaded cannot be started */
1737 if (u->load_state != UNIT_LOADED)
1738 return -EINVAL;
1739
d4fd1cf2
LP
1740 /* Refuse starting scope units more than once */
1741 if (UNIT_VTABLE(u)->once_only && dual_timestamp_is_set(&u->inactive_enter_timestamp))
1742 return -ESTALE;
1743
5766aca8
LP
1744 /* If the conditions failed, don't do anything at all. If we already are activating this call might
1745 * still be useful to speed up activation in case there is some hold-off time, but we don't want to
1746 * recheck the condition in that case. */
a82e5507 1747 if (state != UNIT_ACTIVATING &&
2de9b979
LP
1748 !unit_test_condition(u)) {
1749
1750 /* Let's also check the start limit here. Normally, the start limit is only checked by the
1751 * .start() method of the unit type after it did some additional checks verifying everything
1752 * is in order (so that those other checks can propagate errors properly). However, if a
1753 * condition check doesn't hold we don't get that far but we should still ensure we are not
1754 * called in a tight loop without a rate limit check enforced, hence do the check here. Note
1755 * that ECOMM is generally not a reason for a job to fail, unlike most other errors here,
1756 * hence the chance is big that any triggering unit for us will trigger us again. Note this
1757 * condition check is a bit different from the condition check inside the per-unit .start()
1758 * function, as this one will not change the unit's state in any way (and we shouldn't here,
1759 * after all the condition failed). */
1760
1761 r = unit_test_start_limit(u);
1762 if (r < 0)
1763 return r;
1764
5766aca8 1765 return log_unit_debug_errno(u, SYNTHETIC_ERRNO(ECOMM), "Starting requested but condition failed. Not starting unit.");
2de9b979 1766 }
52661efd 1767
59fccdc5
LP
1768 /* If the asserts failed, fail the entire job */
1769 if (state != UNIT_ACTIVATING &&
5766aca8
LP
1770 !unit_test_assert(u))
1771 return log_unit_notice_errno(u, SYNTHETIC_ERRNO(EPROTO), "Starting requested but asserts failed.");
59fccdc5 1772
5766aca8
LP
1773 /* Units of types that aren't supported cannot be started. Note that we do this test only after the
1774 * condition checks, so that we rather return condition check errors (which are usually not
1775 * considered a true failure) than "not supported" errors (which are considered a failure).
d11a7645
LP
1776 */
1777 if (!unit_supported(u))
1778 return -EOPNOTSUPP;
1779
5766aca8
LP
1780 /* Let's make sure that the deps really are in order before we start this. Normally the job engine
1781 * should have taken care of this already, but let's check this here again. After all, our
1782 * dependencies might not be in effect anymore, due to a reload or due to a failed condition. */
631b676b
LP
1783 if (!unit_verify_deps(u))
1784 return -ENOLINK;
1785
92ab323c 1786 /* Forward to the main object, if we aren't it. */
52990c2e
ZJS
1787 following = unit_following(u);
1788 if (following) {
f2341e0a 1789 log_unit_debug(u, "Redirecting start request from %s to %s.", u->id, following->id);
92ab323c
LP
1790 return unit_start(following);
1791 }
1792
1793 /* If it is stopped, but we cannot start it, then fail */
1794 if (!UNIT_VTABLE(u)->start)
1795 return -EBADR;
1796
5766aca8
LP
1797 /* We don't suppress calls to ->start() here when we are already starting, to allow this request to
1798 * be used as a "hurry up" call, for example when the unit is in some "auto restart" state where it
1799 * waits for a holdoff timer to elapse before it will start again. */
87f0e418 1800
c1e1601e 1801 unit_add_to_dbus_queue(u);
9e58ff9c 1802
d1a34ae9 1803 return UNIT_VTABLE(u)->start(u);
87f0e418
LP
1804}
1805
1806bool unit_can_start(Unit *u) {
1807 assert(u);
1808
8ff4d2ab
LP
1809 if (u->load_state != UNIT_LOADED)
1810 return false;
1811
1812 if (!unit_supported(u))
1813 return false;
1814
d4fd1cf2
LP
1815 /* Scope units may be started only once */
1816 if (UNIT_VTABLE(u)->once_only && dual_timestamp_is_set(&u->inactive_exit_timestamp))
1817 return false;
1818
87f0e418
LP
1819 return !!UNIT_VTABLE(u)->start;
1820}
1821
2528a7a6
LP
1822bool unit_can_isolate(Unit *u) {
1823 assert(u);
1824
1825 return unit_can_start(u) &&
ac155bb8 1826 u->allow_isolate;
2528a7a6
LP
1827}
1828
87f0e418
LP
1829/* Errors:
1830 * -EBADR: This unit type does not support stopping.
1831 * -EALREADY: Unit is already stopped.
1832 * -EAGAIN: An operation is already in progress. Retry later.
1833 */
1834int unit_stop(Unit *u) {
1835 UnitActiveState state;
92ab323c 1836 Unit *following;
87f0e418
LP
1837
1838 assert(u);
1839
87f0e418 1840 state = unit_active_state(u);
fdf20a31 1841 if (UNIT_IS_INACTIVE_OR_FAILED(state))
87f0e418
LP
1842 return -EALREADY;
1843
0faacd47
LP
1844 following = unit_following(u);
1845 if (following) {
f2341e0a 1846 log_unit_debug(u, "Redirecting stop request from %s to %s.", u->id, following->id);
92ab323c
LP
1847 return unit_stop(following);
1848 }
1849
7898b0cf
LP
1850 if (!UNIT_VTABLE(u)->stop)
1851 return -EBADR;
1852
c1e1601e 1853 unit_add_to_dbus_queue(u);
9e58ff9c 1854
d1a34ae9 1855 return UNIT_VTABLE(u)->stop(u);
87f0e418
LP
1856}
1857
f5869324
LP
1858bool unit_can_stop(Unit *u) {
1859 assert(u);
1860
1861 if (!unit_supported(u))
1862 return false;
1863
1864 if (u->perpetual)
1865 return false;
1866
1867 return !!UNIT_VTABLE(u)->stop;
1868}
1869
87f0e418
LP
1870/* Errors:
1871 * -EBADR: This unit type does not support reloading.
1872 * -ENOEXEC: Unit is not started.
1873 * -EAGAIN: An operation is already in progress. Retry later.
1874 */
1875int unit_reload(Unit *u) {
1876 UnitActiveState state;
92ab323c 1877 Unit *following;
87f0e418
LP
1878
1879 assert(u);
1880
ac155bb8 1881 if (u->load_state != UNIT_LOADED)
6124958c
LP
1882 return -EINVAL;
1883
87f0e418
LP
1884 if (!unit_can_reload(u))
1885 return -EBADR;
1886
1887 state = unit_active_state(u);
e364ad06 1888 if (state == UNIT_RELOADING)
6255af75 1889 return -EAGAIN;
87f0e418 1890
6a371e23 1891 if (state != UNIT_ACTIVE) {
f2341e0a 1892 log_unit_warning(u, "Unit cannot be reloaded because it is inactive.");
87f0e418 1893 return -ENOEXEC;
6a371e23 1894 }
87f0e418 1895
e48614c4
ZJS
1896 following = unit_following(u);
1897 if (following) {
f2341e0a 1898 log_unit_debug(u, "Redirecting reload request from %s to %s.", u->id, following->id);
92ab323c
LP
1899 return unit_reload(following);
1900 }
1901
c1e1601e 1902 unit_add_to_dbus_queue(u);
82a2b6bb 1903
f54bcca5
JR
1904 if (!UNIT_VTABLE(u)->reload) {
1905 /* Unit doesn't have a reload function, but we need to propagate the reload anyway */
2ad2e41a 1906 unit_notify(u, unit_active_state(u), unit_active_state(u), 0);
f54bcca5
JR
1907 return 0;
1908 }
1909
d1a34ae9 1910 return UNIT_VTABLE(u)->reload(u);
87f0e418
LP
1911}
1912
1913bool unit_can_reload(Unit *u) {
1914 assert(u);
1915
f54bcca5
JR
1916 if (UNIT_VTABLE(u)->can_reload)
1917 return UNIT_VTABLE(u)->can_reload(u);
87f0e418 1918
eef85c4a 1919 if (!hashmap_isempty(u->dependencies[UNIT_PROPAGATES_RELOAD_TO]))
87f0e418
LP
1920 return true;
1921
f54bcca5 1922 return UNIT_VTABLE(u)->reload;
87f0e418
LP
1923}
1924
a3c1168a
LP
1925bool unit_is_unneeded(Unit *u) {
1926 static const UnitDependency deps[] = {
be7d9ff7 1927 UNIT_REQUIRED_BY,
084918ba 1928 UNIT_REQUISITE_OF,
be7d9ff7
LP
1929 UNIT_WANTED_BY,
1930 UNIT_BOUND_BY,
1931 };
a3c1168a 1932 size_t j;
f3bff0eb
LP
1933
1934 assert(u);
1935
ac155bb8 1936 if (!u->stop_when_unneeded)
a3c1168a 1937 return false;
f3bff0eb 1938
a3c1168a
LP
1939 /* Don't clean up while the unit is transitioning or is even inactive. */
1940 if (!UNIT_IS_ACTIVE_OR_RELOADING(unit_active_state(u)))
1941 return false;
1942 if (u->job)
1943 return false;
f3bff0eb 1944
a3c1168a 1945 for (j = 0; j < ELEMENTSOF(deps); j++) {
eef85c4a
LP
1946 Unit *other;
1947 Iterator i;
1948 void *v;
1949
fda09318 1950 /* If a dependent unit has a job queued, is active or transitioning, or is marked for
a3c1168a 1951 * restart, then don't clean this one up. */
b81884e7 1952
a3c1168a 1953 HASHMAP_FOREACH_KEY(v, other, u->dependencies[deps[j]], i) {
93d4cb09 1954 if (other->job)
a3c1168a
LP
1955 return false;
1956
1957 if (!UNIT_IS_INACTIVE_OR_FAILED(unit_active_state(other)))
1958 return false;
1959
1960 if (unit_will_restart(other))
1961 return false;
1962 }
bea355da
LP
1963 }
1964
a3c1168a
LP
1965 return true;
1966}
f3bff0eb 1967
a3c1168a
LP
1968static void check_unneeded_dependencies(Unit *u) {
1969
1970 static const UnitDependency deps[] = {
1971 UNIT_REQUIRES,
1972 UNIT_REQUISITE,
1973 UNIT_WANTS,
1974 UNIT_BINDS_TO,
1975 };
1976 size_t j;
1977
1978 assert(u);
1979
1980 /* Add all units this unit depends on to the queue that processes StopWhenUnneeded= behaviour. */
1981
1982 for (j = 0; j < ELEMENTSOF(deps); j++) {
1983 Unit *other;
1984 Iterator i;
1985 void *v;
1986
1987 HASHMAP_FOREACH_KEY(v, other, u->dependencies[deps[j]], i)
fda09318 1988 unit_submit_to_stop_when_unneeded_queue(other);
a3c1168a 1989 }
f3bff0eb
LP
1990}
1991
ff502445 1992static void unit_check_binds_to(Unit *u) {
4afd3348 1993 _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
ff502445
LP
1994 bool stop = false;
1995 Unit *other;
1996 Iterator i;
eef85c4a 1997 void *v;
67bfdc97 1998 int r;
ff502445
LP
1999
2000 assert(u);
2001
2002 if (u->job)
2003 return;
2004
2005 if (unit_active_state(u) != UNIT_ACTIVE)
2006 return;
2007
eef85c4a 2008 HASHMAP_FOREACH_KEY(v, other, u->dependencies[UNIT_BINDS_TO], i) {
ff502445
LP
2009 if (other->job)
2010 continue;
13ddc3fc
ZJS
2011
2012 if (!other->coldplugged)
2013 /* We might yet create a job for the other unit… */
2014 continue;
ff502445
LP
2015
2016 if (!UNIT_IS_INACTIVE_OR_FAILED(unit_active_state(other)))
2017 continue;
2018
2019 stop = true;
98f738b6 2020 break;
ff502445
LP
2021 }
2022
2023 if (!stop)
2024 return;
2025
595bfe7d 2026 /* If stopping a unit fails continuously we might enter a stop
67bfdc97
LP
2027 * loop here, hence stop acting on the service being
2028 * unnecessary after a while. */
7994ac1d 2029 if (!ratelimit_below(&u->auto_stop_ratelimit)) {
67bfdc97
LP
2030 log_unit_warning(u, "Unit is bound to inactive unit %s, but not stopping since we tried this too often recently.", other->id);
2031 return;
2032 }
2033
98f738b6 2034 assert(other);
f2341e0a 2035 log_unit_info(u, "Unit is bound to inactive unit %s. Stopping, too.", other->id);
ff502445
LP
2036
2037 /* A unit we need to run is gone. Sniff. Let's stop this. */
50cbaba4 2038 r = manager_add_job(u->manager, JOB_STOP, u, JOB_FAIL, NULL, &error, NULL);
67bfdc97 2039 if (r < 0)
4bd29fe5 2040 log_unit_warning_errno(u, r, "Failed to enqueue stop job, ignoring: %s", bus_error_message(&error, r));
ff502445
LP
2041}
2042
87f0e418
LP
2043static void retroactively_start_dependencies(Unit *u) {
2044 Iterator i;
2045 Unit *other;
eef85c4a 2046 void *v;
87f0e418
LP
2047
2048 assert(u);
2049 assert(UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u)));
2050
eef85c4a
LP
2051 HASHMAP_FOREACH_KEY(v, other, u->dependencies[UNIT_REQUIRES], i)
2052 if (!hashmap_get(u->dependencies[UNIT_AFTER], other) &&
b81884e7 2053 !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other)))
50cbaba4 2054 manager_add_job(u->manager, JOB_START, other, JOB_REPLACE, NULL, NULL, NULL);
b81884e7 2055
eef85c4a
LP
2056 HASHMAP_FOREACH_KEY(v, other, u->dependencies[UNIT_BINDS_TO], i)
2057 if (!hashmap_get(u->dependencies[UNIT_AFTER], other) &&
b81884e7 2058 !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other)))
50cbaba4 2059 manager_add_job(u->manager, JOB_START, other, JOB_REPLACE, NULL, NULL, NULL);
87f0e418 2060
eef85c4a
LP
2061 HASHMAP_FOREACH_KEY(v, other, u->dependencies[UNIT_WANTS], i)
2062 if (!hashmap_get(u->dependencies[UNIT_AFTER], other) &&
b81884e7 2063 !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other)))
50cbaba4 2064 manager_add_job(u->manager, JOB_START, other, JOB_FAIL, NULL, NULL, NULL);
87f0e418 2065
eef85c4a 2066 HASHMAP_FOREACH_KEY(v, other, u->dependencies[UNIT_CONFLICTS], i)
b81884e7 2067 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
50cbaba4 2068 manager_add_job(u->manager, JOB_STOP, other, JOB_REPLACE, NULL, NULL, NULL);
69dd2852 2069
eef85c4a 2070 HASHMAP_FOREACH_KEY(v, other, u->dependencies[UNIT_CONFLICTED_BY], i)
b81884e7 2071 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
50cbaba4 2072 manager_add_job(u->manager, JOB_STOP, other, JOB_REPLACE, NULL, NULL, NULL);
87f0e418
LP
2073}
2074
2075static void retroactively_stop_dependencies(Unit *u) {
87f0e418 2076 Unit *other;
eef85c4a
LP
2077 Iterator i;
2078 void *v;
87f0e418
LP
2079
2080 assert(u);
2081 assert(UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(u)));
2082
b81884e7 2083 /* Pull down units which are bound to us recursively if enabled */
eef85c4a 2084 HASHMAP_FOREACH_KEY(v, other, u->dependencies[UNIT_BOUND_BY], i)
b81884e7 2085 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
50cbaba4 2086 manager_add_job(u->manager, JOB_STOP, other, JOB_REPLACE, NULL, NULL, NULL);
cd0504d0
MS
2087}
2088
3ecaa09b 2089void unit_start_on_failure(Unit *u) {
c0daa706
LP
2090 Unit *other;
2091 Iterator i;
eef85c4a 2092 void *v;
7f66b026 2093 int r;
c0daa706
LP
2094
2095 assert(u);
2096
eef85c4a 2097 if (hashmap_size(u->dependencies[UNIT_ON_FAILURE]) <= 0)
222ae6a8
LP
2098 return;
2099
f2341e0a 2100 log_unit_info(u, "Triggering OnFailure= dependencies.");
222ae6a8 2101
eef85c4a 2102 HASHMAP_FOREACH_KEY(v, other, u->dependencies[UNIT_ON_FAILURE], i) {
7f66b026 2103 _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
222ae6a8 2104
50cbaba4 2105 r = manager_add_job(u->manager, JOB_START, other, u->on_failure_job_mode, NULL, &error, NULL);
c1b6628d 2106 if (r < 0)
7f66b026 2107 log_unit_warning_errno(u, r, "Failed to enqueue OnFailure= job, ignoring: %s", bus_error_message(&error, r));
222ae6a8 2108 }
c0daa706
LP
2109}
2110
3ecaa09b
LP
2111void unit_trigger_notify(Unit *u) {
2112 Unit *other;
2113 Iterator i;
eef85c4a 2114 void *v;
3ecaa09b
LP
2115
2116 assert(u);
2117
eef85c4a 2118 HASHMAP_FOREACH_KEY(v, other, u->dependencies[UNIT_TRIGGERED_BY], i)
3ecaa09b
LP
2119 if (UNIT_VTABLE(other)->trigger_notify)
2120 UNIT_VTABLE(other)->trigger_notify(other, u);
2121}
2122
915b1d01 2123static int unit_log_resources(Unit *u) {
915b1d01 2124 struct iovec iovec[1 + _CGROUP_IP_ACCOUNTING_METRIC_MAX + 4];
82044702 2125 bool any_traffic = false, have_ip_accounting = false;
a87b1faa 2126 _cleanup_free_ char *igress = NULL, *egress = NULL;
915b1d01
LP
2127 size_t n_message_parts = 0, n_iovec = 0;
2128 char* message_parts[3 + 1], *t;
2129 nsec_t nsec = NSEC_INFINITY;
2130 CGroupIPAccountingMetric m;
2131 size_t i;
2132 int r;
2133 const char* const ip_fields[_CGROUP_IP_ACCOUNTING_METRIC_MAX] = {
2134 [CGROUP_IP_INGRESS_BYTES] = "IP_METRIC_INGRESS_BYTES",
2135 [CGROUP_IP_INGRESS_PACKETS] = "IP_METRIC_INGRESS_PACKETS",
2136 [CGROUP_IP_EGRESS_BYTES] = "IP_METRIC_EGRESS_BYTES",
2137 [CGROUP_IP_EGRESS_PACKETS] = "IP_METRIC_EGRESS_PACKETS",
2138 };
2139
2140 assert(u);
2141
2142 /* Invoked whenever a unit enters failed or dead state. Logs information about consumed resources if resource
2143 * accounting was enabled for a unit. It does this in two ways: a friendly human readable string with reduced
2144 * information and the complete data in structured fields. */
2145
2146 (void) unit_get_cpu_usage(u, &nsec);
2147 if (nsec != NSEC_INFINITY) {
2148 char buf[FORMAT_TIMESPAN_MAX] = "";
2149
2150 /* Format the CPU time for inclusion in the structured log message */
2151 if (asprintf(&t, "CPU_USAGE_NSEC=%" PRIu64, nsec) < 0) {
2152 r = log_oom();
2153 goto finish;
2154 }
2155 iovec[n_iovec++] = IOVEC_MAKE_STRING(t);
2156
2157 /* Format the CPU time for inclusion in the human language message string */
2158 format_timespan(buf, sizeof(buf), nsec / NSEC_PER_USEC, USEC_PER_MSEC);
ec9d636b 2159 t = strjoin("consumed ", buf, " CPU time");
915b1d01
LP
2160 if (!t) {
2161 r = log_oom();
2162 goto finish;
2163 }
2164
2165 message_parts[n_message_parts++] = t;
2166 }
2167
2168 for (m = 0; m < _CGROUP_IP_ACCOUNTING_METRIC_MAX; m++) {
2169 char buf[FORMAT_BYTES_MAX] = "";
2170 uint64_t value = UINT64_MAX;
2171
2172 assert(ip_fields[m]);
2173
2174 (void) unit_get_ip_accounting(u, m, &value);
2175 if (value == UINT64_MAX)
2176 continue;
82044702
LP
2177
2178 have_ip_accounting = true;
a87b1faa
LP
2179 if (value > 0)
2180 any_traffic = true;
915b1d01
LP
2181
2182 /* Format IP accounting data for inclusion in the structured log message */
2183 if (asprintf(&t, "%s=%" PRIu64, ip_fields[m], value) < 0) {
2184 r = log_oom();
2185 goto finish;
2186 }
2187 iovec[n_iovec++] = IOVEC_MAKE_STRING(t);
2188
2189 /* Format the IP accounting data for inclusion in the human language message string, but only for the
2190 * bytes counters (and not for the packets counters) */
a87b1faa
LP
2191 if (m == CGROUP_IP_INGRESS_BYTES) {
2192 assert(!igress);
ec9d636b 2193 igress = strjoin("received ", format_bytes(buf, sizeof(buf), value), " IP traffic");
a87b1faa
LP
2194 if (!igress) {
2195 r = log_oom();
2196 goto finish;
2197 }
2198 } else if (m == CGROUP_IP_EGRESS_BYTES) {
2199 assert(!egress);
ec9d636b 2200 egress = strjoin("sent ", format_bytes(buf, sizeof(buf), value), " IP traffic");
a87b1faa
LP
2201 if (!egress) {
2202 r = log_oom();
2203 goto finish;
2204 }
2205 }
2206 }
2207
82044702
LP
2208 if (have_ip_accounting) {
2209 if (any_traffic) {
2210 if (igress)
2211 message_parts[n_message_parts++] = TAKE_PTR(igress);
2212 if (egress)
2213 message_parts[n_message_parts++] = TAKE_PTR(egress);
a87b1faa 2214
82044702
LP
2215 } else {
2216 char *k;
915b1d01 2217
82044702
LP
2218 k = strdup("no IP traffic");
2219 if (!k) {
2220 r = log_oom();
2221 goto finish;
2222 }
2223
2224 message_parts[n_message_parts++] = k;
2225 }
915b1d01
LP
2226 }
2227
2228 /* Is there any accounting data available at all? */
2229 if (n_iovec == 0) {
2230 r = 0;
2231 goto finish;
2232 }
2233
2234 if (n_message_parts == 0)
a87b1faa 2235 t = strjoina("MESSAGE=", u->id, ": Completed.");
915b1d01
LP
2236 else {
2237 _cleanup_free_ char *joined;
2238
2239 message_parts[n_message_parts] = NULL;
2240
2241 joined = strv_join(message_parts, ", ");
2242 if (!joined) {
2243 r = log_oom();
2244 goto finish;
2245 }
2246
ec9d636b 2247 joined[0] = ascii_toupper(joined[0]);
a87b1faa 2248 t = strjoina("MESSAGE=", u->id, ": ", joined, ".");
915b1d01
LP
2249 }
2250
2251 /* The following four fields we allocate on the stack or are static strings, we hence don't want to free them,
2252 * and hence don't increase n_iovec for them */
2253 iovec[n_iovec] = IOVEC_MAKE_STRING(t);
2254 iovec[n_iovec + 1] = IOVEC_MAKE_STRING("MESSAGE_ID=" SD_MESSAGE_UNIT_RESOURCES_STR);
2255
2256 t = strjoina(u->manager->unit_log_field, u->id);
2257 iovec[n_iovec + 2] = IOVEC_MAKE_STRING(t);
2258
2259 t = strjoina(u->manager->invocation_log_field, u->invocation_id_string);
2260 iovec[n_iovec + 3] = IOVEC_MAKE_STRING(t);
2261
2262 log_struct_iovec(LOG_INFO, iovec, n_iovec + 4);
2263 r = 0;
2264
2265finish:
2266 for (i = 0; i < n_message_parts; i++)
2267 free(message_parts[i]);
2268
2269 for (i = 0; i < n_iovec; i++)
2270 free(iovec[i].iov_base);
2271
2272 return r;
2273
2274}
2275
adefcf28
LP
2276static void unit_update_on_console(Unit *u) {
2277 bool b;
2278
2279 assert(u);
2280
2281 b = unit_needs_console(u);
2282 if (u->on_console == b)
2283 return;
2284
2285 u->on_console = b;
2286 if (b)
2287 manager_ref_console(u->manager);
2288 else
2289 manager_unref_console(u->manager);
adefcf28
LP
2290}
2291
6eb65e7c
LP
2292static void unit_emit_audit_start(Unit *u) {
2293 assert(u);
2294
2295 if (u->type != UNIT_SERVICE)
2296 return;
2297
2298 /* Write audit record if we have just finished starting up */
2299 manager_send_unit_audit(u->manager, u, AUDIT_SERVICE_START, true);
2300 u->in_audit = true;
2301}
2302
2303static void unit_emit_audit_stop(Unit *u, UnitActiveState state) {
2304 assert(u);
2305
2306 if (u->type != UNIT_SERVICE)
2307 return;
2308
2309 if (u->in_audit) {
2310 /* Write audit record if we have just finished shutting down */
2311 manager_send_unit_audit(u->manager, u, AUDIT_SERVICE_STOP, state == UNIT_INACTIVE);
2312 u->in_audit = false;
2313 } else {
2314 /* Hmm, if there was no start record written write it now, so that we always have a nice pair */
2315 manager_send_unit_audit(u->manager, u, AUDIT_SERVICE_START, state == UNIT_INACTIVE);
2316
2317 if (state == UNIT_INACTIVE)
2318 manager_send_unit_audit(u->manager, u, AUDIT_SERVICE_STOP, true);
2319 }
2320}
2321
16c74914
LP
2322static bool unit_process_job(Job *j, UnitActiveState ns, UnitNotifyFlags flags) {
2323 bool unexpected = false;
2324
2325 assert(j);
2326
2327 if (j->state == JOB_WAITING)
2328
2329 /* So we reached a different state for this job. Let's see if we can run it now if it failed previously
2330 * due to EAGAIN. */
2331 job_add_to_run_queue(j);
2332
2333 /* Let's check whether the unit's new state constitutes a finished job, or maybe contradicts a running job and
2334 * hence needs to invalidate jobs. */
2335
2336 switch (j->type) {
2337
2338 case JOB_START:
2339 case JOB_VERIFY_ACTIVE:
2340
2341 if (UNIT_IS_ACTIVE_OR_RELOADING(ns))
2342 job_finish_and_invalidate(j, JOB_DONE, true, false);
2343 else if (j->state == JOB_RUNNING && ns != UNIT_ACTIVATING) {
2344 unexpected = true;
2345
2346 if (UNIT_IS_INACTIVE_OR_FAILED(ns))
2347 job_finish_and_invalidate(j, ns == UNIT_FAILED ? JOB_FAILED : JOB_DONE, true, false);
2348 }
2349
2350 break;
2351
2352 case JOB_RELOAD:
2353 case JOB_RELOAD_OR_START:
2354 case JOB_TRY_RELOAD:
2355
2356 if (j->state == JOB_RUNNING) {
2357 if (ns == UNIT_ACTIVE)
2358 job_finish_and_invalidate(j, (flags & UNIT_NOTIFY_RELOAD_FAILURE) ? JOB_FAILED : JOB_DONE, true, false);
2359 else if (!IN_SET(ns, UNIT_ACTIVATING, UNIT_RELOADING)) {
2360 unexpected = true;
2361
2362 if (UNIT_IS_INACTIVE_OR_FAILED(ns))
2363 job_finish_and_invalidate(j, ns == UNIT_FAILED ? JOB_FAILED : JOB_DONE, true, false);
2364 }
2365 }
2366
2367 break;
2368
2369 case JOB_STOP:
2370 case JOB_RESTART:
2371 case JOB_TRY_RESTART:
2372
2373 if (UNIT_IS_INACTIVE_OR_FAILED(ns))
2374 job_finish_and_invalidate(j, JOB_DONE, true, false);
2375 else if (j->state == JOB_RUNNING && ns != UNIT_DEACTIVATING) {
2376 unexpected = true;
2377 job_finish_and_invalidate(j, JOB_FAILED, true, false);
2378 }
2379
2380 break;
2381
2382 default:
2383 assert_not_reached("Job type unknown");
2384 }
2385
2386 return unexpected;
2387}
2388
2ad2e41a 2389void unit_notify(Unit *u, UnitActiveState os, UnitActiveState ns, UnitNotifyFlags flags) {
429926e9 2390 const char *reason;
8559b3b7 2391 Manager *m;
a096ed36 2392
87f0e418
LP
2393 assert(u);
2394 assert(os < _UNIT_ACTIVE_STATE_MAX);
2395 assert(ns < _UNIT_ACTIVE_STATE_MAX);
87f0e418 2396
8559b3b7
LP
2397 /* Note that this is called for all low-level state changes, even if they might map to the same high-level
2398 * UnitActiveState! That means that ns == os is an expected behavior here. For example: if a mount point is
2399 * remounted this function will be called too! */
87f0e418 2400
546ac4f0
MS
2401 m = u->manager;
2402
3c4832ad
LP
2403 /* Let's enqueue the change signal early. In case this unit has a job associated we want that this unit is in
2404 * the bus queue, so that any job change signal queued will force out the unit change signal first. */
2405 unit_add_to_dbus_queue(u);
2406
f755e3b7 2407 /* Update timestamps for state changes */
2c289ea8 2408 if (!MANAGER_IS_RELOADING(m)) {
a483fb59 2409 dual_timestamp_get(&u->state_change_timestamp);
173e3821 2410
bdbf9951 2411 if (UNIT_IS_INACTIVE_OR_FAILED(os) && !UNIT_IS_INACTIVE_OR_FAILED(ns))
a483fb59 2412 u->inactive_exit_timestamp = u->state_change_timestamp;
bdbf9951 2413 else if (!UNIT_IS_INACTIVE_OR_FAILED(os) && UNIT_IS_INACTIVE_OR_FAILED(ns))
a483fb59 2414 u->inactive_enter_timestamp = u->state_change_timestamp;
bdbf9951
LP
2415
2416 if (!UNIT_IS_ACTIVE_OR_RELOADING(os) && UNIT_IS_ACTIVE_OR_RELOADING(ns))
a483fb59 2417 u->active_enter_timestamp = u->state_change_timestamp;
bdbf9951 2418 else if (UNIT_IS_ACTIVE_OR_RELOADING(os) && !UNIT_IS_ACTIVE_OR_RELOADING(ns))
a483fb59 2419 u->active_exit_timestamp = u->state_change_timestamp;
bdbf9951 2420 }
87f0e418 2421
865cc19a 2422 /* Keep track of failed units */
8724defe 2423 (void) manager_update_failed_units(m, u, ns == UNIT_FAILED);
f755e3b7 2424
d3070fbd
LP
2425 /* Make sure the cgroup and state files are always removed when we become inactive */
2426 if (UNIT_IS_INACTIVE_OR_FAILED(ns)) {
efdb0237 2427 unit_prune_cgroup(u);
d3070fbd
LP
2428 unit_unlink_state_files(u);
2429 }
fb385181 2430
adefcf28 2431 unit_update_on_console(u);
7ed9f6cd 2432
2c289ea8 2433 if (!MANAGER_IS_RELOADING(m)) {
a1c7334b
LP
2434 bool unexpected;
2435
2436 /* Let's propagate state changes to the job */
2437 if (u->job)
2438 unexpected = unit_process_job(u->job, ns, flags);
2439 else
2440 unexpected = true;
f3bff0eb 2441
a1c7334b
LP
2442 /* If this state change happened without being requested by a job, then let's retroactively start or
2443 * stop dependencies. We skip that step when deserializing, since we don't want to create any
2444 * additional jobs just because something is already activated. */
bdbf9951
LP
2445
2446 if (unexpected) {
2447 if (UNIT_IS_INACTIVE_OR_FAILED(os) && UNIT_IS_ACTIVE_OR_ACTIVATING(ns))
2448 retroactively_start_dependencies(u);
2449 else if (UNIT_IS_ACTIVE_OR_ACTIVATING(os) && UNIT_IS_INACTIVE_OR_DEACTIVATING(ns))
2450 retroactively_stop_dependencies(u);
2451 }
5de9682c 2452
cd0504d0 2453 /* stop unneeded units regardless if going down was expected or not */
a3c1168a 2454 if (UNIT_IS_INACTIVE_OR_FAILED(ns))
cd0504d0
MS
2455 check_unneeded_dependencies(u);
2456
bdbf9951 2457 if (ns != os && ns == UNIT_FAILED) {
ed77d407 2458 log_unit_debug(u, "Unit entered failed state.");
2ad2e41a
LP
2459
2460 if (!(flags & UNIT_NOTIFY_WILL_AUTO_RESTART))
2461 unit_start_on_failure(u);
cd6d0a45 2462 }
e537352b 2463
256f65d0
LP
2464 if (UNIT_IS_ACTIVE_OR_RELOADING(ns) && !UNIT_IS_ACTIVE_OR_RELOADING(os)) {
2465 /* This unit just finished starting up */
3b2775c5 2466
6eb65e7c 2467 unit_emit_audit_start(u);
546ac4f0 2468 manager_send_unit_plymouth(m, u);
256f65d0 2469 }
bdbf9951 2470
256f65d0 2471 if (UNIT_IS_INACTIVE_OR_FAILED(ns) && !UNIT_IS_INACTIVE_OR_FAILED(os)) {
915b1d01 2472 /* This unit just stopped/failed. */
256f65d0 2473
6eb65e7c 2474 unit_emit_audit_stop(u, ns);
915b1d01 2475 unit_log_resources(u);
cd6d0a45 2476 }
f278026d
LP
2477 }
2478
31dc1ca3
LP
2479 manager_recheck_journal(m);
2480 manager_recheck_dbus(m);
e63ebf71 2481
3ecaa09b 2482 unit_trigger_notify(u);
3b2775c5 2483
8724defe 2484 if (!MANAGER_IS_RELOADING(m)) {
8559b3b7 2485 /* Maybe we finished startup and are now ready for being stopped because unneeded? */
fda09318 2486 unit_submit_to_stop_when_unneeded_queue(u);
c1e1601e 2487
8559b3b7
LP
2488 /* Maybe we finished startup, but something we needed has vanished? Let's die then. (This happens when
2489 * something BindsTo= to a Type=oneshot unit, as these units go directly from starting to inactive,
ff502445
LP
2490 * without ever entering started.) */
2491 unit_check_binds_to(u);
53c35a76 2492
429926e9
TR
2493 if (os != UNIT_FAILED && ns == UNIT_FAILED) {
2494 reason = strjoina("unit ", u->id, " failed");
36c4dc08 2495 emergency_action(m, u->failure_action, 0, u->reboot_arg, unit_failure_action_exit_status(u), reason);
429926e9
TR
2496 } else if (!UNIT_IS_INACTIVE_OR_FAILED(os) && ns == UNIT_INACTIVE) {
2497 reason = strjoina("unit ", u->id, " succeeded");
36c4dc08 2498 emergency_action(m, u->success_action, 0, u->reboot_arg, unit_success_action_exit_status(u), reason);
429926e9 2499 }
ff502445
LP
2500 }
2501
701cc384 2502 unit_add_to_gc_queue(u);
87f0e418
LP
2503}
2504
f75f613d 2505int unit_watch_pid(Unit *u, pid_t pid, bool exclusive) {
62a76913 2506 int r;
a911bb9a 2507
87f0e418 2508 assert(u);
62a76913 2509 assert(pid_is_valid(pid));
87f0e418 2510
62a76913 2511 /* Watch a specific PID */
5ba6985b 2512
f75f613d
FB
2513 /* Caller might be sure that this PID belongs to this unit only. Let's take this
2514 * opportunity to remove any stalled references to this PID as they can be created
2515 * easily (when watching a process which is not our direct child). */
2516 if (exclusive)
2517 manager_unwatch_pid(u->manager, pid);
2518
d5099efc 2519 r = set_ensure_allocated(&u->pids, NULL);
5ba6985b
LP
2520 if (r < 0)
2521 return r;
2522
62a76913 2523 r = hashmap_ensure_allocated(&u->manager->watch_pids, NULL);
a911bb9a
LP
2524 if (r < 0)
2525 return r;
2526
62a76913
LP
2527 /* First try, let's add the unit keyed by "pid". */
2528 r = hashmap_put(u->manager->watch_pids, PID_TO_PTR(pid), u);
2529 if (r == -EEXIST) {
2530 Unit **array;
2531 bool found = false;
2532 size_t n = 0;
05e343b7 2533
62a76913
LP
2534 /* OK, the "pid" key is already assigned to a different unit. Let's see if the "-pid" key (which points
2535 * to an array of Units rather than just a Unit), lists us already. */
a911bb9a 2536
62a76913
LP
2537 array = hashmap_get(u->manager->watch_pids, PID_TO_PTR(-pid));
2538 if (array)
2539 for (; array[n]; n++)
2540 if (array[n] == u)
2541 found = true;
a911bb9a 2542
62a76913
LP
2543 if (found) /* Found it already? if so, do nothing */
2544 r = 0;
2545 else {
2546 Unit **new_array;
2547
2548 /* Allocate a new array */
2549 new_array = new(Unit*, n + 2);
2550 if (!new_array)
2551 return -ENOMEM;
2552
2553 memcpy_safe(new_array, array, sizeof(Unit*) * n);
2554 new_array[n] = u;
2555 new_array[n+1] = NULL;
2556
2557 /* Add or replace the old array */
2558 r = hashmap_replace(u->manager->watch_pids, PID_TO_PTR(-pid), new_array);
2559 if (r < 0) {
2560 free(new_array);
2561 return r;
2562 }
2563
2564 free(array);
2565 }
2566 } else if (r < 0)
2567 return r;
2568
2569 r = set_put(u->pids, PID_TO_PTR(pid));
2570 if (r < 0)
2571 return r;
2572
2573 return 0;
87f0e418
LP
2574}
2575
2576void unit_unwatch_pid(Unit *u, pid_t pid) {
62a76913
LP
2577 Unit **array;
2578
87f0e418 2579 assert(u);
62a76913
LP
2580 assert(pid_is_valid(pid));
2581
2582 /* First let's drop the unit in case it's keyed as "pid". */
2583 (void) hashmap_remove_value(u->manager->watch_pids, PID_TO_PTR(pid), u);
2584
2585 /* Then, let's also drop the unit, in case it's in the array keyed by -pid */
2586 array = hashmap_get(u->manager->watch_pids, PID_TO_PTR(-pid));
2587 if (array) {
2588 size_t n, m = 0;
2589
2590 /* Let's iterate through the array, dropping our own entry */
2591 for (n = 0; array[n]; n++)
2592 if (array[n] != u)
2593 array[m++] = array[n];
2594 array[m] = NULL;
2595
2596 if (m == 0) {
2597 /* The array is now empty, remove the entire entry */
2598 assert(hashmap_remove(u->manager->watch_pids, PID_TO_PTR(-pid)) == array);
2599 free(array);
2600 }
2601 }
87f0e418 2602
fea72cc0 2603 (void) set_remove(u->pids, PID_TO_PTR(pid));
a911bb9a
LP
2604}
2605
bd44e61b
LP
2606void unit_unwatch_all_pids(Unit *u) {
2607 assert(u);
2608
2609 while (!set_isempty(u->pids))
fea72cc0 2610 unit_unwatch_pid(u, PTR_TO_PID(set_first(u->pids)));
bd44e61b 2611
efdb0237 2612 u->pids = set_free(u->pids);
a911bb9a
LP
2613}
2614
50be4f4a
LP
2615static void unit_tidy_watch_pids(Unit *u) {
2616 pid_t except1, except2;
a911bb9a
LP
2617 Iterator i;
2618 void *e;
2619
2620 assert(u);
2621
2622 /* Cleans dead PIDs from our list */
2623
50be4f4a
LP
2624 except1 = unit_main_pid(u);
2625 except2 = unit_control_pid(u);
2626
a911bb9a 2627 SET_FOREACH(e, u->pids, i) {
fea72cc0 2628 pid_t pid = PTR_TO_PID(e);
a911bb9a
LP
2629
2630 if (pid == except1 || pid == except2)
2631 continue;
2632
9f5650ae 2633 if (!pid_is_unwaited(pid))
bd44e61b 2634 unit_unwatch_pid(u, pid);
a911bb9a 2635 }
87f0e418
LP
2636}
2637
50be4f4a
LP
2638static int on_rewatch_pids_event(sd_event_source *s, void *userdata) {
2639 Unit *u = userdata;
2640
2641 assert(s);
2642 assert(u);
2643
2644 unit_tidy_watch_pids(u);
2645 unit_watch_all_pids(u);
2646
2647 /* If the PID set is empty now, then let's finish this off. */
2648 unit_synthesize_cgroup_empty_event(u);
2649
2650 return 0;
2651}
2652
2653int unit_enqueue_rewatch_pids(Unit *u) {
2654 int r;
2655
2656 assert(u);
2657
2658 if (!u->cgroup_path)
2659 return -ENOENT;
2660
2661 r = cg_unified_controller(SYSTEMD_CGROUP_CONTROLLER);
2662 if (r < 0)
2663 return r;
2664 if (r > 0) /* On unified we can use proper notifications */
2665 return 0;
2666
2667 /* Enqueues a low-priority job that will clean up dead PIDs from our list of PIDs to watch and subscribe to new
2668 * PIDs that might have appeared. We do this in a delayed job because the work might be quite slow, as it
2669 * involves issuing kill(pid, 0) on all processes we watch. */
2670
2671 if (!u->rewatch_pids_event_source) {
2672 _cleanup_(sd_event_source_unrefp) sd_event_source *s = NULL;
2673
2674 r = sd_event_add_defer(u->manager->event, &s, on_rewatch_pids_event, u);
2675 if (r < 0)
2676 return log_error_errno(r, "Failed to allocate event source for tidying watched PIDs: %m");
2677
2678 r = sd_event_source_set_priority(s, SD_EVENT_PRIORITY_IDLE);
2679 if (r < 0)
2680 return log_error_errno(r, "Failed to adjust priority of event source for tidying watched PIDs: m");
2681
2682 (void) sd_event_source_set_description(s, "tidy-watch-pids");
2683
2684 u->rewatch_pids_event_source = TAKE_PTR(s);
2685 }
2686
2687 r = sd_event_source_set_enabled(u->rewatch_pids_event_source, SD_EVENT_ONESHOT);
2688 if (r < 0)
2689 return log_error_errno(r, "Failed to enable event source for tidying watched PIDs: %m");
2690
2691 return 0;
2692}
2693
2694void unit_dequeue_rewatch_pids(Unit *u) {
2695 int r;
2696 assert(u);
2697
2698 if (!u->rewatch_pids_event_source)
2699 return;
2700
2701 r = sd_event_source_set_enabled(u->rewatch_pids_event_source, SD_EVENT_OFF);
2702 if (r < 0)
2703 log_warning_errno(r, "Failed to disable event source for tidying watched PIDs, ignoring: %m");
2704
2705 u->rewatch_pids_event_source = sd_event_source_unref(u->rewatch_pids_event_source);
2706}
2707
87f0e418
LP
2708bool unit_job_is_applicable(Unit *u, JobType j) {
2709 assert(u);
2710 assert(j >= 0 && j < _JOB_TYPE_MAX);
2711
2712 switch (j) {
2713
2714 case JOB_VERIFY_ACTIVE:
2715 case JOB_START:
e0209d83 2716 case JOB_NOP:
f5869324
LP
2717 /* Note that we don't check unit_can_start() here. That's because .device units and suchlike are not
2718 * startable by us but may appear due to external events, and it thus makes sense to permit enqueing
2719 * jobs for it. */
87f0e418
LP
2720 return true;
2721
f5869324
LP
2722 case JOB_STOP:
2723 /* Similar as above. However, perpetual units can never be stopped (neither explicitly nor due to
2724 * external events), hence it makes no sense to permit enqueing such a request either. */
2725 return !u->perpetual;
2726
87f0e418
LP
2727 case JOB_RESTART:
2728 case JOB_TRY_RESTART:
f5869324 2729 return unit_can_stop(u) && unit_can_start(u);
87f0e418
LP
2730
2731 case JOB_RELOAD:
3282591d 2732 case JOB_TRY_RELOAD:
87f0e418
LP
2733 return unit_can_reload(u);
2734
2735 case JOB_RELOAD_OR_START:
2736 return unit_can_reload(u) && unit_can_start(u);
2737
2738 default:
2739 assert_not_reached("Invalid job type");
2740 }
2741}
2742
f2341e0a
LP
2743static void maybe_warn_about_dependency(Unit *u, const char *other, UnitDependency dependency) {
2744 assert(u);
d1fab3fe 2745
f2341e0a
LP
2746 /* Only warn about some unit types */
2747 if (!IN_SET(dependency, UNIT_CONFLICTS, UNIT_CONFLICTED_BY, UNIT_BEFORE, UNIT_AFTER, UNIT_ON_FAILURE, UNIT_TRIGGERS, UNIT_TRIGGERED_BY))
2748 return;
3f3cc397 2749
f2341e0a
LP
2750 if (streq_ptr(u->id, other))
2751 log_unit_warning(u, "Dependency %s=%s dropped", unit_dependency_to_string(dependency), u->id);
2752 else
2753 log_unit_warning(u, "Dependency %s=%s dropped, merged into %s", unit_dependency_to_string(dependency), strna(other), u->id);
d1fab3fe
ZJS
2754}
2755
eef85c4a
LP
2756static int unit_add_dependency_hashmap(
2757 Hashmap **h,
2758 Unit *other,
2759 UnitDependencyMask origin_mask,
2760 UnitDependencyMask destination_mask) {
2761
2762 UnitDependencyInfo info;
2763 int r;
2764
2765 assert(h);
2766 assert(other);
2767 assert(origin_mask < _UNIT_DEPENDENCY_MASK_FULL);
2768 assert(destination_mask < _UNIT_DEPENDENCY_MASK_FULL);
2769 assert(origin_mask > 0 || destination_mask > 0);
2770
2771 r = hashmap_ensure_allocated(h, NULL);
2772 if (r < 0)
2773 return r;
2774
2775 assert_cc(sizeof(void*) == sizeof(info));
2776
2777 info.data = hashmap_get(*h, other);
2778 if (info.data) {
2779 /* Entry already exists. Add in our mask. */
2780
d94a24ca
ZJS
2781 if (FLAGS_SET(origin_mask, info.origin_mask) &&
2782 FLAGS_SET(destination_mask, info.destination_mask))
eef85c4a
LP
2783 return 0; /* NOP */
2784
2785 info.origin_mask |= origin_mask;
2786 info.destination_mask |= destination_mask;
2787
2788 r = hashmap_update(*h, other, info.data);
2789 } else {
2790 info = (UnitDependencyInfo) {
2791 .origin_mask = origin_mask,
2792 .destination_mask = destination_mask,
2793 };
2794
2795 r = hashmap_put(*h, other, info.data);
2796 }
2797 if (r < 0)
2798 return r;
2799
2800 return 1;
2801}
2802
2803int unit_add_dependency(
2804 Unit *u,
2805 UnitDependency d,
2806 Unit *other,
2807 bool add_reference,
2808 UnitDependencyMask mask) {
87f0e418
LP
2809
2810 static const UnitDependency inverse_table[_UNIT_DEPENDENCY_MAX] = {
2811 [UNIT_REQUIRES] = UNIT_REQUIRED_BY,
87f0e418 2812 [UNIT_WANTS] = UNIT_WANTED_BY,
be7d9ff7 2813 [UNIT_REQUISITE] = UNIT_REQUISITE_OF,
7f2cddae 2814 [UNIT_BINDS_TO] = UNIT_BOUND_BY,
60649f17 2815 [UNIT_PART_OF] = UNIT_CONSISTS_OF,
be7d9ff7 2816 [UNIT_REQUIRED_BY] = UNIT_REQUIRES,
be7d9ff7 2817 [UNIT_REQUISITE_OF] = UNIT_REQUISITE,
be7d9ff7 2818 [UNIT_WANTED_BY] = UNIT_WANTS,
7f2cddae 2819 [UNIT_BOUND_BY] = UNIT_BINDS_TO,
60649f17 2820 [UNIT_CONSISTS_OF] = UNIT_PART_OF,
69dd2852
LP
2821 [UNIT_CONFLICTS] = UNIT_CONFLICTED_BY,
2822 [UNIT_CONFLICTED_BY] = UNIT_CONFLICTS,
87f0e418 2823 [UNIT_BEFORE] = UNIT_AFTER,
701cc384 2824 [UNIT_AFTER] = UNIT_BEFORE,
5de9682c 2825 [UNIT_ON_FAILURE] = _UNIT_DEPENDENCY_INVALID,
701cc384 2826 [UNIT_REFERENCES] = UNIT_REFERENCED_BY,
57020a3a
LP
2827 [UNIT_REFERENCED_BY] = UNIT_REFERENCES,
2828 [UNIT_TRIGGERS] = UNIT_TRIGGERED_BY,
4dcc1cb4 2829 [UNIT_TRIGGERED_BY] = UNIT_TRIGGERS,
7f2cddae 2830 [UNIT_PROPAGATES_RELOAD_TO] = UNIT_RELOAD_PROPAGATED_FROM,
85e9a101 2831 [UNIT_RELOAD_PROPAGATED_FROM] = UNIT_PROPAGATES_RELOAD_TO,
613b411c 2832 [UNIT_JOINS_NAMESPACE_OF] = UNIT_JOINS_NAMESPACE_OF,
87f0e418 2833 };
eef85c4a
LP
2834 Unit *original_u = u, *original_other = other;
2835 int r;
87f0e418
LP
2836
2837 assert(u);
2838 assert(d >= 0 && d < _UNIT_DEPENDENCY_MAX);
87f0e418
LP
2839 assert(other);
2840
9f151f29
LP
2841 u = unit_follow_merge(u);
2842 other = unit_follow_merge(other);
2843
87f0e418
LP
2844 /* We won't allow dependencies on ourselves. We will not
2845 * consider them an error however. */
d1fab3fe 2846 if (u == other) {
eef85c4a 2847 maybe_warn_about_dependency(original_u, original_other->id, d);
87f0e418 2848 return 0;
d1fab3fe 2849 }
87f0e418 2850
eef85c4a
LP
2851 if ((d == UNIT_BEFORE && other->type == UNIT_DEVICE) ||
2852 (d == UNIT_AFTER && u->type == UNIT_DEVICE)) {
dd5e7000
ZJS
2853 log_unit_warning(u, "Dependency Before=%s ignored (.device units cannot be delayed)", other->id);
2854 return 0;
2855 }
2856
eef85c4a 2857 r = unit_add_dependency_hashmap(u->dependencies + d, other, mask, 0);
613b411c 2858 if (r < 0)
87f0e418
LP
2859 return r;
2860
eef85c4a
LP
2861 if (inverse_table[d] != _UNIT_DEPENDENCY_INVALID && inverse_table[d] != d) {
2862 r = unit_add_dependency_hashmap(other->dependencies + inverse_table[d], u, 0, mask);
613b411c
LP
2863 if (r < 0)
2864 return r;
2865 }
2866
2867 if (add_reference) {
eef85c4a 2868 r = unit_add_dependency_hashmap(u->dependencies + UNIT_REFERENCES, other, mask, 0);
613b411c 2869 if (r < 0)
5de9682c
LP
2870 return r;
2871
eef85c4a 2872 r = unit_add_dependency_hashmap(other->dependencies + UNIT_REFERENCED_BY, u, 0, mask);
613b411c 2873 if (r < 0)
701cc384 2874 return r;
613b411c 2875 }
87f0e418 2876
c1e1601e 2877 unit_add_to_dbus_queue(u);
87f0e418
LP
2878 return 0;
2879}
0301abf4 2880
eef85c4a 2881int unit_add_two_dependencies(Unit *u, UnitDependency d, UnitDependency e, Unit *other, bool add_reference, UnitDependencyMask mask) {
2c966c03
LP
2882 int r;
2883
2884 assert(u);
2885
eef85c4a 2886 r = unit_add_dependency(u, d, other, add_reference, mask);
3f3cc397 2887 if (r < 0)
2c966c03
LP
2888 return r;
2889
eef85c4a 2890 return unit_add_dependency(u, e, other, add_reference, mask);
2c966c03
LP
2891}
2892
23e8c796 2893static int resolve_template(Unit *u, const char *name, char **buf, const char **ret) {
7410616c 2894 int r;
9e2f7c11
LP
2895
2896 assert(u);
23e8c796 2897 assert(name);
7410616c
LP
2898 assert(buf);
2899 assert(ret);
9e2f7c11 2900
7410616c
LP
2901 if (!unit_name_is_valid(name, UNIT_NAME_TEMPLATE)) {
2902 *buf = NULL;
2903 *ret = name;
2904 return 0;
9e2f7c11
LP
2905 }
2906
ac155bb8 2907 if (u->instance)
7410616c 2908 r = unit_name_replace_instance(name, u->instance, buf);
9e2f7c11 2909 else {
ae018d9b 2910 _cleanup_free_ char *i = NULL;
9e2f7c11 2911
7410616c
LP
2912 r = unit_name_to_prefix(u->id, &i);
2913 if (r < 0)
2914 return r;
9e2f7c11 2915
7410616c 2916 r = unit_name_replace_instance(name, i, buf);
9e2f7c11 2917 }
7410616c
LP
2918 if (r < 0)
2919 return r;
9e2f7c11 2920
7410616c
LP
2921 *ret = *buf;
2922 return 0;
9e2f7c11
LP
2923}
2924
35d8c19a 2925int unit_add_dependency_by_name(Unit *u, UnitDependency d, const char *name, bool add_reference, UnitDependencyMask mask) {
7410616c 2926 _cleanup_free_ char *buf = NULL;
09b6b09f
LP
2927 Unit *other;
2928 int r;
2929
9e2f7c11 2930 assert(u);
35d8c19a 2931 assert(name);
09b6b09f 2932
23e8c796 2933 r = resolve_template(u, name, &buf, &name);
7410616c
LP
2934 if (r < 0)
2935 return r;
09b6b09f 2936
35d8c19a 2937 r = manager_load_unit(u->manager, name, NULL, NULL, &other);
8afbb8e1
LP
2938 if (r < 0)
2939 return r;
9e2f7c11 2940
eef85c4a 2941 return unit_add_dependency(u, d, other, add_reference, mask);
09b6b09f
LP
2942}
2943
5a724170 2944int unit_add_two_dependencies_by_name(Unit *u, UnitDependency d, UnitDependency e, const char *name, bool add_reference, UnitDependencyMask mask) {
7410616c 2945 _cleanup_free_ char *buf = NULL;
2c966c03
LP
2946 Unit *other;
2947 int r;
2c966c03
LP
2948
2949 assert(u);
5a724170 2950 assert(name);
2c966c03 2951
23e8c796 2952 r = resolve_template(u, name, &buf, &name);
7410616c
LP
2953 if (r < 0)
2954 return r;
2c966c03 2955
5a724170 2956 r = manager_load_unit(u->manager, name, NULL, NULL, &other);
3f3cc397 2957 if (r < 0)
68eda4bd 2958 return r;
2c966c03 2959
eef85c4a 2960 return unit_add_two_dependencies(u, d, e, other, add_reference, mask);
2c966c03
LP
2961}
2962
0301abf4 2963int set_unit_path(const char *p) {
0301abf4 2964 /* This is mostly for debug purposes */
cbe46ead 2965 if (setenv("SYSTEMD_UNIT_PATH", p, 1) < 0)
26d04f86 2966 return -errno;
0301abf4
LP
2967
2968 return 0;
2969}
88066b3a 2970
ea430986 2971char *unit_dbus_path(Unit *u) {
ea430986
LP
2972 assert(u);
2973
ac155bb8 2974 if (!u->id)
04ade7d2
LP
2975 return NULL;
2976
48899192 2977 return unit_dbus_path_from_name(u->id);
ea430986
LP
2978}
2979
4b58153d
LP
2980char *unit_dbus_path_invocation_id(Unit *u) {
2981 assert(u);
2982
2983 if (sd_id128_is_null(u->invocation_id))
2984 return NULL;
2985
2986 return unit_dbus_path_from_name(u->invocation_id_string);
2987}
2988
d79200e2
LP
2989int unit_set_slice(Unit *u, Unit *slice) {
2990 assert(u);
2991 assert(slice);
2992
2993 /* Sets the unit slice if it has not been set before. Is extra
2994 * careful, to only allow this for units that actually have a
2995 * cgroup context. Also, we don't allow to set this for slices
2996 * (since the parent slice is derived from the name). Make
2997 * sure the unit we set is actually a slice. */
2998
2999 if (!UNIT_HAS_CGROUP_CONTEXT(u))
3000 return -EOPNOTSUPP;
3001
3002 if (u->type == UNIT_SLICE)
3003 return -EINVAL;
3004
102ef982
LP
3005 if (unit_active_state(u) != UNIT_INACTIVE)
3006 return -EBUSY;
3007
d79200e2
LP
3008 if (slice->type != UNIT_SLICE)
3009 return -EINVAL;
3010
efdb0237
LP
3011 if (unit_has_name(u, SPECIAL_INIT_SCOPE) &&
3012 !unit_has_name(slice, SPECIAL_ROOT_SLICE))
3013 return -EPERM;
3014
d79200e2
LP
3015 if (UNIT_DEREF(u->slice) == slice)
3016 return 0;
3017
99e66921
TH
3018 /* Disallow slice changes if @u is already bound to cgroups */
3019 if (UNIT_ISSET(u->slice) && u->cgroup_realized)
d79200e2
LP
3020 return -EBUSY;
3021
7f7d01ed 3022 unit_ref_set(&u->slice, u, slice);
d79200e2
LP
3023 return 1;
3024}
3025
3026int unit_set_default_slice(Unit *u) {
a8833944 3027 const char *slice_name;
a016b922
LP
3028 Unit *slice;
3029 int r;
3030
3031 assert(u);
3032
9444b1f2 3033 if (UNIT_ISSET(u->slice))
a016b922
LP
3034 return 0;
3035
a8833944
LP
3036 if (u->instance) {
3037 _cleanup_free_ char *prefix = NULL, *escaped = NULL;
68eda4bd 3038
a8833944
LP
3039 /* Implicitly place all instantiated units in their
3040 * own per-template slice */
3041
7410616c
LP
3042 r = unit_name_to_prefix(u->id, &prefix);
3043 if (r < 0)
3044 return r;
a8833944
LP
3045
3046 /* The prefix is already escaped, but it might include
3047 * "-" which has a special meaning for slice units,
3048 * hence escape it here extra. */
7410616c 3049 escaped = unit_name_escape(prefix);
a8833944
LP
3050 if (!escaped)
3051 return -ENOMEM;
3052
463d0d15 3053 if (MANAGER_IS_SYSTEM(u->manager))
00e7b3c8 3054 slice_name = strjoina("system-", escaped, ".slice");
a8833944 3055 else
00e7b3c8 3056 slice_name = strjoina(escaped, ".slice");
a8833944
LP
3057 } else
3058 slice_name =
463d0d15 3059 MANAGER_IS_SYSTEM(u->manager) && !unit_has_name(u, SPECIAL_INIT_SCOPE)
a8833944
LP
3060 ? SPECIAL_SYSTEM_SLICE
3061 : SPECIAL_ROOT_SLICE;
3062
3063 r = manager_load_unit(u->manager, slice_name, NULL, NULL, &slice);
a016b922
LP
3064 if (r < 0)
3065 return r;
3066
d79200e2 3067 return unit_set_slice(u, slice);
a016b922
LP
3068}
3069
9444b1f2
LP
3070const char *unit_slice_name(Unit *u) {
3071 assert(u);
3072
3073 if (!UNIT_ISSET(u->slice))
3074 return NULL;
3075
3076 return UNIT_DEREF(u->slice)->id;
3077}
3078
f6ff8c29 3079int unit_load_related_unit(Unit *u, const char *type, Unit **_found) {
78edb35a 3080 _cleanup_free_ char *t = NULL;
f6ff8c29
LP
3081 int r;
3082
3083 assert(u);
3084 assert(type);
3085 assert(_found);
3086
7410616c
LP
3087 r = unit_name_change_suffix(u->id, type, &t);
3088 if (r < 0)
3089 return r;
3090 if (unit_has_name(u, t))
3091 return -EINVAL;
f6ff8c29 3092
ac155bb8 3093 r = manager_load_unit(u->manager, t, NULL, NULL, _found);
9e2f7c11 3094 assert(r < 0 || *_found != u);
f6ff8c29
LP
3095 return r;
3096}
3097
bbc29086
DM
3098static int signal_name_owner_changed(sd_bus_message *message, void *userdata, sd_bus_error *error) {
3099 const char *name, *old_owner, *new_owner;
3100 Unit *u = userdata;
3101 int r;
3102
3103 assert(message);
3104 assert(u);
3105
3106 r = sd_bus_message_read(message, "sss", &name, &old_owner, &new_owner);
3107 if (r < 0) {
3108 bus_log_parse_error(r);
3109 return 0;
3110 }
3111
a8ea93a5
LP
3112 old_owner = empty_to_null(old_owner);
3113 new_owner = empty_to_null(new_owner);
b0076268 3114
bbc29086
DM
3115 if (UNIT_VTABLE(u)->bus_name_owner_change)
3116 UNIT_VTABLE(u)->bus_name_owner_change(u, name, old_owner, new_owner);
3117
3118 return 0;
3119}
3120
9806e87d
LP
3121int unit_install_bus_match(Unit *u, sd_bus *bus, const char *name) {
3122 const char *match;
bbc29086 3123
9806e87d
LP
3124 assert(u);
3125 assert(bus);
3126 assert(name);
bbc29086
DM
3127
3128 if (u->match_bus_slot)
3129 return -EBUSY;
3130
9806e87d 3131 match = strjoina("type='signal',"
81d62103
ZJS
3132 "sender='org.freedesktop.DBus',"
3133 "path='/org/freedesktop/DBus',"
3134 "interface='org.freedesktop.DBus',"
3135 "member='NameOwnerChanged',"
3136 "arg0='", name, "'");
bbc29086 3137
75152a4d 3138 return sd_bus_add_match_async(bus, &u->match_bus_slot, match, signal_name_owner_changed, NULL, u);
bbc29086
DM
3139}
3140
05e343b7 3141int unit_watch_bus_name(Unit *u, const char *name) {
bbc29086
DM
3142 int r;
3143
05e343b7
LP
3144 assert(u);
3145 assert(name);
3146
3147 /* Watch a specific name on the bus. We only support one unit
3148 * watching each name for now. */
3149
bbc29086
DM
3150 if (u->manager->api_bus) {
3151 /* If the bus is already available, install the match directly.
3152 * Otherwise, just put the name in the list. bus_setup_api() will take care later. */
9806e87d 3153 r = unit_install_bus_match(u, u->manager->api_bus, name);
bbc29086 3154 if (r < 0)
8ea823b6 3155 return log_warning_errno(r, "Failed to subscribe to NameOwnerChanged signal for '%s': %m", name);
bbc29086
DM
3156 }
3157
3158 r = hashmap_put(u->manager->watch_bus, name, u);
3159 if (r < 0) {
3160 u->match_bus_slot = sd_bus_slot_unref(u->match_bus_slot);
3161 return log_warning_errno(r, "Failed to put bus name to hashmap: %m");
3162 }
3163
3164 return 0;
05e343b7
LP
3165}
3166
3167void unit_unwatch_bus_name(Unit *u, const char *name) {
3168 assert(u);
3169 assert(name);
3170
8367fea5 3171 (void) hashmap_remove_value(u->manager->watch_bus, name, u);
bbc29086 3172 u->match_bus_slot = sd_bus_slot_unref(u->match_bus_slot);
05e343b7
LP
3173}
3174
a16e1123
LP
3175bool unit_can_serialize(Unit *u) {
3176 assert(u);
3177
3178 return UNIT_VTABLE(u)->serialize && UNIT_VTABLE(u)->deserialize_item;
3179}
3180
d68c645b 3181static int serialize_cgroup_mask(FILE *f, const char *key, CGroupMask mask) {
8b108bd0 3182 _cleanup_free_ char *s = NULL;
d68c645b 3183 int r;
8b108bd0
FB
3184
3185 assert(f);
3186 assert(key);
3187
d68c645b
LP
3188 if (mask == 0)
3189 return 0;
3190
3191 r = cg_mask_to_string(mask, &s);
3192 if (r < 0)
3193 return log_error_errno(r, "Failed to format cgroup mask: %m");
3194
3195 return serialize_item(f, key, s);
8b108bd0
FB
3196}
3197
b82f71c7 3198static const char *const ip_accounting_metric_field[_CGROUP_IP_ACCOUNTING_METRIC_MAX] = {
6b659ed8
LP
3199 [CGROUP_IP_INGRESS_BYTES] = "ip-accounting-ingress-bytes",
3200 [CGROUP_IP_INGRESS_PACKETS] = "ip-accounting-ingress-packets",
3201 [CGROUP_IP_EGRESS_BYTES] = "ip-accounting-egress-bytes",
3202 [CGROUP_IP_EGRESS_PACKETS] = "ip-accounting-egress-packets",
3203};
3204
6b78f9b4 3205int unit_serialize(Unit *u, FILE *f, FDSet *fds, bool serialize_jobs) {
6b659ed8 3206 CGroupIPAccountingMetric m;
a16e1123
LP
3207 int r;
3208
3209 assert(u);
3210 assert(f);
3211 assert(fds);
3212
9bdb98c5 3213 if (unit_can_serialize(u)) {
9bdb98c5 3214 r = UNIT_VTABLE(u)->serialize(u, f, fds);
613b411c
LP
3215 if (r < 0)
3216 return r;
e0209d83
MS
3217 }
3218
d68c645b 3219 (void) serialize_dual_timestamp(f, "state-change-timestamp", &u->state_change_timestamp);
a483fb59 3220
d68c645b
LP
3221 (void) serialize_dual_timestamp(f, "inactive-exit-timestamp", &u->inactive_exit_timestamp);
3222 (void) serialize_dual_timestamp(f, "active-enter-timestamp", &u->active_enter_timestamp);
3223 (void) serialize_dual_timestamp(f, "active-exit-timestamp", &u->active_exit_timestamp);
3224 (void) serialize_dual_timestamp(f, "inactive-enter-timestamp", &u->inactive_enter_timestamp);
a483fb59 3225
d68c645b
LP
3226 (void) serialize_dual_timestamp(f, "condition-timestamp", &u->condition_timestamp);
3227 (void) serialize_dual_timestamp(f, "assert-timestamp", &u->assert_timestamp);
2791a8f8 3228
ac155bb8 3229 if (dual_timestamp_is_set(&u->condition_timestamp))
d68c645b 3230 (void) serialize_bool(f, "condition-result", u->condition_result);
10717a1a 3231
59fccdc5 3232 if (dual_timestamp_is_set(&u->assert_timestamp))
d68c645b 3233 (void) serialize_bool(f, "assert-result", u->assert_result);
59fccdc5 3234
d68c645b
LP
3235 (void) serialize_bool(f, "transient", u->transient);
3236 (void) serialize_bool(f, "in-audit", u->in_audit);
fe700f46 3237
d68c645b
LP
3238 (void) serialize_bool(f, "exported-invocation-id", u->exported_invocation_id);
3239 (void) serialize_bool(f, "exported-log-level-max", u->exported_log_level_max);
3240 (void) serialize_bool(f, "exported-log-extra-fields", u->exported_log_extra_fields);
3241 (void) serialize_bool(f, "exported-log-rate-limit-interval", u->exported_log_rate_limit_interval);
3242 (void) serialize_bool(f, "exported-log-rate-limit-burst", u->exported_log_rate_limit_burst);
0e699122 3243
d68c645b 3244 (void) serialize_item_format(f, "cpu-usage-base", "%" PRIu64, u->cpu_usage_base);
fe700f46 3245 if (u->cpu_usage_last != NSEC_INFINITY)
d68c645b 3246 (void) serialize_item_format(f, "cpu-usage-last", "%" PRIu64, u->cpu_usage_last);
c2756a68
LP
3247
3248 if (u->cgroup_path)
d68c645b
LP
3249 (void) serialize_item(f, "cgroup", u->cgroup_path);
3250
3251 (void) serialize_bool(f, "cgroup-realized", u->cgroup_realized);
3252 (void) serialize_cgroup_mask(f, "cgroup-realized-mask", u->cgroup_realized_mask);
3253 (void) serialize_cgroup_mask(f, "cgroup-enabled-mask", u->cgroup_enabled_mask);
3254 (void) serialize_cgroup_mask(f, "cgroup-invalidated-mask", u->cgroup_invalidated_mask);
c2756a68 3255
00d9ef85 3256 if (uid_is_valid(u->ref_uid))
d68c645b 3257 (void) serialize_item_format(f, "ref-uid", UID_FMT, u->ref_uid);
00d9ef85 3258 if (gid_is_valid(u->ref_gid))
d68c645b 3259 (void) serialize_item_format(f, "ref-gid", GID_FMT, u->ref_gid);
00d9ef85 3260
4b58153d 3261 if (!sd_id128_is_null(u->invocation_id))
d68c645b 3262 (void) serialize_item_format(f, "invocation-id", SD_ID128_FORMAT_STR, SD_ID128_FORMAT_VAL(u->invocation_id));
4b58153d 3263
05a98afd
LP
3264 bus_track_serialize(u->bus_track, f, "ref");
3265
6b659ed8
LP
3266 for (m = 0; m < _CGROUP_IP_ACCOUNTING_METRIC_MAX; m++) {
3267 uint64_t v;
3268
3269 r = unit_get_ip_accounting(u, m, &v);
3270 if (r >= 0)
d68c645b 3271 (void) serialize_item_format(f, ip_accounting_metric_field[m], "%" PRIu64, v);
6b659ed8
LP
3272 }
3273
613b411c
LP
3274 if (serialize_jobs) {
3275 if (u->job) {
d68c645b 3276 fputs("job\n", f);
05a98afd 3277 job_serialize(u->job, f);
613b411c
LP
3278 }
3279
3280 if (u->nop_job) {
d68c645b 3281 fputs("job\n", f);
05a98afd 3282 job_serialize(u->nop_job, f);
613b411c
LP
3283 }
3284 }
3285
a16e1123
LP
3286 /* End marker */
3287 fputc('\n', f);
3288 return 0;
3289}
3290
b17c9620
LP
3291static int unit_deserialize_job(Unit *u, FILE *f) {
3292 _cleanup_(job_freep) Job *j = NULL;
3293 int r;
3294
3295 assert(u);
3296 assert(f);
3297
3298 j = job_new_raw(u);
3299 if (!j)
3300 return log_oom();
3301
3302 r = job_deserialize(j, f);
3303 if (r < 0)
3304 return r;
3305
3306 r = job_install_deserialized(j);
3307 if (r < 0)
3308 return r;
3309
3310 TAKE_PTR(j);
3311 return 0;
3312}
3313
a16e1123
LP
3314int unit_deserialize(Unit *u, FILE *f, FDSet *fds) {
3315 int r;
3316
3317 assert(u);
3318 assert(f);
3319 assert(fds);
3320
a16e1123 3321 for (;;) {
8948b341 3322 _cleanup_free_ char *line = NULL;
6b659ed8 3323 CGroupIPAccountingMetric m;
8948b341 3324 char *l, *v;
a16e1123
LP
3325 size_t k;
3326
8948b341
LP
3327 r = read_line(f, LONG_LINE_MAX, &line);
3328 if (r < 0)
3329 return log_error_errno(r, "Failed to read serialization line: %m");
3330 if (r == 0) /* eof */
3331 break;
a16e1123
LP
3332
3333 l = strstrip(line);
8948b341 3334 if (isempty(l)) /* End marker */
a483fb59 3335 break;
a16e1123
LP
3336
3337 k = strcspn(l, "=");
3338
3339 if (l[k] == '=') {
3340 l[k] = 0;
3341 v = l+k+1;
3342 } else
3343 v = l+k;
3344
cca098b0 3345 if (streq(l, "job")) {
39a18c60 3346 if (v[0] == '\0') {
b17c9620
LP
3347 /* New-style serialized job */
3348 r = unit_deserialize_job(u, f);
3349 if (r < 0)
e0209d83 3350 return r;
b17c9620 3351 } else /* Legacy for pre-44 */
ed10fa8c 3352 log_unit_warning(u, "Update from too old systemd versions are unsupported, cannot deserialize job: %s", v);
cca098b0 3353 continue;
a483fb59 3354 } else if (streq(l, "state-change-timestamp")) {
d68c645b 3355 (void) deserialize_dual_timestamp(v, &u->state_change_timestamp);
a483fb59 3356 continue;
8aaf019b 3357 } else if (streq(l, "inactive-exit-timestamp")) {
d68c645b 3358 (void) deserialize_dual_timestamp(v, &u->inactive_exit_timestamp);
8aaf019b
LP
3359 continue;
3360 } else if (streq(l, "active-enter-timestamp")) {
d68c645b 3361 (void) deserialize_dual_timestamp(v, &u->active_enter_timestamp);
8aaf019b
LP
3362 continue;
3363 } else if (streq(l, "active-exit-timestamp")) {
d68c645b 3364 (void) deserialize_dual_timestamp(v, &u->active_exit_timestamp);
8aaf019b
LP
3365 continue;
3366 } else if (streq(l, "inactive-enter-timestamp")) {
d68c645b 3367 (void) deserialize_dual_timestamp(v, &u->inactive_enter_timestamp);
8aaf019b 3368 continue;
2791a8f8 3369 } else if (streq(l, "condition-timestamp")) {
d68c645b 3370 (void) deserialize_dual_timestamp(v, &u->condition_timestamp);
2791a8f8 3371 continue;
59fccdc5 3372 } else if (streq(l, "assert-timestamp")) {
d68c645b 3373 (void) deserialize_dual_timestamp(v, &u->assert_timestamp);
59fccdc5 3374 continue;
2791a8f8 3375 } else if (streq(l, "condition-result")) {
2791a8f8 3376
e911de99
LP
3377 r = parse_boolean(v);
3378 if (r < 0)
f2341e0a 3379 log_unit_debug(u, "Failed to parse condition result value %s, ignoring.", v);
2791a8f8 3380 else
e911de99 3381 u->condition_result = r;
efbac6d2
LP
3382
3383 continue;
c2756a68 3384
59fccdc5 3385 } else if (streq(l, "assert-result")) {
59fccdc5 3386
e911de99
LP
3387 r = parse_boolean(v);
3388 if (r < 0)
f2341e0a 3389 log_unit_debug(u, "Failed to parse assert result value %s, ignoring.", v);
59fccdc5 3390 else
e911de99 3391 u->assert_result = r;
59fccdc5
LP
3392
3393 continue;
3394
c2756a68 3395 } else if (streq(l, "transient")) {
c2756a68 3396
e911de99
LP
3397 r = parse_boolean(v);
3398 if (r < 0)
f2341e0a 3399 log_unit_debug(u, "Failed to parse transient bool %s, ignoring.", v);
c2756a68 3400 else
e911de99 3401 u->transient = r;
c2756a68
LP
3402
3403 continue;
e911de99 3404
0e699122
LP
3405 } else if (streq(l, "in-audit")) {
3406
3407 r = parse_boolean(v);
3408 if (r < 0)
3409 log_unit_debug(u, "Failed to parse in-audit bool %s, ignoring.", v);
3410 else
3411 u->in_audit = r;
3412
3413 continue;
3414
d3070fbd
LP
3415 } else if (streq(l, "exported-invocation-id")) {
3416
3417 r = parse_boolean(v);
3418 if (r < 0)
3419 log_unit_debug(u, "Failed to parse exported invocation ID bool %s, ignoring.", v);
3420 else
3421 u->exported_invocation_id = r;
3422
3423 continue;
3424
3425 } else if (streq(l, "exported-log-level-max")) {
3426
3427 r = parse_boolean(v);
3428 if (r < 0)
3429 log_unit_debug(u, "Failed to parse exported log level max bool %s, ignoring.", v);
3430 else
3431 u->exported_log_level_max = r;
3432
3433 continue;
3434
3435 } else if (streq(l, "exported-log-extra-fields")) {
3436
3437 r = parse_boolean(v);
3438 if (r < 0)
3439 log_unit_debug(u, "Failed to parse exported log extra fields bool %s, ignoring.", v);
3440 else
3441 u->exported_log_extra_fields = r;
3442
3443 continue;
3444
90fc172e
AZ
3445 } else if (streq(l, "exported-log-rate-limit-interval")) {
3446
3447 r = parse_boolean(v);
3448 if (r < 0)
3449 log_unit_debug(u, "Failed to parse exported log rate limit interval %s, ignoring.", v);
3450 else
3451 u->exported_log_rate_limit_interval = r;
3452
3453 continue;
3454
3455 } else if (streq(l, "exported-log-rate-limit-burst")) {
3456
3457 r = parse_boolean(v);
3458 if (r < 0)
3459 log_unit_debug(u, "Failed to parse exported log rate limit burst %s, ignoring.", v);
3460 else
3461 u->exported_log_rate_limit_burst = r;
3462
3463 continue;
3464
fe700f46 3465 } else if (STR_IN_SET(l, "cpu-usage-base", "cpuacct-usage-base")) {
5ad096b3 3466
66ebf6c0 3467 r = safe_atou64(v, &u->cpu_usage_base);
5ad096b3 3468 if (r < 0)
fe700f46
LP
3469 log_unit_debug(u, "Failed to parse CPU usage base %s, ignoring.", v);
3470
3471 continue;
3472
3473 } else if (streq(l, "cpu-usage-last")) {
3474
3475 r = safe_atou64(v, &u->cpu_usage_last);
3476 if (r < 0)
3477 log_unit_debug(u, "Failed to read CPU usage last %s, ignoring.", v);
5ad096b3 3478
0f908397 3479 continue;
4e595329 3480
e911de99 3481 } else if (streq(l, "cgroup")) {
72673e86 3482
e911de99
LP
3483 r = unit_set_cgroup_path(u, v);
3484 if (r < 0)
f2341e0a 3485 log_unit_debug_errno(u, r, "Failed to set cgroup path %s, ignoring: %m", v);
4e595329 3486
efdb0237
LP
3487 (void) unit_watch_cgroup(u);
3488
de1d4f9b
WF
3489 continue;
3490 } else if (streq(l, "cgroup-realized")) {
3491 int b;
3492
3493 b = parse_boolean(v);
3494 if (b < 0)
3495 log_unit_debug(u, "Failed to parse cgroup-realized bool %s, ignoring.", v);
3496 else
3497 u->cgroup_realized = b;
3498
c2756a68 3499 continue;
00d9ef85 3500
8b108bd0
FB
3501 } else if (streq(l, "cgroup-realized-mask")) {
3502
3503 r = cg_mask_from_string(v, &u->cgroup_realized_mask);
3504 if (r < 0)
3505 log_unit_debug(u, "Failed to parse cgroup-realized-mask %s, ignoring.", v);
3506 continue;
3507
3508 } else if (streq(l, "cgroup-enabled-mask")) {
3509
3510 r = cg_mask_from_string(v, &u->cgroup_enabled_mask);
3511 if (r < 0)
3512 log_unit_debug(u, "Failed to parse cgroup-enabled-mask %s, ignoring.", v);
3513 continue;
3514
17f14955 3515 } else if (streq(l, "cgroup-invalidated-mask")) {
906c06f6 3516
17f14955 3517 r = cg_mask_from_string(v, &u->cgroup_invalidated_mask);
906c06f6 3518 if (r < 0)
17f14955 3519 log_unit_debug(u, "Failed to parse cgroup-invalidated-mask %s, ignoring.", v);
906c06f6
DM
3520 continue;
3521
00d9ef85
LP
3522 } else if (streq(l, "ref-uid")) {
3523 uid_t uid;
3524
3525 r = parse_uid(v, &uid);
3526 if (r < 0)
3527 log_unit_debug(u, "Failed to parse referenced UID %s, ignoring.", v);
3528 else
3529 unit_ref_uid_gid(u, uid, GID_INVALID);
3530
3531 continue;
3532
3533 } else if (streq(l, "ref-gid")) {
3534 gid_t gid;
3535
3536 r = parse_gid(v, &gid);
3537 if (r < 0)
3538 log_unit_debug(u, "Failed to parse referenced GID %s, ignoring.", v);
3539 else
3540 unit_ref_uid_gid(u, UID_INVALID, gid);
3541
5f616d5f
LP
3542 continue;
3543
05a98afd
LP
3544 } else if (streq(l, "ref")) {
3545
3546 r = strv_extend(&u->deserialized_refs, v);
3547 if (r < 0)
d68c645b 3548 return log_oom();
05a98afd 3549
4b58153d
LP
3550 continue;
3551 } else if (streq(l, "invocation-id")) {
3552 sd_id128_t id;
3553
3554 r = sd_id128_from_string(v, &id);
3555 if (r < 0)
3556 log_unit_debug(u, "Failed to parse invocation id %s, ignoring.", v);
3557 else {
3558 r = unit_set_invocation_id(u, id);
3559 if (r < 0)
3560 log_unit_warning_errno(u, r, "Failed to set invocation ID for unit: %m");
3561 }
3562
00d9ef85 3563 continue;
8aaf019b 3564 }
cca098b0 3565
6b659ed8
LP
3566 /* Check if this is an IP accounting metric serialization field */
3567 for (m = 0; m < _CGROUP_IP_ACCOUNTING_METRIC_MAX; m++)
3568 if (streq(l, ip_accounting_metric_field[m]))
3569 break;
3570 if (m < _CGROUP_IP_ACCOUNTING_METRIC_MAX) {
3571 uint64_t c;
3572
3573 r = safe_atou64(v, &c);
3574 if (r < 0)
3575 log_unit_debug(u, "Failed to parse IP accounting value %s, ignoring.", v);
3576 else
3577 u->ip_accounting_extra[m] = c;
3578 continue;
3579 }
3580
9bdb98c5 3581 if (unit_can_serialize(u)) {
e8a565cb
YW
3582 r = exec_runtime_deserialize_compat(u, l, v, fds);
3583 if (r < 0) {
3584 log_unit_warning(u, "Failed to deserialize runtime parameter '%s', ignoring.", l);
3585 continue;
9bdb98c5
LP
3586 }
3587
e8a565cb
YW
3588 /* Returns positive if key was handled by the call */
3589 if (r > 0)
3590 continue;
3591
9bdb98c5 3592 r = UNIT_VTABLE(u)->deserialize_item(u, l, v, fds);
613b411c 3593 if (r < 0)
f2341e0a 3594 log_unit_warning(u, "Failed to deserialize unit parameter '%s', ignoring.", l);
613b411c 3595 }
a16e1123 3596 }
a483fb59
LP
3597
3598 /* Versions before 228 did not carry a state change timestamp. In this case, take the current time. This is
3599 * useful, so that timeouts based on this timestamp don't trigger too early, and is in-line with the logic from
1f133e0d 3600 * before 228 where the base for timeouts was not persistent across reboots. */
a483fb59
LP
3601
3602 if (!dual_timestamp_is_set(&u->state_change_timestamp))
3603 dual_timestamp_get(&u->state_change_timestamp);
3604
58d83430
LP
3605 /* Let's make sure that everything that is deserialized also gets any potential new cgroup settings applied
3606 * after we are done. For that we invalidate anything already realized, so that we can realize it again. */
3607 unit_invalidate_cgroup(u, _CGROUP_MASK_ALL);
3608 unit_invalidate_cgroup_bpf(u);
3609
a483fb59 3610 return 0;
a16e1123
LP
3611}
3612
8948b341
LP
3613int unit_deserialize_skip(FILE *f) {
3614 int r;
07429866
ZJS
3615 assert(f);
3616
3617 /* Skip serialized data for this unit. We don't know what it is. */
3618
3619 for (;;) {
8948b341
LP
3620 _cleanup_free_ char *line = NULL;
3621 char *l;
07429866 3622
8948b341
LP
3623 r = read_line(f, LONG_LINE_MAX, &line);
3624 if (r < 0)
3625 return log_error_errno(r, "Failed to read serialization line: %m");
3626 if (r == 0)
3627 return 0;
07429866 3628
07429866
ZJS
3629 l = strstrip(line);
3630
3631 /* End marker */
3632 if (isempty(l))
8948b341 3633 return 1;
07429866
ZJS
3634 }
3635}
3636
eef85c4a 3637int unit_add_node_dependency(Unit *u, const char *what, bool wants, UnitDependency dep, UnitDependencyMask mask) {
6e2ef85b 3638 Unit *device;
68eda4bd 3639 _cleanup_free_ char *e = NULL;
6e2ef85b
LP
3640 int r;
3641
3642 assert(u);
3643
6e2ef85b 3644 /* Adds in links to the device node that this unit is based on */
47bc12e1
LP
3645 if (isempty(what))
3646 return 0;
6e2ef85b 3647
8407a5d0 3648 if (!is_device_path(what))
6e2ef85b
LP
3649 return 0;
3650
47bc12e1
LP
3651 /* When device units aren't supported (such as in a
3652 * container), don't create dependencies on them. */
1c2e9646 3653 if (!unit_type_supported(UNIT_DEVICE))
47bc12e1
LP
3654 return 0;
3655
7410616c
LP
3656 r = unit_name_from_path(what, ".device", &e);
3657 if (r < 0)
3658 return r;
6e2ef85b 3659
ac155bb8 3660 r = manager_load_unit(u->manager, e, NULL, NULL, &device);
6e2ef85b
LP
3661 if (r < 0)
3662 return r;
3663
ebc8968b
FB
3664 if (dep == UNIT_REQUIRES && device_shall_be_bound_by(device, u))
3665 dep = UNIT_BINDS_TO;
3666
9d06297e 3667 r = unit_add_two_dependencies(u, UNIT_AFTER,
463d0d15 3668 MANAGER_IS_SYSTEM(u->manager) ? dep : UNIT_WANTS,
eef85c4a 3669 device, true, mask);
faa368e3 3670 if (r < 0)
6e2ef85b
LP
3671 return r;
3672
faa368e3 3673 if (wants) {
eef85c4a 3674 r = unit_add_dependency(device, UNIT_WANTS, u, false, mask);
faa368e3 3675 if (r < 0)
6e2ef85b 3676 return r;
faa368e3 3677 }
6e2ef85b
LP
3678
3679 return 0;
3680}
a16e1123 3681
be847e82 3682int unit_coldplug(Unit *u) {
05a98afd
LP
3683 int r = 0, q;
3684 char **i;
cca098b0
LP
3685
3686 assert(u);
3687
f0831ed2 3688 /* Make sure we don't enter a loop, when coldplugging recursively. */
f78f265f
LP
3689 if (u->coldplugged)
3690 return 0;
3691
3692 u->coldplugged = true;
3693
05a98afd
LP
3694 STRV_FOREACH(i, u->deserialized_refs) {
3695 q = bus_unit_track_add_name(u, *i);
3696 if (q < 0 && r >= 0)
3697 r = q;
3698 }
3699 u->deserialized_refs = strv_free(u->deserialized_refs);
cca098b0 3700
05a98afd
LP
3701 if (UNIT_VTABLE(u)->coldplug) {
3702 q = UNIT_VTABLE(u)->coldplug(u);
3703 if (q < 0 && r >= 0)
3704 r = q;
3705 }
5a6158b6 3706
05a98afd
LP
3707 if (u->job) {
3708 q = job_coldplug(u->job);
3709 if (q < 0 && r >= 0)
3710 r = q;
3711 }
cca098b0 3712
05a98afd 3713 return r;
cca098b0
LP
3714}
3715
f0831ed2
LP
3716void unit_catchup(Unit *u) {
3717 assert(u);
3718
3719 if (UNIT_VTABLE(u)->catchup)
3720 UNIT_VTABLE(u)->catchup(u);
3721}
3722
ba25d39e 3723static bool fragment_mtime_newer(const char *path, usec_t mtime, bool path_masked) {
21b95806
ZJS
3724 struct stat st;
3725
3726 if (!path)
3727 return false;
3728
77969722
LP
3729 /* If the source is some virtual kernel file system, then we assume we watch it anyway, and hence pretend we
3730 * are never out-of-date. */
3731 if (PATH_STARTSWITH_SET(path, "/proc", "/sys"))
3732 return false;
3733
21b95806
ZJS
3734 if (stat(path, &st) < 0)
3735 /* What, cannot access this anymore? */
3736 return true;
3737
ba25d39e
ZJS
3738 if (path_masked)
3739 /* For masked files check if they are still so */
3740 return !null_or_empty(&st);
3741 else
3a8db9fe 3742 /* For non-empty files check the mtime */
87ec20ef 3743 return timespec_load(&st.st_mtim) > mtime;
21b95806
ZJS
3744
3745 return false;
3746}
3747
45fb0699 3748bool unit_need_daemon_reload(Unit *u) {
ae7a7182
OS
3749 _cleanup_strv_free_ char **t = NULL;
3750 char **path;
1b64d026 3751
45fb0699
LP
3752 assert(u);
3753
ba25d39e
ZJS
3754 /* For unit files, we allow masking… */
3755 if (fragment_mtime_newer(u->fragment_path, u->fragment_mtime,
3756 u->load_state == UNIT_MASKED))
21b95806 3757 return true;
5f4b19f4 3758
ba25d39e
ZJS
3759 /* Source paths should not be masked… */
3760 if (fragment_mtime_newer(u->source_path, u->source_mtime, false))
ab932a62 3761 return true;
ae7a7182 3762
19a44dfe
LR
3763 if (u->load_state == UNIT_LOADED)
3764 (void) unit_find_dropin_paths(u, &t);
ab932a62
LP
3765 if (!strv_equal(u->dropin_paths, t))
3766 return true;
6d10d308 3767
ba25d39e 3768 /* … any drop-ins that are masked are simply omitted from the list. */
ab932a62 3769 STRV_FOREACH(path, u->dropin_paths)
ba25d39e 3770 if (fragment_mtime_newer(*path, u->dropin_mtime, false))
ab932a62 3771 return true;
21b95806 3772
ab932a62 3773 return false;
45fb0699
LP
3774}
3775
fdf20a31 3776void unit_reset_failed(Unit *u) {
5632e374
LP
3777 assert(u);
3778
fdf20a31
MM
3779 if (UNIT_VTABLE(u)->reset_failed)
3780 UNIT_VTABLE(u)->reset_failed(u);
6bf0f408
LP
3781
3782 RATELIMIT_RESET(u->start_limit);
3783 u->start_limit_hit = false;
5632e374
LP
3784}
3785
a7f241db
LP
3786Unit *unit_following(Unit *u) {
3787 assert(u);
3788
3789 if (UNIT_VTABLE(u)->following)
3790 return UNIT_VTABLE(u)->following(u);
3791
3792 return NULL;
3793}
3794
31afa0a4 3795bool unit_stop_pending(Unit *u) {
18ffdfda
LP
3796 assert(u);
3797
31afa0a4
LP
3798 /* This call does check the current state of the unit. It's
3799 * hence useful to be called from state change calls of the
3800 * unit itself, where the state isn't updated yet. This is
3801 * different from unit_inactive_or_pending() which checks both
3802 * the current state and for a queued job. */
18ffdfda 3803
31afa0a4
LP
3804 return u->job && u->job->type == JOB_STOP;
3805}
3806
3807bool unit_inactive_or_pending(Unit *u) {
3808 assert(u);
3809
3810 /* Returns true if the unit is inactive or going down */
18ffdfda 3811
d956ac29
LP
3812 if (UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(u)))
3813 return true;
3814
31afa0a4 3815 if (unit_stop_pending(u))
18ffdfda
LP
3816 return true;
3817
3818 return false;
3819}
3820
31afa0a4 3821bool unit_active_or_pending(Unit *u) {
f976f3f6
LP
3822 assert(u);
3823
f60c2665 3824 /* Returns true if the unit is active or going up */
f976f3f6
LP
3825
3826 if (UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u)))
3827 return true;
3828
ac155bb8 3829 if (u->job &&
3742095b 3830 IN_SET(u->job->type, JOB_START, JOB_RELOAD_OR_START, JOB_RESTART))
f976f3f6
LP
3831 return true;
3832
3833 return false;
3834}
3835
deb4e708
MK
3836bool unit_will_restart(Unit *u) {
3837 assert(u);
3838
3839 if (!UNIT_VTABLE(u)->will_restart)
3840 return false;
3841
3842 return UNIT_VTABLE(u)->will_restart(u);
3843}
3844
718db961 3845int unit_kill(Unit *u, KillWho w, int signo, sd_bus_error *error) {
8a0867d6
LP
3846 assert(u);
3847 assert(w >= 0 && w < _KILL_WHO_MAX);
6eb7c172 3848 assert(SIGNAL_VALID(signo));
8a0867d6 3849
8a0867d6 3850 if (!UNIT_VTABLE(u)->kill)
15411c0c 3851 return -EOPNOTSUPP;
8a0867d6 3852
c74f17d9 3853 return UNIT_VTABLE(u)->kill(u, w, signo, error);
8a0867d6
LP
3854}
3855
82659fd7 3856static Set *unit_pid_set(pid_t main_pid, pid_t control_pid) {
af4fa99d 3857 _cleanup_set_free_ Set *pid_set = NULL;
82659fd7
LP
3858 int r;
3859
d5099efc 3860 pid_set = set_new(NULL);
82659fd7
LP
3861 if (!pid_set)
3862 return NULL;
3863
3864 /* Exclude the main/control pids from being killed via the cgroup */
3865 if (main_pid > 0) {
fea72cc0 3866 r = set_put(pid_set, PID_TO_PTR(main_pid));
82659fd7 3867 if (r < 0)
95f14a3e 3868 return NULL;
82659fd7
LP
3869 }
3870
3871 if (control_pid > 0) {
fea72cc0 3872 r = set_put(pid_set, PID_TO_PTR(control_pid));
82659fd7 3873 if (r < 0)
95f14a3e 3874 return NULL;
82659fd7
LP
3875 }
3876
95f14a3e 3877 return TAKE_PTR(pid_set);
82659fd7
LP
3878}
3879
d91c34f2
LP
3880int unit_kill_common(
3881 Unit *u,
3882 KillWho who,
3883 int signo,
3884 pid_t main_pid,
3885 pid_t control_pid,
718db961 3886 sd_bus_error *error) {
d91c34f2 3887
814cc562 3888 int r = 0;
ac5e3a50 3889 bool killed = false;
814cc562 3890
ac5e3a50 3891 if (IN_SET(who, KILL_MAIN, KILL_MAIN_FAIL)) {
814cc562 3892 if (main_pid < 0)
7358dc02 3893 return sd_bus_error_setf(error, BUS_ERROR_NO_SUCH_PROCESS, "%s units have no main processes", unit_type_to_string(u->type));
52f448c3 3894 else if (main_pid == 0)
7358dc02 3895 return sd_bus_error_set_const(error, BUS_ERROR_NO_SUCH_PROCESS, "No main process to kill");
814cc562
MS
3896 }
3897
ac5e3a50 3898 if (IN_SET(who, KILL_CONTROL, KILL_CONTROL_FAIL)) {
814cc562 3899 if (control_pid < 0)
7358dc02 3900 return sd_bus_error_setf(error, BUS_ERROR_NO_SUCH_PROCESS, "%s units have no control processes", unit_type_to_string(u->type));
52f448c3 3901 else if (control_pid == 0)
7358dc02 3902 return sd_bus_error_set_const(error, BUS_ERROR_NO_SUCH_PROCESS, "No control process to kill");
814cc562
MS
3903 }
3904
ac5e3a50
JS
3905 if (IN_SET(who, KILL_CONTROL, KILL_CONTROL_FAIL, KILL_ALL, KILL_ALL_FAIL))
3906 if (control_pid > 0) {
814cc562
MS
3907 if (kill(control_pid, signo) < 0)
3908 r = -errno;
ac5e3a50
JS
3909 else
3910 killed = true;
3911 }
814cc562 3912
ac5e3a50
JS
3913 if (IN_SET(who, KILL_MAIN, KILL_MAIN_FAIL, KILL_ALL, KILL_ALL_FAIL))
3914 if (main_pid > 0) {
814cc562
MS
3915 if (kill(main_pid, signo) < 0)
3916 r = -errno;
ac5e3a50
JS
3917 else
3918 killed = true;
3919 }
814cc562 3920
ac5e3a50 3921 if (IN_SET(who, KILL_ALL, KILL_ALL_FAIL) && u->cgroup_path) {
814cc562
MS
3922 _cleanup_set_free_ Set *pid_set = NULL;
3923 int q;
3924
82659fd7
LP
3925 /* Exclude the main/control pids from being killed via the cgroup */
3926 pid_set = unit_pid_set(main_pid, control_pid);
814cc562
MS
3927 if (!pid_set)
3928 return -ENOMEM;
3929
1d98fef1 3930 q = cg_kill_recursive(SYSTEMD_CGROUP_CONTROLLER, u->cgroup_path, signo, 0, pid_set, NULL, NULL);
4c701096 3931 if (q < 0 && !IN_SET(q, -EAGAIN, -ESRCH, -ENOENT))
814cc562 3932 r = q;
ac5e3a50
JS
3933 else
3934 killed = true;
814cc562
MS
3935 }
3936
201f0c91 3937 if (r == 0 && !killed && IN_SET(who, KILL_ALL_FAIL, KILL_CONTROL_FAIL))
ac5e3a50
JS
3938 return -ESRCH;
3939
814cc562
MS
3940 return r;
3941}
3942
6210e7fc
LP
3943int unit_following_set(Unit *u, Set **s) {
3944 assert(u);
3945 assert(s);
3946
3947 if (UNIT_VTABLE(u)->following_set)
3948 return UNIT_VTABLE(u)->following_set(u, s);
3949
3950 *s = NULL;
3951 return 0;
3952}
3953
a4375746 3954UnitFileState unit_get_unit_file_state(Unit *u) {
0ec0deaa
LP
3955 int r;
3956
a4375746
LP
3957 assert(u);
3958
0ec0deaa
LP
3959 if (u->unit_file_state < 0 && u->fragment_path) {
3960 r = unit_file_get_state(
463d0d15 3961 u->manager->unit_file_scope,
0ec0deaa 3962 NULL,
9ea3a0e7 3963 u->id,
0ec0deaa
LP
3964 &u->unit_file_state);
3965 if (r < 0)
3966 u->unit_file_state = UNIT_FILE_BAD;
3967 }
a4375746 3968
ac155bb8 3969 return u->unit_file_state;
a4375746
LP
3970}
3971
d2dc52db
LP
3972int unit_get_unit_file_preset(Unit *u) {
3973 assert(u);
3974
3975 if (u->unit_file_preset < 0 && u->fragment_path)
3976 u->unit_file_preset = unit_file_query_preset(
463d0d15 3977 u->manager->unit_file_scope,
0ec0deaa
LP
3978 NULL,
3979 basename(u->fragment_path));
d2dc52db
LP
3980
3981 return u->unit_file_preset;
3982}
3983
7f7d01ed 3984Unit* unit_ref_set(UnitRef *ref, Unit *source, Unit *target) {
57020a3a 3985 assert(ref);
7f7d01ed
ZJS
3986 assert(source);
3987 assert(target);
57020a3a 3988
7f7d01ed 3989 if (ref->target)
57020a3a
LP
3990 unit_ref_unset(ref);
3991
7f7d01ed
ZJS
3992 ref->source = source;
3993 ref->target = target;
3994 LIST_PREPEND(refs_by_target, target->refs_by_target, ref);
3995 return target;
57020a3a
LP
3996}
3997
3998void unit_ref_unset(UnitRef *ref) {
3999 assert(ref);
4000
7f7d01ed 4001 if (!ref->target)
57020a3a
LP
4002 return;
4003
b75102e5
LP
4004 /* We are about to drop a reference to the unit, make sure the garbage collection has a look at it as it might
4005 * be unreferenced now. */
7f7d01ed 4006 unit_add_to_gc_queue(ref->target);
b75102e5 4007
7f7d01ed
ZJS
4008 LIST_REMOVE(refs_by_target, ref->target->refs_by_target, ref);
4009 ref->source = ref->target = NULL;
57020a3a
LP
4010}
4011
29206d46
LP
4012static int user_from_unit_name(Unit *u, char **ret) {
4013
4014 static const uint8_t hash_key[] = {
4015 0x58, 0x1a, 0xaf, 0xe6, 0x28, 0x58, 0x4e, 0x96,
4016 0xb4, 0x4e, 0xf5, 0x3b, 0x8c, 0x92, 0x07, 0xec
4017 };
4018
4019 _cleanup_free_ char *n = NULL;
4020 int r;
4021
4022 r = unit_name_to_prefix(u->id, &n);
4023 if (r < 0)
4024 return r;
4025
4026 if (valid_user_group_name(n)) {
ae2a15bc 4027 *ret = TAKE_PTR(n);
29206d46
LP
4028 return 0;
4029 }
4030
4031 /* If we can't use the unit name as a user name, then let's hash it and use that */
4032 if (asprintf(ret, "_du%016" PRIx64, siphash24(n, strlen(n), hash_key)) < 0)
4033 return -ENOMEM;
4034
4035 return 0;
4036}
4037
598459ce
LP
4038int unit_patch_contexts(Unit *u) {
4039 CGroupContext *cc;
4040 ExecContext *ec;
cba6e062
LP
4041 unsigned i;
4042 int r;
4043
e06c73cc 4044 assert(u);
e06c73cc 4045
598459ce
LP
4046 /* Patch in the manager defaults into the exec and cgroup
4047 * contexts, _after_ the rest of the settings have been
4048 * initialized */
085afe36 4049
598459ce
LP
4050 ec = unit_get_exec_context(u);
4051 if (ec) {
4052 /* This only copies in the ones that need memory */
4053 for (i = 0; i < _RLIMIT_MAX; i++)
4054 if (u->manager->rlimit[i] && !ec->rlimit[i]) {
4055 ec->rlimit[i] = newdup(struct rlimit, u->manager->rlimit[i], 1);
4056 if (!ec->rlimit[i])
4057 return -ENOMEM;
4058 }
4059
463d0d15 4060 if (MANAGER_IS_USER(u->manager) &&
598459ce
LP
4061 !ec->working_directory) {
4062
4063 r = get_home_dir(&ec->working_directory);
4064 if (r < 0)
4065 return r;
4c08c824
LP
4066
4067 /* Allow user services to run, even if the
4068 * home directory is missing */
4069 ec->working_directory_missing_ok = true;
cba6e062
LP
4070 }
4071
598459ce 4072 if (ec->private_devices)
2cd0a735 4073 ec->capability_bounding_set &= ~((UINT64_C(1) << CAP_MKNOD) | (UINT64_C(1) << CAP_SYS_RAWIO));
502d704e
DH
4074
4075 if (ec->protect_kernel_modules)
4076 ec->capability_bounding_set &= ~(UINT64_C(1) << CAP_SYS_MODULE);
29206d46
LP
4077
4078 if (ec->dynamic_user) {
4079 if (!ec->user) {
4080 r = user_from_unit_name(u, &ec->user);
4081 if (r < 0)
4082 return r;
4083 }
4084
4085 if (!ec->group) {
4086 ec->group = strdup(ec->user);
4087 if (!ec->group)
4088 return -ENOMEM;
4089 }
4090
63bb64a0
LP
4091 /* If the dynamic user option is on, let's make sure that the unit can't leave its UID/GID
4092 * around in the file system or on IPC objects. Hence enforce a strict sandbox. */
4093
29206d46 4094 ec->private_tmp = true;
00d9ef85 4095 ec->remove_ipc = true;
63bb64a0
LP
4096 ec->protect_system = PROTECT_SYSTEM_STRICT;
4097 if (ec->protect_home == PROTECT_HOME_NO)
4098 ec->protect_home = PROTECT_HOME_READ_ONLY;
29206d46 4099 }
cba6e062
LP
4100 }
4101
598459ce 4102 cc = unit_get_cgroup_context(u);
fe65e88b 4103 if (cc && ec) {
f513e420 4104
fe65e88b 4105 if (ec->private_devices &&
598459ce
LP
4106 cc->device_policy == CGROUP_AUTO)
4107 cc->device_policy = CGROUP_CLOSED;
fe65e88b
YW
4108
4109 if (ec->root_image &&
4110 (cc->device_policy != CGROUP_AUTO || cc->device_allow)) {
4111
4112 /* When RootImage= is specified, the following devices are touched. */
4113 r = cgroup_add_device_allow(cc, "/dev/loop-control", "rw");
4114 if (r < 0)
4115 return r;
4116
4117 r = cgroup_add_device_allow(cc, "block-loop", "rwm");
4118 if (r < 0)
4119 return r;
4120
4121 r = cgroup_add_device_allow(cc, "block-blkext", "rwm");
4122 if (r < 0)
4123 return r;
4124 }
598459ce 4125 }
f1660f96 4126
cba6e062 4127 return 0;
e06c73cc
LP
4128}
4129
3ef63c31
LP
4130ExecContext *unit_get_exec_context(Unit *u) {
4131 size_t offset;
4132 assert(u);
4133
598459ce
LP
4134 if (u->type < 0)
4135 return NULL;
4136
3ef63c31
LP
4137 offset = UNIT_VTABLE(u)->exec_context_offset;
4138 if (offset <= 0)
4139 return NULL;
4140
4141 return (ExecContext*) ((uint8_t*) u + offset);
4142}
4143
718db961
LP
4144KillContext *unit_get_kill_context(Unit *u) {
4145 size_t offset;
4146 assert(u);
4147
598459ce
LP
4148 if (u->type < 0)
4149 return NULL;
4150
718db961
LP
4151 offset = UNIT_VTABLE(u)->kill_context_offset;
4152 if (offset <= 0)
4153 return NULL;
4154
4155 return (KillContext*) ((uint8_t*) u + offset);
4156}
4157
4ad49000
LP
4158CGroupContext *unit_get_cgroup_context(Unit *u) {
4159 size_t offset;
4160
598459ce
LP
4161 if (u->type < 0)
4162 return NULL;
4163
4ad49000
LP
4164 offset = UNIT_VTABLE(u)->cgroup_context_offset;
4165 if (offset <= 0)
4166 return NULL;
4167
4168 return (CGroupContext*) ((uint8_t*) u + offset);
4169}
4170
613b411c
LP
4171ExecRuntime *unit_get_exec_runtime(Unit *u) {
4172 size_t offset;
4173
598459ce
LP
4174 if (u->type < 0)
4175 return NULL;
4176
613b411c
LP
4177 offset = UNIT_VTABLE(u)->exec_runtime_offset;
4178 if (offset <= 0)
4179 return NULL;
4180
4181 return *(ExecRuntime**) ((uint8_t*) u + offset);
4182}
4183
2e59b241 4184static const char* unit_drop_in_dir(Unit *u, UnitWriteFlags flags) {
3f5e8115
LP
4185 assert(u);
4186
2e59b241 4187 if (UNIT_WRITE_FLAGS_NOOP(flags))
4f4afc88
LP
4188 return NULL;
4189
39591351
LP
4190 if (u->transient) /* Redirect drop-ins for transient units always into the transient directory. */
4191 return u->manager->lookup_paths.transient;
26d04f86 4192
2e59b241 4193 if (flags & UNIT_PERSISTENT)
4f4afc88 4194 return u->manager->lookup_paths.persistent_control;
26d04f86 4195
2e59b241
LP
4196 if (flags & UNIT_RUNTIME)
4197 return u->manager->lookup_paths.runtime_control;
4198
39591351 4199 return NULL;
71645aca
LP
4200}
4201
2e59b241
LP
4202char* unit_escape_setting(const char *s, UnitWriteFlags flags, char **buf) {
4203 char *ret = NULL;
4204
4205 if (!s)
4206 return NULL;
4207
4208 /* Escapes the input string as requested. Returns the escaped string. If 'buf' is specified then the allocated
4209 * return buffer pointer is also written to *buf, except if no escaping was necessary, in which case *buf is
4210 * set to NULL, and the input pointer is returned as-is. This means the return value always contains a properly
4211 * escaped version, but *buf when passed only contains a pointer if an allocation was necessary. If *buf is
4212 * not specified, then the return value always needs to be freed. Callers can use this to optimize memory
4213 * allocations. */
4214
4215 if (flags & UNIT_ESCAPE_SPECIFIERS) {
4216 ret = specifier_escape(s);
4217 if (!ret)
4218 return NULL;
4219
4220 s = ret;
4221 }
4222
4223 if (flags & UNIT_ESCAPE_C) {
4224 char *a;
4225
4226 a = cescape(s);
4227 free(ret);
4228 if (!a)
4229 return NULL;
4230
4231 ret = a;
4232 }
4233
4234 if (buf) {
4235 *buf = ret;
4236 return ret ?: (char*) s;
4237 }
4238
4239 return ret ?: strdup(s);
4240}
4241
4242char* unit_concat_strv(char **l, UnitWriteFlags flags) {
4243 _cleanup_free_ char *result = NULL;
4244 size_t n = 0, allocated = 0;
ae2a15bc 4245 char **i;
2e59b241
LP
4246
4247 /* Takes a list of strings, escapes them, and concatenates them. This may be used to format command lines in a
4248 * way suitable for ExecStart= stanzas */
4249
4250 STRV_FOREACH(i, l) {
4251 _cleanup_free_ char *buf = NULL;
4252 const char *p;
4253 size_t a;
4254 char *q;
4255
4256 p = unit_escape_setting(*i, flags, &buf);
4257 if (!p)
4258 return NULL;
4259
4260 a = (n > 0) + 1 + strlen(p) + 1; /* separating space + " + entry + " */
4261 if (!GREEDY_REALLOC(result, allocated, n + a + 1))
4262 return NULL;
4263
4264 q = result + n;
4265 if (n > 0)
4266 *(q++) = ' ';
4267
4268 *(q++) = '"';
4269 q = stpcpy(q, p);
4270 *(q++) = '"';
4271
4272 n += a;
4273 }
4274
4275 if (!GREEDY_REALLOC(result, allocated, n + 1))
4276 return NULL;
4277
4278 result[n] = 0;
4279
ae2a15bc 4280 return TAKE_PTR(result);
2e59b241
LP
4281}
4282
4283int unit_write_setting(Unit *u, UnitWriteFlags flags, const char *name, const char *data) {
4284 _cleanup_free_ char *p = NULL, *q = NULL, *escaped = NULL;
2a9a6f8a 4285 const char *dir, *wrapped;
26d04f86 4286 int r;
71645aca
LP
4287
4288 assert(u);
2e59b241
LP
4289 assert(name);
4290 assert(data);
4291
4292 if (UNIT_WRITE_FLAGS_NOOP(flags))
4293 return 0;
4294
4295 data = unit_escape_setting(data, flags, &escaped);
4296 if (!data)
4297 return -ENOMEM;
4298
4299 /* Prefix the section header. If we are writing this out as transient file, then let's suppress this if the
4300 * previous section header is the same */
4301
4302 if (flags & UNIT_PRIVATE) {
4303 if (!UNIT_VTABLE(u)->private_section)
4304 return -EINVAL;
4305
4306 if (!u->transient_file || u->last_section_private < 0)
4307 data = strjoina("[", UNIT_VTABLE(u)->private_section, "]\n", data);
4308 else if (u->last_section_private == 0)
4309 data = strjoina("\n[", UNIT_VTABLE(u)->private_section, "]\n", data);
4310 } else {
4311 if (!u->transient_file || u->last_section_private < 0)
4312 data = strjoina("[Unit]\n", data);
4313 else if (u->last_section_private > 0)
4314 data = strjoina("\n[Unit]\n", data);
4315 }
71645aca 4316
4f4afc88
LP
4317 if (u->transient_file) {
4318 /* When this is a transient unit file in creation, then let's not create a new drop-in but instead
4319 * write to the transient unit file. */
4320 fputs(data, u->transient_file);
4f4afc88 4321
2e59b241
LP
4322 if (!endswith(data, "\n"))
4323 fputc('\n', u->transient_file);
4324
4325 /* Remember which section we wrote this entry to */
4326 u->last_section_private = !!(flags & UNIT_PRIVATE);
8e2af478 4327 return 0;
2e59b241 4328 }
8e2af478 4329
2e59b241 4330 dir = unit_drop_in_dir(u, flags);
39591351
LP
4331 if (!dir)
4332 return -EINVAL;
71645aca 4333
2a9a6f8a 4334 wrapped = strjoina("# This is a drop-in unit file extension, created via \"systemctl set-property\"\n"
3f71dec5 4335 "# or an equivalent operation. Do not edit.\n",
2a9a6f8a
ZJS
4336 data,
4337 "\n");
e20b2a86 4338
815b09d3 4339 r = drop_in_file(dir, u->id, 50, name, &p, &q);
adb76a70
WC
4340 if (r < 0)
4341 return r;
4342
45639f1b 4343 (void) mkdir_p_label(p, 0755);
2a9a6f8a 4344 r = write_string_file_atomic_label(q, wrapped);
adb76a70
WC
4345 if (r < 0)
4346 return r;
4347
815b09d3 4348 r = strv_push(&u->dropin_paths, q);
adb76a70
WC
4349 if (r < 0)
4350 return r;
815b09d3 4351 q = NULL;
adb76a70 4352
adb76a70
WC
4353 strv_uniq(u->dropin_paths);
4354
4355 u->dropin_mtime = now(CLOCK_REALTIME);
4356
4357 return 0;
26d04f86 4358}
71645aca 4359
2e59b241 4360int unit_write_settingf(Unit *u, UnitWriteFlags flags, const char *name, const char *format, ...) {
b9ec9359
LP
4361 _cleanup_free_ char *p = NULL;
4362 va_list ap;
4363 int r;
4364
4365 assert(u);
4366 assert(name);
4367 assert(format);
4368
2e59b241 4369 if (UNIT_WRITE_FLAGS_NOOP(flags))
b9ec9359
LP
4370 return 0;
4371
4372 va_start(ap, format);
4373 r = vasprintf(&p, format, ap);
4374 va_end(ap);
4375
4376 if (r < 0)
4377 return -ENOMEM;
4378
2e59b241 4379 return unit_write_setting(u, flags, name, p);
b9ec9359 4380}
71645aca 4381
c2756a68 4382int unit_make_transient(Unit *u) {
0126c8f3 4383 _cleanup_free_ char *path = NULL;
4f4afc88 4384 FILE *f;
4f4afc88 4385
c2756a68
LP
4386 assert(u);
4387
3f5e8115
LP
4388 if (!UNIT_VTABLE(u)->can_transient)
4389 return -EOPNOTSUPP;
4390
45639f1b
LP
4391 (void) mkdir_p_label(u->manager->lookup_paths.transient, 0755);
4392
605405c6 4393 path = strjoin(u->manager->lookup_paths.transient, "/", u->id);
4f4afc88
LP
4394 if (!path)
4395 return -ENOMEM;
4396
4397 /* Let's open the file we'll write the transient settings into. This file is kept open as long as we are
4398 * creating the transient, and is closed in unit_load(), as soon as we start loading the file. */
4399
78e334b5 4400 RUN_WITH_UMASK(0022) {
4f4afc88 4401 f = fopen(path, "we");
0126c8f3 4402 if (!f)
78e334b5 4403 return -errno;
4f4afc88
LP
4404 }
4405
0126c8f3 4406 safe_fclose(u->transient_file);
4f4afc88
LP
4407 u->transient_file = f;
4408
0126c8f3 4409 free_and_replace(u->fragment_path, path);
7c65093a 4410
7c65093a
LP
4411 u->source_path = mfree(u->source_path);
4412 u->dropin_paths = strv_free(u->dropin_paths);
4413 u->fragment_mtime = u->source_mtime = u->dropin_mtime = 0;
4414
4f4afc88
LP
4415 u->load_state = UNIT_STUB;
4416 u->load_error = 0;
4417 u->transient = true;
4418
7c65093a
LP
4419 unit_add_to_dbus_queue(u);
4420 unit_add_to_gc_queue(u);
c2756a68 4421
4f4afc88
LP
4422 fputs("# This is a transient unit file, created programmatically via the systemd API. Do not edit.\n",
4423 u->transient_file);
4424
3f5e8115 4425 return 0;
c2756a68
LP
4426}
4427
c53d2d54 4428static int log_kill(pid_t pid, int sig, void *userdata) {
1d98fef1
LP
4429 _cleanup_free_ char *comm = NULL;
4430
4431 (void) get_process_comm(pid, &comm);
4432
4433 /* Don't log about processes marked with brackets, under the assumption that these are temporary processes
4434 only, like for example systemd's own PAM stub process. */
4435 if (comm && comm[0] == '(')
c53d2d54 4436 return 0;
1d98fef1
LP
4437
4438 log_unit_notice(userdata,
4439 "Killing process " PID_FMT " (%s) with signal SIG%s.",
4440 pid,
4441 strna(comm),
4442 signal_to_string(sig));
c53d2d54
DB
4443
4444 return 1;
1d98fef1
LP
4445}
4446
4447static int operation_to_signal(KillContext *c, KillOperation k) {
4448 assert(c);
4449
4450 switch (k) {
4451
4452 case KILL_TERMINATE:
4453 case KILL_TERMINATE_AND_LOG:
4454 return c->kill_signal;
4455
4456 case KILL_KILL:
fbb48d4c 4457 return c->final_kill_signal;
1d98fef1 4458
c87700a1
AZ
4459 case KILL_WATCHDOG:
4460 return c->watchdog_signal;
1d98fef1
LP
4461
4462 default:
4463 assert_not_reached("KillOperation unknown");
4464 }
4465}
4466
cd2086fe
LP
4467int unit_kill_context(
4468 Unit *u,
4469 KillContext *c,
db2cb23b 4470 KillOperation k,
cd2086fe
LP
4471 pid_t main_pid,
4472 pid_t control_pid,
4473 bool main_pid_alien) {
4474
1d98fef1 4475 bool wait_for_exit = false, send_sighup;
59ec09a8 4476 cg_kill_log_func_t log_func = NULL;
b821a397 4477 int sig, r;
cd2086fe
LP
4478
4479 assert(u);
4480 assert(c);
4481
59ec09a8
ZJS
4482 /* Kill the processes belonging to this unit, in preparation for shutting the unit down.
4483 * Returns > 0 if we killed something worth waiting for, 0 otherwise. */
1d98fef1 4484
cd2086fe
LP
4485 if (c->kill_mode == KILL_NONE)
4486 return 0;
4487
1d98fef1
LP
4488 sig = operation_to_signal(c, k);
4489
4490 send_sighup =
4491 c->send_sighup &&
4492 IN_SET(k, KILL_TERMINATE, KILL_TERMINATE_AND_LOG) &&
4493 sig != SIGHUP;
4494
59ec09a8
ZJS
4495 if (k != KILL_TERMINATE || IN_SET(sig, SIGKILL, SIGABRT))
4496 log_func = log_kill;
cd2086fe
LP
4497
4498 if (main_pid > 0) {
1d98fef1
LP
4499 if (log_func)
4500 log_func(main_pid, sig, u);
cd2086fe 4501
1d98fef1 4502 r = kill_and_sigcont(main_pid, sig);
cd2086fe
LP
4503 if (r < 0 && r != -ESRCH) {
4504 _cleanup_free_ char *comm = NULL;
1d98fef1 4505 (void) get_process_comm(main_pid, &comm);
cd2086fe 4506
b821a397 4507 log_unit_warning_errno(u, r, "Failed to kill main process " PID_FMT " (%s), ignoring: %m", main_pid, strna(comm));
82659fd7 4508 } else {
bc6aed7b
LP
4509 if (!main_pid_alien)
4510 wait_for_exit = true;
82659fd7 4511
1d98fef1 4512 if (r != -ESRCH && send_sighup)
d0667321 4513 (void) kill(main_pid, SIGHUP);
82659fd7 4514 }
cd2086fe
LP
4515 }
4516
4517 if (control_pid > 0) {
1d98fef1
LP
4518 if (log_func)
4519 log_func(control_pid, sig, u);
cd2086fe 4520
1d98fef1 4521 r = kill_and_sigcont(control_pid, sig);
cd2086fe
LP
4522 if (r < 0 && r != -ESRCH) {
4523 _cleanup_free_ char *comm = NULL;
1d98fef1 4524 (void) get_process_comm(control_pid, &comm);
cd2086fe 4525
b821a397 4526 log_unit_warning_errno(u, r, "Failed to kill control process " PID_FMT " (%s), ignoring: %m", control_pid, strna(comm));
82659fd7 4527 } else {
cd2086fe 4528 wait_for_exit = true;
82659fd7 4529
1d98fef1 4530 if (r != -ESRCH && send_sighup)
d0667321 4531 (void) kill(control_pid, SIGHUP);
82659fd7 4532 }
cd2086fe
LP
4533 }
4534
b821a397
LP
4535 if (u->cgroup_path &&
4536 (c->kill_mode == KILL_CONTROL_GROUP || (c->kill_mode == KILL_MIXED && k == KILL_KILL))) {
cd2086fe
LP
4537 _cleanup_set_free_ Set *pid_set = NULL;
4538
82659fd7
LP
4539 /* Exclude the main/control pids from being killed via the cgroup */
4540 pid_set = unit_pid_set(main_pid, control_pid);
cd2086fe
LP
4541 if (!pid_set)
4542 return -ENOMEM;
4543
1d98fef1
LP
4544 r = cg_kill_recursive(SYSTEMD_CGROUP_CONTROLLER, u->cgroup_path,
4545 sig,
4546 CGROUP_SIGCONT|CGROUP_IGNORE_SELF,
4547 pid_set,
4548 log_func, u);
cd2086fe 4549 if (r < 0) {
4c701096 4550 if (!IN_SET(r, -EAGAIN, -ESRCH, -ENOENT))
b821a397
LP
4551 log_unit_warning_errno(u, r, "Failed to kill control group %s, ignoring: %m", u->cgroup_path);
4552
82659fd7 4553 } else if (r > 0) {
bc6aed7b 4554
1d9cc876
LP
4555 /* FIXME: For now, on the legacy hierarchy, we will not wait for the cgroup members to die if
4556 * we are running in a container or if this is a delegation unit, simply because cgroup
4557 * notification is unreliable in these cases. It doesn't work at all in containers, and outside
4558 * of containers it can be confused easily by left-over directories in the cgroup — which
4559 * however should not exist in non-delegated units. On the unified hierarchy that's different,
4560 * there we get proper events. Hence rely on them. */
efdb0237 4561
c22800e4 4562 if (cg_unified_controller(SYSTEMD_CGROUP_CONTROLLER) > 0 ||
1d9cc876 4563 (detect_container() == 0 && !unit_cgroup_delegate(u)))
e9db43d5 4564 wait_for_exit = true;
58ea275a 4565
1d98fef1 4566 if (send_sighup) {
82659fd7
LP
4567 set_free(pid_set);
4568
4569 pid_set = unit_pid_set(main_pid, control_pid);
4570 if (!pid_set)
4571 return -ENOMEM;
4572
1d98fef1
LP
4573 cg_kill_recursive(SYSTEMD_CGROUP_CONTROLLER, u->cgroup_path,
4574 SIGHUP,
4575 CGROUP_IGNORE_SELF,
4576 pid_set,
4577 NULL, NULL);
82659fd7
LP
4578 }
4579 }
cd2086fe
LP
4580 }
4581
4582 return wait_for_exit;
4583}
4584
eef85c4a 4585int unit_require_mounts_for(Unit *u, const char *path, UnitDependencyMask mask) {
ca8700e9 4586 _cleanup_free_ char *p = NULL;
eef85c4a 4587 UnitDependencyInfo di;
a57f7e2c
LP
4588 int r;
4589
4590 assert(u);
4591 assert(path);
4592
eef85c4a
LP
4593 /* Registers a unit for requiring a certain path and all its prefixes. We keep a hashtable of these paths in
4594 * the unit (from the path to the UnitDependencyInfo structure indicating how to the dependency came to
4595 * be). However, we build a prefix table for all possible prefixes so that new appearing mount units can easily
4596 * determine which units to make themselves a dependency of. */
a57f7e2c 4597
70b64bd3
ZJS
4598 if (!path_is_absolute(path))
4599 return -EINVAL;
4600
548f6937 4601 r = hashmap_ensure_allocated(&u->requires_mounts_for, &path_hash_ops);
eef85c4a
LP
4602 if (r < 0)
4603 return r;
4604
a57f7e2c
LP
4605 p = strdup(path);
4606 if (!p)
4607 return -ENOMEM;
4608
106bf8e4 4609 path = path_simplify(p, true);
a57f7e2c 4610
ca8700e9 4611 if (!path_is_normalized(path))
a57f7e2c 4612 return -EPERM;
a57f7e2c 4613
ca8700e9 4614 if (hashmap_contains(u->requires_mounts_for, path))
a57f7e2c 4615 return 0;
a57f7e2c 4616
eef85c4a
LP
4617 di = (UnitDependencyInfo) {
4618 .origin_mask = mask
4619 };
4620
ca8700e9
ZJS
4621 r = hashmap_put(u->requires_mounts_for, path, di.data);
4622 if (r < 0)
a57f7e2c 4623 return r;
ca8700e9 4624 p = NULL;
a57f7e2c 4625
4cb06c59 4626 char prefix[strlen(path) + 1];
ca8700e9 4627 PATH_FOREACH_PREFIX_MORE(prefix, path) {
a57f7e2c
LP
4628 Set *x;
4629
4630 x = hashmap_get(u->manager->units_requiring_mounts_for, prefix);
4631 if (!x) {
ca8700e9 4632 _cleanup_free_ char *q = NULL;
a57f7e2c 4633
548f6937 4634 r = hashmap_ensure_allocated(&u->manager->units_requiring_mounts_for, &path_hash_ops);
742f41ad
LP
4635 if (r < 0)
4636 return r;
a57f7e2c
LP
4637
4638 q = strdup(prefix);
4639 if (!q)
4640 return -ENOMEM;
4641
d5099efc 4642 x = set_new(NULL);
ca8700e9 4643 if (!x)
a57f7e2c 4644 return -ENOMEM;
a57f7e2c
LP
4645
4646 r = hashmap_put(u->manager->units_requiring_mounts_for, q, x);
4647 if (r < 0) {
a57f7e2c
LP
4648 set_free(x);
4649 return r;
4650 }
ca8700e9 4651 q = NULL;
a57f7e2c
LP
4652 }
4653
4654 r = set_put(x, u);
4655 if (r < 0)
4656 return r;
4657 }
4658
4659 return 0;
4660}
4661
613b411c
LP
4662int unit_setup_exec_runtime(Unit *u) {
4663 ExecRuntime **rt;
4664 size_t offset;
613b411c 4665 Unit *other;
eef85c4a
LP
4666 Iterator i;
4667 void *v;
e8a565cb 4668 int r;
613b411c
LP
4669
4670 offset = UNIT_VTABLE(u)->exec_runtime_offset;
4671 assert(offset > 0);
4672
06b643e7 4673 /* Check if there already is an ExecRuntime for this unit? */
613b411c
LP
4674 rt = (ExecRuntime**) ((uint8_t*) u + offset);
4675 if (*rt)
4676 return 0;
4677
4678 /* Try to get it from somebody else */
eef85c4a 4679 HASHMAP_FOREACH_KEY(v, other, u->dependencies[UNIT_JOINS_NAMESPACE_OF], i) {
e8a565cb
YW
4680 r = exec_runtime_acquire(u->manager, NULL, other->id, false, rt);
4681 if (r == 1)
4682 return 1;
613b411c
LP
4683 }
4684
e8a565cb 4685 return exec_runtime_acquire(u->manager, unit_get_exec_context(u), u->id, true, rt);
613b411c
LP
4686}
4687
29206d46
LP
4688int unit_setup_dynamic_creds(Unit *u) {
4689 ExecContext *ec;
4690 DynamicCreds *dcreds;
4691 size_t offset;
4692
4693 assert(u);
4694
4695 offset = UNIT_VTABLE(u)->dynamic_creds_offset;
4696 assert(offset > 0);
4697 dcreds = (DynamicCreds*) ((uint8_t*) u + offset);
4698
4699 ec = unit_get_exec_context(u);
4700 assert(ec);
4701
4702 if (!ec->dynamic_user)
4703 return 0;
4704
4705 return dynamic_creds_acquire(dcreds, u->manager, ec->user, ec->group);
4706}
4707
1c2e9646
LP
4708bool unit_type_supported(UnitType t) {
4709 if (_unlikely_(t < 0))
4710 return false;
4711 if (_unlikely_(t >= _UNIT_TYPE_MAX))
4712 return false;
4713
4714 if (!unit_vtable[t]->supported)
4715 return true;
4716
4717 return unit_vtable[t]->supported();
4718}
4719
8b4305c7
LP
4720void unit_warn_if_dir_nonempty(Unit *u, const char* where) {
4721 int r;
4722
4723 assert(u);
4724 assert(where);
4725
4726 r = dir_is_empty(where);
3f602115 4727 if (r > 0 || r == -ENOTDIR)
8b4305c7
LP
4728 return;
4729 if (r < 0) {
4730 log_unit_warning_errno(u, r, "Failed to check directory %s: %m", where);
4731 return;
4732 }
4733
4734 log_struct(LOG_NOTICE,
2b044526 4735 "MESSAGE_ID=" SD_MESSAGE_OVERMOUNTING_STR,
8b4305c7 4736 LOG_UNIT_ID(u),
f1c50bec 4737 LOG_UNIT_INVOCATION_ID(u),
8b4305c7 4738 LOG_UNIT_MESSAGE(u, "Directory %s to mount over is not empty, mounting anyway.", where),
a1230ff9 4739 "WHERE=%s", where);
8b4305c7
LP
4740}
4741
25cd4964 4742int unit_fail_if_noncanonical(Unit *u, const char* where) {
58d9d89b 4743 _cleanup_free_ char *canonical_where = NULL;
8b4305c7
LP
4744 int r;
4745
4746 assert(u);
4747 assert(where);
4748
25cd4964 4749 r = chase_symlinks(where, NULL, CHASE_NONEXISTENT, &canonical_where);
8b4305c7 4750 if (r < 0) {
25cd4964 4751 log_unit_debug_errno(u, r, "Failed to check %s for symlinks, ignoring: %m", where);
8b4305c7
LP
4752 return 0;
4753 }
25cd4964
AJ
4754
4755 /* We will happily ignore a trailing slash (or any redundant slashes) */
4756 if (path_equal(where, canonical_where))
8b4305c7
LP
4757 return 0;
4758
25cd4964 4759 /* No need to mention "." or "..", they would already have been rejected by unit_name_from_path() */
8b4305c7 4760 log_struct(LOG_ERR,
2b044526 4761 "MESSAGE_ID=" SD_MESSAGE_OVERMOUNTING_STR,
8b4305c7 4762 LOG_UNIT_ID(u),
f1c50bec 4763 LOG_UNIT_INVOCATION_ID(u),
25cd4964 4764 LOG_UNIT_MESSAGE(u, "Mount path %s is not canonical (contains a symlink).", where),
a1230ff9 4765 "WHERE=%s", where);
8b4305c7
LP
4766
4767 return -ELOOP;
4768}
0f13f3bd
LP
4769
4770bool unit_is_pristine(Unit *u) {
4771 assert(u);
4772
7c65093a 4773 /* Check if the unit already exists or is already around,
0f13f3bd
LP
4774 * in a number of different ways. Note that to cater for unit
4775 * types such as slice, we are generally fine with units that
e9e8cbc8
ZJS
4776 * are marked UNIT_LOADED even though nothing was actually
4777 * loaded, as those unit types don't require a file on disk. */
0f13f3bd
LP
4778
4779 return !(!IN_SET(u->load_state, UNIT_NOT_FOUND, UNIT_LOADED) ||
4780 u->fragment_path ||
4781 u->source_path ||
4782 !strv_isempty(u->dropin_paths) ||
0f13f3bd
LP
4783 u->job ||
4784 u->merged_into);
4785}
291d565a
LP
4786
4787pid_t unit_control_pid(Unit *u) {
4788 assert(u);
4789
4790 if (UNIT_VTABLE(u)->control_pid)
4791 return UNIT_VTABLE(u)->control_pid(u);
4792
4793 return 0;
4794}
4795
4796pid_t unit_main_pid(Unit *u) {
4797 assert(u);
4798
4799 if (UNIT_VTABLE(u)->main_pid)
4800 return UNIT_VTABLE(u)->main_pid(u);
4801
4802 return 0;
4803}
00d9ef85
LP
4804
4805static void unit_unref_uid_internal(
4806 Unit *u,
4807 uid_t *ref_uid,
4808 bool destroy_now,
4809 void (*_manager_unref_uid)(Manager *m, uid_t uid, bool destroy_now)) {
4810
4811 assert(u);
4812 assert(ref_uid);
4813 assert(_manager_unref_uid);
4814
4815 /* Generic implementation of both unit_unref_uid() and unit_unref_gid(), under the assumption that uid_t and
4816 * gid_t are actually the same time, with the same validity rules.
4817 *
4818 * Drops a reference to UID/GID from a unit. */
4819
4820 assert_cc(sizeof(uid_t) == sizeof(gid_t));
4821 assert_cc(UID_INVALID == (uid_t) GID_INVALID);
4822
4823 if (!uid_is_valid(*ref_uid))
4824 return;
4825
4826 _manager_unref_uid(u->manager, *ref_uid, destroy_now);
4827 *ref_uid = UID_INVALID;
4828}
4829
4830void unit_unref_uid(Unit *u, bool destroy_now) {
4831 unit_unref_uid_internal(u, &u->ref_uid, destroy_now, manager_unref_uid);
4832}
4833
4834void unit_unref_gid(Unit *u, bool destroy_now) {
4835 unit_unref_uid_internal(u, (uid_t*) &u->ref_gid, destroy_now, manager_unref_gid);
4836}
4837
4838static int unit_ref_uid_internal(
4839 Unit *u,
4840 uid_t *ref_uid,
4841 uid_t uid,
4842 bool clean_ipc,
4843 int (*_manager_ref_uid)(Manager *m, uid_t uid, bool clean_ipc)) {
4844
4845 int r;
4846
4847 assert(u);
4848 assert(ref_uid);
4849 assert(uid_is_valid(uid));
4850 assert(_manager_ref_uid);
4851
4852 /* Generic implementation of both unit_ref_uid() and unit_ref_guid(), under the assumption that uid_t and gid_t
4853 * are actually the same type, and have the same validity rules.
4854 *
4855 * Adds a reference on a specific UID/GID to this unit. Each unit referencing the same UID/GID maintains a
4856 * reference so that we can destroy the UID/GID's IPC resources as soon as this is requested and the counter
4857 * drops to zero. */
4858
4859 assert_cc(sizeof(uid_t) == sizeof(gid_t));
4860 assert_cc(UID_INVALID == (uid_t) GID_INVALID);
4861
4862 if (*ref_uid == uid)
4863 return 0;
4864
4865 if (uid_is_valid(*ref_uid)) /* Already set? */
4866 return -EBUSY;
4867
4868 r = _manager_ref_uid(u->manager, uid, clean_ipc);
4869 if (r < 0)
4870 return r;
4871
4872 *ref_uid = uid;
4873 return 1;
4874}
4875
4876int unit_ref_uid(Unit *u, uid_t uid, bool clean_ipc) {
4877 return unit_ref_uid_internal(u, &u->ref_uid, uid, clean_ipc, manager_ref_uid);
4878}
4879
4880int unit_ref_gid(Unit *u, gid_t gid, bool clean_ipc) {
4881 return unit_ref_uid_internal(u, (uid_t*) &u->ref_gid, (uid_t) gid, clean_ipc, manager_ref_gid);
4882}
4883
4884static int unit_ref_uid_gid_internal(Unit *u, uid_t uid, gid_t gid, bool clean_ipc) {
4885 int r = 0, q = 0;
4886
4887 assert(u);
4888
4889 /* Reference both a UID and a GID in one go. Either references both, or neither. */
4890
4891 if (uid_is_valid(uid)) {
4892 r = unit_ref_uid(u, uid, clean_ipc);
4893 if (r < 0)
4894 return r;
4895 }
4896
4897 if (gid_is_valid(gid)) {
4898 q = unit_ref_gid(u, gid, clean_ipc);
4899 if (q < 0) {
4900 if (r > 0)
4901 unit_unref_uid(u, false);
4902
4903 return q;
4904 }
4905 }
4906
4907 return r > 0 || q > 0;
4908}
4909
4910int unit_ref_uid_gid(Unit *u, uid_t uid, gid_t gid) {
4911 ExecContext *c;
4912 int r;
4913
4914 assert(u);
4915
4916 c = unit_get_exec_context(u);
4917
4918 r = unit_ref_uid_gid_internal(u, uid, gid, c ? c->remove_ipc : false);
4919 if (r < 0)
4920 return log_unit_warning_errno(u, r, "Couldn't add UID/GID reference to unit, proceeding without: %m");
4921
4922 return r;
4923}
4924
4925void unit_unref_uid_gid(Unit *u, bool destroy_now) {
4926 assert(u);
4927
4928 unit_unref_uid(u, destroy_now);
4929 unit_unref_gid(u, destroy_now);
4930}
4931
4932void unit_notify_user_lookup(Unit *u, uid_t uid, gid_t gid) {
4933 int r;
4934
4935 assert(u);
4936
4937 /* This is invoked whenever one of the forked off processes let's us know the UID/GID its user name/group names
4938 * resolved to. We keep track of which UID/GID is currently assigned in order to be able to destroy its IPC
4939 * objects when no service references the UID/GID anymore. */
4940
4941 r = unit_ref_uid_gid(u, uid, gid);
4942 if (r > 0)
37d0b962 4943 unit_add_to_dbus_queue(u);
00d9ef85 4944}
4b58153d
LP
4945
4946int unit_set_invocation_id(Unit *u, sd_id128_t id) {
4947 int r;
4948
4949 assert(u);
4950
4951 /* Set the invocation ID for this unit. If we cannot, this will not roll back, but reset the whole thing. */
4952
4953 if (sd_id128_equal(u->invocation_id, id))
4954 return 0;
4955
4956 if (!sd_id128_is_null(u->invocation_id))
4957 (void) hashmap_remove_value(u->manager->units_by_invocation_id, &u->invocation_id, u);
4958
4959 if (sd_id128_is_null(id)) {
4960 r = 0;
4961 goto reset;
4962 }
4963
4964 r = hashmap_ensure_allocated(&u->manager->units_by_invocation_id, &id128_hash_ops);
4965 if (r < 0)
4966 goto reset;
4967
4968 u->invocation_id = id;
4969 sd_id128_to_string(id, u->invocation_id_string);
4970
4971 r = hashmap_put(u->manager->units_by_invocation_id, &u->invocation_id, u);
4972 if (r < 0)
4973 goto reset;
4974
4975 return 0;
4976
4977reset:
4978 u->invocation_id = SD_ID128_NULL;
4979 u->invocation_id_string[0] = 0;
4980 return r;
4981}
4982
4983int unit_acquire_invocation_id(Unit *u) {
4984 sd_id128_t id;
4985 int r;
4986
4987 assert(u);
4988
4989 r = sd_id128_randomize(&id);
4990 if (r < 0)
4991 return log_unit_error_errno(u, r, "Failed to generate invocation ID for unit: %m");
4992
4993 r = unit_set_invocation_id(u, id);
4994 if (r < 0)
4995 return log_unit_error_errno(u, r, "Failed to set invocation ID for unit: %m");
4996
af92c603 4997 unit_add_to_dbus_queue(u);
4b58153d
LP
4998 return 0;
4999}
f0d47797 5000
1ad6e8b3
LP
5001int unit_set_exec_params(Unit *u, ExecParameters *p) {
5002 int r;
5003
7960b0c7
LP
5004 assert(u);
5005 assert(p);
f0d47797 5006
004c7f16 5007 /* Copy parameters from manager */
1ad6e8b3
LP
5008 r = manager_get_effective_environment(u->manager, &p->environment);
5009 if (r < 0)
5010 return r;
5011
004c7f16
LP
5012 p->confirm_spawn = manager_get_confirm_spawn(u->manager);
5013 p->cgroup_supported = u->manager->cgroup_supported;
5014 p->prefix = u->manager->prefix;
5015 SET_FLAG(p->flags, EXEC_PASS_LOG_UNIT|EXEC_CHOWN_DIRECTORIES, MANAGER_IS_SYSTEM(u->manager));
5016
5017 /* Copy paramaters from unit */
7960b0c7 5018 p->cgroup_path = u->cgroup_path;
1d9cc876 5019 SET_FLAG(p->flags, EXEC_CGROUP_DELEGATE, unit_cgroup_delegate(u));
1ad6e8b3
LP
5020
5021 return 0;
f0d47797 5022}
a79279c7 5023
4c253ed1 5024int unit_fork_helper_process(Unit *u, const char *name, pid_t *ret) {
a79279c7
LP
5025 int r;
5026
5027 assert(u);
5028 assert(ret);
5029
5030 /* Forks off a helper process and makes sure it is a member of the unit's cgroup. Returns == 0 in the child,
5031 * and > 0 in the parent. The pid parameter is always filled in with the child's PID. */
5032
5033 (void) unit_realize_cgroup(u);
5034
4c253ed1
LP
5035 r = safe_fork(name, FORK_REOPEN_LOG, ret);
5036 if (r != 0)
5037 return r;
a79279c7 5038
4c253ed1
LP
5039 (void) default_signals(SIGNALS_CRASH_HANDLER, SIGNALS_IGNORE, -1);
5040 (void) ignore_signals(SIGPIPE, -1);
a79279c7 5041
4c253ed1 5042 (void) prctl(PR_SET_PDEATHSIG, SIGTERM);
a79279c7 5043
4c253ed1
LP
5044 if (u->cgroup_path) {
5045 r = cg_attach_everywhere(u->manager->cgroup_supported, u->cgroup_path, 0, NULL, NULL);
5046 if (r < 0) {
5047 log_unit_error_errno(u, r, "Failed to join unit cgroup %s: %m", u->cgroup_path);
5048 _exit(EXIT_CGROUP);
a79279c7 5049 }
a79279c7
LP
5050 }
5051
4c253ed1 5052 return 0;
a79279c7 5053}
c999cf38
LP
5054
5055static void unit_update_dependency_mask(Unit *u, UnitDependency d, Unit *other, UnitDependencyInfo di) {
5056 assert(u);
5057 assert(d >= 0);
5058 assert(d < _UNIT_DEPENDENCY_MAX);
5059 assert(other);
5060
5061 if (di.origin_mask == 0 && di.destination_mask == 0) {
5062 /* No bit set anymore, let's drop the whole entry */
5063 assert_se(hashmap_remove(u->dependencies[d], other));
5064 log_unit_debug(u, "%s lost dependency %s=%s", u->id, unit_dependency_to_string(d), other->id);
5065 } else
5066 /* Mask was reduced, let's update the entry */
5067 assert_se(hashmap_update(u->dependencies[d], other, di.data) == 0);
5068}
5069
5070void unit_remove_dependencies(Unit *u, UnitDependencyMask mask) {
5071 UnitDependency d;
5072
5073 assert(u);
5074
5075 /* Removes all dependencies u has on other units marked for ownership by 'mask'. */
5076
5077 if (mask == 0)
5078 return;
5079
5080 for (d = 0; d < _UNIT_DEPENDENCY_MAX; d++) {
5081 bool done;
5082
5083 do {
5084 UnitDependencyInfo di;
5085 Unit *other;
5086 Iterator i;
5087
5088 done = true;
5089
5090 HASHMAP_FOREACH_KEY(di.data, other, u->dependencies[d], i) {
5091 UnitDependency q;
5092
5093 if ((di.origin_mask & ~mask) == di.origin_mask)
5094 continue;
5095 di.origin_mask &= ~mask;
5096 unit_update_dependency_mask(u, d, other, di);
5097
5098 /* We updated the dependency from our unit to the other unit now. But most dependencies
5099 * imply a reverse dependency. Hence, let's delete that one too. For that we go through
5100 * all dependency types on the other unit and delete all those which point to us and
5101 * have the right mask set. */
5102
5103 for (q = 0; q < _UNIT_DEPENDENCY_MAX; q++) {
5104 UnitDependencyInfo dj;
5105
5106 dj.data = hashmap_get(other->dependencies[q], u);
5107 if ((dj.destination_mask & ~mask) == dj.destination_mask)
5108 continue;
5109 dj.destination_mask &= ~mask;
5110
5111 unit_update_dependency_mask(other, q, u, dj);
5112 }
5113
5114 unit_add_to_gc_queue(other);
5115
5116 done = false;
5117 break;
5118 }
5119
5120 } while (!done);
5121 }
5122}
d3070fbd
LP
5123
5124static int unit_export_invocation_id(Unit *u) {
5125 const char *p;
5126 int r;
5127
5128 assert(u);
5129
5130 if (u->exported_invocation_id)
5131 return 0;
5132
5133 if (sd_id128_is_null(u->invocation_id))
5134 return 0;
5135
5136 p = strjoina("/run/systemd/units/invocation:", u->id);
5137 r = symlink_atomic(u->invocation_id_string, p);
5138 if (r < 0)
5139 return log_unit_debug_errno(u, r, "Failed to create invocation ID symlink %s: %m", p);
5140
5141 u->exported_invocation_id = true;
5142 return 0;
5143}
5144
5145static int unit_export_log_level_max(Unit *u, const ExecContext *c) {
5146 const char *p;
5147 char buf[2];
5148 int r;
5149
5150 assert(u);
5151 assert(c);
5152
5153 if (u->exported_log_level_max)
5154 return 0;
5155
5156 if (c->log_level_max < 0)
5157 return 0;
5158
5159 assert(c->log_level_max <= 7);
5160
5161 buf[0] = '0' + c->log_level_max;
5162 buf[1] = 0;
5163
5164 p = strjoina("/run/systemd/units/log-level-max:", u->id);
5165 r = symlink_atomic(buf, p);
5166 if (r < 0)
5167 return log_unit_debug_errno(u, r, "Failed to create maximum log level symlink %s: %m", p);
5168
5169 u->exported_log_level_max = true;
5170 return 0;
5171}
5172
5173static int unit_export_log_extra_fields(Unit *u, const ExecContext *c) {
5174 _cleanup_close_ int fd = -1;
5175 struct iovec *iovec;
5176 const char *p;
5177 char *pattern;
5178 le64_t *sizes;
5179 ssize_t n;
5180 size_t i;
5181 int r;
5182
5183 if (u->exported_log_extra_fields)
5184 return 0;
5185
5186 if (c->n_log_extra_fields <= 0)
5187 return 0;
5188
5189 sizes = newa(le64_t, c->n_log_extra_fields);
5190 iovec = newa(struct iovec, c->n_log_extra_fields * 2);
5191
5192 for (i = 0; i < c->n_log_extra_fields; i++) {
5193 sizes[i] = htole64(c->log_extra_fields[i].iov_len);
5194
5195 iovec[i*2] = IOVEC_MAKE(sizes + i, sizeof(le64_t));
5196 iovec[i*2+1] = c->log_extra_fields[i];
5197 }
5198
5199 p = strjoina("/run/systemd/units/log-extra-fields:", u->id);
5200 pattern = strjoina(p, ".XXXXXX");
5201
5202 fd = mkostemp_safe(pattern);
5203 if (fd < 0)
5204 return log_unit_debug_errno(u, fd, "Failed to create extra fields file %s: %m", p);
5205
5206 n = writev(fd, iovec, c->n_log_extra_fields*2);
5207 if (n < 0) {
5208 r = log_unit_debug_errno(u, errno, "Failed to write extra fields: %m");
5209 goto fail;
5210 }
5211
5212 (void) fchmod(fd, 0644);
5213
5214 if (rename(pattern, p) < 0) {
5215 r = log_unit_debug_errno(u, errno, "Failed to rename extra fields file: %m");
5216 goto fail;
5217 }
5218
5219 u->exported_log_extra_fields = true;
5220 return 0;
5221
5222fail:
5223 (void) unlink(pattern);
5224 return r;
5225}
5226
90fc172e
AZ
5227static int unit_export_log_rate_limit_interval(Unit *u, const ExecContext *c) {
5228 _cleanup_free_ char *buf = NULL;
5229 const char *p;
5230 int r;
5231
5232 assert(u);
5233 assert(c);
5234
5235 if (u->exported_log_rate_limit_interval)
5236 return 0;
5237
5238 if (c->log_rate_limit_interval_usec == 0)
5239 return 0;
5240
5241 p = strjoina("/run/systemd/units/log-rate-limit-interval:", u->id);
5242
5243 if (asprintf(&buf, "%" PRIu64, c->log_rate_limit_interval_usec) < 0)
5244 return log_oom();
5245
5246 r = symlink_atomic(buf, p);
5247 if (r < 0)
5248 return log_unit_debug_errno(u, r, "Failed to create log rate limit interval symlink %s: %m", p);
5249
5250 u->exported_log_rate_limit_interval = true;
5251 return 0;
5252}
5253
5254static int unit_export_log_rate_limit_burst(Unit *u, const ExecContext *c) {
5255 _cleanup_free_ char *buf = NULL;
5256 const char *p;
5257 int r;
5258
5259 assert(u);
5260 assert(c);
5261
5262 if (u->exported_log_rate_limit_burst)
5263 return 0;
5264
5265 if (c->log_rate_limit_burst == 0)
5266 return 0;
5267
5268 p = strjoina("/run/systemd/units/log-rate-limit-burst:", u->id);
5269
5270 if (asprintf(&buf, "%u", c->log_rate_limit_burst) < 0)
5271 return log_oom();
5272
5273 r = symlink_atomic(buf, p);
5274 if (r < 0)
5275 return log_unit_debug_errno(u, r, "Failed to create log rate limit burst symlink %s: %m", p);
5276
5277 u->exported_log_rate_limit_burst = true;
5278 return 0;
5279}
5280
d3070fbd
LP
5281void unit_export_state_files(Unit *u) {
5282 const ExecContext *c;
5283
5284 assert(u);
5285
5286 if (!u->id)
5287 return;
5288
5289 if (!MANAGER_IS_SYSTEM(u->manager))
5290 return;
5291
638cece4 5292 if (MANAGER_IS_TEST_RUN(u->manager))
8f632531
LP
5293 return;
5294
d3070fbd
LP
5295 /* Exports a couple of unit properties to /run/systemd/units/, so that journald can quickly query this data
5296 * from there. Ideally, journald would use IPC to query this, like everybody else, but that's hard, as long as
5297 * the IPC system itself and PID 1 also log to the journal.
5298 *
5299 * Note that these files really shouldn't be considered API for anyone else, as use a runtime file system as
5300 * IPC replacement is not compatible with today's world of file system namespaces. However, this doesn't really
5301 * apply to communication between the journal and systemd, as we assume that these two daemons live in the same
5302 * namespace at least.
5303 *
5304 * Note that some of the "files" exported here are actually symlinks and not regular files. Symlinks work
5305 * better for storing small bits of data, in particular as we can write them with two system calls, and read
5306 * them with one. */
5307
5308 (void) unit_export_invocation_id(u);
5309
5310 c = unit_get_exec_context(u);
5311 if (c) {
5312 (void) unit_export_log_level_max(u, c);
5313 (void) unit_export_log_extra_fields(u, c);
90fc172e
AZ
5314 (void) unit_export_log_rate_limit_interval(u, c);
5315 (void) unit_export_log_rate_limit_burst(u, c);
d3070fbd
LP
5316 }
5317}
5318
5319void unit_unlink_state_files(Unit *u) {
5320 const char *p;
5321
5322 assert(u);
5323
5324 if (!u->id)
5325 return;
5326
5327 if (!MANAGER_IS_SYSTEM(u->manager))
5328 return;
5329
5330 /* Undoes the effect of unit_export_state() */
5331
5332 if (u->exported_invocation_id) {
5333 p = strjoina("/run/systemd/units/invocation:", u->id);
5334 (void) unlink(p);
5335
5336 u->exported_invocation_id = false;
5337 }
5338
5339 if (u->exported_log_level_max) {
5340 p = strjoina("/run/systemd/units/log-level-max:", u->id);
5341 (void) unlink(p);
5342
5343 u->exported_log_level_max = false;
5344 }
5345
5346 if (u->exported_log_extra_fields) {
5347 p = strjoina("/run/systemd/units/extra-fields:", u->id);
5348 (void) unlink(p);
5349
5350 u->exported_log_extra_fields = false;
5351 }
90fc172e
AZ
5352
5353 if (u->exported_log_rate_limit_interval) {
5354 p = strjoina("/run/systemd/units/log-rate-limit-interval:", u->id);
5355 (void) unlink(p);
5356
5357 u->exported_log_rate_limit_interval = false;
5358 }
5359
5360 if (u->exported_log_rate_limit_burst) {
5361 p = strjoina("/run/systemd/units/log-rate-limit-burst:", u->id);
5362 (void) unlink(p);
5363
5364 u->exported_log_rate_limit_burst = false;
5365 }
d3070fbd 5366}
5afe510c 5367
3c7416b6
LP
5368int unit_prepare_exec(Unit *u) {
5369 int r;
5370
5371 assert(u);
5372
5373 /* Prepares everything so that we can fork of a process for this unit */
5374
5375 (void) unit_realize_cgroup(u);
5376
5377 if (u->reset_accounting) {
5378 (void) unit_reset_cpu_accounting(u);
5379 (void) unit_reset_ip_accounting(u);
5380 u->reset_accounting = false;
5381 }
5382
5383 unit_export_state_files(u);
5384
5385 r = unit_setup_exec_runtime(u);
5386 if (r < 0)
5387 return r;
5388
5389 r = unit_setup_dynamic_creds(u);
5390 if (r < 0)
5391 return r;
5392
5393 return 0;
5394}
5395
c53d2d54 5396static int log_leftover(pid_t pid, int sig, void *userdata) {
a4634b21
LP
5397 _cleanup_free_ char *comm = NULL;
5398
5399 (void) get_process_comm(pid, &comm);
5400
5401 if (comm && comm[0] == '(') /* Most likely our own helper process (PAM?), ignore */
c53d2d54 5402 return 0;
a4634b21
LP
5403
5404 log_unit_warning(userdata,
5405 "Found left-over process " PID_FMT " (%s) in control group while starting unit. Ignoring.\n"
5406 "This usually indicates unclean termination of a previous run, or service implementation deficiencies.",
5407 pid, strna(comm));
c53d2d54
DB
5408
5409 return 1;
a4634b21
LP
5410}
5411
c53d2d54 5412int unit_warn_leftover_processes(Unit *u) {
a4634b21
LP
5413 assert(u);
5414
5415 (void) unit_pick_cgroup_path(u);
5416
5417 if (!u->cgroup_path)
c53d2d54 5418 return 0;
a4634b21 5419
c53d2d54 5420 return cg_kill_recursive(SYSTEMD_CGROUP_CONTROLLER, u->cgroup_path, 0, 0, NULL, log_leftover, u);
a4634b21
LP
5421}
5422
bb2c7685
LP
5423bool unit_needs_console(Unit *u) {
5424 ExecContext *ec;
5425 UnitActiveState state;
5426
5427 assert(u);
5428
5429 state = unit_active_state(u);
5430
5431 if (UNIT_IS_INACTIVE_OR_FAILED(state))
5432 return false;
5433
5434 if (UNIT_VTABLE(u)->needs_console)
5435 return UNIT_VTABLE(u)->needs_console(u);
5436
5437 /* If this unit type doesn't implement this call, let's use a generic fallback implementation: */
5438 ec = unit_get_exec_context(u);
5439 if (!ec)
5440 return false;
5441
5442 return exec_context_may_touch_console(ec);
5443}
5444
81e9871e
LP
5445const char *unit_label_path(Unit *u) {
5446 const char *p;
5447
5448 /* Returns the file system path to use for MAC access decisions, i.e. the file to read the SELinux label off
5449 * when validating access checks. */
5450
5451 p = u->source_path ?: u->fragment_path;
5452 if (!p)
5453 return NULL;
5454
5455 /* If a unit is masked, then don't read the SELinux label of /dev/null, as that really makes no sense */
5456 if (path_equal(p, "/dev/null"))
5457 return NULL;
5458
5459 return p;
5460}
5461
6592b975
LP
5462int unit_pid_attachable(Unit *u, pid_t pid, sd_bus_error *error) {
5463 int r;
5464
5465 assert(u);
5466
5467 /* Checks whether the specified PID is generally good for attaching, i.e. a valid PID, not our manager itself,
5468 * and not a kernel thread either */
5469
5470 /* First, a simple range check */
5471 if (!pid_is_valid(pid))
5472 return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Process identifier " PID_FMT " is not valid.", pid);
5473
5474 /* Some extra safety check */
5475 if (pid == 1 || pid == getpid_cached())
3fe91079 5476 return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Process " PID_FMT " is a manager process, refusing.", pid);
6592b975
LP
5477
5478 /* Don't even begin to bother with kernel threads */
5479 r = is_kernel_thread(pid);
5480 if (r == -ESRCH)
5481 return sd_bus_error_setf(error, SD_BUS_ERROR_UNIX_PROCESS_ID_UNKNOWN, "Process with ID " PID_FMT " does not exist.", pid);
5482 if (r < 0)
5483 return sd_bus_error_set_errnof(error, r, "Failed to determine whether process " PID_FMT " is a kernel thread: %m", pid);
5484 if (r > 0)
5485 return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Process " PID_FMT " is a kernel thread, refusing.", pid);
5486
5487 return 0;
5488}
5489
523ee2d4
LP
5490void unit_log_success(Unit *u) {
5491 assert(u);
5492
5493 log_struct(LOG_INFO,
5494 "MESSAGE_ID=" SD_MESSAGE_UNIT_SUCCESS_STR,
5495 LOG_UNIT_ID(u),
5496 LOG_UNIT_INVOCATION_ID(u),
5497 LOG_UNIT_MESSAGE(u, "Succeeded."));
5498}
5499
7c047d74
LP
5500void unit_log_failure(Unit *u, const char *result) {
5501 assert(u);
5502 assert(result);
5503
5504 log_struct(LOG_WARNING,
5505 "MESSAGE_ID=" SD_MESSAGE_UNIT_FAILURE_RESULT_STR,
5506 LOG_UNIT_ID(u),
5507 LOG_UNIT_INVOCATION_ID(u),
5508 LOG_UNIT_MESSAGE(u, "Failed with result '%s'.", result),
5509 "UNIT_RESULT=%s", result);
5510}
5511
91bbd9b7
LP
5512void unit_log_process_exit(
5513 Unit *u,
5514 int level,
5515 const char *kind,
5516 const char *command,
5517 int code,
5518 int status) {
5519
5520 assert(u);
5521 assert(kind);
5522
5523 if (code != CLD_EXITED)
5524 level = LOG_WARNING;
5525
5526 log_struct(level,
5527 "MESSAGE_ID=" SD_MESSAGE_UNIT_PROCESS_EXIT_STR,
5528 LOG_UNIT_MESSAGE(u, "%s exited, code=%s, status=%i/%s",
5529 kind,
5530 sigchld_code_to_string(code), status,
5531 strna(code == CLD_EXITED
5532 ? exit_status_to_string(status, EXIT_STATUS_FULL)
5533 : signal_to_string(status))),
5534 "EXIT_CODE=%s", sigchld_code_to_string(code),
5535 "EXIT_STATUS=%i", status,
5536 "COMMAND=%s", strna(command),
5537 LOG_UNIT_ID(u),
5538 LOG_UNIT_INVOCATION_ID(u));
5539}
5540
7af67e9a
LP
5541int unit_exit_status(Unit *u) {
5542 assert(u);
5543
5544 /* Returns the exit status to propagate for the most recent cycle of this unit. Returns a value in the range
5545 * 0…255 if there's something to propagate. EOPNOTSUPP if the concept does not apply to this unit type, ENODATA
5546 * if no data is currently known (for example because the unit hasn't deactivated yet) and EBADE if the main
5547 * service process has exited abnormally (signal/coredump). */
5548
5549 if (!UNIT_VTABLE(u)->exit_status)
5550 return -EOPNOTSUPP;
5551
5552 return UNIT_VTABLE(u)->exit_status(u);
5553}
5554
5555int unit_failure_action_exit_status(Unit *u) {
5556 int r;
5557
5558 assert(u);
5559
5560 /* Returns the exit status to propagate on failure, or an error if there's nothing to propagate */
5561
5562 if (u->failure_action_exit_status >= 0)
5563 return u->failure_action_exit_status;
5564
5565 r = unit_exit_status(u);
5566 if (r == -EBADE) /* Exited, but not cleanly (i.e. by signal or such) */
5567 return 255;
5568
5569 return r;
5570}
5571
5572int unit_success_action_exit_status(Unit *u) {
5573 int r;
5574
5575 assert(u);
5576
5577 /* Returns the exit status to propagate on success, or an error if there's nothing to propagate */
5578
5579 if (u->success_action_exit_status >= 0)
5580 return u->success_action_exit_status;
5581
5582 r = unit_exit_status(u);
5583 if (r == -EBADE) /* Exited, but not cleanly (i.e. by signal or such) */
5584 return 255;
5585
5586 return r;
5587}
5588
a4191c9f
LP
5589int unit_test_trigger_loaded(Unit *u) {
5590 Unit *trigger;
5591
5592 /* Tests whether the unit to trigger is loaded */
5593
5594 trigger = UNIT_TRIGGER(u);
5595 if (!trigger)
5596 return log_unit_error_errno(u, SYNTHETIC_ERRNO(ENOENT), "Refusing to start, unit to trigger not loaded.");
5597 if (trigger->load_state != UNIT_LOADED)
5598 return log_unit_error_errno(u, SYNTHETIC_ERRNO(ENOENT), "Refusing to start, unit %s to trigger not loaded.", u->id);
5599
5600 return 0;
5601}
5602
5afe510c
LP
5603static const char* const collect_mode_table[_COLLECT_MODE_MAX] = {
5604 [COLLECT_INACTIVE] = "inactive",
5605 [COLLECT_INACTIVE_OR_FAILED] = "inactive-or-failed",
5606};
5607
5608DEFINE_STRING_TABLE_LOOKUP(collect_mode, CollectMode);