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