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