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