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