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