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