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