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