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