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