]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/core/unit.c
core: make the root mount perpetual too
[thirdparty/systemd.git] / src / core / unit.c
CommitLineData
a7334b09
LP
1/***
2 This file is part of systemd.
3
4 Copyright 2010 Lennart Poettering
5
6 systemd is free software; you can redistribute it and/or modify it
5430f7f2
LP
7 under the terms of the GNU Lesser General Public License as published by
8 the Free Software Foundation; either version 2.1 of the License, or
a7334b09
LP
9 (at your option) any later version.
10
11 systemd is distributed in the hope that it will be useful, but
12 WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
5430f7f2 14 Lesser General Public License for more details.
a7334b09 15
5430f7f2 16 You should have received a copy of the GNU Lesser General Public License
a7334b09
LP
17 along with systemd; If not, see <http://www.gnu.org/licenses/>.
18***/
19
87f0e418 20#include <errno.h>
0301abf4 21#include <stdlib.h>
4f5dd394 22#include <string.h>
45fb0699 23#include <sys/stat.h>
4f5dd394 24#include <unistd.h>
87f0e418 25
718db961
LP
26#include "sd-id128.h"
27#include "sd-messages.h"
4f5dd394 28
b5efdb8a 29#include "alloc-util.h"
4f5dd394
LP
30#include "bus-common-errors.h"
31#include "bus-util.h"
c6c18be3 32#include "cgroup-util.h"
4f5dd394
LP
33#include "dbus-unit.h"
34#include "dbus.h"
35#include "dropin.h"
36#include "escape.h"
37#include "execute.h"
a5c32cff 38#include "fileio-label.h"
6482f626 39#include "formats-util.h"
4b58153d 40#include "id128-util.h"
4f5dd394
LP
41#include "load-dropin.h"
42#include "load-fragment.h"
43#include "log.h"
44#include "macro.h"
45#include "missing.h"
46#include "mkdir.h"
6bedfcbb 47#include "parse-util.h"
4f5dd394 48#include "path-util.h"
0b452006 49#include "process-util.h"
4f5dd394 50#include "set.h"
6eb7c172 51#include "signal-util.h"
e9db43d5 52#include "special.h"
8fcde012 53#include "stat-util.h"
d054f0a4 54#include "stdio-util.h"
07630cea 55#include "string-util.h"
4f5dd394 56#include "strv.h"
4f4afc88 57#include "umask-util.h"
4f5dd394 58#include "unit-name.h"
e9db43d5 59#include "unit.h"
b1d4f8e1
LP
60#include "user-util.h"
61#include "virt.h"
87f0e418
LP
62
63const UnitVTable * const unit_vtable[_UNIT_TYPE_MAX] = {
64 [UNIT_SERVICE] = &service_vtable,
87f0e418 65 [UNIT_SOCKET] = &socket_vtable,
e821075a 66 [UNIT_BUSNAME] = &busname_vtable,
87f0e418
LP
67 [UNIT_TARGET] = &target_vtable,
68 [UNIT_DEVICE] = &device_vtable,
69 [UNIT_MOUNT] = &mount_vtable,
70 [UNIT_AUTOMOUNT] = &automount_vtable,
01f78473 71 [UNIT_SWAP] = &swap_vtable,
e821075a 72 [UNIT_TIMER] = &timer_vtable,
a016b922 73 [UNIT_PATH] = &path_vtable,
6c12b52e
LP
74 [UNIT_SLICE] = &slice_vtable,
75 [UNIT_SCOPE] = &scope_vtable
87f0e418
LP
76};
77
f2341e0a 78static void maybe_warn_about_dependency(Unit *u, const char *other, UnitDependency dependency);
d1fab3fe 79
7d17cfbc 80Unit *unit_new(Manager *m, size_t size) {
87f0e418
LP
81 Unit *u;
82
83 assert(m);
ac155bb8 84 assert(size >= sizeof(Unit));
87f0e418 85
7d17cfbc
MS
86 u = malloc0(size);
87 if (!u)
87f0e418
LP
88 return NULL;
89
d5099efc 90 u->names = set_new(&string_hash_ops);
6b430fdb
ZJS
91 if (!u->names)
92 return mfree(u);
87f0e418 93
ac155bb8
MS
94 u->manager = m;
95 u->type = _UNIT_TYPE_INVALID;
ac155bb8
MS
96 u->default_dependencies = true;
97 u->unit_file_state = _UNIT_FILE_STATE_INVALID;
d2dc52db 98 u->unit_file_preset = -1;
d420282b 99 u->on_failure_job_mode = JOB_REPLACE;
efdb0237 100 u->cgroup_inotify_wd = -1;
36c16a7c 101 u->job_timeout = USEC_INFINITY;
00d9ef85
LP
102 u->ref_uid = UID_INVALID;
103 u->ref_gid = GID_INVALID;
fe700f46 104 u->cpu_usage_last = NSEC_INFINITY;
87f0e418 105
6bf0f408 106 RATELIMIT_INIT(u->start_limit, m->default_start_limit_interval, m->default_start_limit_burst);
67bfdc97 107 RATELIMIT_INIT(u->auto_stop_ratelimit, 10 * USEC_PER_SEC, 16);
bea355da 108
87f0e418
LP
109 return u;
110}
111
f278026d
LP
112bool unit_has_name(Unit *u, const char *name) {
113 assert(u);
114 assert(name);
115
390bc2b1 116 return set_contains(u->names, (char*) name);
f278026d
LP
117}
118
598459ce
LP
119static void unit_init(Unit *u) {
120 CGroupContext *cc;
121 ExecContext *ec;
122 KillContext *kc;
123
124 assert(u);
125 assert(u->manager);
126 assert(u->type >= 0);
127
128 cc = unit_get_cgroup_context(u);
129 if (cc) {
130 cgroup_context_init(cc);
131
132 /* Copy in the manager defaults into the cgroup
133 * context, _before_ the rest of the settings have
134 * been initialized */
135
136 cc->cpu_accounting = u->manager->default_cpu_accounting;
13c31542 137 cc->io_accounting = u->manager->default_io_accounting;
598459ce
LP
138 cc->blockio_accounting = u->manager->default_blockio_accounting;
139 cc->memory_accounting = u->manager->default_memory_accounting;
03a7b521 140 cc->tasks_accounting = u->manager->default_tasks_accounting;
0af20ea2
LP
141
142 if (u->type != UNIT_SLICE)
143 cc->tasks_max = u->manager->default_tasks_max;
598459ce
LP
144 }
145
146 ec = unit_get_exec_context(u);
147 if (ec)
148 exec_context_init(ec);
149
150 kc = unit_get_kill_context(u);
151 if (kc)
152 kill_context_init(kc);
153
154 if (UNIT_VTABLE(u)->init)
155 UNIT_VTABLE(u)->init(u);
156}
157
87f0e418 158int unit_add_name(Unit *u, const char *text) {
598459ce 159 _cleanup_free_ char *s = NULL, *i = NULL;
87f0e418 160 UnitType t;
87f0e418
LP
161 int r;
162
163 assert(u);
164 assert(text);
165
7410616c 166 if (unit_name_is_valid(text, UNIT_NAME_TEMPLATE)) {
598459ce 167
ac155bb8 168 if (!u->instance)
9e2f7c11 169 return -EINVAL;
87f0e418 170
7410616c
LP
171 r = unit_name_replace_instance(text, u->instance, &s);
172 if (r < 0)
173 return r;
174 } else {
9e2f7c11 175 s = strdup(text);
7410616c
LP
176 if (!s)
177 return -ENOMEM;
178 }
87f0e418 179
7410616c
LP
180 if (set_contains(u->names, s))
181 return 0;
182 if (hashmap_contains(u->manager->units, s))
183 return -EEXIST;
184
185 if (!unit_name_is_valid(s, UNIT_NAME_PLAIN|UNIT_NAME_INSTANCE))
598459ce 186 return -EINVAL;
e537352b 187
7410616c
LP
188 t = unit_name_to_type(s);
189 if (t < 0)
190 return -EINVAL;
87f0e418 191
598459ce
LP
192 if (u->type != _UNIT_TYPE_INVALID && t != u->type)
193 return -EINVAL;
87f0e418 194
e48614c4
ZJS
195 r = unit_name_to_instance(s, &i);
196 if (r < 0)
598459ce 197 return r;
87f0e418 198
ce99c68a 199 if (i && !unit_type_may_template(t))
598459ce 200 return -EINVAL;
9e2f7c11 201
276c3e78 202 /* Ensure that this unit is either instanced or not instanced,
7410616c
LP
203 * but not both. Note that we do allow names with different
204 * instance names however! */
598459ce
LP
205 if (u->type != _UNIT_TYPE_INVALID && !u->instance != !i)
206 return -EINVAL;
9e2f7c11 207
8a993b61 208 if (!unit_type_may_alias(t) && !set_isempty(u->names))
598459ce 209 return -EEXIST;
9e2f7c11 210
598459ce
LP
211 if (hashmap_size(u->manager->units) >= MANAGER_MAX_NAMES)
212 return -E2BIG;
4f0f902f 213
e48614c4 214 r = set_put(u->names, s);
7410616c 215 if (r < 0)
598459ce 216 return r;
7410616c 217 assert(r > 0);
87f0e418 218
e48614c4
ZJS
219 r = hashmap_put(u->manager->units, s, u);
220 if (r < 0) {
7410616c 221 (void) set_remove(u->names, s);
598459ce 222 return r;
87f0e418
LP
223 }
224
ac155bb8 225 if (u->type == _UNIT_TYPE_INVALID) {
ac155bb8
MS
226 u->type = t;
227 u->id = s;
228 u->instance = i;
9e2f7c11 229
71fda00f 230 LIST_PREPEND(units_by_type, u->manager->units_by_type[t], u);
e537352b 231
598459ce 232 unit_init(u);
87f0e418 233
598459ce
LP
234 i = NULL;
235 }
9e2f7c11 236
598459ce 237 s = NULL;
9e2f7c11 238
598459ce
LP
239 unit_add_to_dbus_queue(u);
240 return 0;
87f0e418
LP
241}
242
0ae97ec1 243int unit_choose_id(Unit *u, const char *name) {
68eda4bd 244 _cleanup_free_ char *t = NULL;
598459ce 245 char *s, *i;
276c3e78 246 int r;
0ae97ec1
LP
247
248 assert(u);
249 assert(name);
250
7410616c 251 if (unit_name_is_valid(name, UNIT_NAME_TEMPLATE)) {
9e2f7c11 252
ac155bb8 253 if (!u->instance)
9e2f7c11
LP
254 return -EINVAL;
255
7410616c
LP
256 r = unit_name_replace_instance(name, u->instance, &t);
257 if (r < 0)
258 return r;
9e2f7c11
LP
259
260 name = t;
261 }
262
0ae97ec1 263 /* Selects one of the names of this unit as the id */
ac155bb8 264 s = set_get(u->names, (char*) name);
9e2f7c11 265 if (!s)
0ae97ec1
LP
266 return -ENOENT;
267
7410616c 268 /* Determine the new instance from the new id */
e48614c4
ZJS
269 r = unit_name_to_instance(s, &i);
270 if (r < 0)
276c3e78
LP
271 return r;
272
ac155bb8 273 u->id = s;
276c3e78 274
ac155bb8
MS
275 free(u->instance);
276 u->instance = i;
276c3e78 277
c1e1601e 278 unit_add_to_dbus_queue(u);
9e2f7c11 279
0ae97ec1
LP
280 return 0;
281}
282
f50e0a01
LP
283int unit_set_description(Unit *u, const char *description) {
284 char *s;
285
286 assert(u);
287
8aec412f
LP
288 if (isempty(description))
289 s = NULL;
290 else {
291 s = strdup(description);
292 if (!s)
293 return -ENOMEM;
294 }
f50e0a01 295
ac155bb8
MS
296 free(u->description);
297 u->description = s;
c1e1601e
LP
298
299 unit_add_to_dbus_queue(u);
f50e0a01
LP
300 return 0;
301}
302
701cc384 303bool unit_check_gc(Unit *u) {
a354329f 304 UnitActiveState state;
701cc384
LP
305 assert(u);
306
a354329f 307 if (u->job)
701cc384
LP
308 return true;
309
a354329f 310 if (u->nop_job)
6c073082
LP
311 return true;
312
a354329f
LP
313 state = unit_active_state(u);
314
315 /* If the unit is inactive and failed and no job is queued for
316 * it, then release its runtime resources */
317 if (UNIT_IS_INACTIVE_OR_FAILED(state) &&
318 UNIT_VTABLE(u)->release_resources)
319 UNIT_VTABLE(u)->release_resources(u);
320
321 /* But we keep the unit object around for longer when it is
322 * referenced or configured to not be gc'ed */
323 if (state != UNIT_INACTIVE)
701cc384
LP
324 return true;
325
f5869324 326 if (u->perpetual)
701cc384
LP
327 return true;
328
9d576438
LP
329 if (u->refs)
330 return true;
331
05a98afd
LP
332 if (sd_bus_track_count(u->bus_track) > 0)
333 return true;
334
701cc384
LP
335 if (UNIT_VTABLE(u)->check_gc)
336 if (UNIT_VTABLE(u)->check_gc(u))
337 return true;
338
339 return false;
340}
341
87f0e418
LP
342void unit_add_to_load_queue(Unit *u) {
343 assert(u);
ac155bb8 344 assert(u->type != _UNIT_TYPE_INVALID);
87f0e418 345
ac155bb8 346 if (u->load_state != UNIT_STUB || u->in_load_queue)
87f0e418
LP
347 return;
348
71fda00f 349 LIST_PREPEND(load_queue, u->manager->load_queue, u);
ac155bb8 350 u->in_load_queue = true;
87f0e418
LP
351}
352
23a177ef
LP
353void unit_add_to_cleanup_queue(Unit *u) {
354 assert(u);
355
ac155bb8 356 if (u->in_cleanup_queue)
23a177ef
LP
357 return;
358
71fda00f 359 LIST_PREPEND(cleanup_queue, u->manager->cleanup_queue, u);
ac155bb8 360 u->in_cleanup_queue = true;
23a177ef
LP
361}
362
701cc384
LP
363void unit_add_to_gc_queue(Unit *u) {
364 assert(u);
365
ac155bb8 366 if (u->in_gc_queue || u->in_cleanup_queue)
701cc384
LP
367 return;
368
369 if (unit_check_gc(u))
370 return;
371
71fda00f 372 LIST_PREPEND(gc_queue, u->manager->gc_queue, u);
ac155bb8 373 u->in_gc_queue = true;
701cc384 374
313cefa1 375 u->manager->n_in_gc_queue++;
701cc384
LP
376}
377
c1e1601e
LP
378void unit_add_to_dbus_queue(Unit *u) {
379 assert(u);
ac155bb8 380 assert(u->type != _UNIT_TYPE_INVALID);
c1e1601e 381
ac155bb8 382 if (u->load_state == UNIT_STUB || u->in_dbus_queue)
c1e1601e
LP
383 return;
384
a567261a 385 /* Shortcut things if nobody cares */
8f8f05a9
LP
386 if (sd_bus_track_count(u->manager->subscribed) <= 0 &&
387 set_isempty(u->manager->private_buses)) {
ac155bb8 388 u->sent_dbus_new_signal = true;
94b6dfa2
LP
389 return;
390 }
391
71fda00f 392 LIST_PREPEND(dbus_queue, u->manager->dbus_unit_queue, u);
ac155bb8 393 u->in_dbus_queue = true;
c1e1601e
LP
394}
395
87f0e418
LP
396static void bidi_set_free(Unit *u, Set *s) {
397 Iterator i;
398 Unit *other;
399
400 assert(u);
401
402 /* Frees the set and makes sure we are dropped from the
403 * inverse pointers */
404
405 SET_FOREACH(other, s, i) {
406 UnitDependency d;
407
408 for (d = 0; d < _UNIT_DEPENDENCY_MAX; d++)
ac155bb8 409 set_remove(other->dependencies[d], u);
701cc384
LP
410
411 unit_add_to_gc_queue(other);
87f0e418
LP
412 }
413
414 set_free(s);
415}
416
c2756a68
LP
417static void unit_remove_transient(Unit *u) {
418 char **i;
419
420 assert(u);
421
422 if (!u->transient)
423 return;
424
425 if (u->fragment_path)
3f5e8115 426 (void) unlink(u->fragment_path);
c2756a68
LP
427
428 STRV_FOREACH(i, u->dropin_paths) {
39591351 429 _cleanup_free_ char *p = NULL, *pp = NULL;
c2756a68 430
39591351
LP
431 p = dirname_malloc(*i); /* Get the drop-in directory from the drop-in file */
432 if (!p)
433 continue;
434
435 pp = dirname_malloc(p); /* Get the config directory from the drop-in directory */
436 if (!pp)
437 continue;
438
439 /* Only drop transient drop-ins */
440 if (!path_equal(u->manager->lookup_paths.transient, pp))
441 continue;
c2756a68 442
39591351
LP
443 (void) unlink(*i);
444 (void) rmdir(p);
c2756a68
LP
445 }
446}
447
a57f7e2c
LP
448static void unit_free_requires_mounts_for(Unit *u) {
449 char **j;
450
451 STRV_FOREACH(j, u->requires_mounts_for) {
452 char s[strlen(*j) + 1];
453
454 PATH_FOREACH_PREFIX_MORE(s, *j) {
455 char *y;
456 Set *x;
457
458 x = hashmap_get2(u->manager->units_requiring_mounts_for, s, (void**) &y);
459 if (!x)
460 continue;
461
462 set_remove(x, u);
463
464 if (set_isempty(x)) {
465 hashmap_remove(u->manager->units_requiring_mounts_for, y);
466 free(y);
467 set_free(x);
468 }
469 }
470 }
471
6796073e 472 u->requires_mounts_for = strv_free(u->requires_mounts_for);
a57f7e2c
LP
473}
474
598459ce
LP
475static void unit_done(Unit *u) {
476 ExecContext *ec;
477 CGroupContext *cc;
478
479 assert(u);
480
481 if (u->type < 0)
482 return;
483
484 if (UNIT_VTABLE(u)->done)
485 UNIT_VTABLE(u)->done(u);
486
487 ec = unit_get_exec_context(u);
488 if (ec)
489 exec_context_done(ec);
490
491 cc = unit_get_cgroup_context(u);
492 if (cc)
493 cgroup_context_done(cc);
494}
495
87f0e418
LP
496void unit_free(Unit *u) {
497 UnitDependency d;
498 Iterator i;
499 char *t;
500
501 assert(u);
502
4f4afc88
LP
503 if (u->transient_file)
504 fclose(u->transient_file);
505
2c289ea8 506 if (!MANAGER_IS_RELOADING(u->manager))
c2756a68
LP
507 unit_remove_transient(u);
508
c1e1601e
LP
509 bus_unit_send_removed_signal(u);
510
598459ce 511 unit_done(u);
a013b84b 512
cf9fd508
DM
513 sd_bus_slot_unref(u->match_bus_slot);
514
05a98afd
LP
515 sd_bus_track_unref(u->bus_track);
516 u->deserialized_refs = strv_free(u->deserialized_refs);
517
a57f7e2c
LP
518 unit_free_requires_mounts_for(u);
519
ac155bb8
MS
520 SET_FOREACH(t, u->names, i)
521 hashmap_remove_value(u->manager->units, t, u);
87f0e418 522
4b58153d
LP
523 if (!sd_id128_is_null(u->invocation_id))
524 hashmap_remove_value(u->manager->units_by_invocation_id, &u->invocation_id, u);
525
97e7d748
MS
526 if (u->job) {
527 Job *j = u->job;
528 job_uninstall(j);
529 job_free(j);
530 }
964e0949 531
e0209d83
MS
532 if (u->nop_job) {
533 Job *j = u->nop_job;
534 job_uninstall(j);
535 job_free(j);
536 }
537
964e0949 538 for (d = 0; d < _UNIT_DEPENDENCY_MAX; d++)
ac155bb8 539 bidi_set_free(u, u->dependencies[d]);
964e0949 540
ac155bb8 541 if (u->type != _UNIT_TYPE_INVALID)
71fda00f 542 LIST_REMOVE(units_by_type, u->manager->units_by_type[u->type], u);
ef734fd6 543
ac155bb8 544 if (u->in_load_queue)
71fda00f 545 LIST_REMOVE(load_queue, u->manager->load_queue, u);
87f0e418 546
ac155bb8 547 if (u->in_dbus_queue)
71fda00f 548 LIST_REMOVE(dbus_queue, u->manager->dbus_unit_queue, u);
c1e1601e 549
ac155bb8 550 if (u->in_cleanup_queue)
71fda00f 551 LIST_REMOVE(cleanup_queue, u->manager->cleanup_queue, u);
23a177ef 552
ac155bb8 553 if (u->in_gc_queue) {
71fda00f 554 LIST_REMOVE(gc_queue, u->manager->gc_queue, u);
ac155bb8 555 u->manager->n_in_gc_queue--;
701cc384
LP
556 }
557
4ad49000 558 if (u->in_cgroup_queue)
71fda00f 559 LIST_REMOVE(cgroup_queue, u->manager->cgroup_queue, u);
87f0e418 560
efdb0237 561 unit_release_cgroup(u);
72673e86 562
00d9ef85
LP
563 unit_unref_uid_gid(u, false);
564
5269eb6b 565 (void) manager_update_failed_units(u->manager, u, false);
db785129 566 set_remove(u->manager->startup_units, u);
f755e3b7 567
ac155bb8 568 free(u->description);
49dbfa7b 569 strv_free(u->documentation);
ac155bb8 570 free(u->fragment_path);
1b64d026 571 free(u->source_path);
ae7a7182 572 strv_free(u->dropin_paths);
ac155bb8 573 free(u->instance);
87f0e418 574
f189ab18
LP
575 free(u->job_timeout_reboot_arg);
576
ac155bb8 577 set_free_free(u->names);
87f0e418 578
a911bb9a
LP
579 unit_unwatch_all_pids(u);
580
ac155bb8 581 condition_free_list(u->conditions);
59fccdc5 582 condition_free_list(u->asserts);
52661efd 583
6bf0f408
LP
584 free(u->reboot_arg);
585
702a2d8f
LP
586 unit_ref_unset(&u->slice);
587
ac155bb8
MS
588 while (u->refs)
589 unit_ref_unset(u->refs);
57020a3a 590
87f0e418
LP
591 free(u);
592}
593
594UnitActiveState unit_active_state(Unit *u) {
595 assert(u);
596
ac155bb8 597 if (u->load_state == UNIT_MERGED)
6124958c
LP
598 return unit_active_state(unit_follow_merge(u));
599
600 /* After a reload it might happen that a unit is not correctly
601 * loaded but still has a process around. That's why we won't
fdf20a31 602 * shortcut failed loading to UNIT_INACTIVE_FAILED. */
87f0e418
LP
603
604 return UNIT_VTABLE(u)->active_state(u);
605}
606
10a94420
LP
607const char* unit_sub_state_to_string(Unit *u) {
608 assert(u);
609
610 return UNIT_VTABLE(u)->sub_state_to_string(u);
611}
612
7c0b05e5
MS
613static int complete_move(Set **s, Set **other) {
614 int r;
615
23a177ef
LP
616 assert(s);
617 assert(other);
87f0e418 618
23a177ef 619 if (!*other)
7c0b05e5 620 return 0;
87f0e418 621
7c0b05e5
MS
622 if (*s) {
623 r = set_move(*s, *other);
624 if (r < 0)
625 return r;
626 } else {
23a177ef
LP
627 *s = *other;
628 *other = NULL;
629 }
7c0b05e5
MS
630
631 return 0;
23a177ef 632}
87f0e418 633
7c0b05e5 634static int merge_names(Unit *u, Unit *other) {
23a177ef
LP
635 char *t;
636 Iterator i;
7c0b05e5 637 int r;
87f0e418 638
23a177ef
LP
639 assert(u);
640 assert(other);
641
7c0b05e5
MS
642 r = complete_move(&u->names, &other->names);
643 if (r < 0)
644 return r;
23a177ef 645
ac155bb8
MS
646 set_free_free(other->names);
647 other->names = NULL;
648 other->id = NULL;
23a177ef 649
ac155bb8
MS
650 SET_FOREACH(t, u->names, i)
651 assert_se(hashmap_replace(u->manager->units, t, u) == 0);
7c0b05e5
MS
652
653 return 0;
87f0e418
LP
654}
655
09a65f92
MS
656static int reserve_dependencies(Unit *u, Unit *other, UnitDependency d) {
657 unsigned n_reserve;
658
659 assert(u);
660 assert(other);
661 assert(d < _UNIT_DEPENDENCY_MAX);
662
663 /*
664 * If u does not have this dependency set allocated, there is no need
f131770b 665 * to reserve anything. In that case other's set will be transferred
09a65f92
MS
666 * as a whole to u by complete_move().
667 */
668 if (!u->dependencies[d])
669 return 0;
670
671 /* merge_dependencies() will skip a u-on-u dependency */
672 n_reserve = set_size(other->dependencies[d]) - !!set_get(other->dependencies[d], u);
673
674 return set_reserve(u->dependencies[d], n_reserve);
675}
676
d1fab3fe 677static void merge_dependencies(Unit *u, Unit *other, const char *other_id, UnitDependency d) {
23a177ef
LP
678 Iterator i;
679 Unit *back;
87f0e418 680 int r;
23a177ef
LP
681
682 assert(u);
683 assert(other);
684 assert(d < _UNIT_DEPENDENCY_MAX);
685
83a95334 686 /* Fix backwards pointers */
ac155bb8 687 SET_FOREACH(back, other->dependencies[d], i) {
23a177ef
LP
688 UnitDependency k;
689
e48614c4 690 for (k = 0; k < _UNIT_DEPENDENCY_MAX; k++) {
e66047ff
ZJS
691 /* Do not add dependencies between u and itself */
692 if (back == u) {
d1fab3fe 693 if (set_remove(back->dependencies[k], other))
f2341e0a 694 maybe_warn_about_dependency(u, other_id, k);
e66047ff
ZJS
695 } else {
696 r = set_remove_and_put(back->dependencies[k], other, u);
697 if (r == -EEXIST)
698 set_remove(back->dependencies[k], other);
699 else
700 assert(r >= 0 || r == -ENOENT);
701 }
e48614c4 702 }
23a177ef
LP
703 }
704
e66047ff 705 /* Also do not move dependencies on u to itself */
d1fab3fe
ZJS
706 back = set_remove(other->dependencies[d], u);
707 if (back)
f2341e0a 708 maybe_warn_about_dependency(u, other_id, d);
e66047ff 709
7c0b05e5
MS
710 /* The move cannot fail. The caller must have performed a reservation. */
711 assert_se(complete_move(&u->dependencies[d], &other->dependencies[d]) == 0);
23a177ef 712
525d3cc7 713 other->dependencies[d] = set_free(other->dependencies[d]);
23a177ef
LP
714}
715
716int unit_merge(Unit *u, Unit *other) {
87f0e418 717 UnitDependency d;
d1fab3fe 718 const char *other_id = NULL;
09a65f92 719 int r;
87f0e418
LP
720
721 assert(u);
722 assert(other);
ac155bb8
MS
723 assert(u->manager == other->manager);
724 assert(u->type != _UNIT_TYPE_INVALID);
87f0e418 725
cc916967
LP
726 other = unit_follow_merge(other);
727
23a177ef
LP
728 if (other == u)
729 return 0;
730
ac155bb8 731 if (u->type != other->type)
9e2f7c11
LP
732 return -EINVAL;
733
ac155bb8 734 if (!u->instance != !other->instance)
87f0e418
LP
735 return -EINVAL;
736
8a993b61 737 if (!unit_type_may_alias(u->type)) /* Merging only applies to unit names that support aliases */
934e749e
LP
738 return -EEXIST;
739
ac155bb8 740 if (other->load_state != UNIT_STUB &&
c2756a68 741 other->load_state != UNIT_NOT_FOUND)
23a177ef 742 return -EEXIST;
87f0e418 743
ac155bb8 744 if (other->job)
819e213f
LP
745 return -EEXIST;
746
e0209d83
MS
747 if (other->nop_job)
748 return -EEXIST;
749
fdf20a31 750 if (!UNIT_IS_INACTIVE_OR_FAILED(unit_active_state(other)))
819e213f
LP
751 return -EEXIST;
752
d1fab3fe
ZJS
753 if (other->id)
754 other_id = strdupa(other->id);
755
09a65f92
MS
756 /* Make reservations to ensure merge_dependencies() won't fail */
757 for (d = 0; d < _UNIT_DEPENDENCY_MAX; d++) {
758 r = reserve_dependencies(u, other, d);
759 /*
760 * We don't rollback reservations if we fail. We don't have
761 * a way to undo reservations. A reservation is not a leak.
762 */
763 if (r < 0)
764 return r;
765 }
766
87f0e418 767 /* Merge names */
7c0b05e5
MS
768 r = merge_names(u, other);
769 if (r < 0)
770 return r;
87f0e418 771
57020a3a 772 /* Redirect all references */
ac155bb8
MS
773 while (other->refs)
774 unit_ref_set(other->refs, u);
57020a3a 775
87f0e418
LP
776 /* Merge dependencies */
777 for (d = 0; d < _UNIT_DEPENDENCY_MAX; d++)
d1fab3fe 778 merge_dependencies(u, other, other_id, d);
87f0e418 779
ac155bb8
MS
780 other->load_state = UNIT_MERGED;
781 other->merged_into = u;
23a177ef 782
3616a49c
LP
783 /* If there is still some data attached to the other node, we
784 * don't need it anymore, and can free it. */
ac155bb8 785 if (other->load_state != UNIT_STUB)
3616a49c
LP
786 if (UNIT_VTABLE(other)->done)
787 UNIT_VTABLE(other)->done(other);
788
789 unit_add_to_dbus_queue(u);
23a177ef
LP
790 unit_add_to_cleanup_queue(other);
791
792 return 0;
793}
794
795int unit_merge_by_name(Unit *u, const char *name) {
934e749e 796 _cleanup_free_ char *s = NULL;
23a177ef 797 Unit *other;
9e2f7c11 798 int r;
23a177ef
LP
799
800 assert(u);
801 assert(name);
802
7410616c 803 if (unit_name_is_valid(name, UNIT_NAME_TEMPLATE)) {
ac155bb8 804 if (!u->instance)
9e2f7c11
LP
805 return -EINVAL;
806
7410616c
LP
807 r = unit_name_replace_instance(name, u->instance, &s);
808 if (r < 0)
809 return r;
9e2f7c11
LP
810
811 name = s;
812 }
813
c2756a68 814 other = manager_get_unit(u->manager, name);
7410616c
LP
815 if (other)
816 return unit_merge(u, other);
23a177ef 817
7410616c 818 return unit_add_name(u, name);
23a177ef
LP
819}
820
821Unit* unit_follow_merge(Unit *u) {
822 assert(u);
823
ac155bb8
MS
824 while (u->load_state == UNIT_MERGED)
825 assert_se(u = u->merged_into);
23a177ef
LP
826
827 return u;
828}
829
830int unit_add_exec_dependencies(Unit *u, ExecContext *c) {
831 int r;
832
833 assert(u);
834 assert(c);
835
36be24c8
ZJS
836 if (c->working_directory) {
837 r = unit_require_mounts_for(u, c->working_directory);
838 if (r < 0)
839 return r;
840 }
841
842 if (c->root_directory) {
843 r = unit_require_mounts_for(u, c->root_directory);
844 if (r < 0)
845 return r;
846 }
847
463d0d15 848 if (!MANAGER_IS_SYSTEM(u->manager))
b46a529c
LP
849 return 0;
850
851 if (c->private_tmp) {
852 r = unit_require_mounts_for(u, "/tmp");
853 if (r < 0)
854 return r;
855
856 r = unit_require_mounts_for(u, "/var/tmp");
857 if (r < 0)
858 return r;
859 }
860
52c239d7
LB
861 if (!IN_SET(c->std_output,
862 EXEC_OUTPUT_JOURNAL, EXEC_OUTPUT_JOURNAL_AND_CONSOLE,
863 EXEC_OUTPUT_KMSG, EXEC_OUTPUT_KMSG_AND_CONSOLE,
864 EXEC_OUTPUT_SYSLOG, EXEC_OUTPUT_SYSLOG_AND_CONSOLE) &&
865 !IN_SET(c->std_error,
866 EXEC_OUTPUT_JOURNAL, EXEC_OUTPUT_JOURNAL_AND_CONSOLE,
867 EXEC_OUTPUT_KMSG, EXEC_OUTPUT_KMSG_AND_CONSOLE,
868 EXEC_OUTPUT_SYSLOG, EXEC_OUTPUT_SYSLOG_AND_CONSOLE))
23a177ef
LP
869 return 0;
870
871 /* If syslog or kernel logging is requested, make sure our own
872 * logging daemon is run first. */
873
b46a529c
LP
874 r = unit_add_dependency_by_name(u, UNIT_AFTER, SPECIAL_JOURNALD_SOCKET, NULL, true);
875 if (r < 0)
876 return r;
23a177ef 877
87f0e418
LP
878 return 0;
879}
880
87f0e418
LP
881const char *unit_description(Unit *u) {
882 assert(u);
883
ac155bb8
MS
884 if (u->description)
885 return u->description;
87f0e418 886
ac155bb8 887 return strna(u->id);
87f0e418
LP
888}
889
890void unit_dump(Unit *u, FILE *f, const char *prefix) {
49dbfa7b 891 char *t, **j;
87f0e418
LP
892 UnitDependency d;
893 Iterator i;
47be870b 894 const char *prefix2;
173e3821 895 char
a483fb59 896 timestamp0[FORMAT_TIMESTAMP_MAX],
173e3821
LP
897 timestamp1[FORMAT_TIMESTAMP_MAX],
898 timestamp2[FORMAT_TIMESTAMP_MAX],
899 timestamp3[FORMAT_TIMESTAMP_MAX],
faf919f1
LP
900 timestamp4[FORMAT_TIMESTAMP_MAX],
901 timespan[FORMAT_TIMESPAN_MAX];
a7f241db 902 Unit *following;
eeaedb7c
LP
903 _cleanup_set_free_ Set *following_set = NULL;
904 int r;
05a98afd 905 const char *n;
87f0e418
LP
906
907 assert(u);
ac155bb8 908 assert(u->type >= 0);
87f0e418 909
4c940960 910 prefix = strempty(prefix);
63c372cb 911 prefix2 = strjoina(prefix, "\t");
87f0e418
LP
912
913 fprintf(f,
40d50879 914 "%s-> Unit %s:\n"
87f0e418 915 "%s\tDescription: %s\n"
9e2f7c11 916 "%s\tInstance: %s\n"
87f0e418 917 "%s\tUnit Load State: %s\n"
2fad8195 918 "%s\tUnit Active State: %s\n"
b895d155 919 "%s\tState Change Timestamp: %s\n"
173e3821 920 "%s\tInactive Exit Timestamp: %s\n"
2fad8195 921 "%s\tActive Enter Timestamp: %s\n"
701cc384 922 "%s\tActive Exit Timestamp: %s\n"
173e3821 923 "%s\tInactive Enter Timestamp: %s\n"
45fb0699 924 "%s\tGC Check Good: %s\n"
9444b1f2 925 "%s\tNeed Daemon Reload: %s\n"
c2756a68 926 "%s\tTransient: %s\n"
f5869324 927 "%s\tPerpetual: %s\n"
4ad49000
LP
928 "%s\tSlice: %s\n"
929 "%s\tCGroup: %s\n"
930 "%s\tCGroup realized: %s\n"
6414b7c9
DS
931 "%s\tCGroup mask: 0x%x\n"
932 "%s\tCGroup members mask: 0x%x\n",
ac155bb8 933 prefix, u->id,
87f0e418 934 prefix, unit_description(u),
ac155bb8
MS
935 prefix, strna(u->instance),
936 prefix, unit_load_state_to_string(u->load_state),
2fad8195 937 prefix, unit_active_state_to_string(unit_active_state(u)),
a483fb59 938 prefix, strna(format_timestamp(timestamp0, sizeof(timestamp0), u->state_change_timestamp.realtime)),
ac155bb8
MS
939 prefix, strna(format_timestamp(timestamp1, sizeof(timestamp1), u->inactive_exit_timestamp.realtime)),
940 prefix, strna(format_timestamp(timestamp2, sizeof(timestamp2), u->active_enter_timestamp.realtime)),
941 prefix, strna(format_timestamp(timestamp3, sizeof(timestamp3), u->active_exit_timestamp.realtime)),
942 prefix, strna(format_timestamp(timestamp4, sizeof(timestamp4), u->inactive_enter_timestamp.realtime)),
45fb0699 943 prefix, yes_no(unit_check_gc(u)),
9444b1f2 944 prefix, yes_no(unit_need_daemon_reload(u)),
c2756a68 945 prefix, yes_no(u->transient),
f5869324 946 prefix, yes_no(u->perpetual),
4ad49000
LP
947 prefix, strna(unit_slice_name(u)),
948 prefix, strna(u->cgroup_path),
949 prefix, yes_no(u->cgroup_realized),
bc432dc7 950 prefix, u->cgroup_realized_mask,
6414b7c9 951 prefix, u->cgroup_members_mask);
0301abf4 952
ac155bb8 953 SET_FOREACH(t, u->names, i)
87f0e418
LP
954 fprintf(f, "%s\tName: %s\n", prefix, t);
955
4b58153d
LP
956 if (!sd_id128_is_null(u->invocation_id))
957 fprintf(f, "%s\tInvocation ID: " SD_ID128_FORMAT_STR "\n",
958 prefix, SD_ID128_FORMAT_VAL(u->invocation_id));
959
49dbfa7b
LP
960 STRV_FOREACH(j, u->documentation)
961 fprintf(f, "%s\tDocumentation: %s\n", prefix, *j);
962
eeaedb7c
LP
963 following = unit_following(u);
964 if (following)
ac155bb8 965 fprintf(f, "%s\tFollowing: %s\n", prefix, following->id);
8fe914ec 966
eeaedb7c
LP
967 r = unit_following_set(u, &following_set);
968 if (r >= 0) {
969 Unit *other;
970
971 SET_FOREACH(other, following_set, i)
972 fprintf(f, "%s\tFollowing Set Member: %s\n", prefix, other->id);
973 }
974
ac155bb8
MS
975 if (u->fragment_path)
976 fprintf(f, "%s\tFragment Path: %s\n", prefix, u->fragment_path);
23a177ef 977
1b64d026
LP
978 if (u->source_path)
979 fprintf(f, "%s\tSource Path: %s\n", prefix, u->source_path);
980
ae7a7182 981 STRV_FOREACH(j, u->dropin_paths)
2875e22b 982 fprintf(f, "%s\tDropIn Path: %s\n", prefix, *j);
ae7a7182 983
36c16a7c 984 if (u->job_timeout != USEC_INFINITY)
2fa4092c 985 fprintf(f, "%s\tJob Timeout: %s\n", prefix, format_timespan(timespan, sizeof(timespan), u->job_timeout, 0));
faf919f1 986
87a47f99
LN
987 if (u->job_timeout_action != EMERGENCY_ACTION_NONE)
988 fprintf(f, "%s\tJob Timeout Action: %s\n", prefix, emergency_action_to_string(u->job_timeout_action));
f189ab18
LP
989
990 if (u->job_timeout_reboot_arg)
991 fprintf(f, "%s\tJob Timeout Reboot Argument: %s\n", prefix, u->job_timeout_reboot_arg);
992
59fccdc5
LP
993 condition_dump_list(u->conditions, f, prefix, condition_type_to_string);
994 condition_dump_list(u->asserts, f, prefix, assert_type_to_string);
52661efd 995
ac155bb8 996 if (dual_timestamp_is_set(&u->condition_timestamp))
2791a8f8
LP
997 fprintf(f,
998 "%s\tCondition Timestamp: %s\n"
999 "%s\tCondition Result: %s\n",
ac155bb8
MS
1000 prefix, strna(format_timestamp(timestamp1, sizeof(timestamp1), u->condition_timestamp.realtime)),
1001 prefix, yes_no(u->condition_result));
2791a8f8 1002
59fccdc5
LP
1003 if (dual_timestamp_is_set(&u->assert_timestamp))
1004 fprintf(f,
1005 "%s\tAssert Timestamp: %s\n"
1006 "%s\tAssert Result: %s\n",
1007 prefix, strna(format_timestamp(timestamp1, sizeof(timestamp1), u->assert_timestamp.realtime)),
1008 prefix, yes_no(u->assert_result));
1009
87f0e418
LP
1010 for (d = 0; d < _UNIT_DEPENDENCY_MAX; d++) {
1011 Unit *other;
1012
ac155bb8
MS
1013 SET_FOREACH(other, u->dependencies[d], i)
1014 fprintf(f, "%s\t%s: %s\n", prefix, unit_dependency_to_string(d), other->id);
87f0e418
LP
1015 }
1016
7c8fa05c 1017 if (!strv_isempty(u->requires_mounts_for)) {
7c8fa05c
LP
1018 fprintf(f,
1019 "%s\tRequiresMountsFor:", prefix);
1020
1021 STRV_FOREACH(j, u->requires_mounts_for)
1022 fprintf(f, " %s", *j);
1023
1024 fputs("\n", f);
1025 }
1026
ac155bb8 1027 if (u->load_state == UNIT_LOADED) {
ab1f0633 1028
b0650475 1029 fprintf(f,
a40eb732 1030 "%s\tStopWhenUnneeded: %s\n"
b5e9dba8
LP
1031 "%s\tRefuseManualStart: %s\n"
1032 "%s\tRefuseManualStop: %s\n"
222ae6a8 1033 "%s\tDefaultDependencies: %s\n"
d420282b 1034 "%s\tOnFailureJobMode: %s\n"
36b4a7ba 1035 "%s\tIgnoreOnIsolate: %s\n",
ac155bb8
MS
1036 prefix, yes_no(u->stop_when_unneeded),
1037 prefix, yes_no(u->refuse_manual_start),
1038 prefix, yes_no(u->refuse_manual_stop),
1039 prefix, yes_no(u->default_dependencies),
d420282b 1040 prefix, job_mode_to_string(u->on_failure_job_mode),
36b4a7ba 1041 prefix, yes_no(u->ignore_on_isolate));
ac155bb8 1042
23a177ef
LP
1043 if (UNIT_VTABLE(u)->dump)
1044 UNIT_VTABLE(u)->dump(u, f, prefix2);
b0650475 1045
ac155bb8 1046 } else if (u->load_state == UNIT_MERGED)
b0650475
LP
1047 fprintf(f,
1048 "%s\tMerged into: %s\n",
ac155bb8
MS
1049 prefix, u->merged_into->id);
1050 else if (u->load_state == UNIT_ERROR)
1051 fprintf(f, "%s\tLoad Error Code: %s\n", prefix, strerror(-u->load_error));
8821a00f 1052
05a98afd
LP
1053 for (n = sd_bus_track_first(u->bus_track); n; n = sd_bus_track_next(u->bus_track))
1054 fprintf(f, "%s\tBus Ref: %s\n", prefix, n);
87f0e418 1055
ac155bb8
MS
1056 if (u->job)
1057 job_dump(u->job, f, prefix2);
87f0e418 1058
e0209d83
MS
1059 if (u->nop_job)
1060 job_dump(u->nop_job, f, prefix2);
87f0e418
LP
1061}
1062
1063/* Common implementation for multiple backends */
e537352b 1064int unit_load_fragment_and_dropin(Unit *u) {
23a177ef
LP
1065 int r;
1066
1067 assert(u);
23a177ef 1068
e48614c4 1069 /* Load a .{service,socket,...} file */
4ad49000
LP
1070 r = unit_load_fragment(u);
1071 if (r < 0)
23a177ef
LP
1072 return r;
1073
ac155bb8 1074 if (u->load_state == UNIT_STUB)
23a177ef
LP
1075 return -ENOENT;
1076
1077 /* Load drop-in directory data */
4ad49000
LP
1078 r = unit_load_dropin(unit_follow_merge(u));
1079 if (r < 0)
23a177ef
LP
1080 return r;
1081
1082 return 0;
1083}
1084
1085/* Common implementation for multiple backends */
e537352b 1086int unit_load_fragment_and_dropin_optional(Unit *u) {
23a177ef 1087 int r;
87f0e418
LP
1088
1089 assert(u);
1090
23a177ef
LP
1091 /* Same as unit_load_fragment_and_dropin(), but whether
1092 * something can be loaded or not doesn't matter. */
1093
1094 /* Load a .service file */
4ad49000
LP
1095 r = unit_load_fragment(u);
1096 if (r < 0)
87f0e418
LP
1097 return r;
1098
ac155bb8
MS
1099 if (u->load_state == UNIT_STUB)
1100 u->load_state = UNIT_LOADED;
d46de8a1 1101
87f0e418 1102 /* Load drop-in directory data */
4ad49000
LP
1103 r = unit_load_dropin(unit_follow_merge(u));
1104 if (r < 0)
87f0e418
LP
1105 return r;
1106
23a177ef 1107 return 0;
87f0e418
LP
1108}
1109
bba34eed 1110int unit_add_default_target_dependency(Unit *u, Unit *target) {
98bc2000
LP
1111 assert(u);
1112 assert(target);
1113
ac155bb8 1114 if (target->type != UNIT_TARGET)
98bc2000
LP
1115 return 0;
1116
35b8ca3a 1117 /* Only add the dependency if both units are loaded, so that
bba34eed 1118 * that loop check below is reliable */
ac155bb8
MS
1119 if (u->load_state != UNIT_LOADED ||
1120 target->load_state != UNIT_LOADED)
bba34eed
LP
1121 return 0;
1122
21256a2b
LP
1123 /* If either side wants no automatic dependencies, then let's
1124 * skip this */
ac155bb8
MS
1125 if (!u->default_dependencies ||
1126 !target->default_dependencies)
21256a2b
LP
1127 return 0;
1128
98bc2000 1129 /* Don't create loops */
ac155bb8 1130 if (set_get(target->dependencies[UNIT_BEFORE], u))
98bc2000
LP
1131 return 0;
1132
1133 return unit_add_dependency(target, UNIT_AFTER, u, true);
1134}
1135
e954c9cf 1136static int unit_add_target_dependencies(Unit *u) {
a016b922 1137
21256a2b
LP
1138 static const UnitDependency deps[] = {
1139 UNIT_REQUIRED_BY,
be7d9ff7 1140 UNIT_REQUISITE_OF,
21256a2b
LP
1141 UNIT_WANTED_BY,
1142 UNIT_BOUND_BY
1143 };
1144
bba34eed 1145 Unit *target;
98bc2000 1146 Iterator i;
21256a2b 1147 unsigned k;
db57f3c6 1148 int r = 0;
98bc2000
LP
1149
1150 assert(u);
1151
21256a2b 1152 for (k = 0; k < ELEMENTSOF(deps); k++)
a016b922
LP
1153 SET_FOREACH(target, u->dependencies[deps[k]], i) {
1154 r = unit_add_default_target_dependency(u, target);
1155 if (r < 0)
21256a2b 1156 return r;
a016b922
LP
1157 }
1158
e954c9cf
LP
1159 return r;
1160}
4ad49000 1161
e954c9cf
LP
1162static int unit_add_slice_dependencies(Unit *u) {
1163 assert(u);
b81884e7 1164
35b7ff80 1165 if (!UNIT_HAS_CGROUP_CONTEXT(u))
e954c9cf
LP
1166 return 0;
1167
1168 if (UNIT_ISSET(u->slice))
8c8da0e0 1169 return unit_add_two_dependencies(u, UNIT_AFTER, UNIT_REQUIRES, UNIT_DEREF(u->slice), true);
e954c9cf 1170
8c8da0e0 1171 if (unit_has_name(u, SPECIAL_ROOT_SLICE))
d1fab3fe
ZJS
1172 return 0;
1173
8c8da0e0 1174 return unit_add_two_dependencies_by_name(u, UNIT_AFTER, UNIT_REQUIRES, SPECIAL_ROOT_SLICE, NULL, true);
98bc2000
LP
1175}
1176
e954c9cf 1177static int unit_add_mount_dependencies(Unit *u) {
9588bc32
LP
1178 char **i;
1179 int r;
1180
1181 assert(u);
1182
1183 STRV_FOREACH(i, u->requires_mounts_for) {
1184 char prefix[strlen(*i) + 1];
1185
1186 PATH_FOREACH_PREFIX_MORE(prefix, *i) {
c7c89abb 1187 _cleanup_free_ char *p = NULL;
9588bc32
LP
1188 Unit *m;
1189
c7c89abb 1190 r = unit_name_from_path(prefix, ".mount", &p);
9588bc32
LP
1191 if (r < 0)
1192 return r;
c7c89abb
FB
1193
1194 m = manager_get_unit(u->manager, p);
1195 if (!m) {
1196 /* Make sure to load the mount unit if
1197 * it exists. If so the dependencies
1198 * on this unit will be added later
1199 * during the loading of the mount
1200 * unit. */
1201 (void) manager_load_unit_prepare(u->manager, p, NULL, NULL, &m);
9588bc32 1202 continue;
c7c89abb 1203 }
9588bc32
LP
1204 if (m == u)
1205 continue;
1206
1207 if (m->load_state != UNIT_LOADED)
1208 continue;
1209
1210 r = unit_add_dependency(u, UNIT_AFTER, m, true);
1211 if (r < 0)
1212 return r;
1213
1214 if (m->fragment_path) {
1215 r = unit_add_dependency(u, UNIT_REQUIRES, m, true);
1216 if (r < 0)
1217 return r;
1218 }
1219 }
1220 }
1221
1222 return 0;
1223}
1224
95ae05c0
WC
1225static int unit_add_startup_units(Unit *u) {
1226 CGroupContext *c;
5269eb6b 1227 int r;
95ae05c0
WC
1228
1229 c = unit_get_cgroup_context(u);
db785129
LP
1230 if (!c)
1231 return 0;
1232
d53d9474 1233 if (c->startup_cpu_shares == CGROUP_CPU_SHARES_INVALID &&
13c31542 1234 c->startup_io_weight == CGROUP_WEIGHT_INVALID &&
d53d9474 1235 c->startup_blockio_weight == CGROUP_BLKIO_WEIGHT_INVALID)
db785129
LP
1236 return 0;
1237
5269eb6b
LP
1238 r = set_ensure_allocated(&u->manager->startup_units, NULL);
1239 if (r < 0)
1240 return r;
1241
756c09e6 1242 return set_put(u->manager->startup_units, u);
95ae05c0
WC
1243}
1244
87f0e418
LP
1245int unit_load(Unit *u) {
1246 int r;
1247
1248 assert(u);
1249
ac155bb8 1250 if (u->in_load_queue) {
71fda00f 1251 LIST_REMOVE(load_queue, u->manager->load_queue, u);
ac155bb8 1252 u->in_load_queue = false;
87f0e418
LP
1253 }
1254
ac155bb8 1255 if (u->type == _UNIT_TYPE_INVALID)
e537352b
LP
1256 return -EINVAL;
1257
ac155bb8 1258 if (u->load_state != UNIT_STUB)
87f0e418
LP
1259 return 0;
1260
4f4afc88
LP
1261 if (u->transient_file) {
1262 r = fflush_and_check(u->transient_file);
1263 if (r < 0)
1264 goto fail;
1265
1266 fclose(u->transient_file);
1267 u->transient_file = NULL;
f9ba08fb 1268
f76707da 1269 u->fragment_mtime = now(CLOCK_REALTIME);
4f4afc88
LP
1270 }
1271
c2756a68
LP
1272 if (UNIT_VTABLE(u)->load) {
1273 r = UNIT_VTABLE(u)->load(u);
1274 if (r < 0)
87f0e418 1275 goto fail;
c2756a68 1276 }
23a177ef 1277
ac155bb8 1278 if (u->load_state == UNIT_STUB) {
23a177ef
LP
1279 r = -ENOENT;
1280 goto fail;
1281 }
1282
7c8fa05c 1283 if (u->load_state == UNIT_LOADED) {
c2756a68 1284
e954c9cf
LP
1285 r = unit_add_target_dependencies(u);
1286 if (r < 0)
1287 goto fail;
1288
1289 r = unit_add_slice_dependencies(u);
1290 if (r < 0)
1291 goto fail;
c2756a68 1292
e954c9cf 1293 r = unit_add_mount_dependencies(u);
7c8fa05c 1294 if (r < 0)
c2756a68 1295 goto fail;
7c8fa05c 1296
95ae05c0
WC
1297 r = unit_add_startup_units(u);
1298 if (r < 0)
1299 goto fail;
1300
bc432dc7 1301 if (u->on_failure_job_mode == JOB_ISOLATE && set_size(u->dependencies[UNIT_ON_FAILURE]) > 1) {
f2341e0a 1302 log_unit_error(u, "More than one OnFailure= dependencies specified but OnFailureJobMode=isolate set. Refusing.");
c2756a68
LP
1303 r = -EINVAL;
1304 goto fail;
1305 }
bc432dc7
LP
1306
1307 unit_update_cgroup_members_masks(u);
f68319bb
LP
1308 }
1309
ac155bb8 1310 assert((u->load_state != UNIT_MERGED) == !u->merged_into);
23a177ef
LP
1311
1312 unit_add_to_dbus_queue(unit_follow_merge(u));
701cc384 1313 unit_add_to_gc_queue(u);
87f0e418 1314
87f0e418
LP
1315 return 0;
1316
1317fail:
c2756a68 1318 u->load_state = u->load_state == UNIT_STUB ? UNIT_NOT_FOUND : UNIT_ERROR;
ac155bb8 1319 u->load_error = r;
c1e1601e 1320 unit_add_to_dbus_queue(u);
9a46fc3b 1321 unit_add_to_gc_queue(u);
23a177ef 1322
f2341e0a 1323 log_unit_debug_errno(u, r, "Failed to load configuration: %m");
23a177ef 1324
87f0e418
LP
1325 return r;
1326}
1327
49365733
LP
1328static bool unit_condition_test_list(Unit *u, Condition *first, const char *(*to_string)(ConditionType t)) {
1329 Condition *c;
1330 int triggered = -1;
1331
1332 assert(u);
1333 assert(to_string);
1334
1335 /* If the condition list is empty, then it is true */
1336 if (!first)
1337 return true;
1338
1339 /* Otherwise, if all of the non-trigger conditions apply and
1340 * if any of the trigger conditions apply (unless there are
1341 * none) we return true */
1342 LIST_FOREACH(conditions, c, first) {
1343 int r;
1344
1345 r = condition_test(c);
1346 if (r < 0)
f2341e0a
LP
1347 log_unit_warning(u,
1348 "Couldn't determine result for %s=%s%s%s, assuming failed: %m",
49365733
LP
1349 to_string(c->type),
1350 c->trigger ? "|" : "",
1351 c->negate ? "!" : "",
f2341e0a 1352 c->parameter);
49365733 1353 else
f2341e0a
LP
1354 log_unit_debug(u,
1355 "%s=%s%s%s %s.",
49365733
LP
1356 to_string(c->type),
1357 c->trigger ? "|" : "",
1358 c->negate ? "!" : "",
1359 c->parameter,
f2341e0a 1360 condition_result_to_string(c->result));
49365733
LP
1361
1362 if (!c->trigger && r <= 0)
1363 return false;
1364
1365 if (c->trigger && triggered <= 0)
1366 triggered = r > 0;
1367 }
1368
1369 return triggered != 0;
1370}
1371
9588bc32 1372static bool unit_condition_test(Unit *u) {
90bbc946
LP
1373 assert(u);
1374
ac155bb8 1375 dual_timestamp_get(&u->condition_timestamp);
49365733 1376 u->condition_result = unit_condition_test_list(u, u->conditions, condition_type_to_string);
90bbc946 1377
ac155bb8 1378 return u->condition_result;
90bbc946
LP
1379}
1380
59fccdc5
LP
1381static bool unit_assert_test(Unit *u) {
1382 assert(u);
1383
1384 dual_timestamp_get(&u->assert_timestamp);
49365733 1385 u->assert_result = unit_condition_test_list(u, u->asserts, assert_type_to_string);
59fccdc5
LP
1386
1387 return u->assert_result;
1388}
1389
df446f96
LP
1390void unit_status_printf(Unit *u, const char *status, const char *unit_status_msg_format) {
1391 DISABLE_WARNING_FORMAT_NONLITERAL;
1392 manager_status_printf(u->manager, STATUS_TYPE_NORMAL, status, unit_status_msg_format, unit_description(u));
1393 REENABLE_WARNING;
1394}
1395
44a6b1b6 1396_pure_ static const char* unit_get_status_message_format(Unit *u, JobType t) {
877d54e9 1397 const char *format;
a85ca902 1398 const UnitStatusMessageFormats *format_table;
877d54e9
LP
1399
1400 assert(u);
df446f96 1401 assert(IN_SET(t, JOB_START, JOB_STOP, JOB_RELOAD));
877d54e9 1402
b5bf308b 1403 if (t != JOB_RELOAD) {
a85ca902
MS
1404 format_table = &UNIT_VTABLE(u)->status_message_formats;
1405 if (format_table) {
1406 format = format_table->starting_stopping[t == JOB_STOP];
1407 if (format)
1408 return format;
1409 }
1410 }
877d54e9
LP
1411
1412 /* Return generic strings */
1413 if (t == JOB_START)
1414 return "Starting %s.";
1415 else if (t == JOB_STOP)
1416 return "Stopping %s.";
b5bf308b 1417 else
877d54e9 1418 return "Reloading %s.";
877d54e9
LP
1419}
1420
1421static void unit_status_print_starting_stopping(Unit *u, JobType t) {
1422 const char *format;
1423
1424 assert(u);
1425
df446f96
LP
1426 /* Reload status messages have traditionally not been printed to console. */
1427 if (!IN_SET(t, JOB_START, JOB_STOP))
1428 return;
1429
877d54e9 1430 format = unit_get_status_message_format(u, t);
c6918296 1431
bcfce235 1432 DISABLE_WARNING_FORMAT_NONLITERAL;
49b1d377 1433 unit_status_printf(u, "", format);
bcfce235 1434 REENABLE_WARNING;
c6918296
MS
1435}
1436
877d54e9
LP
1437static void unit_status_log_starting_stopping_reloading(Unit *u, JobType t) {
1438 const char *format;
1439 char buf[LINE_MAX];
1440 sd_id128_t mid;
1441
1442 assert(u);
1443
df446f96 1444 if (!IN_SET(t, JOB_START, JOB_STOP, JOB_RELOAD))
877d54e9
LP
1445 return;
1446
81270860
LP
1447 if (log_on_console())
1448 return;
1449
877d54e9
LP
1450 /* We log status messages for all units and all operations. */
1451
a85ca902 1452 format = unit_get_status_message_format(u, t);
877d54e9 1453
bcfce235 1454 DISABLE_WARNING_FORMAT_NONLITERAL;
d054f0a4 1455 xsprintf(buf, format, unit_description(u));
bcfce235 1456 REENABLE_WARNING;
877d54e9
LP
1457
1458 mid = t == JOB_START ? SD_MESSAGE_UNIT_STARTING :
1459 t == JOB_STOP ? SD_MESSAGE_UNIT_STOPPING :
1460 SD_MESSAGE_UNIT_RELOADING;
1461
f2341e0a
LP
1462 /* Note that we deliberately use LOG_MESSAGE() instead of
1463 * LOG_UNIT_MESSAGE() here, since this is supposed to mimic
1464 * closely what is written to screen using the status output,
1465 * which is supposed the highest level, friendliest output
1466 * possible, which means we should avoid the low-level unit
1467 * name. */
1468 log_struct(LOG_INFO,
1469 LOG_MESSAGE_ID(mid),
1470 LOG_UNIT_ID(u),
1471 LOG_MESSAGE("%s", buf),
1472 NULL);
877d54e9 1473}
877d54e9 1474
d1a34ae9 1475void unit_status_emit_starting_stopping_reloading(Unit *u, JobType t) {
df446f96
LP
1476 assert(u);
1477 assert(t >= 0);
1478 assert(t < _JOB_TYPE_MAX);
d1a34ae9
MS
1479
1480 unit_status_log_starting_stopping_reloading(u, t);
df446f96 1481 unit_status_print_starting_stopping(u, t);
d1a34ae9
MS
1482}
1483
07299350 1484int unit_start_limit_test(Unit *u) {
6bf0f408
LP
1485 assert(u);
1486
1487 if (ratelimit_test(&u->start_limit)) {
1488 u->start_limit_hit = false;
1489 return 0;
1490 }
1491
1492 log_unit_warning(u, "Start request repeated too quickly.");
1493 u->start_limit_hit = true;
1494
87a47f99 1495 return emergency_action(u->manager, u->start_limit_action, u->reboot_arg, "unit failed");
6bf0f408
LP
1496}
1497
87f0e418 1498/* Errors:
6bf0f408
LP
1499 * -EBADR: This unit type does not support starting.
1500 * -EALREADY: Unit is already started.
1501 * -EAGAIN: An operation is already in progress. Retry later.
1502 * -ECANCELED: Too many requests for now.
1503 * -EPROTO: Assert failed
1504 * -EINVAL: Unit not loaded
1505 * -EOPNOTSUPP: Unit type not supported
87f0e418
LP
1506 */
1507int unit_start(Unit *u) {
1508 UnitActiveState state;
92ab323c 1509 Unit *following;
87f0e418
LP
1510
1511 assert(u);
1512
a82e5507
LP
1513 /* If this is already started, then this will succeed. Note
1514 * that this will even succeed if this unit is not startable
1515 * by the user. This is relied on to detect when we need to
1516 * wait for units and when waiting is finished. */
87f0e418
LP
1517 state = unit_active_state(u);
1518 if (UNIT_IS_ACTIVE_OR_RELOADING(state))
1519 return -EALREADY;
1520
6bf0f408
LP
1521 /* Units that aren't loaded cannot be started */
1522 if (u->load_state != UNIT_LOADED)
1523 return -EINVAL;
1524
a82e5507
LP
1525 /* If the conditions failed, don't do anything at all. If we
1526 * already are activating this call might still be useful to
1527 * speed up activation in case there is some hold-off time,
1528 * but we don't want to recheck the condition in that case. */
1529 if (state != UNIT_ACTIVATING &&
1530 !unit_condition_test(u)) {
f2341e0a 1531 log_unit_debug(u, "Starting requested but condition failed. Not starting unit.");
52661efd
LP
1532 return -EALREADY;
1533 }
1534
59fccdc5
LP
1535 /* If the asserts failed, fail the entire job */
1536 if (state != UNIT_ACTIVATING &&
1537 !unit_assert_test(u)) {
f2341e0a 1538 log_unit_notice(u, "Starting requested but asserts failed.");
59fccdc5
LP
1539 return -EPROTO;
1540 }
1541
d11a7645
LP
1542 /* Units of types that aren't supported cannot be
1543 * started. Note that we do this test only after the condition
1544 * checks, so that we rather return condition check errors
1545 * (which are usually not considered a true failure) than "not
1546 * supported" errors (which are considered a failure).
1547 */
1548 if (!unit_supported(u))
1549 return -EOPNOTSUPP;
1550
92ab323c 1551 /* Forward to the main object, if we aren't it. */
52990c2e
ZJS
1552 following = unit_following(u);
1553 if (following) {
f2341e0a 1554 log_unit_debug(u, "Redirecting start request from %s to %s.", u->id, following->id);
92ab323c
LP
1555 return unit_start(following);
1556 }
1557
1558 /* If it is stopped, but we cannot start it, then fail */
1559 if (!UNIT_VTABLE(u)->start)
1560 return -EBADR;
1561
87f0e418
LP
1562 /* We don't suppress calls to ->start() here when we are
1563 * already starting, to allow this request to be used as a
1564 * "hurry up" call, for example when the unit is in some "auto
1565 * restart" state where it waits for a holdoff timer to elapse
1566 * before it will start again. */
1567
c1e1601e 1568 unit_add_to_dbus_queue(u);
9e58ff9c 1569
d1a34ae9 1570 return UNIT_VTABLE(u)->start(u);
87f0e418
LP
1571}
1572
1573bool unit_can_start(Unit *u) {
1574 assert(u);
1575
8ff4d2ab
LP
1576 if (u->load_state != UNIT_LOADED)
1577 return false;
1578
1579 if (!unit_supported(u))
1580 return false;
1581
87f0e418
LP
1582 return !!UNIT_VTABLE(u)->start;
1583}
1584
2528a7a6
LP
1585bool unit_can_isolate(Unit *u) {
1586 assert(u);
1587
1588 return unit_can_start(u) &&
ac155bb8 1589 u->allow_isolate;
2528a7a6
LP
1590}
1591
87f0e418
LP
1592/* Errors:
1593 * -EBADR: This unit type does not support stopping.
1594 * -EALREADY: Unit is already stopped.
1595 * -EAGAIN: An operation is already in progress. Retry later.
1596 */
1597int unit_stop(Unit *u) {
1598 UnitActiveState state;
92ab323c 1599 Unit *following;
87f0e418
LP
1600
1601 assert(u);
1602
87f0e418 1603 state = unit_active_state(u);
fdf20a31 1604 if (UNIT_IS_INACTIVE_OR_FAILED(state))
87f0e418
LP
1605 return -EALREADY;
1606
0faacd47
LP
1607 following = unit_following(u);
1608 if (following) {
f2341e0a 1609 log_unit_debug(u, "Redirecting stop request from %s to %s.", u->id, following->id);
92ab323c
LP
1610 return unit_stop(following);
1611 }
1612
7898b0cf
LP
1613 if (!UNIT_VTABLE(u)->stop)
1614 return -EBADR;
1615
c1e1601e 1616 unit_add_to_dbus_queue(u);
9e58ff9c 1617
d1a34ae9 1618 return UNIT_VTABLE(u)->stop(u);
87f0e418
LP
1619}
1620
f5869324
LP
1621bool unit_can_stop(Unit *u) {
1622 assert(u);
1623
1624 if (!unit_supported(u))
1625 return false;
1626
1627 if (u->perpetual)
1628 return false;
1629
1630 return !!UNIT_VTABLE(u)->stop;
1631}
1632
87f0e418
LP
1633/* Errors:
1634 * -EBADR: This unit type does not support reloading.
1635 * -ENOEXEC: Unit is not started.
1636 * -EAGAIN: An operation is already in progress. Retry later.
1637 */
1638int unit_reload(Unit *u) {
1639 UnitActiveState state;
92ab323c 1640 Unit *following;
87f0e418
LP
1641
1642 assert(u);
1643
ac155bb8 1644 if (u->load_state != UNIT_LOADED)
6124958c
LP
1645 return -EINVAL;
1646
87f0e418
LP
1647 if (!unit_can_reload(u))
1648 return -EBADR;
1649
1650 state = unit_active_state(u);
e364ad06 1651 if (state == UNIT_RELOADING)
87f0e418
LP
1652 return -EALREADY;
1653
6a371e23 1654 if (state != UNIT_ACTIVE) {
f2341e0a 1655 log_unit_warning(u, "Unit cannot be reloaded because it is inactive.");
87f0e418 1656 return -ENOEXEC;
6a371e23 1657 }
87f0e418 1658
e48614c4
ZJS
1659 following = unit_following(u);
1660 if (following) {
f2341e0a 1661 log_unit_debug(u, "Redirecting reload request from %s to %s.", u->id, following->id);
92ab323c
LP
1662 return unit_reload(following);
1663 }
1664
c1e1601e 1665 unit_add_to_dbus_queue(u);
82a2b6bb 1666
d1a34ae9 1667 return UNIT_VTABLE(u)->reload(u);
87f0e418
LP
1668}
1669
1670bool unit_can_reload(Unit *u) {
1671 assert(u);
1672
1673 if (!UNIT_VTABLE(u)->reload)
1674 return false;
1675
1676 if (!UNIT_VTABLE(u)->can_reload)
1677 return true;
1678
1679 return UNIT_VTABLE(u)->can_reload(u);
1680}
1681
b4a16b7b 1682static void unit_check_unneeded(Unit *u) {
be7d9ff7 1683
4afd3348 1684 _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
4bd29fe5 1685
be7d9ff7
LP
1686 static const UnitDependency needed_dependencies[] = {
1687 UNIT_REQUIRED_BY,
084918ba 1688 UNIT_REQUISITE_OF,
be7d9ff7
LP
1689 UNIT_WANTED_BY,
1690 UNIT_BOUND_BY,
1691 };
1692
f3bff0eb 1693 Unit *other;
be7d9ff7
LP
1694 Iterator i;
1695 unsigned j;
1696 int r;
f3bff0eb
LP
1697
1698 assert(u);
1699
1700 /* If this service shall be shut down when unneeded then do
1701 * so. */
1702
ac155bb8 1703 if (!u->stop_when_unneeded)
f3bff0eb
LP
1704 return;
1705
1706 if (!UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u)))
1707 return;
1708
be7d9ff7 1709 for (j = 0; j < ELEMENTSOF(needed_dependencies); j++)
f3b85044 1710 SET_FOREACH(other, u->dependencies[needed_dependencies[j]], i)
be7d9ff7
LP
1711 if (unit_active_or_pending(other))
1712 return;
b81884e7 1713
595bfe7d 1714 /* If stopping a unit fails continuously we might enter a stop
bea355da
LP
1715 * loop here, hence stop acting on the service being
1716 * unnecessary after a while. */
67bfdc97 1717 if (!ratelimit_test(&u->auto_stop_ratelimit)) {
bea355da
LP
1718 log_unit_warning(u, "Unit not needed anymore, but not stopping since we tried this too often recently.");
1719 return;
1720 }
1721
f2341e0a 1722 log_unit_info(u, "Unit not needed anymore. Stopping.");
f3bff0eb
LP
1723
1724 /* Ok, nobody needs us anymore. Sniff. Then let's commit suicide */
4bd29fe5 1725 r = manager_add_job(u->manager, JOB_STOP, u, JOB_FAIL, &error, NULL);
be7d9ff7 1726 if (r < 0)
4bd29fe5 1727 log_unit_warning_errno(u, r, "Failed to enqueue stop job, ignoring: %s", bus_error_message(&error, r));
f3bff0eb
LP
1728}
1729
ff502445 1730static void unit_check_binds_to(Unit *u) {
4afd3348 1731 _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
ff502445
LP
1732 bool stop = false;
1733 Unit *other;
1734 Iterator i;
67bfdc97 1735 int r;
ff502445
LP
1736
1737 assert(u);
1738
1739 if (u->job)
1740 return;
1741
1742 if (unit_active_state(u) != UNIT_ACTIVE)
1743 return;
1744
1745 SET_FOREACH(other, u->dependencies[UNIT_BINDS_TO], i) {
1746 if (other->job)
1747 continue;
1748
1749 if (!UNIT_IS_INACTIVE_OR_FAILED(unit_active_state(other)))
1750 continue;
1751
1752 stop = true;
98f738b6 1753 break;
ff502445
LP
1754 }
1755
1756 if (!stop)
1757 return;
1758
595bfe7d 1759 /* If stopping a unit fails continuously we might enter a stop
67bfdc97
LP
1760 * loop here, hence stop acting on the service being
1761 * unnecessary after a while. */
1762 if (!ratelimit_test(&u->auto_stop_ratelimit)) {
1763 log_unit_warning(u, "Unit is bound to inactive unit %s, but not stopping since we tried this too often recently.", other->id);
1764 return;
1765 }
1766
98f738b6 1767 assert(other);
f2341e0a 1768 log_unit_info(u, "Unit is bound to inactive unit %s. Stopping, too.", other->id);
ff502445
LP
1769
1770 /* A unit we need to run is gone. Sniff. Let's stop this. */
4bd29fe5 1771 r = manager_add_job(u->manager, JOB_STOP, u, JOB_FAIL, &error, NULL);
67bfdc97 1772 if (r < 0)
4bd29fe5 1773 log_unit_warning_errno(u, r, "Failed to enqueue stop job, ignoring: %s", bus_error_message(&error, r));
ff502445
LP
1774}
1775
87f0e418
LP
1776static void retroactively_start_dependencies(Unit *u) {
1777 Iterator i;
1778 Unit *other;
1779
1780 assert(u);
1781 assert(UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u)));
1782
ac155bb8
MS
1783 SET_FOREACH(other, u->dependencies[UNIT_REQUIRES], i)
1784 if (!set_get(u->dependencies[UNIT_AFTER], other) &&
b81884e7 1785 !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other)))
4bd29fe5 1786 manager_add_job(u->manager, JOB_START, other, JOB_REPLACE, NULL, NULL);
b81884e7 1787
7f2cddae 1788 SET_FOREACH(other, u->dependencies[UNIT_BINDS_TO], i)
ac155bb8 1789 if (!set_get(u->dependencies[UNIT_AFTER], other) &&
b81884e7 1790 !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other)))
4bd29fe5 1791 manager_add_job(u->manager, JOB_START, other, JOB_REPLACE, NULL, NULL);
87f0e418 1792
ac155bb8
MS
1793 SET_FOREACH(other, u->dependencies[UNIT_WANTS], i)
1794 if (!set_get(u->dependencies[UNIT_AFTER], other) &&
b81884e7 1795 !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other)))
4bd29fe5 1796 manager_add_job(u->manager, JOB_START, other, JOB_FAIL, NULL, NULL);
87f0e418 1797
ac155bb8 1798 SET_FOREACH(other, u->dependencies[UNIT_CONFLICTS], i)
b81884e7 1799 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
4bd29fe5 1800 manager_add_job(u->manager, JOB_STOP, other, JOB_REPLACE, NULL, NULL);
69dd2852 1801
ac155bb8 1802 SET_FOREACH(other, u->dependencies[UNIT_CONFLICTED_BY], i)
b81884e7 1803 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
4bd29fe5 1804 manager_add_job(u->manager, JOB_STOP, other, JOB_REPLACE, NULL, NULL);
87f0e418
LP
1805}
1806
1807static void retroactively_stop_dependencies(Unit *u) {
1808 Iterator i;
1809 Unit *other;
1810
1811 assert(u);
1812 assert(UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(u)));
1813
b81884e7 1814 /* Pull down units which are bound to us recursively if enabled */
ac155bb8 1815 SET_FOREACH(other, u->dependencies[UNIT_BOUND_BY], i)
b81884e7 1816 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
4bd29fe5 1817 manager_add_job(u->manager, JOB_STOP, other, JOB_REPLACE, NULL, NULL);
cd0504d0
MS
1818}
1819
1820static void check_unneeded_dependencies(Unit *u) {
1821 Iterator i;
1822 Unit *other;
1823
1824 assert(u);
1825 assert(UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(u)));
f3bff0eb
LP
1826
1827 /* Garbage collect services that might not be needed anymore, if enabled */
ac155bb8 1828 SET_FOREACH(other, u->dependencies[UNIT_REQUIRES], i)
87f0e418 1829 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
b4a16b7b 1830 unit_check_unneeded(other);
ac155bb8 1831 SET_FOREACH(other, u->dependencies[UNIT_WANTS], i)
f3bff0eb 1832 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
b4a16b7b 1833 unit_check_unneeded(other);
ac155bb8 1834 SET_FOREACH(other, u->dependencies[UNIT_REQUISITE], i)
f3bff0eb 1835 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
b4a16b7b 1836 unit_check_unneeded(other);
7f2cddae 1837 SET_FOREACH(other, u->dependencies[UNIT_BINDS_TO], i)
b81884e7
LP
1838 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
1839 unit_check_unneeded(other);
87f0e418
LP
1840}
1841
3ecaa09b 1842void unit_start_on_failure(Unit *u) {
c0daa706
LP
1843 Unit *other;
1844 Iterator i;
1845
1846 assert(u);
1847
ac155bb8 1848 if (set_size(u->dependencies[UNIT_ON_FAILURE]) <= 0)
222ae6a8
LP
1849 return;
1850
f2341e0a 1851 log_unit_info(u, "Triggering OnFailure= dependencies.");
222ae6a8 1852
ac155bb8 1853 SET_FOREACH(other, u->dependencies[UNIT_ON_FAILURE], i) {
222ae6a8
LP
1854 int r;
1855
4bd29fe5 1856 r = manager_add_job(u->manager, JOB_START, other, u->on_failure_job_mode, NULL, NULL);
c1b6628d 1857 if (r < 0)
f2341e0a 1858 log_unit_error_errno(u, r, "Failed to enqueue OnFailure= job: %m");
222ae6a8 1859 }
c0daa706
LP
1860}
1861
3ecaa09b
LP
1862void unit_trigger_notify(Unit *u) {
1863 Unit *other;
1864 Iterator i;
1865
1866 assert(u);
1867
1868 SET_FOREACH(other, u->dependencies[UNIT_TRIGGERED_BY], i)
1869 if (UNIT_VTABLE(other)->trigger_notify)
1870 UNIT_VTABLE(other)->trigger_notify(other, u);
1871}
1872
e2f3b44c 1873void unit_notify(Unit *u, UnitActiveState os, UnitActiveState ns, bool reload_success) {
546ac4f0 1874 Manager *m;
7e6e7b06 1875 bool unexpected;
a096ed36 1876
87f0e418
LP
1877 assert(u);
1878 assert(os < _UNIT_ACTIVE_STATE_MAX);
1879 assert(ns < _UNIT_ACTIVE_STATE_MAX);
87f0e418 1880
8e471ccd
LP
1881 /* Note that this is called for all low-level state changes,
1882 * even if they might map to the same high-level
865cc19a 1883 * UnitActiveState! That means that ns == os is an expected
c5315881 1884 * behavior here. For example: if a mount point is remounted
cd6d0a45 1885 * this function will be called too! */
87f0e418 1886
546ac4f0
MS
1887 m = u->manager;
1888
f755e3b7 1889 /* Update timestamps for state changes */
2c289ea8 1890 if (!MANAGER_IS_RELOADING(m)) {
a483fb59 1891 dual_timestamp_get(&u->state_change_timestamp);
173e3821 1892
bdbf9951 1893 if (UNIT_IS_INACTIVE_OR_FAILED(os) && !UNIT_IS_INACTIVE_OR_FAILED(ns))
a483fb59 1894 u->inactive_exit_timestamp = u->state_change_timestamp;
bdbf9951 1895 else if (!UNIT_IS_INACTIVE_OR_FAILED(os) && UNIT_IS_INACTIVE_OR_FAILED(ns))
a483fb59 1896 u->inactive_enter_timestamp = u->state_change_timestamp;
bdbf9951
LP
1897
1898 if (!UNIT_IS_ACTIVE_OR_RELOADING(os) && UNIT_IS_ACTIVE_OR_RELOADING(ns))
a483fb59 1899 u->active_enter_timestamp = u->state_change_timestamp;
bdbf9951 1900 else if (UNIT_IS_ACTIVE_OR_RELOADING(os) && !UNIT_IS_ACTIVE_OR_RELOADING(ns))
a483fb59 1901 u->active_exit_timestamp = u->state_change_timestamp;
bdbf9951 1902 }
87f0e418 1903
865cc19a 1904 /* Keep track of failed units */
5269eb6b 1905 (void) manager_update_failed_units(u->manager, u, ns == UNIT_FAILED);
f755e3b7
LP
1906
1907 /* Make sure the cgroup is always removed when we become inactive */
fdf20a31 1908 if (UNIT_IS_INACTIVE_OR_FAILED(ns))
efdb0237 1909 unit_prune_cgroup(u);
fb385181 1910
9cd86184 1911 /* Note that this doesn't apply to RemainAfterExit services exiting
6f285378 1912 * successfully, since there's no change of state in that case. Which is
9cd86184 1913 * why it is handled in service_set_state() */
7ed9f6cd 1914 if (UNIT_IS_INACTIVE_OR_FAILED(os) != UNIT_IS_INACTIVE_OR_FAILED(ns)) {
b33918c2
LP
1915 ExecContext *ec;
1916
1917 ec = unit_get_exec_context(u);
7ed9f6cd 1918 if (ec && exec_context_may_touch_console(ec)) {
31a7eb86 1919 if (UNIT_IS_INACTIVE_OR_FAILED(ns)) {
313cefa1 1920 m->n_on_console--;
31a7eb86
ZJS
1921
1922 if (m->n_on_console == 0)
1923 /* unset no_console_output flag, since the console is free */
2f38577f 1924 m->no_console_output = false;
31a7eb86 1925 } else
313cefa1 1926 m->n_on_console++;
7ed9f6cd
MS
1927 }
1928 }
1929
ac155bb8 1930 if (u->job) {
7e6e7b06 1931 unexpected = false;
87f0e418 1932
ac155bb8 1933 if (u->job->state == JOB_WAITING)
87f0e418
LP
1934
1935 /* So we reached a different state for this
1936 * job. Let's see if we can run it now if it
1937 * failed previously due to EAGAIN. */
ac155bb8 1938 job_add_to_run_queue(u->job);
87f0e418 1939
b410e6b9 1940 /* Let's check whether this state change constitutes a
35b8ca3a 1941 * finished job, or maybe contradicts a running job and
b410e6b9 1942 * hence needs to invalidate jobs. */
87f0e418 1943
ac155bb8 1944 switch (u->job->type) {
87f0e418 1945
b410e6b9
LP
1946 case JOB_START:
1947 case JOB_VERIFY_ACTIVE:
87f0e418 1948
b410e6b9 1949 if (UNIT_IS_ACTIVE_OR_RELOADING(ns))
833f92ad 1950 job_finish_and_invalidate(u->job, JOB_DONE, true, false);
ac155bb8 1951 else if (u->job->state == JOB_RUNNING && ns != UNIT_ACTIVATING) {
b410e6b9 1952 unexpected = true;
41b02ec7 1953
fdf20a31 1954 if (UNIT_IS_INACTIVE_OR_FAILED(ns))
833f92ad 1955 job_finish_and_invalidate(u->job, ns == UNIT_FAILED ? JOB_FAILED : JOB_DONE, true, false);
b410e6b9 1956 }
87f0e418 1957
b410e6b9 1958 break;
87f0e418 1959
b410e6b9
LP
1960 case JOB_RELOAD:
1961 case JOB_RELOAD_OR_START:
3282591d 1962 case JOB_TRY_RELOAD:
87f0e418 1963
ac155bb8 1964 if (u->job->state == JOB_RUNNING) {
a096ed36 1965 if (ns == UNIT_ACTIVE)
833f92ad 1966 job_finish_and_invalidate(u->job, reload_success ? JOB_DONE : JOB_FAILED, true, false);
032ff4af 1967 else if (ns != UNIT_ACTIVATING && ns != UNIT_RELOADING) {
a096ed36 1968 unexpected = true;
41b02ec7 1969
fdf20a31 1970 if (UNIT_IS_INACTIVE_OR_FAILED(ns))
833f92ad 1971 job_finish_and_invalidate(u->job, ns == UNIT_FAILED ? JOB_FAILED : JOB_DONE, true, false);
a096ed36 1972 }
b410e6b9 1973 }
87f0e418 1974
b410e6b9 1975 break;
87f0e418 1976
b410e6b9
LP
1977 case JOB_STOP:
1978 case JOB_RESTART:
1979 case JOB_TRY_RESTART:
87f0e418 1980
fdf20a31 1981 if (UNIT_IS_INACTIVE_OR_FAILED(ns))
833f92ad 1982 job_finish_and_invalidate(u->job, JOB_DONE, true, false);
ac155bb8 1983 else if (u->job->state == JOB_RUNNING && ns != UNIT_DEACTIVATING) {
b410e6b9 1984 unexpected = true;
833f92ad 1985 job_finish_and_invalidate(u->job, JOB_FAILED, true, false);
b410e6b9 1986 }
87f0e418 1987
b410e6b9 1988 break;
87f0e418 1989
b410e6b9
LP
1990 default:
1991 assert_not_reached("Job type unknown");
87f0e418 1992 }
87f0e418 1993
7e6e7b06
LP
1994 } else
1995 unexpected = true;
1996
2c289ea8 1997 if (!MANAGER_IS_RELOADING(m)) {
f3bff0eb 1998
bdbf9951
LP
1999 /* If this state change happened without being
2000 * requested by a job, then let's retroactively start
2001 * or stop dependencies. We skip that step when
2002 * deserializing, since we don't want to create any
2003 * additional jobs just because something is already
2004 * activated. */
2005
2006 if (unexpected) {
2007 if (UNIT_IS_INACTIVE_OR_FAILED(os) && UNIT_IS_ACTIVE_OR_ACTIVATING(ns))
2008 retroactively_start_dependencies(u);
2009 else if (UNIT_IS_ACTIVE_OR_ACTIVATING(os) && UNIT_IS_INACTIVE_OR_DEACTIVATING(ns))
2010 retroactively_stop_dependencies(u);
2011 }
5de9682c 2012
cd0504d0 2013 /* stop unneeded units regardless if going down was expected or not */
b33918c2 2014 if (UNIT_IS_INACTIVE_OR_DEACTIVATING(ns))
cd0504d0
MS
2015 check_unneeded_dependencies(u);
2016
bdbf9951 2017 if (ns != os && ns == UNIT_FAILED) {
f2341e0a 2018 log_unit_notice(u, "Unit entered failed state.");
3ecaa09b 2019 unit_start_on_failure(u);
cd6d0a45 2020 }
3b2775c5 2021 }
e537352b 2022
3b2775c5
LP
2023 /* Some names are special */
2024 if (UNIT_IS_ACTIVE_OR_RELOADING(ns)) {
2025
2026 if (unit_has_name(u, SPECIAL_DBUS_SERVICE))
865cc19a 2027 /* The bus might have just become available,
3b2775c5
LP
2028 * hence try to connect to it, if we aren't
2029 * yet connected. */
546ac4f0 2030 bus_init(m, true);
3b2775c5 2031
ac155bb8 2032 if (u->type == UNIT_SERVICE &&
3b2775c5 2033 !UNIT_IS_ACTIVE_OR_RELOADING(os) &&
2c289ea8 2034 !MANAGER_IS_RELOADING(m)) {
3b2775c5 2035 /* Write audit record if we have just finished starting up */
546ac4f0 2036 manager_send_unit_audit(m, u, AUDIT_SERVICE_START, true);
ac155bb8 2037 u->in_audit = true;
3b2775c5 2038 }
e983b760 2039
3b2775c5 2040 if (!UNIT_IS_ACTIVE_OR_RELOADING(os))
546ac4f0 2041 manager_send_unit_plymouth(m, u);
bdbf9951 2042
3b2775c5 2043 } else {
bdbf9951 2044
3b2775c5
LP
2045 /* We don't care about D-Bus here, since we'll get an
2046 * asynchronous notification for it anyway. */
cd6d0a45 2047
ac155bb8 2048 if (u->type == UNIT_SERVICE &&
3b2775c5
LP
2049 UNIT_IS_INACTIVE_OR_FAILED(ns) &&
2050 !UNIT_IS_INACTIVE_OR_FAILED(os) &&
2c289ea8 2051 !MANAGER_IS_RELOADING(m)) {
4927fcae 2052
3b2775c5
LP
2053 /* Hmm, if there was no start record written
2054 * write it now, so that we always have a nice
2055 * pair */
ac155bb8 2056 if (!u->in_audit) {
546ac4f0 2057 manager_send_unit_audit(m, u, AUDIT_SERVICE_START, ns == UNIT_INACTIVE);
cd6d0a45 2058
3b2775c5 2059 if (ns == UNIT_INACTIVE)
546ac4f0 2060 manager_send_unit_audit(m, u, AUDIT_SERVICE_STOP, true);
3b2775c5
LP
2061 } else
2062 /* Write audit record if we have just finished shutting down */
546ac4f0 2063 manager_send_unit_audit(m, u, AUDIT_SERVICE_STOP, ns == UNIT_INACTIVE);
bdbf9951 2064
ac155bb8 2065 u->in_audit = false;
cd6d0a45 2066 }
f278026d
LP
2067 }
2068
546ac4f0 2069 manager_recheck_journal(m);
3ecaa09b 2070 unit_trigger_notify(u);
3b2775c5 2071
2c289ea8 2072 if (!MANAGER_IS_RELOADING(u->manager)) {
ff502445
LP
2073 /* Maybe we finished startup and are now ready for
2074 * being stopped because unneeded? */
bf6dcfa6 2075 unit_check_unneeded(u);
c1e1601e 2076
ff502445
LP
2077 /* Maybe we finished startup, but something we needed
2078 * has vanished? Let's die then. (This happens when
2079 * something BindsTo= to a Type=oneshot unit, as these
2080 * units go directly from starting to inactive,
2081 * without ever entering started.) */
2082 unit_check_binds_to(u);
2083 }
2084
c1e1601e 2085 unit_add_to_dbus_queue(u);
701cc384 2086 unit_add_to_gc_queue(u);
87f0e418
LP
2087}
2088
87f0e418 2089int unit_watch_pid(Unit *u, pid_t pid) {
a911bb9a
LP
2090 int q, r;
2091
87f0e418
LP
2092 assert(u);
2093 assert(pid >= 1);
2094
5ba6985b
LP
2095 /* Watch a specific PID. We only support one or two units
2096 * watching each PID for now, not more. */
2097
d5099efc 2098 r = set_ensure_allocated(&u->pids, NULL);
5ba6985b
LP
2099 if (r < 0)
2100 return r;
2101
d5099efc 2102 r = hashmap_ensure_allocated(&u->manager->watch_pids1, NULL);
a911bb9a
LP
2103 if (r < 0)
2104 return r;
2105
fea72cc0 2106 r = hashmap_put(u->manager->watch_pids1, PID_TO_PTR(pid), u);
5ba6985b 2107 if (r == -EEXIST) {
d5099efc 2108 r = hashmap_ensure_allocated(&u->manager->watch_pids2, NULL);
5ba6985b
LP
2109 if (r < 0)
2110 return r;
05e343b7 2111
fea72cc0 2112 r = hashmap_put(u->manager->watch_pids2, PID_TO_PTR(pid), u);
5ba6985b 2113 }
a911bb9a 2114
fea72cc0 2115 q = set_put(u->pids, PID_TO_PTR(pid));
a911bb9a
LP
2116 if (q < 0)
2117 return q;
2118
2119 return r;
87f0e418
LP
2120}
2121
2122void unit_unwatch_pid(Unit *u, pid_t pid) {
2123 assert(u);
2124 assert(pid >= 1);
2125
fea72cc0
LP
2126 (void) hashmap_remove_value(u->manager->watch_pids1, PID_TO_PTR(pid), u);
2127 (void) hashmap_remove_value(u->manager->watch_pids2, PID_TO_PTR(pid), u);
2128 (void) set_remove(u->pids, PID_TO_PTR(pid));
a911bb9a
LP
2129}
2130
bd44e61b
LP
2131void unit_unwatch_all_pids(Unit *u) {
2132 assert(u);
2133
2134 while (!set_isempty(u->pids))
fea72cc0 2135 unit_unwatch_pid(u, PTR_TO_PID(set_first(u->pids)));
bd44e61b 2136
efdb0237 2137 u->pids = set_free(u->pids);
a911bb9a
LP
2138}
2139
2140void unit_tidy_watch_pids(Unit *u, pid_t except1, pid_t except2) {
2141 Iterator i;
2142 void *e;
2143
2144 assert(u);
2145
2146 /* Cleans dead PIDs from our list */
2147
2148 SET_FOREACH(e, u->pids, i) {
fea72cc0 2149 pid_t pid = PTR_TO_PID(e);
a911bb9a
LP
2150
2151 if (pid == except1 || pid == except2)
2152 continue;
2153
9f5650ae 2154 if (!pid_is_unwaited(pid))
bd44e61b 2155 unit_unwatch_pid(u, pid);
a911bb9a 2156 }
87f0e418
LP
2157}
2158
87f0e418
LP
2159bool unit_job_is_applicable(Unit *u, JobType j) {
2160 assert(u);
2161 assert(j >= 0 && j < _JOB_TYPE_MAX);
2162
2163 switch (j) {
2164
2165 case JOB_VERIFY_ACTIVE:
2166 case JOB_START:
e0209d83 2167 case JOB_NOP:
f5869324
LP
2168 /* Note that we don't check unit_can_start() here. That's because .device units and suchlike are not
2169 * startable by us but may appear due to external events, and it thus makes sense to permit enqueing
2170 * jobs for it. */
87f0e418
LP
2171 return true;
2172
f5869324
LP
2173 case JOB_STOP:
2174 /* Similar as above. However, perpetual units can never be stopped (neither explicitly nor due to
2175 * external events), hence it makes no sense to permit enqueing such a request either. */
2176 return !u->perpetual;
2177
87f0e418
LP
2178 case JOB_RESTART:
2179 case JOB_TRY_RESTART:
f5869324 2180 return unit_can_stop(u) && unit_can_start(u);
87f0e418
LP
2181
2182 case JOB_RELOAD:
3282591d 2183 case JOB_TRY_RELOAD:
87f0e418
LP
2184 return unit_can_reload(u);
2185
2186 case JOB_RELOAD_OR_START:
2187 return unit_can_reload(u) && unit_can_start(u);
2188
2189 default:
2190 assert_not_reached("Invalid job type");
2191 }
2192}
2193
f2341e0a
LP
2194static void maybe_warn_about_dependency(Unit *u, const char *other, UnitDependency dependency) {
2195 assert(u);
d1fab3fe 2196
f2341e0a
LP
2197 /* Only warn about some unit types */
2198 if (!IN_SET(dependency, UNIT_CONFLICTS, UNIT_CONFLICTED_BY, UNIT_BEFORE, UNIT_AFTER, UNIT_ON_FAILURE, UNIT_TRIGGERS, UNIT_TRIGGERED_BY))
2199 return;
3f3cc397 2200
f2341e0a
LP
2201 if (streq_ptr(u->id, other))
2202 log_unit_warning(u, "Dependency %s=%s dropped", unit_dependency_to_string(dependency), u->id);
2203 else
2204 log_unit_warning(u, "Dependency %s=%s dropped, merged into %s", unit_dependency_to_string(dependency), strna(other), u->id);
d1fab3fe
ZJS
2205}
2206
701cc384 2207int unit_add_dependency(Unit *u, UnitDependency d, Unit *other, bool add_reference) {
87f0e418
LP
2208
2209 static const UnitDependency inverse_table[_UNIT_DEPENDENCY_MAX] = {
2210 [UNIT_REQUIRES] = UNIT_REQUIRED_BY,
87f0e418 2211 [UNIT_WANTS] = UNIT_WANTED_BY,
be7d9ff7 2212 [UNIT_REQUISITE] = UNIT_REQUISITE_OF,
7f2cddae 2213 [UNIT_BINDS_TO] = UNIT_BOUND_BY,
60649f17 2214 [UNIT_PART_OF] = UNIT_CONSISTS_OF,
be7d9ff7 2215 [UNIT_REQUIRED_BY] = UNIT_REQUIRES,
be7d9ff7 2216 [UNIT_REQUISITE_OF] = UNIT_REQUISITE,
be7d9ff7 2217 [UNIT_WANTED_BY] = UNIT_WANTS,
7f2cddae 2218 [UNIT_BOUND_BY] = UNIT_BINDS_TO,
60649f17 2219 [UNIT_CONSISTS_OF] = UNIT_PART_OF,
69dd2852
LP
2220 [UNIT_CONFLICTS] = UNIT_CONFLICTED_BY,
2221 [UNIT_CONFLICTED_BY] = UNIT_CONFLICTS,
87f0e418 2222 [UNIT_BEFORE] = UNIT_AFTER,
701cc384 2223 [UNIT_AFTER] = UNIT_BEFORE,
5de9682c 2224 [UNIT_ON_FAILURE] = _UNIT_DEPENDENCY_INVALID,
701cc384 2225 [UNIT_REFERENCES] = UNIT_REFERENCED_BY,
57020a3a
LP
2226 [UNIT_REFERENCED_BY] = UNIT_REFERENCES,
2227 [UNIT_TRIGGERS] = UNIT_TRIGGERED_BY,
4dcc1cb4 2228 [UNIT_TRIGGERED_BY] = UNIT_TRIGGERS,
7f2cddae 2229 [UNIT_PROPAGATES_RELOAD_TO] = UNIT_RELOAD_PROPAGATED_FROM,
85e9a101 2230 [UNIT_RELOAD_PROPAGATED_FROM] = UNIT_PROPAGATES_RELOAD_TO,
613b411c 2231 [UNIT_JOINS_NAMESPACE_OF] = UNIT_JOINS_NAMESPACE_OF,
87f0e418 2232 };
701cc384 2233 int r, q = 0, v = 0, w = 0;
d1fab3fe 2234 Unit *orig_u = u, *orig_other = other;
87f0e418
LP
2235
2236 assert(u);
2237 assert(d >= 0 && d < _UNIT_DEPENDENCY_MAX);
87f0e418
LP
2238 assert(other);
2239
9f151f29
LP
2240 u = unit_follow_merge(u);
2241 other = unit_follow_merge(other);
2242
87f0e418
LP
2243 /* We won't allow dependencies on ourselves. We will not
2244 * consider them an error however. */
d1fab3fe 2245 if (u == other) {
f2341e0a 2246 maybe_warn_about_dependency(orig_u, orig_other->id, d);
87f0e418 2247 return 0;
d1fab3fe 2248 }
87f0e418 2249
dd5e7000
ZJS
2250 if (d == UNIT_BEFORE && other->type == UNIT_DEVICE) {
2251 log_unit_warning(u, "Dependency Before=%s ignored (.device units cannot be delayed)", other->id);
2252 return 0;
2253 }
2254
d5099efc 2255 r = set_ensure_allocated(&u->dependencies[d], NULL);
613b411c 2256 if (r < 0)
87f0e418
LP
2257 return r;
2258
613b411c 2259 if (inverse_table[d] != _UNIT_DEPENDENCY_INVALID) {
d5099efc 2260 r = set_ensure_allocated(&other->dependencies[inverse_table[d]], NULL);
613b411c
LP
2261 if (r < 0)
2262 return r;
2263 }
2264
2265 if (add_reference) {
d5099efc 2266 r = set_ensure_allocated(&u->dependencies[UNIT_REFERENCES], NULL);
613b411c 2267 if (r < 0)
5de9682c
LP
2268 return r;
2269
d5099efc 2270 r = set_ensure_allocated(&other->dependencies[UNIT_REFERENCED_BY], NULL);
613b411c 2271 if (r < 0)
701cc384 2272 return r;
613b411c 2273 }
87f0e418 2274
613b411c
LP
2275 q = set_put(u->dependencies[d], other);
2276 if (q < 0)
701cc384 2277 return q;
87f0e418 2278
613b411c
LP
2279 if (inverse_table[d] != _UNIT_DEPENDENCY_INVALID && inverse_table[d] != d) {
2280 v = set_put(other->dependencies[inverse_table[d]], u);
2281 if (v < 0) {
5de9682c
LP
2282 r = v;
2283 goto fail;
2284 }
613b411c 2285 }
701cc384
LP
2286
2287 if (add_reference) {
613b411c
LP
2288 w = set_put(u->dependencies[UNIT_REFERENCES], other);
2289 if (w < 0) {
701cc384
LP
2290 r = w;
2291 goto fail;
2292 }
2293
613b411c
LP
2294 r = set_put(other->dependencies[UNIT_REFERENCED_BY], u);
2295 if (r < 0)
701cc384 2296 goto fail;
87f0e418
LP
2297 }
2298
c1e1601e 2299 unit_add_to_dbus_queue(u);
87f0e418 2300 return 0;
701cc384
LP
2301
2302fail:
2303 if (q > 0)
ac155bb8 2304 set_remove(u->dependencies[d], other);
701cc384
LP
2305
2306 if (v > 0)
ac155bb8 2307 set_remove(other->dependencies[inverse_table[d]], u);
701cc384
LP
2308
2309 if (w > 0)
ac155bb8 2310 set_remove(u->dependencies[UNIT_REFERENCES], other);
701cc384
LP
2311
2312 return r;
87f0e418 2313}
0301abf4 2314
2c966c03
LP
2315int unit_add_two_dependencies(Unit *u, UnitDependency d, UnitDependency e, Unit *other, bool add_reference) {
2316 int r;
2317
2318 assert(u);
2319
3f3cc397
LP
2320 r = unit_add_dependency(u, d, other, add_reference);
2321 if (r < 0)
2c966c03
LP
2322 return r;
2323
7410616c 2324 return unit_add_dependency(u, e, other, add_reference);
2c966c03
LP
2325}
2326
7410616c
LP
2327static int resolve_template(Unit *u, const char *name, const char*path, char **buf, const char **ret) {
2328 int r;
9e2f7c11
LP
2329
2330 assert(u);
2331 assert(name || path);
7410616c
LP
2332 assert(buf);
2333 assert(ret);
9e2f7c11
LP
2334
2335 if (!name)
2b6bf07d 2336 name = basename(path);
9e2f7c11 2337
7410616c
LP
2338 if (!unit_name_is_valid(name, UNIT_NAME_TEMPLATE)) {
2339 *buf = NULL;
2340 *ret = name;
2341 return 0;
9e2f7c11
LP
2342 }
2343
ac155bb8 2344 if (u->instance)
7410616c 2345 r = unit_name_replace_instance(name, u->instance, buf);
9e2f7c11 2346 else {
ae018d9b 2347 _cleanup_free_ char *i = NULL;
9e2f7c11 2348
7410616c
LP
2349 r = unit_name_to_prefix(u->id, &i);
2350 if (r < 0)
2351 return r;
9e2f7c11 2352
7410616c 2353 r = unit_name_replace_instance(name, i, buf);
9e2f7c11 2354 }
7410616c
LP
2355 if (r < 0)
2356 return r;
9e2f7c11 2357
7410616c
LP
2358 *ret = *buf;
2359 return 0;
9e2f7c11
LP
2360}
2361
701cc384 2362int unit_add_dependency_by_name(Unit *u, UnitDependency d, const char *name, const char *path, bool add_reference) {
7410616c 2363 _cleanup_free_ char *buf = NULL;
09b6b09f
LP
2364 Unit *other;
2365 int r;
2366
9e2f7c11
LP
2367 assert(u);
2368 assert(name || path);
09b6b09f 2369
7410616c
LP
2370 r = resolve_template(u, name, path, &buf, &name);
2371 if (r < 0)
2372 return r;
09b6b09f 2373
8afbb8e1
LP
2374 r = manager_load_unit(u->manager, name, path, NULL, &other);
2375 if (r < 0)
2376 return r;
9e2f7c11 2377
8afbb8e1 2378 return unit_add_dependency(u, d, other, add_reference);
09b6b09f
LP
2379}
2380
2c966c03 2381int unit_add_two_dependencies_by_name(Unit *u, UnitDependency d, UnitDependency e, const char *name, const char *path, bool add_reference) {
7410616c 2382 _cleanup_free_ char *buf = NULL;
2c966c03
LP
2383 Unit *other;
2384 int r;
2c966c03
LP
2385
2386 assert(u);
2387 assert(name || path);
2388
7410616c
LP
2389 r = resolve_template(u, name, path, &buf, &name);
2390 if (r < 0)
2391 return r;
2c966c03 2392
3f3cc397
LP
2393 r = manager_load_unit(u->manager, name, path, NULL, &other);
2394 if (r < 0)
68eda4bd 2395 return r;
2c966c03 2396
3f3cc397 2397 return unit_add_two_dependencies(u, d, e, other, add_reference);
2c966c03
LP
2398}
2399
0301abf4 2400int set_unit_path(const char *p) {
0301abf4 2401 /* This is mostly for debug purposes */
cbe46ead 2402 if (setenv("SYSTEMD_UNIT_PATH", p, 1) < 0)
26d04f86 2403 return -errno;
0301abf4
LP
2404
2405 return 0;
2406}
88066b3a 2407
ea430986 2408char *unit_dbus_path(Unit *u) {
ea430986
LP
2409 assert(u);
2410
ac155bb8 2411 if (!u->id)
04ade7d2
LP
2412 return NULL;
2413
48899192 2414 return unit_dbus_path_from_name(u->id);
ea430986
LP
2415}
2416
4b58153d
LP
2417char *unit_dbus_path_invocation_id(Unit *u) {
2418 assert(u);
2419
2420 if (sd_id128_is_null(u->invocation_id))
2421 return NULL;
2422
2423 return unit_dbus_path_from_name(u->invocation_id_string);
2424}
2425
d79200e2
LP
2426int unit_set_slice(Unit *u, Unit *slice) {
2427 assert(u);
2428 assert(slice);
2429
2430 /* Sets the unit slice if it has not been set before. Is extra
2431 * careful, to only allow this for units that actually have a
2432 * cgroup context. Also, we don't allow to set this for slices
2433 * (since the parent slice is derived from the name). Make
2434 * sure the unit we set is actually a slice. */
2435
2436 if (!UNIT_HAS_CGROUP_CONTEXT(u))
2437 return -EOPNOTSUPP;
2438
2439 if (u->type == UNIT_SLICE)
2440 return -EINVAL;
2441
102ef982
LP
2442 if (unit_active_state(u) != UNIT_INACTIVE)
2443 return -EBUSY;
2444
d79200e2
LP
2445 if (slice->type != UNIT_SLICE)
2446 return -EINVAL;
2447
efdb0237
LP
2448 if (unit_has_name(u, SPECIAL_INIT_SCOPE) &&
2449 !unit_has_name(slice, SPECIAL_ROOT_SLICE))
2450 return -EPERM;
2451
d79200e2
LP
2452 if (UNIT_DEREF(u->slice) == slice)
2453 return 0;
2454
99e66921
TH
2455 /* Disallow slice changes if @u is already bound to cgroups */
2456 if (UNIT_ISSET(u->slice) && u->cgroup_realized)
d79200e2
LP
2457 return -EBUSY;
2458
99e66921 2459 unit_ref_unset(&u->slice);
d79200e2
LP
2460 unit_ref_set(&u->slice, slice);
2461 return 1;
2462}
2463
2464int unit_set_default_slice(Unit *u) {
a8833944
LP
2465 _cleanup_free_ char *b = NULL;
2466 const char *slice_name;
a016b922
LP
2467 Unit *slice;
2468 int r;
2469
2470 assert(u);
2471
9444b1f2 2472 if (UNIT_ISSET(u->slice))
a016b922
LP
2473 return 0;
2474
a8833944
LP
2475 if (u->instance) {
2476 _cleanup_free_ char *prefix = NULL, *escaped = NULL;
68eda4bd 2477
a8833944
LP
2478 /* Implicitly place all instantiated units in their
2479 * own per-template slice */
2480
7410616c
LP
2481 r = unit_name_to_prefix(u->id, &prefix);
2482 if (r < 0)
2483 return r;
a8833944
LP
2484
2485 /* The prefix is already escaped, but it might include
2486 * "-" which has a special meaning for slice units,
2487 * hence escape it here extra. */
7410616c 2488 escaped = unit_name_escape(prefix);
a8833944
LP
2489 if (!escaped)
2490 return -ENOMEM;
2491
463d0d15 2492 if (MANAGER_IS_SYSTEM(u->manager))
a8833944
LP
2493 b = strjoin("system-", escaped, ".slice", NULL);
2494 else
2495 b = strappend(escaped, ".slice");
2496 if (!b)
2497 return -ENOMEM;
2498
2499 slice_name = b;
2500 } else
2501 slice_name =
463d0d15 2502 MANAGER_IS_SYSTEM(u->manager) && !unit_has_name(u, SPECIAL_INIT_SCOPE)
a8833944
LP
2503 ? SPECIAL_SYSTEM_SLICE
2504 : SPECIAL_ROOT_SLICE;
2505
2506 r = manager_load_unit(u->manager, slice_name, NULL, NULL, &slice);
a016b922
LP
2507 if (r < 0)
2508 return r;
2509
d79200e2 2510 return unit_set_slice(u, slice);
a016b922
LP
2511}
2512
9444b1f2
LP
2513const char *unit_slice_name(Unit *u) {
2514 assert(u);
2515
2516 if (!UNIT_ISSET(u->slice))
2517 return NULL;
2518
2519 return UNIT_DEREF(u->slice)->id;
2520}
2521
f6ff8c29 2522int unit_load_related_unit(Unit *u, const char *type, Unit **_found) {
78edb35a 2523 _cleanup_free_ char *t = NULL;
f6ff8c29
LP
2524 int r;
2525
2526 assert(u);
2527 assert(type);
2528 assert(_found);
2529
7410616c
LP
2530 r = unit_name_change_suffix(u->id, type, &t);
2531 if (r < 0)
2532 return r;
2533 if (unit_has_name(u, t))
2534 return -EINVAL;
f6ff8c29 2535
ac155bb8 2536 r = manager_load_unit(u->manager, t, NULL, NULL, _found);
9e2f7c11 2537 assert(r < 0 || *_found != u);
f6ff8c29
LP
2538 return r;
2539}
2540
bbc29086
DM
2541static int signal_name_owner_changed(sd_bus_message *message, void *userdata, sd_bus_error *error) {
2542 const char *name, *old_owner, *new_owner;
2543 Unit *u = userdata;
2544 int r;
2545
2546 assert(message);
2547 assert(u);
2548
2549 r = sd_bus_message_read(message, "sss", &name, &old_owner, &new_owner);
2550 if (r < 0) {
2551 bus_log_parse_error(r);
2552 return 0;
2553 }
2554
2555 if (UNIT_VTABLE(u)->bus_name_owner_change)
2556 UNIT_VTABLE(u)->bus_name_owner_change(u, name, old_owner, new_owner);
2557
2558 return 0;
2559}
2560
9806e87d
LP
2561int unit_install_bus_match(Unit *u, sd_bus *bus, const char *name) {
2562 const char *match;
bbc29086 2563
9806e87d
LP
2564 assert(u);
2565 assert(bus);
2566 assert(name);
bbc29086
DM
2567
2568 if (u->match_bus_slot)
2569 return -EBUSY;
2570
9806e87d 2571 match = strjoina("type='signal',"
81d62103
ZJS
2572 "sender='org.freedesktop.DBus',"
2573 "path='/org/freedesktop/DBus',"
2574 "interface='org.freedesktop.DBus',"
2575 "member='NameOwnerChanged',"
2576 "arg0='", name, "'");
bbc29086
DM
2577
2578 return sd_bus_add_match(bus, &u->match_bus_slot, match, signal_name_owner_changed, u);
2579}
2580
05e343b7 2581int unit_watch_bus_name(Unit *u, const char *name) {
bbc29086
DM
2582 int r;
2583
05e343b7
LP
2584 assert(u);
2585 assert(name);
2586
2587 /* Watch a specific name on the bus. We only support one unit
2588 * watching each name for now. */
2589
bbc29086
DM
2590 if (u->manager->api_bus) {
2591 /* If the bus is already available, install the match directly.
2592 * Otherwise, just put the name in the list. bus_setup_api() will take care later. */
9806e87d 2593 r = unit_install_bus_match(u, u->manager->api_bus, name);
bbc29086 2594 if (r < 0)
8ea823b6 2595 return log_warning_errno(r, "Failed to subscribe to NameOwnerChanged signal for '%s': %m", name);
bbc29086
DM
2596 }
2597
2598 r = hashmap_put(u->manager->watch_bus, name, u);
2599 if (r < 0) {
2600 u->match_bus_slot = sd_bus_slot_unref(u->match_bus_slot);
2601 return log_warning_errno(r, "Failed to put bus name to hashmap: %m");
2602 }
2603
2604 return 0;
05e343b7
LP
2605}
2606
2607void unit_unwatch_bus_name(Unit *u, const char *name) {
2608 assert(u);
2609 assert(name);
2610
ac155bb8 2611 hashmap_remove_value(u->manager->watch_bus, name, u);
bbc29086 2612 u->match_bus_slot = sd_bus_slot_unref(u->match_bus_slot);
05e343b7
LP
2613}
2614
a16e1123
LP
2615bool unit_can_serialize(Unit *u) {
2616 assert(u);
2617
2618 return UNIT_VTABLE(u)->serialize && UNIT_VTABLE(u)->deserialize_item;
2619}
2620
6b78f9b4 2621int unit_serialize(Unit *u, FILE *f, FDSet *fds, bool serialize_jobs) {
a16e1123
LP
2622 int r;
2623
2624 assert(u);
2625 assert(f);
2626 assert(fds);
2627
9bdb98c5
LP
2628 if (unit_can_serialize(u)) {
2629 ExecRuntime *rt;
a16e1123 2630
9bdb98c5 2631 r = UNIT_VTABLE(u)->serialize(u, f, fds);
613b411c
LP
2632 if (r < 0)
2633 return r;
9bdb98c5
LP
2634
2635 rt = unit_get_exec_runtime(u);
2636 if (rt) {
f2341e0a 2637 r = exec_runtime_serialize(u, rt, f, fds);
9bdb98c5
LP
2638 if (r < 0)
2639 return r;
2640 }
e0209d83
MS
2641 }
2642
a483fb59
LP
2643 dual_timestamp_serialize(f, "state-change-timestamp", &u->state_change_timestamp);
2644
ac155bb8
MS
2645 dual_timestamp_serialize(f, "inactive-exit-timestamp", &u->inactive_exit_timestamp);
2646 dual_timestamp_serialize(f, "active-enter-timestamp", &u->active_enter_timestamp);
2647 dual_timestamp_serialize(f, "active-exit-timestamp", &u->active_exit_timestamp);
2648 dual_timestamp_serialize(f, "inactive-enter-timestamp", &u->inactive_enter_timestamp);
a483fb59 2649
ac155bb8 2650 dual_timestamp_serialize(f, "condition-timestamp", &u->condition_timestamp);
59fccdc5 2651 dual_timestamp_serialize(f, "assert-timestamp", &u->assert_timestamp);
2791a8f8 2652
ac155bb8
MS
2653 if (dual_timestamp_is_set(&u->condition_timestamp))
2654 unit_serialize_item(u, f, "condition-result", yes_no(u->condition_result));
10717a1a 2655
59fccdc5
LP
2656 if (dual_timestamp_is_set(&u->assert_timestamp))
2657 unit_serialize_item(u, f, "assert-result", yes_no(u->assert_result));
2658
c2756a68 2659 unit_serialize_item(u, f, "transient", yes_no(u->transient));
fe700f46 2660
66ebf6c0 2661 unit_serialize_item_format(u, f, "cpu-usage-base", "%" PRIu64, u->cpu_usage_base);
fe700f46
LP
2662 if (u->cpu_usage_last != NSEC_INFINITY)
2663 unit_serialize_item_format(u, f, "cpu-usage-last", "%" PRIu64, u->cpu_usage_last);
c2756a68
LP
2664
2665 if (u->cgroup_path)
2666 unit_serialize_item(u, f, "cgroup", u->cgroup_path);
de1d4f9b 2667 unit_serialize_item(u, f, "cgroup-realized", yes_no(u->cgroup_realized));
c2756a68 2668
00d9ef85
LP
2669 if (uid_is_valid(u->ref_uid))
2670 unit_serialize_item_format(u, f, "ref-uid", UID_FMT, u->ref_uid);
2671 if (gid_is_valid(u->ref_gid))
2672 unit_serialize_item_format(u, f, "ref-gid", GID_FMT, u->ref_gid);
2673
4b58153d
LP
2674 if (!sd_id128_is_null(u->invocation_id))
2675 unit_serialize_item_format(u, f, "invocation-id", SD_ID128_FORMAT_STR, SD_ID128_FORMAT_VAL(u->invocation_id));
2676
05a98afd
LP
2677 bus_track_serialize(u->bus_track, f, "ref");
2678
613b411c
LP
2679 if (serialize_jobs) {
2680 if (u->job) {
2681 fprintf(f, "job\n");
05a98afd 2682 job_serialize(u->job, f);
613b411c
LP
2683 }
2684
2685 if (u->nop_job) {
2686 fprintf(f, "job\n");
05a98afd 2687 job_serialize(u->nop_job, f);
613b411c
LP
2688 }
2689 }
2690
a16e1123
LP
2691 /* End marker */
2692 fputc('\n', f);
2693 return 0;
2694}
2695
a34ceba6
LP
2696int unit_serialize_item(Unit *u, FILE *f, const char *key, const char *value) {
2697 assert(u);
2698 assert(f);
2699 assert(key);
2700
2701 if (!value)
2702 return 0;
2703
2704 fputs(key, f);
2705 fputc('=', f);
2706 fputs(value, f);
2707 fputc('\n', f);
2708
2709 return 1;
2710}
2711
2712int unit_serialize_item_escaped(Unit *u, FILE *f, const char *key, const char *value) {
2713 _cleanup_free_ char *c = NULL;
2714
2715 assert(u);
2716 assert(f);
2717 assert(key);
2718
2719 if (!value)
2720 return 0;
2721
2722 c = cescape(value);
2723 if (!c)
2724 return -ENOMEM;
2725
2726 fputs(key, f);
2727 fputc('=', f);
2728 fputs(c, f);
2729 fputc('\n', f);
2730
2731 return 1;
2732}
2733
2734int unit_serialize_item_fd(Unit *u, FILE *f, FDSet *fds, const char *key, int fd) {
2735 int copy;
2736
2737 assert(u);
2738 assert(f);
2739 assert(key);
2740
2741 if (fd < 0)
2742 return 0;
2743
2744 copy = fdset_put_dup(fds, fd);
2745 if (copy < 0)
2746 return copy;
2747
2748 fprintf(f, "%s=%i\n", key, copy);
2749 return 1;
2750}
2751
a16e1123
LP
2752void unit_serialize_item_format(Unit *u, FILE *f, const char *key, const char *format, ...) {
2753 va_list ap;
2754
2755 assert(u);
2756 assert(f);
2757 assert(key);
2758 assert(format);
2759
2760 fputs(key, f);
2761 fputc('=', f);
2762
2763 va_start(ap, format);
2764 vfprintf(f, format, ap);
2765 va_end(ap);
2766
2767 fputc('\n', f);
2768}
2769
a16e1123 2770int unit_deserialize(Unit *u, FILE *f, FDSet *fds) {
28b99ccd 2771 ExecRuntime **rt = NULL;
9bdb98c5 2772 size_t offset;
a16e1123
LP
2773 int r;
2774
2775 assert(u);
2776 assert(f);
2777 assert(fds);
2778
613b411c
LP
2779 offset = UNIT_VTABLE(u)->exec_runtime_offset;
2780 if (offset > 0)
2781 rt = (ExecRuntime**) ((uint8_t*) u + offset);
2782
a16e1123 2783 for (;;) {
20c03b7b 2784 char line[LINE_MAX], *l, *v;
a16e1123
LP
2785 size_t k;
2786
2787 if (!fgets(line, sizeof(line), f)) {
2788 if (feof(f))
2789 return 0;
2790 return -errno;
2791 }
2792
10f8e83c 2793 char_array_0(line);
a16e1123
LP
2794 l = strstrip(line);
2795
2796 /* End marker */
e911de99 2797 if (isempty(l))
a483fb59 2798 break;
a16e1123
LP
2799
2800 k = strcspn(l, "=");
2801
2802 if (l[k] == '=') {
2803 l[k] = 0;
2804 v = l+k+1;
2805 } else
2806 v = l+k;
2807
cca098b0 2808 if (streq(l, "job")) {
39a18c60
MS
2809 if (v[0] == '\0') {
2810 /* new-style serialized job */
9c3349e2
LP
2811 Job *j;
2812
2813 j = job_new_raw(u);
39a18c60 2814 if (!j)
e911de99 2815 return log_oom();
39a18c60 2816
05a98afd 2817 r = job_deserialize(j, f);
39a18c60
MS
2818 if (r < 0) {
2819 job_free(j);
2820 return r;
2821 }
cca098b0 2822
39a18c60
MS
2823 r = hashmap_put(u->manager->jobs, UINT32_TO_PTR(j->id), j);
2824 if (r < 0) {
2825 job_free(j);
2826 return r;
2827 }
e0209d83
MS
2828
2829 r = job_install_deserialized(j);
2830 if (r < 0) {
2831 hashmap_remove(u->manager->jobs, UINT32_TO_PTR(j->id));
2832 job_free(j);
2833 return r;
2834 }
ed10fa8c
LP
2835 } else /* legacy for pre-44 */
2836 log_unit_warning(u, "Update from too old systemd versions are unsupported, cannot deserialize job: %s", v);
cca098b0 2837 continue;
a483fb59
LP
2838 } else if (streq(l, "state-change-timestamp")) {
2839 dual_timestamp_deserialize(v, &u->state_change_timestamp);
2840 continue;
8aaf019b 2841 } else if (streq(l, "inactive-exit-timestamp")) {
ac155bb8 2842 dual_timestamp_deserialize(v, &u->inactive_exit_timestamp);
8aaf019b
LP
2843 continue;
2844 } else if (streq(l, "active-enter-timestamp")) {
ac155bb8 2845 dual_timestamp_deserialize(v, &u->active_enter_timestamp);
8aaf019b
LP
2846 continue;
2847 } else if (streq(l, "active-exit-timestamp")) {
ac155bb8 2848 dual_timestamp_deserialize(v, &u->active_exit_timestamp);
8aaf019b
LP
2849 continue;
2850 } else if (streq(l, "inactive-enter-timestamp")) {
ac155bb8 2851 dual_timestamp_deserialize(v, &u->inactive_enter_timestamp);
8aaf019b 2852 continue;
2791a8f8 2853 } else if (streq(l, "condition-timestamp")) {
ac155bb8 2854 dual_timestamp_deserialize(v, &u->condition_timestamp);
2791a8f8 2855 continue;
59fccdc5
LP
2856 } else if (streq(l, "assert-timestamp")) {
2857 dual_timestamp_deserialize(v, &u->assert_timestamp);
2858 continue;
2791a8f8 2859 } else if (streq(l, "condition-result")) {
2791a8f8 2860
e911de99
LP
2861 r = parse_boolean(v);
2862 if (r < 0)
f2341e0a 2863 log_unit_debug(u, "Failed to parse condition result value %s, ignoring.", v);
2791a8f8 2864 else
e911de99 2865 u->condition_result = r;
efbac6d2
LP
2866
2867 continue;
c2756a68 2868
59fccdc5 2869 } else if (streq(l, "assert-result")) {
59fccdc5 2870
e911de99
LP
2871 r = parse_boolean(v);
2872 if (r < 0)
f2341e0a 2873 log_unit_debug(u, "Failed to parse assert result value %s, ignoring.", v);
59fccdc5 2874 else
e911de99 2875 u->assert_result = r;
59fccdc5
LP
2876
2877 continue;
2878
c2756a68 2879 } else if (streq(l, "transient")) {
c2756a68 2880
e911de99
LP
2881 r = parse_boolean(v);
2882 if (r < 0)
f2341e0a 2883 log_unit_debug(u, "Failed to parse transient bool %s, ignoring.", v);
c2756a68 2884 else
e911de99 2885 u->transient = r;
c2756a68
LP
2886
2887 continue;
e911de99 2888
fe700f46 2889 } else if (STR_IN_SET(l, "cpu-usage-base", "cpuacct-usage-base")) {
5ad096b3 2890
66ebf6c0 2891 r = safe_atou64(v, &u->cpu_usage_base);
5ad096b3 2892 if (r < 0)
fe700f46
LP
2893 log_unit_debug(u, "Failed to parse CPU usage base %s, ignoring.", v);
2894
2895 continue;
2896
2897 } else if (streq(l, "cpu-usage-last")) {
2898
2899 r = safe_atou64(v, &u->cpu_usage_last);
2900 if (r < 0)
2901 log_unit_debug(u, "Failed to read CPU usage last %s, ignoring.", v);
5ad096b3 2902
0f908397 2903 continue;
4e595329 2904
e911de99 2905 } else if (streq(l, "cgroup")) {
72673e86 2906
e911de99
LP
2907 r = unit_set_cgroup_path(u, v);
2908 if (r < 0)
f2341e0a 2909 log_unit_debug_errno(u, r, "Failed to set cgroup path %s, ignoring: %m", v);
4e595329 2910
efdb0237
LP
2911 (void) unit_watch_cgroup(u);
2912
de1d4f9b
WF
2913 continue;
2914 } else if (streq(l, "cgroup-realized")) {
2915 int b;
2916
2917 b = parse_boolean(v);
2918 if (b < 0)
2919 log_unit_debug(u, "Failed to parse cgroup-realized bool %s, ignoring.", v);
2920 else
2921 u->cgroup_realized = b;
2922
c2756a68 2923 continue;
00d9ef85
LP
2924
2925 } else if (streq(l, "ref-uid")) {
2926 uid_t uid;
2927
2928 r = parse_uid(v, &uid);
2929 if (r < 0)
2930 log_unit_debug(u, "Failed to parse referenced UID %s, ignoring.", v);
2931 else
2932 unit_ref_uid_gid(u, uid, GID_INVALID);
2933
2934 continue;
2935
2936 } else if (streq(l, "ref-gid")) {
2937 gid_t gid;
2938
2939 r = parse_gid(v, &gid);
2940 if (r < 0)
2941 log_unit_debug(u, "Failed to parse referenced GID %s, ignoring.", v);
2942 else
2943 unit_ref_uid_gid(u, UID_INVALID, gid);
2944
05a98afd
LP
2945 } else if (streq(l, "ref")) {
2946
2947 r = strv_extend(&u->deserialized_refs, v);
2948 if (r < 0)
2949 log_oom();
2950
4b58153d
LP
2951 continue;
2952 } else if (streq(l, "invocation-id")) {
2953 sd_id128_t id;
2954
2955 r = sd_id128_from_string(v, &id);
2956 if (r < 0)
2957 log_unit_debug(u, "Failed to parse invocation id %s, ignoring.", v);
2958 else {
2959 r = unit_set_invocation_id(u, id);
2960 if (r < 0)
2961 log_unit_warning_errno(u, r, "Failed to set invocation ID for unit: %m");
2962 }
2963
00d9ef85 2964 continue;
8aaf019b 2965 }
cca098b0 2966
9bdb98c5
LP
2967 if (unit_can_serialize(u)) {
2968 if (rt) {
f2341e0a 2969 r = exec_runtime_deserialize_item(u, rt, l, v, fds);
e911de99 2970 if (r < 0) {
f2341e0a 2971 log_unit_warning(u, "Failed to deserialize runtime parameter '%s', ignoring.", l);
e911de99
LP
2972 continue;
2973 }
2974
2975 /* Returns positive if key was handled by the call */
9bdb98c5
LP
2976 if (r > 0)
2977 continue;
2978 }
2979
2980 r = UNIT_VTABLE(u)->deserialize_item(u, l, v, fds);
613b411c 2981 if (r < 0)
f2341e0a 2982 log_unit_warning(u, "Failed to deserialize unit parameter '%s', ignoring.", l);
613b411c 2983 }
a16e1123 2984 }
a483fb59
LP
2985
2986 /* Versions before 228 did not carry a state change timestamp. In this case, take the current time. This is
2987 * useful, so that timeouts based on this timestamp don't trigger too early, and is in-line with the logic from
1f133e0d 2988 * before 228 where the base for timeouts was not persistent across reboots. */
a483fb59
LP
2989
2990 if (!dual_timestamp_is_set(&u->state_change_timestamp))
2991 dual_timestamp_get(&u->state_change_timestamp);
2992
2993 return 0;
a16e1123
LP
2994}
2995
9d06297e 2996int unit_add_node_link(Unit *u, const char *what, bool wants, UnitDependency dep) {
6e2ef85b 2997 Unit *device;
68eda4bd 2998 _cleanup_free_ char *e = NULL;
6e2ef85b
LP
2999 int r;
3000
3001 assert(u);
3002
6e2ef85b 3003 /* Adds in links to the device node that this unit is based on */
47bc12e1
LP
3004 if (isempty(what))
3005 return 0;
6e2ef85b 3006
8407a5d0 3007 if (!is_device_path(what))
6e2ef85b
LP
3008 return 0;
3009
47bc12e1
LP
3010 /* When device units aren't supported (such as in a
3011 * container), don't create dependencies on them. */
1c2e9646 3012 if (!unit_type_supported(UNIT_DEVICE))
47bc12e1
LP
3013 return 0;
3014
7410616c
LP
3015 r = unit_name_from_path(what, ".device", &e);
3016 if (r < 0)
3017 return r;
6e2ef85b 3018
ac155bb8 3019 r = manager_load_unit(u->manager, e, NULL, NULL, &device);
6e2ef85b
LP
3020 if (r < 0)
3021 return r;
3022
9d06297e 3023 r = unit_add_two_dependencies(u, UNIT_AFTER,
463d0d15 3024 MANAGER_IS_SYSTEM(u->manager) ? dep : UNIT_WANTS,
9d06297e 3025 device, true);
faa368e3 3026 if (r < 0)
6e2ef85b
LP
3027 return r;
3028
faa368e3
LP
3029 if (wants) {
3030 r = unit_add_dependency(device, UNIT_WANTS, u, false);
3031 if (r < 0)
6e2ef85b 3032 return r;
faa368e3 3033 }
6e2ef85b
LP
3034
3035 return 0;
3036}
a16e1123 3037
be847e82 3038int unit_coldplug(Unit *u) {
05a98afd
LP
3039 int r = 0, q;
3040 char **i;
cca098b0
LP
3041
3042 assert(u);
3043
f78f265f
LP
3044 /* Make sure we don't enter a loop, when coldplugging
3045 * recursively. */
3046 if (u->coldplugged)
3047 return 0;
3048
3049 u->coldplugged = true;
3050
05a98afd
LP
3051 STRV_FOREACH(i, u->deserialized_refs) {
3052 q = bus_unit_track_add_name(u, *i);
3053 if (q < 0 && r >= 0)
3054 r = q;
3055 }
3056 u->deserialized_refs = strv_free(u->deserialized_refs);
cca098b0 3057
05a98afd
LP
3058 if (UNIT_VTABLE(u)->coldplug) {
3059 q = UNIT_VTABLE(u)->coldplug(u);
3060 if (q < 0 && r >= 0)
3061 r = q;
3062 }
5a6158b6 3063
05a98afd
LP
3064 if (u->job) {
3065 q = job_coldplug(u->job);
3066 if (q < 0 && r >= 0)
3067 r = q;
3068 }
cca098b0 3069
05a98afd 3070 return r;
cca098b0
LP
3071}
3072
ba25d39e 3073static bool fragment_mtime_newer(const char *path, usec_t mtime, bool path_masked) {
21b95806
ZJS
3074 struct stat st;
3075
3076 if (!path)
3077 return false;
3078
3079 if (stat(path, &st) < 0)
3080 /* What, cannot access this anymore? */
3081 return true;
3082
ba25d39e
ZJS
3083 if (path_masked)
3084 /* For masked files check if they are still so */
3085 return !null_or_empty(&st);
3086 else
3a8db9fe 3087 /* For non-empty files check the mtime */
87ec20ef 3088 return timespec_load(&st.st_mtim) > mtime;
21b95806
ZJS
3089
3090 return false;
3091}
3092
45fb0699 3093bool unit_need_daemon_reload(Unit *u) {
ae7a7182
OS
3094 _cleanup_strv_free_ char **t = NULL;
3095 char **path;
1b64d026 3096
45fb0699
LP
3097 assert(u);
3098
ba25d39e
ZJS
3099 /* For unit files, we allow masking… */
3100 if (fragment_mtime_newer(u->fragment_path, u->fragment_mtime,
3101 u->load_state == UNIT_MASKED))
21b95806 3102 return true;
5f4b19f4 3103
ba25d39e
ZJS
3104 /* Source paths should not be masked… */
3105 if (fragment_mtime_newer(u->source_path, u->source_mtime, false))
ab932a62 3106 return true;
ae7a7182 3107
ab932a62
LP
3108 (void) unit_find_dropin_paths(u, &t);
3109 if (!strv_equal(u->dropin_paths, t))
3110 return true;
6d10d308 3111
ba25d39e 3112 /* … any drop-ins that are masked are simply omitted from the list. */
ab932a62 3113 STRV_FOREACH(path, u->dropin_paths)
ba25d39e 3114 if (fragment_mtime_newer(*path, u->dropin_mtime, false))
ab932a62 3115 return true;
21b95806 3116
ab932a62 3117 return false;
45fb0699
LP
3118}
3119
fdf20a31 3120void unit_reset_failed(Unit *u) {
5632e374
LP
3121 assert(u);
3122
fdf20a31
MM
3123 if (UNIT_VTABLE(u)->reset_failed)
3124 UNIT_VTABLE(u)->reset_failed(u);
6bf0f408
LP
3125
3126 RATELIMIT_RESET(u->start_limit);
3127 u->start_limit_hit = false;
5632e374
LP
3128}
3129
a7f241db
LP
3130Unit *unit_following(Unit *u) {
3131 assert(u);
3132
3133 if (UNIT_VTABLE(u)->following)
3134 return UNIT_VTABLE(u)->following(u);
3135
3136 return NULL;
3137}
3138
31afa0a4 3139bool unit_stop_pending(Unit *u) {
18ffdfda
LP
3140 assert(u);
3141
31afa0a4
LP
3142 /* This call does check the current state of the unit. It's
3143 * hence useful to be called from state change calls of the
3144 * unit itself, where the state isn't updated yet. This is
3145 * different from unit_inactive_or_pending() which checks both
3146 * the current state and for a queued job. */
18ffdfda 3147
31afa0a4
LP
3148 return u->job && u->job->type == JOB_STOP;
3149}
3150
3151bool unit_inactive_or_pending(Unit *u) {
3152 assert(u);
3153
3154 /* Returns true if the unit is inactive or going down */
18ffdfda 3155
d956ac29
LP
3156 if (UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(u)))
3157 return true;
3158
31afa0a4 3159 if (unit_stop_pending(u))
18ffdfda
LP
3160 return true;
3161
3162 return false;
3163}
3164
31afa0a4 3165bool unit_active_or_pending(Unit *u) {
f976f3f6
LP
3166 assert(u);
3167
f60c2665 3168 /* Returns true if the unit is active or going up */
f976f3f6
LP
3169
3170 if (UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u)))
3171 return true;
3172
ac155bb8
MS
3173 if (u->job &&
3174 (u->job->type == JOB_START ||
3175 u->job->type == JOB_RELOAD_OR_START ||
3176 u->job->type == JOB_RESTART))
f976f3f6
LP
3177 return true;
3178
3179 return false;
3180}
3181
718db961 3182int unit_kill(Unit *u, KillWho w, int signo, sd_bus_error *error) {
8a0867d6
LP
3183 assert(u);
3184 assert(w >= 0 && w < _KILL_WHO_MAX);
6eb7c172 3185 assert(SIGNAL_VALID(signo));
8a0867d6 3186
8a0867d6 3187 if (!UNIT_VTABLE(u)->kill)
15411c0c 3188 return -EOPNOTSUPP;
8a0867d6 3189
c74f17d9 3190 return UNIT_VTABLE(u)->kill(u, w, signo, error);
8a0867d6
LP
3191}
3192
82659fd7
LP
3193static Set *unit_pid_set(pid_t main_pid, pid_t control_pid) {
3194 Set *pid_set;
3195 int r;
3196
d5099efc 3197 pid_set = set_new(NULL);
82659fd7
LP
3198 if (!pid_set)
3199 return NULL;
3200
3201 /* Exclude the main/control pids from being killed via the cgroup */
3202 if (main_pid > 0) {
fea72cc0 3203 r = set_put(pid_set, PID_TO_PTR(main_pid));
82659fd7
LP
3204 if (r < 0)
3205 goto fail;
3206 }
3207
3208 if (control_pid > 0) {
fea72cc0 3209 r = set_put(pid_set, PID_TO_PTR(control_pid));
82659fd7
LP
3210 if (r < 0)
3211 goto fail;
3212 }
3213
3214 return pid_set;
3215
3216fail:
3217 set_free(pid_set);
3218 return NULL;
3219}
3220
d91c34f2
LP
3221int unit_kill_common(
3222 Unit *u,
3223 KillWho who,
3224 int signo,
3225 pid_t main_pid,
3226 pid_t control_pid,
718db961 3227 sd_bus_error *error) {
d91c34f2 3228
814cc562 3229 int r = 0;
ac5e3a50 3230 bool killed = false;
814cc562 3231
ac5e3a50 3232 if (IN_SET(who, KILL_MAIN, KILL_MAIN_FAIL)) {
814cc562 3233 if (main_pid < 0)
7358dc02 3234 return sd_bus_error_setf(error, BUS_ERROR_NO_SUCH_PROCESS, "%s units have no main processes", unit_type_to_string(u->type));
52f448c3 3235 else if (main_pid == 0)
7358dc02 3236 return sd_bus_error_set_const(error, BUS_ERROR_NO_SUCH_PROCESS, "No main process to kill");
814cc562
MS
3237 }
3238
ac5e3a50 3239 if (IN_SET(who, KILL_CONTROL, KILL_CONTROL_FAIL)) {
814cc562 3240 if (control_pid < 0)
7358dc02 3241 return sd_bus_error_setf(error, BUS_ERROR_NO_SUCH_PROCESS, "%s units have no control processes", unit_type_to_string(u->type));
52f448c3 3242 else if (control_pid == 0)
7358dc02 3243 return sd_bus_error_set_const(error, BUS_ERROR_NO_SUCH_PROCESS, "No control process to kill");
814cc562
MS
3244 }
3245
ac5e3a50
JS
3246 if (IN_SET(who, KILL_CONTROL, KILL_CONTROL_FAIL, KILL_ALL, KILL_ALL_FAIL))
3247 if (control_pid > 0) {
814cc562
MS
3248 if (kill(control_pid, signo) < 0)
3249 r = -errno;
ac5e3a50
JS
3250 else
3251 killed = true;
3252 }
814cc562 3253
ac5e3a50
JS
3254 if (IN_SET(who, KILL_MAIN, KILL_MAIN_FAIL, KILL_ALL, KILL_ALL_FAIL))
3255 if (main_pid > 0) {
814cc562
MS
3256 if (kill(main_pid, signo) < 0)
3257 r = -errno;
ac5e3a50
JS
3258 else
3259 killed = true;
3260 }
814cc562 3261
ac5e3a50 3262 if (IN_SET(who, KILL_ALL, KILL_ALL_FAIL) && u->cgroup_path) {
814cc562
MS
3263 _cleanup_set_free_ Set *pid_set = NULL;
3264 int q;
3265
82659fd7
LP
3266 /* Exclude the main/control pids from being killed via the cgroup */
3267 pid_set = unit_pid_set(main_pid, control_pid);
814cc562
MS
3268 if (!pid_set)
3269 return -ENOMEM;
3270
1d98fef1 3271 q = cg_kill_recursive(SYSTEMD_CGROUP_CONTROLLER, u->cgroup_path, signo, 0, pid_set, NULL, NULL);
814cc562
MS
3272 if (q < 0 && q != -EAGAIN && q != -ESRCH && q != -ENOENT)
3273 r = q;
ac5e3a50
JS
3274 else
3275 killed = true;
814cc562
MS
3276 }
3277
201f0c91 3278 if (r == 0 && !killed && IN_SET(who, KILL_ALL_FAIL, KILL_CONTROL_FAIL))
ac5e3a50
JS
3279 return -ESRCH;
3280
814cc562
MS
3281 return r;
3282}
3283
6210e7fc
LP
3284int unit_following_set(Unit *u, Set **s) {
3285 assert(u);
3286 assert(s);
3287
3288 if (UNIT_VTABLE(u)->following_set)
3289 return UNIT_VTABLE(u)->following_set(u, s);
3290
3291 *s = NULL;
3292 return 0;
3293}
3294
a4375746 3295UnitFileState unit_get_unit_file_state(Unit *u) {
0ec0deaa
LP
3296 int r;
3297
a4375746
LP
3298 assert(u);
3299
0ec0deaa
LP
3300 if (u->unit_file_state < 0 && u->fragment_path) {
3301 r = unit_file_get_state(
463d0d15 3302 u->manager->unit_file_scope,
0ec0deaa
LP
3303 NULL,
3304 basename(u->fragment_path),
3305 &u->unit_file_state);
3306 if (r < 0)
3307 u->unit_file_state = UNIT_FILE_BAD;
3308 }
a4375746 3309
ac155bb8 3310 return u->unit_file_state;
a4375746
LP
3311}
3312
d2dc52db
LP
3313int unit_get_unit_file_preset(Unit *u) {
3314 assert(u);
3315
3316 if (u->unit_file_preset < 0 && u->fragment_path)
3317 u->unit_file_preset = unit_file_query_preset(
463d0d15 3318 u->manager->unit_file_scope,
0ec0deaa
LP
3319 NULL,
3320 basename(u->fragment_path));
d2dc52db
LP
3321
3322 return u->unit_file_preset;
3323}
3324
57020a3a
LP
3325Unit* unit_ref_set(UnitRef *ref, Unit *u) {
3326 assert(ref);
3327 assert(u);
3328
3329 if (ref->unit)
3330 unit_ref_unset(ref);
3331
3332 ref->unit = u;
71fda00f 3333 LIST_PREPEND(refs, u->refs, ref);
57020a3a
LP
3334 return u;
3335}
3336
3337void unit_ref_unset(UnitRef *ref) {
3338 assert(ref);
3339
3340 if (!ref->unit)
3341 return;
3342
b75102e5
LP
3343 /* We are about to drop a reference to the unit, make sure the garbage collection has a look at it as it might
3344 * be unreferenced now. */
3345 unit_add_to_gc_queue(ref->unit);
3346
71fda00f 3347 LIST_REMOVE(refs, ref->unit->refs, ref);
57020a3a
LP
3348 ref->unit = NULL;
3349}
3350
29206d46
LP
3351static int user_from_unit_name(Unit *u, char **ret) {
3352
3353 static const uint8_t hash_key[] = {
3354 0x58, 0x1a, 0xaf, 0xe6, 0x28, 0x58, 0x4e, 0x96,
3355 0xb4, 0x4e, 0xf5, 0x3b, 0x8c, 0x92, 0x07, 0xec
3356 };
3357
3358 _cleanup_free_ char *n = NULL;
3359 int r;
3360
3361 r = unit_name_to_prefix(u->id, &n);
3362 if (r < 0)
3363 return r;
3364
3365 if (valid_user_group_name(n)) {
3366 *ret = n;
3367 n = NULL;
3368 return 0;
3369 }
3370
3371 /* If we can't use the unit name as a user name, then let's hash it and use that */
3372 if (asprintf(ret, "_du%016" PRIx64, siphash24(n, strlen(n), hash_key)) < 0)
3373 return -ENOMEM;
3374
3375 return 0;
3376}
3377
598459ce
LP
3378int unit_patch_contexts(Unit *u) {
3379 CGroupContext *cc;
3380 ExecContext *ec;
cba6e062
LP
3381 unsigned i;
3382 int r;
3383
e06c73cc 3384 assert(u);
e06c73cc 3385
598459ce
LP
3386 /* Patch in the manager defaults into the exec and cgroup
3387 * contexts, _after_ the rest of the settings have been
3388 * initialized */
085afe36 3389
598459ce
LP
3390 ec = unit_get_exec_context(u);
3391 if (ec) {
3392 /* This only copies in the ones that need memory */
3393 for (i = 0; i < _RLIMIT_MAX; i++)
3394 if (u->manager->rlimit[i] && !ec->rlimit[i]) {
3395 ec->rlimit[i] = newdup(struct rlimit, u->manager->rlimit[i], 1);
3396 if (!ec->rlimit[i])
3397 return -ENOMEM;
3398 }
3399
463d0d15 3400 if (MANAGER_IS_USER(u->manager) &&
598459ce
LP
3401 !ec->working_directory) {
3402
3403 r = get_home_dir(&ec->working_directory);
3404 if (r < 0)
3405 return r;
4c08c824
LP
3406
3407 /* Allow user services to run, even if the
3408 * home directory is missing */
3409 ec->working_directory_missing_ok = true;
cba6e062
LP
3410 }
3411
463d0d15 3412 if (MANAGER_IS_USER(u->manager) &&
598459ce
LP
3413 (ec->syscall_whitelist ||
3414 !set_isempty(ec->syscall_filter) ||
3415 !set_isempty(ec->syscall_archs) ||
3416 ec->address_families_whitelist ||
3417 !set_isempty(ec->address_families)))
3418 ec->no_new_privileges = true;
e06c73cc 3419
598459ce 3420 if (ec->private_devices)
2cd0a735 3421 ec->capability_bounding_set &= ~((UINT64_C(1) << CAP_MKNOD) | (UINT64_C(1) << CAP_SYS_RAWIO));
502d704e
DH
3422
3423 if (ec->protect_kernel_modules)
3424 ec->capability_bounding_set &= ~(UINT64_C(1) << CAP_SYS_MODULE);
29206d46
LP
3425
3426 if (ec->dynamic_user) {
3427 if (!ec->user) {
3428 r = user_from_unit_name(u, &ec->user);
3429 if (r < 0)
3430 return r;
3431 }
3432
3433 if (!ec->group) {
3434 ec->group = strdup(ec->user);
3435 if (!ec->group)
3436 return -ENOMEM;
3437 }
3438
63bb64a0
LP
3439 /* If the dynamic user option is on, let's make sure that the unit can't leave its UID/GID
3440 * around in the file system or on IPC objects. Hence enforce a strict sandbox. */
3441
29206d46 3442 ec->private_tmp = true;
00d9ef85 3443 ec->remove_ipc = true;
63bb64a0
LP
3444 ec->protect_system = PROTECT_SYSTEM_STRICT;
3445 if (ec->protect_home == PROTECT_HOME_NO)
3446 ec->protect_home = PROTECT_HOME_READ_ONLY;
29206d46 3447 }
cba6e062
LP
3448 }
3449
598459ce
LP
3450 cc = unit_get_cgroup_context(u);
3451 if (cc) {
f513e420 3452
598459ce
LP
3453 if (ec &&
3454 ec->private_devices &&
3455 cc->device_policy == CGROUP_AUTO)
3456 cc->device_policy = CGROUP_CLOSED;
3457 }
f1660f96 3458
cba6e062 3459 return 0;
e06c73cc
LP
3460}
3461
3ef63c31
LP
3462ExecContext *unit_get_exec_context(Unit *u) {
3463 size_t offset;
3464 assert(u);
3465
598459ce
LP
3466 if (u->type < 0)
3467 return NULL;
3468
3ef63c31
LP
3469 offset = UNIT_VTABLE(u)->exec_context_offset;
3470 if (offset <= 0)
3471 return NULL;
3472
3473 return (ExecContext*) ((uint8_t*) u + offset);
3474}
3475
718db961
LP
3476KillContext *unit_get_kill_context(Unit *u) {
3477 size_t offset;
3478 assert(u);
3479
598459ce
LP
3480 if (u->type < 0)
3481 return NULL;
3482
718db961
LP
3483 offset = UNIT_VTABLE(u)->kill_context_offset;
3484 if (offset <= 0)
3485 return NULL;
3486
3487 return (KillContext*) ((uint8_t*) u + offset);
3488}
3489
4ad49000
LP
3490CGroupContext *unit_get_cgroup_context(Unit *u) {
3491 size_t offset;
3492
598459ce
LP
3493 if (u->type < 0)
3494 return NULL;
3495
4ad49000
LP
3496 offset = UNIT_VTABLE(u)->cgroup_context_offset;
3497 if (offset <= 0)
3498 return NULL;
3499
3500 return (CGroupContext*) ((uint8_t*) u + offset);
3501}
3502
613b411c
LP
3503ExecRuntime *unit_get_exec_runtime(Unit *u) {
3504 size_t offset;
3505
598459ce
LP
3506 if (u->type < 0)
3507 return NULL;
3508
613b411c
LP
3509 offset = UNIT_VTABLE(u)->exec_runtime_offset;
3510 if (offset <= 0)
3511 return NULL;
3512
3513 return *(ExecRuntime**) ((uint8_t*) u + offset);
3514}
3515
39591351 3516static const char* unit_drop_in_dir(Unit *u, UnitSetPropertiesMode mode) {
3f5e8115
LP
3517 assert(u);
3518
4f4afc88
LP
3519 if (!IN_SET(mode, UNIT_RUNTIME, UNIT_PERSISTENT))
3520 return NULL;
3521
39591351
LP
3522 if (u->transient) /* Redirect drop-ins for transient units always into the transient directory. */
3523 return u->manager->lookup_paths.transient;
26d04f86 3524
39591351 3525 if (mode == UNIT_RUNTIME)
4f4afc88 3526 return u->manager->lookup_paths.runtime_control;
3f5e8115 3527
39591351 3528 if (mode == UNIT_PERSISTENT)
4f4afc88 3529 return u->manager->lookup_paths.persistent_control;
26d04f86 3530
39591351 3531 return NULL;
71645aca
LP
3532}
3533
8e2af478 3534int unit_write_drop_in(Unit *u, UnitSetPropertiesMode mode, const char *name, const char *data) {
39591351 3535 _cleanup_free_ char *p = NULL, *q = NULL;
2a9a6f8a 3536 const char *dir, *wrapped;
26d04f86 3537 int r;
71645aca
LP
3538
3539 assert(u);
3540
4f4afc88
LP
3541 if (u->transient_file) {
3542 /* When this is a transient unit file in creation, then let's not create a new drop-in but instead
3543 * write to the transient unit file. */
3544 fputs(data, u->transient_file);
fc40065b 3545 fputc('\n', u->transient_file);
4f4afc88
LP
3546 return 0;
3547 }
3548
6d235724 3549 if (!IN_SET(mode, UNIT_PERSISTENT, UNIT_RUNTIME))
8e2af478
LP
3550 return 0;
3551
39591351
LP
3552 dir = unit_drop_in_dir(u, mode);
3553 if (!dir)
3554 return -EINVAL;
71645aca 3555
2a9a6f8a 3556 wrapped = strjoina("# This is a drop-in unit file extension, created via \"systemctl set-property\"\n"
3f71dec5 3557 "# or an equivalent operation. Do not edit.\n",
2a9a6f8a
ZJS
3558 data,
3559 "\n");
e20b2a86 3560
815b09d3 3561 r = drop_in_file(dir, u->id, 50, name, &p, &q);
adb76a70
WC
3562 if (r < 0)
3563 return r;
3564
815b09d3 3565 (void) mkdir_p(p, 0755);
2a9a6f8a 3566 r = write_string_file_atomic_label(q, wrapped);
adb76a70
WC
3567 if (r < 0)
3568 return r;
3569
815b09d3 3570 r = strv_push(&u->dropin_paths, q);
adb76a70
WC
3571 if (r < 0)
3572 return r;
815b09d3 3573 q = NULL;
adb76a70 3574
adb76a70
WC
3575 strv_uniq(u->dropin_paths);
3576
3577 u->dropin_mtime = now(CLOCK_REALTIME);
3578
3579 return 0;
26d04f86 3580}
71645aca 3581
b9ec9359
LP
3582int unit_write_drop_in_format(Unit *u, UnitSetPropertiesMode mode, const char *name, const char *format, ...) {
3583 _cleanup_free_ char *p = NULL;
3584 va_list ap;
3585 int r;
3586
3587 assert(u);
3588 assert(name);
3589 assert(format);
3590
6d235724 3591 if (!IN_SET(mode, UNIT_PERSISTENT, UNIT_RUNTIME))
b9ec9359
LP
3592 return 0;
3593
3594 va_start(ap, format);
3595 r = vasprintf(&p, format, ap);
3596 va_end(ap);
3597
3598 if (r < 0)
3599 return -ENOMEM;
3600
3601 return unit_write_drop_in(u, mode, name, p);
3602}
3603
3604int unit_write_drop_in_private(Unit *u, UnitSetPropertiesMode mode, const char *name, const char *data) {
39591351 3605 const char *ndata;
b42defe3
LP
3606
3607 assert(u);
3608 assert(name);
3609 assert(data);
3610
3611 if (!UNIT_VTABLE(u)->private_section)
3612 return -EINVAL;
3613
6d235724 3614 if (!IN_SET(mode, UNIT_PERSISTENT, UNIT_RUNTIME))
b9ec9359
LP
3615 return 0;
3616
81d62103 3617 ndata = strjoina("[", UNIT_VTABLE(u)->private_section, "]\n", data);
b42defe3
LP
3618
3619 return unit_write_drop_in(u, mode, name, ndata);
3620}
3621
b9ec9359
LP
3622int unit_write_drop_in_private_format(Unit *u, UnitSetPropertiesMode mode, const char *name, const char *format, ...) {
3623 _cleanup_free_ char *p = NULL;
3624 va_list ap;
3625 int r;
3626
3627 assert(u);
3628 assert(name);
3629 assert(format);
3630
6d235724 3631 if (!IN_SET(mode, UNIT_PERSISTENT, UNIT_RUNTIME))
b9ec9359
LP
3632 return 0;
3633
3634 va_start(ap, format);
3635 r = vasprintf(&p, format, ap);
3636 va_end(ap);
3637
3638 if (r < 0)
3639 return -ENOMEM;
3640
3641 return unit_write_drop_in_private(u, mode, name, p);
3642}
71645aca 3643
c2756a68 3644int unit_make_transient(Unit *u) {
4f4afc88
LP
3645 FILE *f;
3646 char *path;
3647
c2756a68
LP
3648 assert(u);
3649
3f5e8115
LP
3650 if (!UNIT_VTABLE(u)->can_transient)
3651 return -EOPNOTSUPP;
3652
4f4afc88
LP
3653 path = strjoin(u->manager->lookup_paths.transient, "/", u->id, NULL);
3654 if (!path)
3655 return -ENOMEM;
3656
3657 /* Let's open the file we'll write the transient settings into. This file is kept open as long as we are
3658 * creating the transient, and is closed in unit_load(), as soon as we start loading the file. */
3659
78e334b5 3660 RUN_WITH_UMASK(0022) {
4f4afc88 3661 f = fopen(path, "we");
78e334b5
ZJS
3662 if (!f) {
3663 free(path);
3664 return -errno;
3665 }
4f4afc88
LP
3666 }
3667
3668 if (u->transient_file)
3669 fclose(u->transient_file);
3670 u->transient_file = f;
3671
3672 free(u->fragment_path);
3673 u->fragment_path = path;
7c65093a 3674
7c65093a
LP
3675 u->source_path = mfree(u->source_path);
3676 u->dropin_paths = strv_free(u->dropin_paths);
3677 u->fragment_mtime = u->source_mtime = u->dropin_mtime = 0;
3678
4f4afc88
LP
3679 u->load_state = UNIT_STUB;
3680 u->load_error = 0;
3681 u->transient = true;
3682
7c65093a
LP
3683 unit_add_to_dbus_queue(u);
3684 unit_add_to_gc_queue(u);
c2756a68 3685
4f4afc88
LP
3686 fputs("# This is a transient unit file, created programmatically via the systemd API. Do not edit.\n",
3687 u->transient_file);
3688
3f5e8115 3689 return 0;
c2756a68
LP
3690}
3691
1d98fef1
LP
3692static void log_kill(pid_t pid, int sig, void *userdata) {
3693 _cleanup_free_ char *comm = NULL;
3694
3695 (void) get_process_comm(pid, &comm);
3696
3697 /* Don't log about processes marked with brackets, under the assumption that these are temporary processes
3698 only, like for example systemd's own PAM stub process. */
3699 if (comm && comm[0] == '(')
3700 return;
3701
3702 log_unit_notice(userdata,
3703 "Killing process " PID_FMT " (%s) with signal SIG%s.",
3704 pid,
3705 strna(comm),
3706 signal_to_string(sig));
3707}
3708
3709static int operation_to_signal(KillContext *c, KillOperation k) {
3710 assert(c);
3711
3712 switch (k) {
3713
3714 case KILL_TERMINATE:
3715 case KILL_TERMINATE_AND_LOG:
3716 return c->kill_signal;
3717
3718 case KILL_KILL:
3719 return SIGKILL;
3720
3721 case KILL_ABORT:
3722 return SIGABRT;
3723
3724 default:
3725 assert_not_reached("KillOperation unknown");
3726 }
3727}
3728
cd2086fe
LP
3729int unit_kill_context(
3730 Unit *u,
3731 KillContext *c,
db2cb23b 3732 KillOperation k,
cd2086fe
LP
3733 pid_t main_pid,
3734 pid_t control_pid,
3735 bool main_pid_alien) {
3736
1d98fef1
LP
3737 bool wait_for_exit = false, send_sighup;
3738 cg_kill_log_func_t log_func;
b821a397 3739 int sig, r;
cd2086fe
LP
3740
3741 assert(u);
3742 assert(c);
3743
1d98fef1
LP
3744 /* Kill the processes belonging to this unit, in preparation for shutting the unit down. Returns > 0 if we
3745 * killed something worth waiting for, 0 otherwise. */
3746
cd2086fe
LP
3747 if (c->kill_mode == KILL_NONE)
3748 return 0;
3749
1d98fef1
LP
3750 sig = operation_to_signal(c, k);
3751
3752 send_sighup =
3753 c->send_sighup &&
3754 IN_SET(k, KILL_TERMINATE, KILL_TERMINATE_AND_LOG) &&
3755 sig != SIGHUP;
3756
3757 log_func =
3758 k != KILL_TERMINATE ||
3759 IN_SET(sig, SIGKILL, SIGABRT) ? log_kill : NULL;
cd2086fe
LP
3760
3761 if (main_pid > 0) {
1d98fef1
LP
3762 if (log_func)
3763 log_func(main_pid, sig, u);
cd2086fe 3764
1d98fef1 3765 r = kill_and_sigcont(main_pid, sig);
cd2086fe
LP
3766 if (r < 0 && r != -ESRCH) {
3767 _cleanup_free_ char *comm = NULL;
1d98fef1 3768 (void) get_process_comm(main_pid, &comm);
cd2086fe 3769
b821a397 3770 log_unit_warning_errno(u, r, "Failed to kill main process " PID_FMT " (%s), ignoring: %m", main_pid, strna(comm));
82659fd7 3771 } else {
bc6aed7b
LP
3772 if (!main_pid_alien)
3773 wait_for_exit = true;
82659fd7 3774
1d98fef1 3775 if (r != -ESRCH && send_sighup)
d0667321 3776 (void) kill(main_pid, SIGHUP);
82659fd7 3777 }
cd2086fe
LP
3778 }
3779
3780 if (control_pid > 0) {
1d98fef1
LP
3781 if (log_func)
3782 log_func(control_pid, sig, u);
cd2086fe 3783
1d98fef1 3784 r = kill_and_sigcont(control_pid, sig);
cd2086fe
LP
3785 if (r < 0 && r != -ESRCH) {
3786 _cleanup_free_ char *comm = NULL;
1d98fef1 3787 (void) get_process_comm(control_pid, &comm);
cd2086fe 3788
b821a397 3789 log_unit_warning_errno(u, r, "Failed to kill control process " PID_FMT " (%s), ignoring: %m", control_pid, strna(comm));
82659fd7 3790 } else {
cd2086fe 3791 wait_for_exit = true;
82659fd7 3792
1d98fef1 3793 if (r != -ESRCH && send_sighup)
d0667321 3794 (void) kill(control_pid, SIGHUP);
82659fd7 3795 }
cd2086fe
LP
3796 }
3797
b821a397
LP
3798 if (u->cgroup_path &&
3799 (c->kill_mode == KILL_CONTROL_GROUP || (c->kill_mode == KILL_MIXED && k == KILL_KILL))) {
cd2086fe
LP
3800 _cleanup_set_free_ Set *pid_set = NULL;
3801
82659fd7
LP
3802 /* Exclude the main/control pids from being killed via the cgroup */
3803 pid_set = unit_pid_set(main_pid, control_pid);
cd2086fe
LP
3804 if (!pid_set)
3805 return -ENOMEM;
3806
1d98fef1
LP
3807 r = cg_kill_recursive(SYSTEMD_CGROUP_CONTROLLER, u->cgroup_path,
3808 sig,
3809 CGROUP_SIGCONT|CGROUP_IGNORE_SELF,
3810 pid_set,
3811 log_func, u);
cd2086fe
LP
3812 if (r < 0) {
3813 if (r != -EAGAIN && r != -ESRCH && r != -ENOENT)
b821a397
LP
3814 log_unit_warning_errno(u, r, "Failed to kill control group %s, ignoring: %m", u->cgroup_path);
3815
82659fd7 3816 } else if (r > 0) {
bc6aed7b 3817
efdb0237
LP
3818 /* FIXME: For now, on the legacy hierarchy, we
3819 * will not wait for the cgroup members to die
3820 * if we are running in a container or if this
3821 * is a delegation unit, simply because cgroup
3822 * notification is unreliable in these
3823 * cases. It doesn't work at all in
3824 * containers, and outside of containers it
3825 * can be confused easily by left-over
ccddd104 3826 * directories in the cgroup — which however
efdb0237
LP
3827 * should not exist in non-delegated units. On
3828 * the unified hierarchy that's different,
3829 * there we get proper events. Hence rely on
3830 * them.*/
3831
5da38d07 3832 if (cg_unified(SYSTEMD_CGROUP_CONTROLLER) > 0 ||
75f86906 3833 (detect_container() == 0 && !unit_cgroup_delegate(u)))
e9db43d5 3834 wait_for_exit = true;
58ea275a 3835
1d98fef1 3836 if (send_sighup) {
82659fd7
LP
3837 set_free(pid_set);
3838
3839 pid_set = unit_pid_set(main_pid, control_pid);
3840 if (!pid_set)
3841 return -ENOMEM;
3842
1d98fef1
LP
3843 cg_kill_recursive(SYSTEMD_CGROUP_CONTROLLER, u->cgroup_path,
3844 SIGHUP,
3845 CGROUP_IGNORE_SELF,
3846 pid_set,
3847 NULL, NULL);
82659fd7
LP
3848 }
3849 }
cd2086fe
LP
3850 }
3851
3852 return wait_for_exit;
3853}
3854
a57f7e2c
LP
3855int unit_require_mounts_for(Unit *u, const char *path) {
3856 char prefix[strlen(path) + 1], *p;
3857 int r;
3858
3859 assert(u);
3860 assert(path);
3861
3862 /* Registers a unit for requiring a certain path and all its
3863 * prefixes. We keep a simple array of these paths in the
3864 * unit, since its usually short. However, we build a prefix
3865 * table for all possible prefixes so that new appearing mount
3866 * units can easily determine which units to make themselves a
3867 * dependency of. */
3868
70b64bd3
ZJS
3869 if (!path_is_absolute(path))
3870 return -EINVAL;
3871
a57f7e2c
LP
3872 p = strdup(path);
3873 if (!p)
3874 return -ENOMEM;
3875
3876 path_kill_slashes(p);
3877
a57f7e2c
LP
3878 if (!path_is_safe(p)) {
3879 free(p);
3880 return -EPERM;
3881 }
3882
3883 if (strv_contains(u->requires_mounts_for, p)) {
3884 free(p);
3885 return 0;
3886 }
3887
6e18964d
ZJS
3888 r = strv_consume(&u->requires_mounts_for, p);
3889 if (r < 0)
a57f7e2c 3890 return r;
a57f7e2c
LP
3891
3892 PATH_FOREACH_PREFIX_MORE(prefix, p) {
3893 Set *x;
3894
3895 x = hashmap_get(u->manager->units_requiring_mounts_for, prefix);
3896 if (!x) {
3897 char *q;
3898
742f41ad
LP
3899 r = hashmap_ensure_allocated(&u->manager->units_requiring_mounts_for, &string_hash_ops);
3900 if (r < 0)
3901 return r;
a57f7e2c
LP
3902
3903 q = strdup(prefix);
3904 if (!q)
3905 return -ENOMEM;
3906
d5099efc 3907 x = set_new(NULL);
a57f7e2c
LP
3908 if (!x) {
3909 free(q);
3910 return -ENOMEM;
3911 }
3912
3913 r = hashmap_put(u->manager->units_requiring_mounts_for, q, x);
3914 if (r < 0) {
3915 free(q);
3916 set_free(x);
3917 return r;
3918 }
3919 }
3920
3921 r = set_put(x, u);
3922 if (r < 0)
3923 return r;
3924 }
3925
3926 return 0;
3927}
3928
613b411c
LP
3929int unit_setup_exec_runtime(Unit *u) {
3930 ExecRuntime **rt;
3931 size_t offset;
3932 Iterator i;
3933 Unit *other;
3934
3935 offset = UNIT_VTABLE(u)->exec_runtime_offset;
3936 assert(offset > 0);
3937
06b643e7 3938 /* Check if there already is an ExecRuntime for this unit? */
613b411c
LP
3939 rt = (ExecRuntime**) ((uint8_t*) u + offset);
3940 if (*rt)
3941 return 0;
3942
3943 /* Try to get it from somebody else */
3944 SET_FOREACH(other, u->dependencies[UNIT_JOINS_NAMESPACE_OF], i) {
3945
3946 *rt = unit_get_exec_runtime(other);
3947 if (*rt) {
3948 exec_runtime_ref(*rt);
3949 return 0;
3950 }
3951 }
3952
3953 return exec_runtime_make(rt, unit_get_exec_context(u), u->id);
3954}
3955
29206d46
LP
3956int unit_setup_dynamic_creds(Unit *u) {
3957 ExecContext *ec;
3958 DynamicCreds *dcreds;
3959 size_t offset;
3960
3961 assert(u);
3962
3963 offset = UNIT_VTABLE(u)->dynamic_creds_offset;
3964 assert(offset > 0);
3965 dcreds = (DynamicCreds*) ((uint8_t*) u + offset);
3966
3967 ec = unit_get_exec_context(u);
3968 assert(ec);
3969
3970 if (!ec->dynamic_user)
3971 return 0;
3972
3973 return dynamic_creds_acquire(dcreds, u->manager, ec->user, ec->group);
3974}
3975
1c2e9646
LP
3976bool unit_type_supported(UnitType t) {
3977 if (_unlikely_(t < 0))
3978 return false;
3979 if (_unlikely_(t >= _UNIT_TYPE_MAX))
3980 return false;
3981
3982 if (!unit_vtable[t]->supported)
3983 return true;
3984
3985 return unit_vtable[t]->supported();
3986}
3987
8b4305c7
LP
3988void unit_warn_if_dir_nonempty(Unit *u, const char* where) {
3989 int r;
3990
3991 assert(u);
3992 assert(where);
3993
3994 r = dir_is_empty(where);
3995 if (r > 0)
3996 return;
3997 if (r < 0) {
3998 log_unit_warning_errno(u, r, "Failed to check directory %s: %m", where);
3999 return;
4000 }
4001
4002 log_struct(LOG_NOTICE,
4003 LOG_MESSAGE_ID(SD_MESSAGE_OVERMOUNTING),
4004 LOG_UNIT_ID(u),
4005 LOG_UNIT_MESSAGE(u, "Directory %s to mount over is not empty, mounting anyway.", where),
4006 "WHERE=%s", where,
4007 NULL);
4008}
4009
4010int unit_fail_if_symlink(Unit *u, const char* where) {
4011 int r;
4012
4013 assert(u);
4014 assert(where);
4015
4016 r = is_symlink(where);
4017 if (r < 0) {
4018 log_unit_debug_errno(u, r, "Failed to check symlink %s, ignoring: %m", where);
4019 return 0;
4020 }
4021 if (r == 0)
4022 return 0;
4023
4024 log_struct(LOG_ERR,
4025 LOG_MESSAGE_ID(SD_MESSAGE_OVERMOUNTING),
4026 LOG_UNIT_ID(u),
4027 LOG_UNIT_MESSAGE(u, "Mount on symlink %s not allowed.", where),
4028 "WHERE=%s", where,
4029 NULL);
4030
4031 return -ELOOP;
4032}
0f13f3bd
LP
4033
4034bool unit_is_pristine(Unit *u) {
4035 assert(u);
4036
7c65093a 4037 /* Check if the unit already exists or is already around,
0f13f3bd
LP
4038 * in a number of different ways. Note that to cater for unit
4039 * types such as slice, we are generally fine with units that
61233823 4040 * are marked UNIT_LOADED even though nothing was
0f13f3bd
LP
4041 * actually loaded, as those unit types don't require a file
4042 * on disk to validly load. */
4043
4044 return !(!IN_SET(u->load_state, UNIT_NOT_FOUND, UNIT_LOADED) ||
4045 u->fragment_path ||
4046 u->source_path ||
4047 !strv_isempty(u->dropin_paths) ||
0f13f3bd
LP
4048 u->job ||
4049 u->merged_into);
4050}
291d565a
LP
4051
4052pid_t unit_control_pid(Unit *u) {
4053 assert(u);
4054
4055 if (UNIT_VTABLE(u)->control_pid)
4056 return UNIT_VTABLE(u)->control_pid(u);
4057
4058 return 0;
4059}
4060
4061pid_t unit_main_pid(Unit *u) {
4062 assert(u);
4063
4064 if (UNIT_VTABLE(u)->main_pid)
4065 return UNIT_VTABLE(u)->main_pid(u);
4066
4067 return 0;
4068}
00d9ef85
LP
4069
4070static void unit_unref_uid_internal(
4071 Unit *u,
4072 uid_t *ref_uid,
4073 bool destroy_now,
4074 void (*_manager_unref_uid)(Manager *m, uid_t uid, bool destroy_now)) {
4075
4076 assert(u);
4077 assert(ref_uid);
4078 assert(_manager_unref_uid);
4079
4080 /* Generic implementation of both unit_unref_uid() and unit_unref_gid(), under the assumption that uid_t and
4081 * gid_t are actually the same time, with the same validity rules.
4082 *
4083 * Drops a reference to UID/GID from a unit. */
4084
4085 assert_cc(sizeof(uid_t) == sizeof(gid_t));
4086 assert_cc(UID_INVALID == (uid_t) GID_INVALID);
4087
4088 if (!uid_is_valid(*ref_uid))
4089 return;
4090
4091 _manager_unref_uid(u->manager, *ref_uid, destroy_now);
4092 *ref_uid = UID_INVALID;
4093}
4094
4095void unit_unref_uid(Unit *u, bool destroy_now) {
4096 unit_unref_uid_internal(u, &u->ref_uid, destroy_now, manager_unref_uid);
4097}
4098
4099void unit_unref_gid(Unit *u, bool destroy_now) {
4100 unit_unref_uid_internal(u, (uid_t*) &u->ref_gid, destroy_now, manager_unref_gid);
4101}
4102
4103static int unit_ref_uid_internal(
4104 Unit *u,
4105 uid_t *ref_uid,
4106 uid_t uid,
4107 bool clean_ipc,
4108 int (*_manager_ref_uid)(Manager *m, uid_t uid, bool clean_ipc)) {
4109
4110 int r;
4111
4112 assert(u);
4113 assert(ref_uid);
4114 assert(uid_is_valid(uid));
4115 assert(_manager_ref_uid);
4116
4117 /* Generic implementation of both unit_ref_uid() and unit_ref_guid(), under the assumption that uid_t and gid_t
4118 * are actually the same type, and have the same validity rules.
4119 *
4120 * Adds a reference on a specific UID/GID to this unit. Each unit referencing the same UID/GID maintains a
4121 * reference so that we can destroy the UID/GID's IPC resources as soon as this is requested and the counter
4122 * drops to zero. */
4123
4124 assert_cc(sizeof(uid_t) == sizeof(gid_t));
4125 assert_cc(UID_INVALID == (uid_t) GID_INVALID);
4126
4127 if (*ref_uid == uid)
4128 return 0;
4129
4130 if (uid_is_valid(*ref_uid)) /* Already set? */
4131 return -EBUSY;
4132
4133 r = _manager_ref_uid(u->manager, uid, clean_ipc);
4134 if (r < 0)
4135 return r;
4136
4137 *ref_uid = uid;
4138 return 1;
4139}
4140
4141int unit_ref_uid(Unit *u, uid_t uid, bool clean_ipc) {
4142 return unit_ref_uid_internal(u, &u->ref_uid, uid, clean_ipc, manager_ref_uid);
4143}
4144
4145int unit_ref_gid(Unit *u, gid_t gid, bool clean_ipc) {
4146 return unit_ref_uid_internal(u, (uid_t*) &u->ref_gid, (uid_t) gid, clean_ipc, manager_ref_gid);
4147}
4148
4149static int unit_ref_uid_gid_internal(Unit *u, uid_t uid, gid_t gid, bool clean_ipc) {
4150 int r = 0, q = 0;
4151
4152 assert(u);
4153
4154 /* Reference both a UID and a GID in one go. Either references both, or neither. */
4155
4156 if (uid_is_valid(uid)) {
4157 r = unit_ref_uid(u, uid, clean_ipc);
4158 if (r < 0)
4159 return r;
4160 }
4161
4162 if (gid_is_valid(gid)) {
4163 q = unit_ref_gid(u, gid, clean_ipc);
4164 if (q < 0) {
4165 if (r > 0)
4166 unit_unref_uid(u, false);
4167
4168 return q;
4169 }
4170 }
4171
4172 return r > 0 || q > 0;
4173}
4174
4175int unit_ref_uid_gid(Unit *u, uid_t uid, gid_t gid) {
4176 ExecContext *c;
4177 int r;
4178
4179 assert(u);
4180
4181 c = unit_get_exec_context(u);
4182
4183 r = unit_ref_uid_gid_internal(u, uid, gid, c ? c->remove_ipc : false);
4184 if (r < 0)
4185 return log_unit_warning_errno(u, r, "Couldn't add UID/GID reference to unit, proceeding without: %m");
4186
4187 return r;
4188}
4189
4190void unit_unref_uid_gid(Unit *u, bool destroy_now) {
4191 assert(u);
4192
4193 unit_unref_uid(u, destroy_now);
4194 unit_unref_gid(u, destroy_now);
4195}
4196
4197void unit_notify_user_lookup(Unit *u, uid_t uid, gid_t gid) {
4198 int r;
4199
4200 assert(u);
4201
4202 /* This is invoked whenever one of the forked off processes let's us know the UID/GID its user name/group names
4203 * resolved to. We keep track of which UID/GID is currently assigned in order to be able to destroy its IPC
4204 * objects when no service references the UID/GID anymore. */
4205
4206 r = unit_ref_uid_gid(u, uid, gid);
4207 if (r > 0)
4208 bus_unit_send_change_signal(u);
4209}
4b58153d
LP
4210
4211int unit_set_invocation_id(Unit *u, sd_id128_t id) {
4212 int r;
4213
4214 assert(u);
4215
4216 /* Set the invocation ID for this unit. If we cannot, this will not roll back, but reset the whole thing. */
4217
4218 if (sd_id128_equal(u->invocation_id, id))
4219 return 0;
4220
4221 if (!sd_id128_is_null(u->invocation_id))
4222 (void) hashmap_remove_value(u->manager->units_by_invocation_id, &u->invocation_id, u);
4223
4224 if (sd_id128_is_null(id)) {
4225 r = 0;
4226 goto reset;
4227 }
4228
4229 r = hashmap_ensure_allocated(&u->manager->units_by_invocation_id, &id128_hash_ops);
4230 if (r < 0)
4231 goto reset;
4232
4233 u->invocation_id = id;
4234 sd_id128_to_string(id, u->invocation_id_string);
4235
4236 r = hashmap_put(u->manager->units_by_invocation_id, &u->invocation_id, u);
4237 if (r < 0)
4238 goto reset;
4239
4240 return 0;
4241
4242reset:
4243 u->invocation_id = SD_ID128_NULL;
4244 u->invocation_id_string[0] = 0;
4245 return r;
4246}
4247
4248int unit_acquire_invocation_id(Unit *u) {
4249 sd_id128_t id;
4250 int r;
4251
4252 assert(u);
4253
4254 r = sd_id128_randomize(&id);
4255 if (r < 0)
4256 return log_unit_error_errno(u, r, "Failed to generate invocation ID for unit: %m");
4257
4258 r = unit_set_invocation_id(u, id);
4259 if (r < 0)
4260 return log_unit_error_errno(u, r, "Failed to set invocation ID for unit: %m");
4261
4262 return 0;
4263}