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