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