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