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