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