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