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