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