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