]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/core/unit.c
update TODO
[thirdparty/systemd.git] / src / core / unit.c
CommitLineData
d6c9574f 1/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
87f0e418 2
a7334b09
LP
3/***
4 This file is part of systemd.
5
6 Copyright 2010 Lennart Poettering
7
8 systemd is free software; you can redistribute it and/or modify it
5430f7f2
LP
9 under the terms of the GNU Lesser General Public License as published by
10 the Free Software Foundation; either version 2.1 of the License, or
a7334b09
LP
11 (at your option) any later version.
12
13 systemd is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
5430f7f2 16 Lesser General Public License for more details.
a7334b09 17
5430f7f2 18 You should have received a copy of the GNU Lesser General Public License
a7334b09
LP
19 along with systemd; If not, see <http://www.gnu.org/licenses/>.
20***/
21
87f0e418
LP
22#include <assert.h>
23#include <errno.h>
24#include <string.h>
25#include <sys/epoll.h>
26#include <sys/timerfd.h>
27#include <sys/poll.h>
0301abf4
LP
28#include <stdlib.h>
29#include <unistd.h>
45fb0699 30#include <sys/stat.h>
87f0e418 31
718db961
LP
32#include "sd-id128.h"
33#include "sd-messages.h"
87f0e418
LP
34#include "set.h"
35#include "unit.h"
36#include "macro.h"
37#include "strv.h"
9eb977db 38#include "path-util.h"
87f0e418
LP
39#include "load-fragment.h"
40#include "load-dropin.h"
41#include "log.h"
9e2f7c11 42#include "unit-name.h"
4139c1b2 43#include "dbus-unit.h"
514f4ef5 44#include "special.h"
c6c18be3 45#include "cgroup-util.h"
4927fcae 46#include "missing.h"
71645aca 47#include "mkdir.h"
a5c32cff
HH
48#include "label.h"
49#include "fileio-label.h"
814cc562 50#include "bus-errors.h"
718db961 51#include "dbus.h"
613b411c 52#include "execute.h"
bc6aed7b 53#include "virt.h"
87f0e418
LP
54
55const UnitVTable * const unit_vtable[_UNIT_TYPE_MAX] = {
56 [UNIT_SERVICE] = &service_vtable,
87f0e418 57 [UNIT_SOCKET] = &socket_vtable,
e821075a 58 [UNIT_BUSNAME] = &busname_vtable,
87f0e418 59 [UNIT_TARGET] = &target_vtable,
e821075a 60 [UNIT_SNAPSHOT] = &snapshot_vtable,
87f0e418
LP
61 [UNIT_DEVICE] = &device_vtable,
62 [UNIT_MOUNT] = &mount_vtable,
63 [UNIT_AUTOMOUNT] = &automount_vtable,
01f78473 64 [UNIT_SWAP] = &swap_vtable,
e821075a 65 [UNIT_TIMER] = &timer_vtable,
a016b922 66 [UNIT_PATH] = &path_vtable,
6c12b52e
LP
67 [UNIT_SLICE] = &slice_vtable,
68 [UNIT_SCOPE] = &scope_vtable
87f0e418
LP
69};
70
7d17cfbc 71Unit *unit_new(Manager *m, size_t size) {
87f0e418
LP
72 Unit *u;
73
74 assert(m);
ac155bb8 75 assert(size >= sizeof(Unit));
87f0e418 76
7d17cfbc
MS
77 u = malloc0(size);
78 if (!u)
87f0e418
LP
79 return NULL;
80
ac155bb8
MS
81 u->names = set_new(string_hash_func, string_compare_func);
82 if (!u->names) {
87f0e418
LP
83 free(u);
84 return NULL;
85 }
86
ac155bb8
MS
87 u->manager = m;
88 u->type = _UNIT_TYPE_INVALID;
89 u->deserialized_job = _JOB_TYPE_INVALID;
90 u->default_dependencies = true;
91 u->unit_file_state = _UNIT_FILE_STATE_INVALID;
d420282b 92 u->on_failure_job_mode = JOB_REPLACE;
87f0e418
LP
93
94 return u;
95}
96
f278026d
LP
97bool unit_has_name(Unit *u, const char *name) {
98 assert(u);
99 assert(name);
100
ac155bb8 101 return !!set_get(u->names, (char*) name);
f278026d
LP
102}
103
87f0e418
LP
104int unit_add_name(Unit *u, const char *text) {
105 UnitType t;
276c3e78 106 char *s, *i = NULL;
87f0e418
LP
107 int r;
108
109 assert(u);
110 assert(text);
111
9e2f7c11 112 if (unit_name_is_template(text)) {
ac155bb8 113 if (!u->instance)
9e2f7c11 114 return -EINVAL;
87f0e418 115
ac155bb8 116 s = unit_name_replace_instance(text, u->instance);
9e2f7c11
LP
117 } else
118 s = strdup(text);
87f0e418 119
9e2f7c11
LP
120 if (!s)
121 return -ENOMEM;
87f0e418 122
f78e6385 123 if (!unit_name_is_valid(s, TEMPLATE_INVALID)) {
9e2f7c11
LP
124 r = -EINVAL;
125 goto fail;
126 }
e537352b 127
9e2f7c11 128 assert_se((t = unit_name_to_type(s)) >= 0);
87f0e418 129
ac155bb8 130 if (u->type != _UNIT_TYPE_INVALID && t != u->type) {
9e2f7c11
LP
131 r = -EINVAL;
132 goto fail;
133 }
87f0e418 134
e48614c4
ZJS
135 r = unit_name_to_instance(s, &i);
136 if (r < 0)
9e2f7c11 137 goto fail;
87f0e418 138
796ba554
LP
139 if (i && unit_vtable[t]->no_instances) {
140 r = -EINVAL;
9e2f7c11 141 goto fail;
796ba554 142 }
9e2f7c11 143
276c3e78
LP
144 /* Ensure that this unit is either instanced or not instanced,
145 * but not both. */
ac155bb8 146 if (u->type != _UNIT_TYPE_INVALID && !u->instance != !i) {
9e2f7c11
LP
147 r = -EINVAL;
148 goto fail;
149 }
150
151 if (unit_vtable[t]->no_alias &&
ac155bb8
MS
152 !set_isempty(u->names) &&
153 !set_get(u->names, s)) {
9e2f7c11
LP
154 r = -EEXIST;
155 goto fail;
156 }
157
ac155bb8 158 if (hashmap_size(u->manager->units) >= MANAGER_MAX_NAMES) {
4f0f902f
LP
159 r = -E2BIG;
160 goto fail;
161 }
162
e48614c4
ZJS
163 r = set_put(u->names, s);
164 if (r < 0) {
9e2f7c11
LP
165 if (r == -EEXIST)
166 r = 0;
167 goto fail;
87f0e418
LP
168 }
169
e48614c4
ZJS
170 r = hashmap_put(u->manager->units, s, u);
171 if (r < 0) {
ac155bb8 172 set_remove(u->names, s);
9e2f7c11 173 goto fail;
87f0e418
LP
174 }
175
ac155bb8 176 if (u->type == _UNIT_TYPE_INVALID) {
ef734fd6 177
ac155bb8
MS
178 u->type = t;
179 u->id = s;
180 u->instance = i;
9e2f7c11 181
71fda00f 182 LIST_PREPEND(units_by_type, u->manager->units_by_type[t], u);
e537352b
LP
183
184 if (UNIT_VTABLE(u)->init)
185 UNIT_VTABLE(u)->init(u);
9e2f7c11
LP
186 } else
187 free(i);
87f0e418 188
c1e1601e 189 unit_add_to_dbus_queue(u);
87f0e418 190 return 0;
9e2f7c11
LP
191
192fail:
193 free(s);
194 free(i);
195
196 return r;
87f0e418
LP
197}
198
0ae97ec1 199int unit_choose_id(Unit *u, const char *name) {
68eda4bd
RC
200 char *s, *i;
201 _cleanup_free_ char *t = NULL;
276c3e78 202 int r;
0ae97ec1
LP
203
204 assert(u);
205 assert(name);
206
9e2f7c11
LP
207 if (unit_name_is_template(name)) {
208
ac155bb8 209 if (!u->instance)
9e2f7c11
LP
210 return -EINVAL;
211
e48614c4
ZJS
212 t = unit_name_replace_instance(name, u->instance);
213 if (!t)
9e2f7c11
LP
214 return -ENOMEM;
215
216 name = t;
217 }
218
0ae97ec1 219 /* Selects one of the names of this unit as the id */
ac155bb8 220 s = set_get(u->names, (char*) name);
0ae97ec1 221
9e2f7c11 222 if (!s)
0ae97ec1
LP
223 return -ENOENT;
224
e48614c4
ZJS
225 r = unit_name_to_instance(s, &i);
226 if (r < 0)
276c3e78
LP
227 return r;
228
ac155bb8 229 u->id = s;
276c3e78 230
ac155bb8
MS
231 free(u->instance);
232 u->instance = i;
276c3e78 233
c1e1601e 234 unit_add_to_dbus_queue(u);
9e2f7c11 235
0ae97ec1
LP
236 return 0;
237}
238
f50e0a01
LP
239int unit_set_description(Unit *u, const char *description) {
240 char *s;
241
242 assert(u);
243
8aec412f
LP
244 if (isempty(description))
245 s = NULL;
246 else {
247 s = strdup(description);
248 if (!s)
249 return -ENOMEM;
250 }
f50e0a01 251
ac155bb8
MS
252 free(u->description);
253 u->description = s;
c1e1601e
LP
254
255 unit_add_to_dbus_queue(u);
f50e0a01
LP
256 return 0;
257}
258
701cc384
LP
259bool unit_check_gc(Unit *u) {
260 assert(u);
261
ac155bb8 262 if (u->load_state == UNIT_STUB)
b86d44e5
LP
263 return true;
264
701cc384
LP
265 if (UNIT_VTABLE(u)->no_gc)
266 return true;
267
ac155bb8 268 if (u->no_gc)
6c073082
LP
269 return true;
270
ac155bb8 271 if (u->job)
701cc384
LP
272 return true;
273
e0209d83
MS
274 if (u->nop_job)
275 return true;
276
701cc384
LP
277 if (unit_active_state(u) != UNIT_INACTIVE)
278 return true;
279
9d576438
LP
280 if (u->refs)
281 return true;
282
701cc384
LP
283 if (UNIT_VTABLE(u)->check_gc)
284 if (UNIT_VTABLE(u)->check_gc(u))
285 return true;
286
287 return false;
288}
289
87f0e418
LP
290void unit_add_to_load_queue(Unit *u) {
291 assert(u);
ac155bb8 292 assert(u->type != _UNIT_TYPE_INVALID);
87f0e418 293
ac155bb8 294 if (u->load_state != UNIT_STUB || u->in_load_queue)
87f0e418
LP
295 return;
296
71fda00f 297 LIST_PREPEND(load_queue, u->manager->load_queue, u);
ac155bb8 298 u->in_load_queue = true;
87f0e418
LP
299}
300
23a177ef
LP
301void unit_add_to_cleanup_queue(Unit *u) {
302 assert(u);
303
ac155bb8 304 if (u->in_cleanup_queue)
23a177ef
LP
305 return;
306
71fda00f 307 LIST_PREPEND(cleanup_queue, u->manager->cleanup_queue, u);
ac155bb8 308 u->in_cleanup_queue = true;
23a177ef
LP
309}
310
701cc384
LP
311void unit_add_to_gc_queue(Unit *u) {
312 assert(u);
313
ac155bb8 314 if (u->in_gc_queue || u->in_cleanup_queue)
701cc384
LP
315 return;
316
317 if (unit_check_gc(u))
318 return;
319
71fda00f 320 LIST_PREPEND(gc_queue, u->manager->gc_queue, u);
ac155bb8 321 u->in_gc_queue = true;
701cc384 322
ac155bb8 323 u->manager->n_in_gc_queue ++;
701cc384
LP
324}
325
c1e1601e
LP
326void unit_add_to_dbus_queue(Unit *u) {
327 assert(u);
ac155bb8 328 assert(u->type != _UNIT_TYPE_INVALID);
c1e1601e 329
ac155bb8 330 if (u->load_state == UNIT_STUB || u->in_dbus_queue)
c1e1601e
LP
331 return;
332
a567261a 333 /* Shortcut things if nobody cares */
718db961 334 if (set_isempty(u->manager->subscribed)) {
ac155bb8 335 u->sent_dbus_new_signal = true;
94b6dfa2
LP
336 return;
337 }
338
71fda00f 339 LIST_PREPEND(dbus_queue, u->manager->dbus_unit_queue, u);
ac155bb8 340 u->in_dbus_queue = true;
c1e1601e
LP
341}
342
87f0e418
LP
343static void bidi_set_free(Unit *u, Set *s) {
344 Iterator i;
345 Unit *other;
346
347 assert(u);
348
349 /* Frees the set and makes sure we are dropped from the
350 * inverse pointers */
351
352 SET_FOREACH(other, s, i) {
353 UnitDependency d;
354
355 for (d = 0; d < _UNIT_DEPENDENCY_MAX; d++)
ac155bb8 356 set_remove(other->dependencies[d], u);
701cc384
LP
357
358 unit_add_to_gc_queue(other);
87f0e418
LP
359 }
360
361 set_free(s);
362}
363
c2756a68
LP
364static void unit_remove_transient(Unit *u) {
365 char **i;
366
367 assert(u);
368
369 if (!u->transient)
370 return;
371
372 if (u->fragment_path)
373 unlink(u->fragment_path);
374
375 STRV_FOREACH(i, u->dropin_paths) {
376 _cleanup_free_ char *p = NULL;
377 int r;
378
379 unlink(*i);
380
381 r = path_get_parent(*i, &p);
382 if (r >= 0)
383 rmdir(p);
384 }
385}
386
a57f7e2c
LP
387static void unit_free_requires_mounts_for(Unit *u) {
388 char **j;
389
390 STRV_FOREACH(j, u->requires_mounts_for) {
391 char s[strlen(*j) + 1];
392
393 PATH_FOREACH_PREFIX_MORE(s, *j) {
394 char *y;
395 Set *x;
396
397 x = hashmap_get2(u->manager->units_requiring_mounts_for, s, (void**) &y);
398 if (!x)
399 continue;
400
401 set_remove(x, u);
402
403 if (set_isempty(x)) {
404 hashmap_remove(u->manager->units_requiring_mounts_for, y);
405 free(y);
406 set_free(x);
407 }
408 }
409 }
410
411 strv_free(u->requires_mounts_for);
412 u->requires_mounts_for = NULL;
413}
414
87f0e418
LP
415void unit_free(Unit *u) {
416 UnitDependency d;
417 Iterator i;
418 char *t;
419
420 assert(u);
421
c2756a68
LP
422 if (u->manager->n_reloading <= 0)
423 unit_remove_transient(u);
424
c1e1601e
LP
425 bus_unit_send_removed_signal(u);
426
ac155bb8 427 if (u->load_state != UNIT_STUB)
a013b84b
LP
428 if (UNIT_VTABLE(u)->done)
429 UNIT_VTABLE(u)->done(u);
430
a57f7e2c
LP
431 unit_free_requires_mounts_for(u);
432
ac155bb8
MS
433 SET_FOREACH(t, u->names, i)
434 hashmap_remove_value(u->manager->units, t, u);
87f0e418 435
97e7d748
MS
436 if (u->job) {
437 Job *j = u->job;
438 job_uninstall(j);
439 job_free(j);
440 }
964e0949 441
e0209d83
MS
442 if (u->nop_job) {
443 Job *j = u->nop_job;
444 job_uninstall(j);
445 job_free(j);
446 }
447
964e0949 448 for (d = 0; d < _UNIT_DEPENDENCY_MAX; d++)
ac155bb8 449 bidi_set_free(u, u->dependencies[d]);
964e0949 450
ac155bb8 451 if (u->type != _UNIT_TYPE_INVALID)
71fda00f 452 LIST_REMOVE(units_by_type, u->manager->units_by_type[u->type], u);
ef734fd6 453
ac155bb8 454 if (u->in_load_queue)
71fda00f 455 LIST_REMOVE(load_queue, u->manager->load_queue, u);
87f0e418 456
ac155bb8 457 if (u->in_dbus_queue)
71fda00f 458 LIST_REMOVE(dbus_queue, u->manager->dbus_unit_queue, u);
c1e1601e 459
ac155bb8 460 if (u->in_cleanup_queue)
71fda00f 461 LIST_REMOVE(cleanup_queue, u->manager->cleanup_queue, u);
23a177ef 462
ac155bb8 463 if (u->in_gc_queue) {
71fda00f 464 LIST_REMOVE(gc_queue, u->manager->gc_queue, u);
ac155bb8 465 u->manager->n_in_gc_queue--;
701cc384
LP
466 }
467
4ad49000 468 if (u->in_cgroup_queue)
71fda00f 469 LIST_REMOVE(cgroup_queue, u->manager->cgroup_queue, u);
87f0e418 470
72673e86
LP
471 if (u->cgroup_path) {
472 hashmap_remove(u->manager->cgroup_unit, u->cgroup_path);
473 free(u->cgroup_path);
474 }
475
ac155bb8 476 free(u->description);
49dbfa7b 477 strv_free(u->documentation);
ac155bb8 478 free(u->fragment_path);
1b64d026 479 free(u->source_path);
ae7a7182 480 strv_free(u->dropin_paths);
ac155bb8 481 free(u->instance);
87f0e418 482
ac155bb8 483 set_free_free(u->names);
87f0e418 484
a911bb9a
LP
485 unit_unwatch_all_pids(u);
486
ac155bb8 487 condition_free_list(u->conditions);
52661efd 488
702a2d8f
LP
489 unit_ref_unset(&u->slice);
490
ac155bb8
MS
491 while (u->refs)
492 unit_ref_unset(u->refs);
57020a3a 493
87f0e418
LP
494 free(u);
495}
496
497UnitActiveState unit_active_state(Unit *u) {
498 assert(u);
499
ac155bb8 500 if (u->load_state == UNIT_MERGED)
6124958c
LP
501 return unit_active_state(unit_follow_merge(u));
502
503 /* After a reload it might happen that a unit is not correctly
504 * loaded but still has a process around. That's why we won't
fdf20a31 505 * shortcut failed loading to UNIT_INACTIVE_FAILED. */
87f0e418
LP
506
507 return UNIT_VTABLE(u)->active_state(u);
508}
509
10a94420
LP
510const char* unit_sub_state_to_string(Unit *u) {
511 assert(u);
512
513 return UNIT_VTABLE(u)->sub_state_to_string(u);
514}
515
23a177ef
LP
516static void complete_move(Set **s, Set **other) {
517 assert(s);
518 assert(other);
87f0e418 519
23a177ef
LP
520 if (!*other)
521 return;
87f0e418
LP
522
523 if (*s)
23a177ef
LP
524 set_move(*s, *other);
525 else {
526 *s = *other;
527 *other = NULL;
528 }
529}
87f0e418 530
23a177ef
LP
531static void merge_names(Unit *u, Unit *other) {
532 char *t;
533 Iterator i;
87f0e418 534
23a177ef
LP
535 assert(u);
536 assert(other);
537
ac155bb8 538 complete_move(&u->names, &other->names);
23a177ef 539
ac155bb8
MS
540 set_free_free(other->names);
541 other->names = NULL;
542 other->id = NULL;
23a177ef 543
ac155bb8
MS
544 SET_FOREACH(t, u->names, i)
545 assert_se(hashmap_replace(u->manager->units, t, u) == 0);
87f0e418
LP
546}
547
23a177ef
LP
548static void merge_dependencies(Unit *u, Unit *other, UnitDependency d) {
549 Iterator i;
550 Unit *back;
87f0e418 551 int r;
23a177ef
LP
552
553 assert(u);
554 assert(other);
555 assert(d < _UNIT_DEPENDENCY_MAX);
556
83a95334 557 /* Fix backwards pointers */
ac155bb8 558 SET_FOREACH(back, other->dependencies[d], i) {
23a177ef
LP
559 UnitDependency k;
560
e48614c4
ZJS
561 for (k = 0; k < _UNIT_DEPENDENCY_MAX; k++) {
562 r = set_remove_and_put(back->dependencies[k], other, u);
563 if (r == -EEXIST)
564 set_remove(back->dependencies[k], other);
565 else
566 assert(r >= 0 || r == -ENOENT);
567 }
23a177ef
LP
568 }
569
ac155bb8 570 complete_move(&u->dependencies[d], &other->dependencies[d]);
23a177ef 571
ac155bb8
MS
572 set_free(other->dependencies[d]);
573 other->dependencies[d] = NULL;
23a177ef
LP
574}
575
576int unit_merge(Unit *u, Unit *other) {
87f0e418
LP
577 UnitDependency d;
578
579 assert(u);
580 assert(other);
ac155bb8
MS
581 assert(u->manager == other->manager);
582 assert(u->type != _UNIT_TYPE_INVALID);
87f0e418 583
cc916967
LP
584 other = unit_follow_merge(other);
585
23a177ef
LP
586 if (other == u)
587 return 0;
588
ac155bb8 589 if (u->type != other->type)
9e2f7c11
LP
590 return -EINVAL;
591
ac155bb8 592 if (!u->instance != !other->instance)
87f0e418
LP
593 return -EINVAL;
594
ac155bb8 595 if (other->load_state != UNIT_STUB &&
c2756a68 596 other->load_state != UNIT_NOT_FOUND)
23a177ef 597 return -EEXIST;
87f0e418 598
ac155bb8 599 if (other->job)
819e213f
LP
600 return -EEXIST;
601
e0209d83
MS
602 if (other->nop_job)
603 return -EEXIST;
604
fdf20a31 605 if (!UNIT_IS_INACTIVE_OR_FAILED(unit_active_state(other)))
819e213f
LP
606 return -EEXIST;
607
87f0e418 608 /* Merge names */
23a177ef 609 merge_names(u, other);
87f0e418 610
57020a3a 611 /* Redirect all references */
ac155bb8
MS
612 while (other->refs)
613 unit_ref_set(other->refs, u);
57020a3a 614
87f0e418
LP
615 /* Merge dependencies */
616 for (d = 0; d < _UNIT_DEPENDENCY_MAX; d++)
23a177ef 617 merge_dependencies(u, other, d);
87f0e418 618
ac155bb8
MS
619 other->load_state = UNIT_MERGED;
620 other->merged_into = u;
23a177ef 621
3616a49c
LP
622 /* If there is still some data attached to the other node, we
623 * don't need it anymore, and can free it. */
ac155bb8 624 if (other->load_state != UNIT_STUB)
3616a49c
LP
625 if (UNIT_VTABLE(other)->done)
626 UNIT_VTABLE(other)->done(other);
627
628 unit_add_to_dbus_queue(u);
23a177ef
LP
629 unit_add_to_cleanup_queue(other);
630
631 return 0;
632}
633
634int unit_merge_by_name(Unit *u, const char *name) {
635 Unit *other;
9e2f7c11 636 int r;
68eda4bd 637 _cleanup_free_ char *s = NULL;
23a177ef
LP
638
639 assert(u);
640 assert(name);
641
9e2f7c11 642 if (unit_name_is_template(name)) {
ac155bb8 643 if (!u->instance)
9e2f7c11
LP
644 return -EINVAL;
645
e48614c4
ZJS
646 s = unit_name_replace_instance(name, u->instance);
647 if (!s)
9e2f7c11
LP
648 return -ENOMEM;
649
650 name = s;
651 }
652
c2756a68
LP
653 other = manager_get_unit(u->manager, name);
654 if (!other)
9e2f7c11
LP
655 r = unit_add_name(u, name);
656 else
657 r = unit_merge(u, other);
23a177ef 658
9e2f7c11 659 return r;
23a177ef
LP
660}
661
662Unit* unit_follow_merge(Unit *u) {
663 assert(u);
664
ac155bb8
MS
665 while (u->load_state == UNIT_MERGED)
666 assert_se(u = u->merged_into);
23a177ef
LP
667
668 return u;
669}
670
671int unit_add_exec_dependencies(Unit *u, ExecContext *c) {
672 int r;
673
674 assert(u);
675 assert(c);
676
36be24c8
ZJS
677 if (c->working_directory) {
678 r = unit_require_mounts_for(u, c->working_directory);
679 if (r < 0)
680 return r;
681 }
682
683 if (c->root_directory) {
684 r = unit_require_mounts_for(u, c->root_directory);
685 if (r < 0)
686 return r;
687 }
688
ecc6e2b8
LP
689 if (c->std_output != EXEC_OUTPUT_KMSG &&
690 c->std_output != EXEC_OUTPUT_SYSLOG &&
706343f4 691 c->std_output != EXEC_OUTPUT_JOURNAL &&
28dbc1e8
LP
692 c->std_output != EXEC_OUTPUT_KMSG_AND_CONSOLE &&
693 c->std_output != EXEC_OUTPUT_SYSLOG_AND_CONSOLE &&
706343f4 694 c->std_output != EXEC_OUTPUT_JOURNAL_AND_CONSOLE &&
ecc6e2b8 695 c->std_error != EXEC_OUTPUT_KMSG &&
085c98af 696 c->std_error != EXEC_OUTPUT_SYSLOG &&
706343f4 697 c->std_error != EXEC_OUTPUT_JOURNAL &&
085c98af 698 c->std_error != EXEC_OUTPUT_KMSG_AND_CONSOLE &&
706343f4 699 c->std_error != EXEC_OUTPUT_JOURNAL_AND_CONSOLE &&
28dbc1e8 700 c->std_error != EXEC_OUTPUT_SYSLOG_AND_CONSOLE)
23a177ef
LP
701 return 0;
702
703 /* If syslog or kernel logging is requested, make sure our own
704 * logging daemon is run first. */
705
9d246da3
MS
706 if (u->manager->running_as == SYSTEMD_SYSTEM) {
707 r = unit_add_dependency_by_name(u, UNIT_AFTER, SPECIAL_JOURNALD_SOCKET, NULL, true);
708 if (r < 0)
23a177ef 709 return r;
9d246da3 710 }
23a177ef 711
87f0e418
LP
712 return 0;
713}
714
87f0e418
LP
715const char *unit_description(Unit *u) {
716 assert(u);
717
ac155bb8
MS
718 if (u->description)
719 return u->description;
87f0e418 720
ac155bb8 721 return strna(u->id);
87f0e418
LP
722}
723
724void unit_dump(Unit *u, FILE *f, const char *prefix) {
49dbfa7b 725 char *t, **j;
87f0e418
LP
726 UnitDependency d;
727 Iterator i;
68eda4bd 728 _cleanup_free_ char *p2 = NULL;
47be870b 729 const char *prefix2;
173e3821
LP
730 char
731 timestamp1[FORMAT_TIMESTAMP_MAX],
732 timestamp2[FORMAT_TIMESTAMP_MAX],
733 timestamp3[FORMAT_TIMESTAMP_MAX],
faf919f1
LP
734 timestamp4[FORMAT_TIMESTAMP_MAX],
735 timespan[FORMAT_TIMESPAN_MAX];
a7f241db 736 Unit *following;
eeaedb7c
LP
737 _cleanup_set_free_ Set *following_set = NULL;
738 int r;
87f0e418
LP
739
740 assert(u);
ac155bb8 741 assert(u->type >= 0);
87f0e418
LP
742
743 if (!prefix)
744 prefix = "";
47be870b
LP
745 p2 = strappend(prefix, "\t");
746 prefix2 = p2 ? p2 : prefix;
87f0e418
LP
747
748 fprintf(f,
40d50879 749 "%s-> Unit %s:\n"
87f0e418 750 "%s\tDescription: %s\n"
9e2f7c11 751 "%s\tInstance: %s\n"
87f0e418 752 "%s\tUnit Load State: %s\n"
2fad8195 753 "%s\tUnit Active State: %s\n"
173e3821 754 "%s\tInactive Exit Timestamp: %s\n"
2fad8195 755 "%s\tActive Enter Timestamp: %s\n"
701cc384 756 "%s\tActive Exit Timestamp: %s\n"
173e3821 757 "%s\tInactive Enter Timestamp: %s\n"
45fb0699 758 "%s\tGC Check Good: %s\n"
9444b1f2 759 "%s\tNeed Daemon Reload: %s\n"
c2756a68 760 "%s\tTransient: %s\n"
4ad49000
LP
761 "%s\tSlice: %s\n"
762 "%s\tCGroup: %s\n"
763 "%s\tCGroup realized: %s\n"
6414b7c9
DS
764 "%s\tCGroup mask: 0x%x\n"
765 "%s\tCGroup members mask: 0x%x\n",
ac155bb8 766 prefix, u->id,
87f0e418 767 prefix, unit_description(u),
ac155bb8
MS
768 prefix, strna(u->instance),
769 prefix, unit_load_state_to_string(u->load_state),
2fad8195 770 prefix, unit_active_state_to_string(unit_active_state(u)),
ac155bb8
MS
771 prefix, strna(format_timestamp(timestamp1, sizeof(timestamp1), u->inactive_exit_timestamp.realtime)),
772 prefix, strna(format_timestamp(timestamp2, sizeof(timestamp2), u->active_enter_timestamp.realtime)),
773 prefix, strna(format_timestamp(timestamp3, sizeof(timestamp3), u->active_exit_timestamp.realtime)),
774 prefix, strna(format_timestamp(timestamp4, sizeof(timestamp4), u->inactive_enter_timestamp.realtime)),
45fb0699 775 prefix, yes_no(unit_check_gc(u)),
9444b1f2 776 prefix, yes_no(unit_need_daemon_reload(u)),
c2756a68 777 prefix, yes_no(u->transient),
4ad49000
LP
778 prefix, strna(unit_slice_name(u)),
779 prefix, strna(u->cgroup_path),
780 prefix, yes_no(u->cgroup_realized),
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
9091e686
TA
1143#pragma GCC diagnostic push
1144#pragma GCC diagnostic ignored "-Wformat-nonliteral"
877d54e9
LP
1145static void unit_status_print_starting_stopping(Unit *u, JobType t) {
1146 const char *format;
1147
1148 assert(u);
1149
1150 /* We only print status messages for selected units on
1151 * selected operations. */
c6918296 1152
877d54e9 1153 format = unit_get_status_message_format(u, t);
c6918296
MS
1154 if (!format)
1155 return;
1156
49b1d377 1157 unit_status_printf(u, "", format);
c6918296 1158}
9091e686 1159#pragma GCC diagnostic pop
c6918296 1160
877d54e9
LP
1161#pragma GCC diagnostic push
1162#pragma GCC diagnostic ignored "-Wformat-nonliteral"
1163static void unit_status_log_starting_stopping_reloading(Unit *u, JobType t) {
1164 const char *format;
1165 char buf[LINE_MAX];
1166 sd_id128_t mid;
1167
1168 assert(u);
1169
1170 if (t != JOB_START && t != JOB_STOP && t != JOB_RELOAD)
1171 return;
1172
81270860
LP
1173 if (log_on_console())
1174 return;
1175
877d54e9
LP
1176 /* We log status messages for all units and all operations. */
1177
1178 format = unit_get_status_message_format_try_harder(u, t);
1179 if (!format)
1180 return;
1181
1182 snprintf(buf, sizeof(buf), format, unit_description(u));
1183 char_array_0(buf);
1184
1185 mid = t == JOB_START ? SD_MESSAGE_UNIT_STARTING :
1186 t == JOB_STOP ? SD_MESSAGE_UNIT_STOPPING :
1187 SD_MESSAGE_UNIT_RELOADING;
1188
bbc9006e 1189 log_struct_unit(LOG_INFO,
c1b6628d
ZJS
1190 u->id,
1191 MESSAGE_ID(mid),
1192 "MESSAGE=%s", buf,
1193 NULL);
877d54e9
LP
1194}
1195#pragma GCC diagnostic pop
1196
87f0e418 1197/* Errors:
d5159713
LP
1198 * -EBADR: This unit type does not support starting.
1199 * -EALREADY: Unit is already started.
1200 * -EAGAIN: An operation is already in progress. Retry later.
1201 * -ECANCELED: Too many requests for now.
87f0e418
LP
1202 */
1203int unit_start(Unit *u) {
1204 UnitActiveState state;
92ab323c 1205 Unit *following;
87f0e418
LP
1206
1207 assert(u);
1208
ac155bb8 1209 if (u->load_state != UNIT_LOADED)
6124958c
LP
1210 return -EINVAL;
1211
a82e5507
LP
1212 /* If this is already started, then this will succeed. Note
1213 * that this will even succeed if this unit is not startable
1214 * by the user. This is relied on to detect when we need to
1215 * wait for units and when waiting is finished. */
87f0e418
LP
1216 state = unit_active_state(u);
1217 if (UNIT_IS_ACTIVE_OR_RELOADING(state))
1218 return -EALREADY;
1219
a82e5507
LP
1220 /* If the conditions failed, don't do anything at all. If we
1221 * already are activating this call might still be useful to
1222 * speed up activation in case there is some hold-off time,
1223 * but we don't want to recheck the condition in that case. */
1224 if (state != UNIT_ACTIVATING &&
1225 !unit_condition_test(u)) {
c1b6628d 1226 log_debug_unit(u->id, "Starting of %s requested but condition failed. Ignoring.", u->id);
52661efd
LP
1227 return -EALREADY;
1228 }
1229
92ab323c 1230 /* Forward to the main object, if we aren't it. */
52990c2e
ZJS
1231 following = unit_following(u);
1232 if (following) {
c1b6628d
ZJS
1233 log_debug_unit(u->id, "Redirecting start request from %s to %s.",
1234 u->id, following->id);
92ab323c
LP
1235 return unit_start(following);
1236 }
1237
877d54e9
LP
1238 unit_status_log_starting_stopping_reloading(u, JOB_START);
1239 unit_status_print_starting_stopping(u, JOB_START);
c6918296 1240
92ab323c
LP
1241 /* If it is stopped, but we cannot start it, then fail */
1242 if (!UNIT_VTABLE(u)->start)
1243 return -EBADR;
1244
87f0e418
LP
1245 /* We don't suppress calls to ->start() here when we are
1246 * already starting, to allow this request to be used as a
1247 * "hurry up" call, for example when the unit is in some "auto
1248 * restart" state where it waits for a holdoff timer to elapse
1249 * before it will start again. */
1250
c1e1601e 1251 unit_add_to_dbus_queue(u);
9e58ff9c 1252
87f0e418
LP
1253 return UNIT_VTABLE(u)->start(u);
1254}
1255
1256bool unit_can_start(Unit *u) {
1257 assert(u);
1258
1259 return !!UNIT_VTABLE(u)->start;
1260}
1261
2528a7a6
LP
1262bool unit_can_isolate(Unit *u) {
1263 assert(u);
1264
1265 return unit_can_start(u) &&
ac155bb8 1266 u->allow_isolate;
2528a7a6
LP
1267}
1268
87f0e418
LP
1269/* Errors:
1270 * -EBADR: This unit type does not support stopping.
1271 * -EALREADY: Unit is already stopped.
1272 * -EAGAIN: An operation is already in progress. Retry later.
1273 */
1274int unit_stop(Unit *u) {
1275 UnitActiveState state;
92ab323c 1276 Unit *following;
87f0e418
LP
1277
1278 assert(u);
1279
87f0e418 1280 state = unit_active_state(u);
fdf20a31 1281 if (UNIT_IS_INACTIVE_OR_FAILED(state))
87f0e418
LP
1282 return -EALREADY;
1283
92ab323c 1284 if ((following = unit_following(u))) {
c1b6628d
ZJS
1285 log_debug_unit(u->id, "Redirecting stop request from %s to %s.",
1286 u->id, following->id);
92ab323c
LP
1287 return unit_stop(following);
1288 }
1289
877d54e9
LP
1290 unit_status_log_starting_stopping_reloading(u, JOB_STOP);
1291 unit_status_print_starting_stopping(u, JOB_STOP);
c6918296 1292
7898b0cf
LP
1293 if (!UNIT_VTABLE(u)->stop)
1294 return -EBADR;
1295
c1e1601e 1296 unit_add_to_dbus_queue(u);
9e58ff9c 1297
87f0e418
LP
1298 return UNIT_VTABLE(u)->stop(u);
1299}
1300
1301/* Errors:
1302 * -EBADR: This unit type does not support reloading.
1303 * -ENOEXEC: Unit is not started.
1304 * -EAGAIN: An operation is already in progress. Retry later.
1305 */
1306int unit_reload(Unit *u) {
1307 UnitActiveState state;
92ab323c 1308 Unit *following;
87f0e418
LP
1309
1310 assert(u);
1311
ac155bb8 1312 if (u->load_state != UNIT_LOADED)
6124958c
LP
1313 return -EINVAL;
1314
87f0e418
LP
1315 if (!unit_can_reload(u))
1316 return -EBADR;
1317
1318 state = unit_active_state(u);
e364ad06 1319 if (state == UNIT_RELOADING)
87f0e418
LP
1320 return -EALREADY;
1321
6a371e23
ZJS
1322 if (state != UNIT_ACTIVE) {
1323 log_warning_unit(u->id, "Unit %s cannot be reloaded because it is inactive.",
1324 u->id);
87f0e418 1325 return -ENOEXEC;
6a371e23 1326 }
87f0e418 1327
e48614c4
ZJS
1328 following = unit_following(u);
1329 if (following) {
c1b6628d
ZJS
1330 log_debug_unit(u->id, "Redirecting reload request from %s to %s.",
1331 u->id, following->id);
92ab323c
LP
1332 return unit_reload(following);
1333 }
1334
877d54e9
LP
1335 unit_status_log_starting_stopping_reloading(u, JOB_RELOAD);
1336
c1e1601e 1337 unit_add_to_dbus_queue(u);
87f0e418
LP
1338 return UNIT_VTABLE(u)->reload(u);
1339}
1340
1341bool unit_can_reload(Unit *u) {
1342 assert(u);
1343
1344 if (!UNIT_VTABLE(u)->reload)
1345 return false;
1346
1347 if (!UNIT_VTABLE(u)->can_reload)
1348 return true;
1349
1350 return UNIT_VTABLE(u)->can_reload(u);
1351}
1352
b4a16b7b 1353static void unit_check_unneeded(Unit *u) {
f3bff0eb
LP
1354 Iterator i;
1355 Unit *other;
1356
1357 assert(u);
1358
1359 /* If this service shall be shut down when unneeded then do
1360 * so. */
1361
ac155bb8 1362 if (!u->stop_when_unneeded)
f3bff0eb
LP
1363 return;
1364
1365 if (!UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u)))
1366 return;
1367
ac155bb8 1368 SET_FOREACH(other, u->dependencies[UNIT_REQUIRED_BY], i)
31afa0a4 1369 if (unit_active_or_pending(other))
f3bff0eb
LP
1370 return;
1371
ac155bb8 1372 SET_FOREACH(other, u->dependencies[UNIT_REQUIRED_BY_OVERRIDABLE], i)
31afa0a4 1373 if (unit_active_or_pending(other))
f3bff0eb
LP
1374 return;
1375
ac155bb8 1376 SET_FOREACH(other, u->dependencies[UNIT_WANTED_BY], i)
31afa0a4 1377 if (unit_active_or_pending(other))
f3bff0eb
LP
1378 return;
1379
ac155bb8 1380 SET_FOREACH(other, u->dependencies[UNIT_BOUND_BY], i)
31afa0a4 1381 if (unit_active_or_pending(other))
b81884e7
LP
1382 return;
1383
c1b6628d 1384 log_info_unit(u->id, "Service %s is not needed anymore. Stopping.", u->id);
f3bff0eb
LP
1385
1386 /* Ok, nobody needs us anymore. Sniff. Then let's commit suicide */
ac155bb8 1387 manager_add_job(u->manager, JOB_STOP, u, JOB_FAIL, true, NULL, NULL);
f3bff0eb
LP
1388}
1389
87f0e418
LP
1390static void retroactively_start_dependencies(Unit *u) {
1391 Iterator i;
1392 Unit *other;
1393
1394 assert(u);
1395 assert(UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u)));
1396
ac155bb8
MS
1397 SET_FOREACH(other, u->dependencies[UNIT_REQUIRES], i)
1398 if (!set_get(u->dependencies[UNIT_AFTER], other) &&
b81884e7 1399 !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other)))
ac155bb8 1400 manager_add_job(u->manager, JOB_START, other, JOB_REPLACE, true, NULL, NULL);
b81884e7 1401
7f2cddae 1402 SET_FOREACH(other, u->dependencies[UNIT_BINDS_TO], i)
ac155bb8 1403 if (!set_get(u->dependencies[UNIT_AFTER], other) &&
b81884e7 1404 !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other)))
ac155bb8 1405 manager_add_job(u->manager, JOB_START, other, JOB_REPLACE, true, NULL, NULL);
87f0e418 1406
ac155bb8
MS
1407 SET_FOREACH(other, u->dependencies[UNIT_REQUIRES_OVERRIDABLE], i)
1408 if (!set_get(u->dependencies[UNIT_AFTER], other) &&
b81884e7 1409 !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other)))
ac155bb8 1410 manager_add_job(u->manager, JOB_START, other, JOB_FAIL, false, NULL, NULL);
87f0e418 1411
ac155bb8
MS
1412 SET_FOREACH(other, u->dependencies[UNIT_WANTS], i)
1413 if (!set_get(u->dependencies[UNIT_AFTER], other) &&
b81884e7 1414 !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other)))
ac155bb8 1415 manager_add_job(u->manager, JOB_START, other, JOB_FAIL, false, NULL, NULL);
87f0e418 1416
ac155bb8 1417 SET_FOREACH(other, u->dependencies[UNIT_CONFLICTS], i)
b81884e7 1418 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
ac155bb8 1419 manager_add_job(u->manager, JOB_STOP, other, JOB_REPLACE, true, NULL, NULL);
69dd2852 1420
ac155bb8 1421 SET_FOREACH(other, u->dependencies[UNIT_CONFLICTED_BY], i)
b81884e7 1422 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
ac155bb8 1423 manager_add_job(u->manager, JOB_STOP, other, JOB_REPLACE, true, NULL, NULL);
87f0e418
LP
1424}
1425
1426static void retroactively_stop_dependencies(Unit *u) {
1427 Iterator i;
1428 Unit *other;
1429
1430 assert(u);
1431 assert(UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(u)));
1432
b81884e7 1433 /* Pull down units which are bound to us recursively if enabled */
ac155bb8 1434 SET_FOREACH(other, u->dependencies[UNIT_BOUND_BY], i)
b81884e7 1435 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
ac155bb8 1436 manager_add_job(u->manager, JOB_STOP, other, JOB_REPLACE, true, NULL, NULL);
cd0504d0
MS
1437}
1438
1439static void check_unneeded_dependencies(Unit *u) {
1440 Iterator i;
1441 Unit *other;
1442
1443 assert(u);
1444 assert(UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(u)));
f3bff0eb
LP
1445
1446 /* Garbage collect services that might not be needed anymore, if enabled */
ac155bb8 1447 SET_FOREACH(other, u->dependencies[UNIT_REQUIRES], i)
87f0e418 1448 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
b4a16b7b 1449 unit_check_unneeded(other);
ac155bb8 1450 SET_FOREACH(other, u->dependencies[UNIT_REQUIRES_OVERRIDABLE], i)
f3bff0eb 1451 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
b4a16b7b 1452 unit_check_unneeded(other);
ac155bb8 1453 SET_FOREACH(other, u->dependencies[UNIT_WANTS], i)
f3bff0eb 1454 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
b4a16b7b 1455 unit_check_unneeded(other);
ac155bb8 1456 SET_FOREACH(other, u->dependencies[UNIT_REQUISITE], i)
f3bff0eb 1457 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
b4a16b7b 1458 unit_check_unneeded(other);
ac155bb8 1459 SET_FOREACH(other, u->dependencies[UNIT_REQUISITE_OVERRIDABLE], i)
f3bff0eb 1460 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
b4a16b7b 1461 unit_check_unneeded(other);
7f2cddae 1462 SET_FOREACH(other, u->dependencies[UNIT_BINDS_TO], i)
b81884e7
LP
1463 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
1464 unit_check_unneeded(other);
87f0e418
LP
1465}
1466
3ecaa09b 1467void unit_start_on_failure(Unit *u) {
c0daa706
LP
1468 Unit *other;
1469 Iterator i;
1470
1471 assert(u);
1472
ac155bb8 1473 if (set_size(u->dependencies[UNIT_ON_FAILURE]) <= 0)
222ae6a8
LP
1474 return;
1475
c1b6628d 1476 log_info_unit(u->id, "Triggering OnFailure= dependencies of %s.", u->id);
222ae6a8 1477
ac155bb8 1478 SET_FOREACH(other, u->dependencies[UNIT_ON_FAILURE], i) {
222ae6a8
LP
1479 int r;
1480
d420282b 1481 r = manager_add_job(u->manager, JOB_START, other, u->on_failure_job_mode, true, NULL, NULL);
c1b6628d
ZJS
1482 if (r < 0)
1483 log_error_unit(u->id, "Failed to enqueue OnFailure= job: %s", strerror(-r));
222ae6a8 1484 }
c0daa706
LP
1485}
1486
3ecaa09b
LP
1487void unit_trigger_notify(Unit *u) {
1488 Unit *other;
1489 Iterator i;
1490
1491 assert(u);
1492
1493 SET_FOREACH(other, u->dependencies[UNIT_TRIGGERED_BY], i)
1494 if (UNIT_VTABLE(other)->trigger_notify)
1495 UNIT_VTABLE(other)->trigger_notify(other, u);
1496}
1497
e2f3b44c 1498void unit_notify(Unit *u, UnitActiveState os, UnitActiveState ns, bool reload_success) {
546ac4f0 1499 Manager *m;
7e6e7b06 1500 bool unexpected;
a096ed36 1501
87f0e418
LP
1502 assert(u);
1503 assert(os < _UNIT_ACTIVE_STATE_MAX);
1504 assert(ns < _UNIT_ACTIVE_STATE_MAX);
87f0e418 1505
8e471ccd
LP
1506 /* Note that this is called for all low-level state changes,
1507 * even if they might map to the same high-level
1508 * UnitActiveState! That means that ns == os is OK an expected
c5315881 1509 * behavior here. For example: if a mount point is remounted
cd6d0a45 1510 * this function will be called too! */
87f0e418 1511
546ac4f0
MS
1512 m = u->manager;
1513
1514 if (m->n_reloading <= 0) {
bdbf9951 1515 dual_timestamp ts;
173e3821 1516
bdbf9951 1517 dual_timestamp_get(&ts);
173e3821 1518
bdbf9951 1519 if (UNIT_IS_INACTIVE_OR_FAILED(os) && !UNIT_IS_INACTIVE_OR_FAILED(ns))
ac155bb8 1520 u->inactive_exit_timestamp = ts;
bdbf9951 1521 else if (!UNIT_IS_INACTIVE_OR_FAILED(os) && UNIT_IS_INACTIVE_OR_FAILED(ns))
ac155bb8 1522 u->inactive_enter_timestamp = ts;
bdbf9951
LP
1523
1524 if (!UNIT_IS_ACTIVE_OR_RELOADING(os) && UNIT_IS_ACTIVE_OR_RELOADING(ns))
ac155bb8 1525 u->active_enter_timestamp = ts;
bdbf9951 1526 else if (UNIT_IS_ACTIVE_OR_RELOADING(os) && !UNIT_IS_ACTIVE_OR_RELOADING(ns))
ac155bb8 1527 u->active_exit_timestamp = ts;
bdbf9951 1528 }
87f0e418 1529
fdf20a31 1530 if (UNIT_IS_INACTIVE_OR_FAILED(ns))
4ad49000 1531 unit_destroy_cgroup(u);
fb385181 1532
9cd86184
OB
1533 /* Note that this doesn't apply to RemainAfterExit services exiting
1534 * sucessfully, since there's no change of state in that case. Which is
1535 * why it is handled in service_set_state() */
7ed9f6cd 1536 if (UNIT_IS_INACTIVE_OR_FAILED(os) != UNIT_IS_INACTIVE_OR_FAILED(ns)) {
b33918c2
LP
1537 ExecContext *ec;
1538
1539 ec = unit_get_exec_context(u);
7ed9f6cd 1540 if (ec && exec_context_may_touch_console(ec)) {
31a7eb86
ZJS
1541 if (UNIT_IS_INACTIVE_OR_FAILED(ns)) {
1542 m->n_on_console --;
1543
1544 if (m->n_on_console == 0)
1545 /* unset no_console_output flag, since the console is free */
2f38577f 1546 m->no_console_output = false;
31a7eb86
ZJS
1547 } else
1548 m->n_on_console ++;
7ed9f6cd
MS
1549 }
1550 }
1551
ac155bb8 1552 if (u->job) {
7e6e7b06 1553 unexpected = false;
87f0e418 1554
ac155bb8 1555 if (u->job->state == JOB_WAITING)
87f0e418
LP
1556
1557 /* So we reached a different state for this
1558 * job. Let's see if we can run it now if it
1559 * failed previously due to EAGAIN. */
ac155bb8 1560 job_add_to_run_queue(u->job);
87f0e418 1561
b410e6b9 1562 /* Let's check whether this state change constitutes a
35b8ca3a 1563 * finished job, or maybe contradicts a running job and
b410e6b9 1564 * hence needs to invalidate jobs. */
87f0e418 1565
ac155bb8 1566 switch (u->job->type) {
87f0e418 1567
b410e6b9
LP
1568 case JOB_START:
1569 case JOB_VERIFY_ACTIVE:
87f0e418 1570
b410e6b9 1571 if (UNIT_IS_ACTIVE_OR_RELOADING(ns))
5273510e 1572 job_finish_and_invalidate(u->job, JOB_DONE, true);
ac155bb8 1573 else if (u->job->state == JOB_RUNNING && ns != UNIT_ACTIVATING) {
b410e6b9 1574 unexpected = true;
41b02ec7 1575
fdf20a31 1576 if (UNIT_IS_INACTIVE_OR_FAILED(ns))
5273510e 1577 job_finish_and_invalidate(u->job, ns == UNIT_FAILED ? JOB_FAILED : JOB_DONE, true);
b410e6b9 1578 }
87f0e418 1579
b410e6b9 1580 break;
87f0e418 1581
b410e6b9
LP
1582 case JOB_RELOAD:
1583 case JOB_RELOAD_OR_START:
87f0e418 1584
ac155bb8 1585 if (u->job->state == JOB_RUNNING) {
a096ed36 1586 if (ns == UNIT_ACTIVE)
5273510e 1587 job_finish_and_invalidate(u->job, reload_success ? JOB_DONE : JOB_FAILED, true);
032ff4af 1588 else if (ns != UNIT_ACTIVATING && ns != UNIT_RELOADING) {
a096ed36 1589 unexpected = true;
41b02ec7 1590
fdf20a31 1591 if (UNIT_IS_INACTIVE_OR_FAILED(ns))
5273510e 1592 job_finish_and_invalidate(u->job, ns == UNIT_FAILED ? JOB_FAILED : JOB_DONE, true);
a096ed36 1593 }
b410e6b9 1594 }
87f0e418 1595
b410e6b9 1596 break;
87f0e418 1597
b410e6b9
LP
1598 case JOB_STOP:
1599 case JOB_RESTART:
1600 case JOB_TRY_RESTART:
87f0e418 1601
fdf20a31 1602 if (UNIT_IS_INACTIVE_OR_FAILED(ns))
5273510e 1603 job_finish_and_invalidate(u->job, JOB_DONE, true);
ac155bb8 1604 else if (u->job->state == JOB_RUNNING && ns != UNIT_DEACTIVATING) {
b410e6b9 1605 unexpected = true;
5273510e 1606 job_finish_and_invalidate(u->job, JOB_FAILED, true);
b410e6b9 1607 }
87f0e418 1608
b410e6b9 1609 break;
87f0e418 1610
b410e6b9
LP
1611 default:
1612 assert_not_reached("Job type unknown");
87f0e418 1613 }
87f0e418 1614
7e6e7b06
LP
1615 } else
1616 unexpected = true;
1617
546ac4f0 1618 if (m->n_reloading <= 0) {
f3bff0eb 1619
bdbf9951
LP
1620 /* If this state change happened without being
1621 * requested by a job, then let's retroactively start
1622 * or stop dependencies. We skip that step when
1623 * deserializing, since we don't want to create any
1624 * additional jobs just because something is already
1625 * activated. */
1626
1627 if (unexpected) {
1628 if (UNIT_IS_INACTIVE_OR_FAILED(os) && UNIT_IS_ACTIVE_OR_ACTIVATING(ns))
1629 retroactively_start_dependencies(u);
1630 else if (UNIT_IS_ACTIVE_OR_ACTIVATING(os) && UNIT_IS_INACTIVE_OR_DEACTIVATING(ns))
1631 retroactively_stop_dependencies(u);
1632 }
5de9682c 1633
cd0504d0 1634 /* stop unneeded units regardless if going down was expected or not */
b33918c2 1635 if (UNIT_IS_INACTIVE_OR_DEACTIVATING(ns))
cd0504d0
MS
1636 check_unneeded_dependencies(u);
1637
bdbf9951 1638 if (ns != os && ns == UNIT_FAILED) {
b33918c2 1639 log_notice_unit(u->id, "Unit %s entered failed state.", u->id);
3ecaa09b 1640 unit_start_on_failure(u);
cd6d0a45 1641 }
3b2775c5 1642 }
e537352b 1643
3b2775c5
LP
1644 /* Some names are special */
1645 if (UNIT_IS_ACTIVE_OR_RELOADING(ns)) {
1646
1647 if (unit_has_name(u, SPECIAL_DBUS_SERVICE))
1648 /* The bus just might have become available,
1649 * hence try to connect to it, if we aren't
1650 * yet connected. */
546ac4f0 1651 bus_init(m, true);
3b2775c5 1652
ac155bb8 1653 if (u->type == UNIT_SERVICE &&
3b2775c5 1654 !UNIT_IS_ACTIVE_OR_RELOADING(os) &&
546ac4f0 1655 m->n_reloading <= 0) {
3b2775c5 1656 /* Write audit record if we have just finished starting up */
546ac4f0 1657 manager_send_unit_audit(m, u, AUDIT_SERVICE_START, true);
ac155bb8 1658 u->in_audit = true;
3b2775c5 1659 }
e983b760 1660
3b2775c5 1661 if (!UNIT_IS_ACTIVE_OR_RELOADING(os))
546ac4f0 1662 manager_send_unit_plymouth(m, u);
bdbf9951 1663
3b2775c5 1664 } else {
bdbf9951 1665
3b2775c5
LP
1666 /* We don't care about D-Bus here, since we'll get an
1667 * asynchronous notification for it anyway. */
cd6d0a45 1668
ac155bb8 1669 if (u->type == UNIT_SERVICE &&
3b2775c5
LP
1670 UNIT_IS_INACTIVE_OR_FAILED(ns) &&
1671 !UNIT_IS_INACTIVE_OR_FAILED(os) &&
546ac4f0 1672 m->n_reloading <= 0) {
4927fcae 1673
3b2775c5
LP
1674 /* Hmm, if there was no start record written
1675 * write it now, so that we always have a nice
1676 * pair */
ac155bb8 1677 if (!u->in_audit) {
546ac4f0 1678 manager_send_unit_audit(m, u, AUDIT_SERVICE_START, ns == UNIT_INACTIVE);
cd6d0a45 1679
3b2775c5 1680 if (ns == UNIT_INACTIVE)
546ac4f0 1681 manager_send_unit_audit(m, u, AUDIT_SERVICE_STOP, true);
3b2775c5
LP
1682 } else
1683 /* Write audit record if we have just finished shutting down */
546ac4f0 1684 manager_send_unit_audit(m, u, AUDIT_SERVICE_STOP, ns == UNIT_INACTIVE);
bdbf9951 1685
ac155bb8 1686 u->in_audit = false;
cd6d0a45 1687 }
f278026d
LP
1688 }
1689
546ac4f0 1690 manager_recheck_journal(m);
3ecaa09b 1691 unit_trigger_notify(u);
3b2775c5 1692
f3bff0eb
LP
1693 /* Maybe we finished startup and are now ready for being
1694 * stopped because unneeded? */
bf6dcfa6
OS
1695 if (u->manager->n_reloading <= 0)
1696 unit_check_unneeded(u);
c1e1601e
LP
1697
1698 unit_add_to_dbus_queue(u);
701cc384 1699 unit_add_to_gc_queue(u);
87f0e418
LP
1700}
1701
87f0e418 1702int unit_watch_pid(Unit *u, pid_t pid) {
a911bb9a
LP
1703 int q, r;
1704
87f0e418
LP
1705 assert(u);
1706 assert(pid >= 1);
1707
5ba6985b
LP
1708 /* Watch a specific PID. We only support one or two units
1709 * watching each PID for now, not more. */
1710
1711 r = hashmap_ensure_allocated(&u->manager->watch_pids1, trivial_hash_func, trivial_compare_func);
1712 if (r < 0)
1713 return r;
1714
a911bb9a
LP
1715 r = set_ensure_allocated(&u->pids, trivial_hash_func, trivial_compare_func);
1716 if (r < 0)
1717 return r;
1718
5ba6985b
LP
1719 r = hashmap_put(u->manager->watch_pids1, LONG_TO_PTR(pid), u);
1720 if (r == -EEXIST) {
1721 r = hashmap_ensure_allocated(&u->manager->watch_pids2, trivial_hash_func, trivial_compare_func);
1722 if (r < 0)
1723 return r;
05e343b7 1724
5ba6985b
LP
1725 r = hashmap_put(u->manager->watch_pids2, LONG_TO_PTR(pid), u);
1726 }
a911bb9a 1727
5ba6985b 1728 q = set_put(u->pids, LONG_TO_PTR(pid));
a911bb9a
LP
1729 if (q < 0)
1730 return q;
1731
1732 return r;
87f0e418
LP
1733}
1734
1735void unit_unwatch_pid(Unit *u, pid_t pid) {
1736 assert(u);
1737 assert(pid >= 1);
1738
5ba6985b
LP
1739 hashmap_remove_value(u->manager->watch_pids1, LONG_TO_PTR(pid), u);
1740 hashmap_remove_value(u->manager->watch_pids2, LONG_TO_PTR(pid), u);
a911bb9a
LP
1741 set_remove(u->pids, LONG_TO_PTR(pid));
1742}
1743
1744static int watch_pids_in_path(Unit *u, const char *path) {
1745 _cleanup_closedir_ DIR *d = NULL;
1746 _cleanup_fclose_ FILE *f = NULL;
1747 int ret = 0, r;
1748
1749 assert(u);
1750 assert(path);
1751
1752 /* Adds all PIDs from a specific cgroup path to the set of PIDs we watch. */
1753
1754 r = cg_enumerate_processes(SYSTEMD_CGROUP_CONTROLLER, path, &f);
1755 if (r >= 0) {
1756 pid_t pid;
1757
1758 while ((r = cg_read_pid(f, &pid)) > 0) {
1759 r = unit_watch_pid(u, pid);
1760 if (r < 0 && ret >= 0)
1761 ret = r;
1762 }
1763 if (r < 0 && ret >= 0)
1764 ret = r;
1765
1766 } else if (ret >= 0)
1767 ret = r;
1768
1769 r = cg_enumerate_subgroups(SYSTEMD_CGROUP_CONTROLLER, path, &d);
1770 if (r >= 0) {
1771 char *fn;
1772
1773 while ((r = cg_read_subgroup(d, &fn)) > 0) {
1774 _cleanup_free_ char *p = NULL;
1775
1776 p = strjoin(path, "/", fn, NULL);
1777 free(fn);
1778
1779 if (!p)
1780 return -ENOMEM;
1781
1782 r = watch_pids_in_path(u, p);
1783 if (r < 0 && ret >= 0)
1784 ret = r;
1785 }
1786 if (r < 0 && ret >= 0)
1787 ret = r;
1788
1789 } else if (ret >= 0)
1790 ret = r;
1791
1792 return ret;
1793}
1794
1795
1796int unit_watch_all_pids(Unit *u) {
1797 assert(u);
1798
1799 if (!u->cgroup_path)
1800 return -ENOENT;
1801
1802 /* Adds all PIDs from our cgroup to the set of PIDs we watch */
1803
1804 return watch_pids_in_path(u, u->cgroup_path);
1805}
1806
1807void unit_unwatch_all_pids(Unit *u) {
1808 Iterator i;
1809 void *e;
1810
1811 assert(u);
1812
5ba6985b
LP
1813 SET_FOREACH(e, u->pids, i) {
1814 hashmap_remove_value(u->manager->watch_pids1, e, u);
1815 hashmap_remove_value(u->manager->watch_pids2, e, u);
1816 }
a911bb9a
LP
1817
1818 set_free(u->pids);
1819 u->pids = NULL;
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))
a911bb9a
LP
1837 set_remove(u->pids, e);
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
b1e2b33c
CR
2528#pragma GCC diagnostic push
2529#pragma GCC diagnostic ignored "-Wformat-nonliteral"
49b1d377
MS
2530void unit_status_printf(Unit *u, const char *status, const char *unit_status_msg_format) {
2531 manager_status_printf(u->manager, false, status, unit_status_msg_format, unit_description(u));
2532}
b1e2b33c 2533#pragma GCC diagnostic pop
49b1d377 2534
45fb0699 2535bool unit_need_daemon_reload(Unit *u) {
ae7a7182
OS
2536 _cleanup_strv_free_ char **t = NULL;
2537 char **path;
1b64d026 2538 struct stat st;
ae7a7182 2539 unsigned loaded_cnt, current_cnt;
1b64d026 2540
45fb0699
LP
2541 assert(u);
2542
ac155bb8 2543 if (u->fragment_path) {
5f4b19f4 2544 zero(st);
ac155bb8 2545 if (stat(u->fragment_path, &st) < 0)
5f4b19f4
LP
2546 /* What, cannot access this anymore? */
2547 return true;
45fb0699 2548
ac155bb8
MS
2549 if (u->fragment_mtime > 0 &&
2550 timespec_load(&st.st_mtim) != u->fragment_mtime)
5f4b19f4
LP
2551 return true;
2552 }
2553
1b64d026
LP
2554 if (u->source_path) {
2555 zero(st);
2556 if (stat(u->source_path, &st) < 0)
2557 return true;
2558
2559 if (u->source_mtime > 0 &&
2560 timespec_load(&st.st_mtim) != u->source_mtime)
2561 return true;
2562 }
5f4b19f4 2563
ae7a7182
OS
2564 t = unit_find_dropin_paths(u);
2565 loaded_cnt = strv_length(t);
2566 current_cnt = strv_length(u->dropin_paths);
2567
2568 if (loaded_cnt == current_cnt) {
2569 if (loaded_cnt == 0)
2570 return false;
2571
2572 if (strv_overlap(u->dropin_paths, t)) {
2573 STRV_FOREACH(path, u->dropin_paths) {
2574 zero(st);
2575 if (stat(*path, &st) < 0)
2576 return true;
2577
2578 if (u->dropin_mtime > 0 &&
2579 timespec_load(&st.st_mtim) > u->dropin_mtime)
2580 return true;
2581 }
2582
2583 return false;
2584 } else
2585 return true;
2586 } else
2587 return true;
45fb0699
LP
2588}
2589
fdf20a31 2590void unit_reset_failed(Unit *u) {
5632e374
LP
2591 assert(u);
2592
fdf20a31
MM
2593 if (UNIT_VTABLE(u)->reset_failed)
2594 UNIT_VTABLE(u)->reset_failed(u);
5632e374
LP
2595}
2596
a7f241db
LP
2597Unit *unit_following(Unit *u) {
2598 assert(u);
2599
2600 if (UNIT_VTABLE(u)->following)
2601 return UNIT_VTABLE(u)->following(u);
2602
2603 return NULL;
2604}
2605
31afa0a4 2606bool unit_stop_pending(Unit *u) {
18ffdfda
LP
2607 assert(u);
2608
31afa0a4
LP
2609 /* This call does check the current state of the unit. It's
2610 * hence useful to be called from state change calls of the
2611 * unit itself, where the state isn't updated yet. This is
2612 * different from unit_inactive_or_pending() which checks both
2613 * the current state and for a queued job. */
18ffdfda 2614
31afa0a4
LP
2615 return u->job && u->job->type == JOB_STOP;
2616}
2617
2618bool unit_inactive_or_pending(Unit *u) {
2619 assert(u);
2620
2621 /* Returns true if the unit is inactive or going down */
18ffdfda 2622
d956ac29
LP
2623 if (UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(u)))
2624 return true;
2625
31afa0a4 2626 if (unit_stop_pending(u))
18ffdfda
LP
2627 return true;
2628
2629 return false;
2630}
2631
31afa0a4 2632bool unit_active_or_pending(Unit *u) {
f976f3f6
LP
2633 assert(u);
2634
f60c2665 2635 /* Returns true if the unit is active or going up */
f976f3f6
LP
2636
2637 if (UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u)))
2638 return true;
2639
ac155bb8
MS
2640 if (u->job &&
2641 (u->job->type == JOB_START ||
2642 u->job->type == JOB_RELOAD_OR_START ||
2643 u->job->type == JOB_RESTART))
f976f3f6
LP
2644 return true;
2645
2646 return false;
2647}
2648
718db961 2649int unit_kill(Unit *u, KillWho w, int signo, sd_bus_error *error) {
8a0867d6
LP
2650 assert(u);
2651 assert(w >= 0 && w < _KILL_WHO_MAX);
8a0867d6
LP
2652 assert(signo > 0);
2653 assert(signo < _NSIG);
2654
8a0867d6
LP
2655 if (!UNIT_VTABLE(u)->kill)
2656 return -ENOTSUP;
2657
c74f17d9 2658 return UNIT_VTABLE(u)->kill(u, w, signo, error);
8a0867d6
LP
2659}
2660
82659fd7
LP
2661static Set *unit_pid_set(pid_t main_pid, pid_t control_pid) {
2662 Set *pid_set;
2663 int r;
2664
2665 pid_set = set_new(trivial_hash_func, trivial_compare_func);
2666 if (!pid_set)
2667 return NULL;
2668
2669 /* Exclude the main/control pids from being killed via the cgroup */
2670 if (main_pid > 0) {
2671 r = set_put(pid_set, LONG_TO_PTR(main_pid));
2672 if (r < 0)
2673 goto fail;
2674 }
2675
2676 if (control_pid > 0) {
2677 r = set_put(pid_set, LONG_TO_PTR(control_pid));
2678 if (r < 0)
2679 goto fail;
2680 }
2681
2682 return pid_set;
2683
2684fail:
2685 set_free(pid_set);
2686 return NULL;
2687}
2688
d91c34f2
LP
2689int unit_kill_common(
2690 Unit *u,
2691 KillWho who,
2692 int signo,
2693 pid_t main_pid,
2694 pid_t control_pid,
718db961 2695 sd_bus_error *error) {
d91c34f2 2696
814cc562
MS
2697 int r = 0;
2698
2699 if (who == KILL_MAIN && main_pid <= 0) {
2700 if (main_pid < 0)
718db961 2701 sd_bus_error_setf(error, BUS_ERROR_NO_SUCH_PROCESS, "%s units have no main processes", unit_type_to_string(u->type));
814cc562 2702 else
718db961 2703 sd_bus_error_set_const(error, BUS_ERROR_NO_SUCH_PROCESS, "No main process to kill");
814cc562
MS
2704 return -ESRCH;
2705 }
2706
2707 if (who == KILL_CONTROL && control_pid <= 0) {
2708 if (control_pid < 0)
718db961 2709 sd_bus_error_setf(error, BUS_ERROR_NO_SUCH_PROCESS, "%s units have no control processes", unit_type_to_string(u->type));
814cc562 2710 else
718db961 2711 sd_bus_error_set_const(error, BUS_ERROR_NO_SUCH_PROCESS, "No control process to kill");
814cc562
MS
2712 return -ESRCH;
2713 }
2714
2715 if (who == KILL_CONTROL || who == KILL_ALL)
2716 if (control_pid > 0)
2717 if (kill(control_pid, signo) < 0)
2718 r = -errno;
2719
2720 if (who == KILL_MAIN || who == KILL_ALL)
2721 if (main_pid > 0)
2722 if (kill(main_pid, signo) < 0)
2723 r = -errno;
2724
4ad49000 2725 if (who == KILL_ALL && u->cgroup_path) {
814cc562
MS
2726 _cleanup_set_free_ Set *pid_set = NULL;
2727 int q;
2728
82659fd7
LP
2729 /* Exclude the main/control pids from being killed via the cgroup */
2730 pid_set = unit_pid_set(main_pid, control_pid);
814cc562
MS
2731 if (!pid_set)
2732 return -ENOMEM;
2733
4ad49000 2734 q = cg_kill_recursive(SYSTEMD_CGROUP_CONTROLLER, u->cgroup_path, signo, false, true, false, pid_set);
814cc562
MS
2735 if (q < 0 && q != -EAGAIN && q != -ESRCH && q != -ENOENT)
2736 r = q;
2737 }
2738
2739 return r;
2740}
2741
6210e7fc
LP
2742int unit_following_set(Unit *u, Set **s) {
2743 assert(u);
2744 assert(s);
2745
2746 if (UNIT_VTABLE(u)->following_set)
2747 return UNIT_VTABLE(u)->following_set(u, s);
2748
2749 *s = NULL;
2750 return 0;
2751}
2752
a4375746
LP
2753UnitFileState unit_get_unit_file_state(Unit *u) {
2754 assert(u);
2755
ac155bb8
MS
2756 if (u->unit_file_state < 0 && u->fragment_path)
2757 u->unit_file_state = unit_file_get_state(
67445f4e 2758 u->manager->running_as == SYSTEMD_SYSTEM ? UNIT_FILE_SYSTEM : UNIT_FILE_USER,
2b6bf07d 2759 NULL, basename(u->fragment_path));
a4375746 2760
ac155bb8 2761 return u->unit_file_state;
a4375746
LP
2762}
2763
57020a3a
LP
2764Unit* unit_ref_set(UnitRef *ref, Unit *u) {
2765 assert(ref);
2766 assert(u);
2767
2768 if (ref->unit)
2769 unit_ref_unset(ref);
2770
2771 ref->unit = u;
71fda00f 2772 LIST_PREPEND(refs, u->refs, ref);
57020a3a
LP
2773 return u;
2774}
2775
2776void unit_ref_unset(UnitRef *ref) {
2777 assert(ref);
2778
2779 if (!ref->unit)
2780 return;
2781
71fda00f 2782 LIST_REMOVE(refs, ref->unit->refs, ref);
57020a3a
LP
2783 ref->unit = NULL;
2784}
2785
cba6e062
LP
2786int unit_exec_context_defaults(Unit *u, ExecContext *c) {
2787 unsigned i;
2788 int r;
2789
e06c73cc
LP
2790 assert(u);
2791 assert(c);
2792
cba6e062 2793 /* This only copies in the ones that need memory */
cba6e062
LP
2794 for (i = 0; i < RLIMIT_NLIMITS; i++)
2795 if (u->manager->rlimit[i] && !c->rlimit[i]) {
2796 c->rlimit[i] = newdup(struct rlimit, u->manager->rlimit[i], 1);
2797 if (!c->rlimit[i])
2798 return -ENOMEM;
2799 }
2800
67445f4e 2801 if (u->manager->running_as == SYSTEMD_USER &&
cba6e062 2802 !c->working_directory) {
e06c73cc 2803
cba6e062
LP
2804 r = get_home_dir(&c->working_directory);
2805 if (r < 0)
2806 return r;
2807 }
2808
2809 return 0;
e06c73cc
LP
2810}
2811
3ef63c31
LP
2812ExecContext *unit_get_exec_context(Unit *u) {
2813 size_t offset;
2814 assert(u);
2815
2816 offset = UNIT_VTABLE(u)->exec_context_offset;
2817 if (offset <= 0)
2818 return NULL;
2819
2820 return (ExecContext*) ((uint8_t*) u + offset);
2821}
2822
718db961
LP
2823KillContext *unit_get_kill_context(Unit *u) {
2824 size_t offset;
2825 assert(u);
2826
2827 offset = UNIT_VTABLE(u)->kill_context_offset;
2828 if (offset <= 0)
2829 return NULL;
2830
2831 return (KillContext*) ((uint8_t*) u + offset);
2832}
2833
4ad49000
LP
2834CGroupContext *unit_get_cgroup_context(Unit *u) {
2835 size_t offset;
2836
2837 offset = UNIT_VTABLE(u)->cgroup_context_offset;
2838 if (offset <= 0)
2839 return NULL;
2840
2841 return (CGroupContext*) ((uint8_t*) u + offset);
2842}
2843
613b411c
LP
2844ExecRuntime *unit_get_exec_runtime(Unit *u) {
2845 size_t offset;
2846
2847 offset = UNIT_VTABLE(u)->exec_runtime_offset;
2848 if (offset <= 0)
2849 return NULL;
2850
2851 return *(ExecRuntime**) ((uint8_t*) u + offset);
2852}
2853
8e2af478 2854static int drop_in_file(Unit *u, UnitSetPropertiesMode mode, const char *name, char **_p, char **_q) {
b9ec9359 2855 _cleanup_free_ char *b = NULL;
26d04f86
LP
2856 char *p, *q;
2857 int r;
2858
71645aca 2859 assert(u);
26d04f86
LP
2860 assert(name);
2861 assert(_p);
2862 assert(_q);
71645aca 2863
b9ec9359
LP
2864 b = xescape(name, "/.");
2865 if (!b)
2866 return -ENOMEM;
2867
2868 if (!filename_is_safe(b))
71645aca
LP
2869 return -EINVAL;
2870
26d04f86
LP
2871 if (u->manager->running_as == SYSTEMD_USER) {
2872 _cleanup_free_ char *c = NULL;
2873
2874 r = user_config_home(&c);
2875 if (r < 0)
2876 return r;
2877 if (r == 0)
2878 return -ENOENT;
2879
2880 p = strjoin(c, "/", u->id, ".d", NULL);
6d235724 2881 } else if (mode == UNIT_PERSISTENT && !u->transient)
26d04f86 2882 p = strjoin("/etc/systemd/system/", u->id, ".d", NULL);
8e2af478
LP
2883 else
2884 p = strjoin("/run/systemd/system/", u->id, ".d", NULL);
71645aca
LP
2885 if (!p)
2886 return -ENOMEM;
2887
b9ec9359 2888 q = strjoin(p, "/90-", b, ".conf", NULL);
26d04f86
LP
2889 if (!q) {
2890 free(p);
71645aca 2891 return -ENOMEM;
26d04f86 2892 }
71645aca 2893
26d04f86
LP
2894 *_p = p;
2895 *_q = q;
2896 return 0;
71645aca
LP
2897}
2898
8e2af478 2899int unit_write_drop_in(Unit *u, UnitSetPropertiesMode mode, const char *name, const char *data) {
71645aca 2900 _cleanup_free_ char *p = NULL, *q = NULL;
26d04f86 2901 int r;
71645aca
LP
2902
2903 assert(u);
b42defe3
LP
2904 assert(name);
2905 assert(data);
71645aca 2906
6d235724 2907 if (!IN_SET(mode, UNIT_PERSISTENT, UNIT_RUNTIME))
8e2af478
LP
2908 return 0;
2909
2910 r = drop_in_file(u, mode, name, &p, &q);
26d04f86
LP
2911 if (r < 0)
2912 return r;
71645aca 2913
26d04f86 2914 mkdir_p(p, 0755);
574d5f2d 2915 return write_string_file_atomic_label(q, data);
26d04f86 2916}
71645aca 2917
b9ec9359
LP
2918int unit_write_drop_in_format(Unit *u, UnitSetPropertiesMode mode, const char *name, const char *format, ...) {
2919 _cleanup_free_ char *p = NULL;
2920 va_list ap;
2921 int r;
2922
2923 assert(u);
2924 assert(name);
2925 assert(format);
2926
6d235724 2927 if (!IN_SET(mode, UNIT_PERSISTENT, UNIT_RUNTIME))
b9ec9359
LP
2928 return 0;
2929
2930 va_start(ap, format);
2931 r = vasprintf(&p, format, ap);
2932 va_end(ap);
2933
2934 if (r < 0)
2935 return -ENOMEM;
2936
2937 return unit_write_drop_in(u, mode, name, p);
2938}
2939
2940int unit_write_drop_in_private(Unit *u, UnitSetPropertiesMode mode, const char *name, const char *data) {
b42defe3
LP
2941 _cleanup_free_ char *ndata = NULL;
2942
2943 assert(u);
2944 assert(name);
2945 assert(data);
2946
2947 if (!UNIT_VTABLE(u)->private_section)
2948 return -EINVAL;
2949
6d235724 2950 if (!IN_SET(mode, UNIT_PERSISTENT, UNIT_RUNTIME))
b9ec9359
LP
2951 return 0;
2952
b42defe3
LP
2953 ndata = strjoin("[", UNIT_VTABLE(u)->private_section, "]\n", data, NULL);
2954 if (!ndata)
2955 return -ENOMEM;
2956
2957 return unit_write_drop_in(u, mode, name, ndata);
2958}
2959
b9ec9359
LP
2960int unit_write_drop_in_private_format(Unit *u, UnitSetPropertiesMode mode, const char *name, const char *format, ...) {
2961 _cleanup_free_ char *p = NULL;
2962 va_list ap;
2963 int r;
2964
2965 assert(u);
2966 assert(name);
2967 assert(format);
2968
6d235724 2969 if (!IN_SET(mode, UNIT_PERSISTENT, UNIT_RUNTIME))
b9ec9359
LP
2970 return 0;
2971
2972 va_start(ap, format);
2973 r = vasprintf(&p, format, ap);
2974 va_end(ap);
2975
2976 if (r < 0)
2977 return -ENOMEM;
2978
2979 return unit_write_drop_in_private(u, mode, name, p);
2980}
2981
8e2af478 2982int unit_remove_drop_in(Unit *u, UnitSetPropertiesMode mode, const char *name) {
26d04f86
LP
2983 _cleanup_free_ char *p = NULL, *q = NULL;
2984 int r;
71645aca 2985
26d04f86 2986 assert(u);
71645aca 2987
6d235724 2988 if (!IN_SET(mode, UNIT_PERSISTENT, UNIT_RUNTIME))
8e2af478
LP
2989 return 0;
2990
2991 r = drop_in_file(u, mode, name, &p, &q);
6891529f
ZJS
2992 if (r < 0)
2993 return r;
2994
71645aca 2995 if (unlink(q) < 0)
241da328 2996 r = errno == ENOENT ? 0 : -errno;
26d04f86 2997 else
241da328 2998 r = 1;
71645aca
LP
2999
3000 rmdir(p);
26d04f86 3001 return r;
71645aca
LP
3002}
3003
c2756a68
LP
3004int unit_make_transient(Unit *u) {
3005 int r;
3006
3007 assert(u);
3008
3009 u->load_state = UNIT_STUB;
3010 u->load_error = 0;
3011 u->transient = true;
3012
3013 free(u->fragment_path);
3014 u->fragment_path = NULL;
3015
3016 if (u->manager->running_as == SYSTEMD_USER) {
3017 _cleanup_free_ char *c = NULL;
3018
3019 r = user_config_home(&c);
3020 if (r < 0)
3021 return r;
3022 if (r == 0)
3023 return -ENOENT;
3024
3025 u->fragment_path = strjoin(c, "/", u->id, NULL);
3026 if (!u->fragment_path)
3027 return -ENOMEM;
3028
3029 mkdir_p(c, 0755);
3030 } else {
3031 u->fragment_path = strappend("/run/systemd/system/", u->id);
3032 if (!u->fragment_path)
3033 return -ENOMEM;
3034
3035 mkdir_p("/run/systemd/system", 0755);
3036 }
3037
3038 return write_string_file_atomic_label(u->fragment_path, "# Transient stub");
3039}
3040
cd2086fe
LP
3041int unit_kill_context(
3042 Unit *u,
3043 KillContext *c,
3044 bool sigkill,
3045 pid_t main_pid,
3046 pid_t control_pid,
3047 bool main_pid_alien) {
3048
bc6aed7b 3049 int sig, wait_for_exit = false, r;
cd2086fe
LP
3050
3051 assert(u);
3052 assert(c);
3053
3054 if (c->kill_mode == KILL_NONE)
3055 return 0;
3056
3057 sig = sigkill ? SIGKILL : c->kill_signal;
3058
3059 if (main_pid > 0) {
3060 r = kill_and_sigcont(main_pid, sig);
3061
3062 if (r < 0 && r != -ESRCH) {
3063 _cleanup_free_ char *comm = NULL;
3064 get_process_comm(main_pid, &comm);
3065
6294b8a9 3066 log_warning_unit(u->id, "Failed to kill main process " PID_FMT " (%s): %s", main_pid, strna(comm), strerror(-r));
82659fd7 3067 } else {
bc6aed7b
LP
3068 if (!main_pid_alien)
3069 wait_for_exit = true;
82659fd7 3070
97e0691f 3071 if (c->send_sighup && !sigkill)
82659fd7
LP
3072 kill(main_pid, SIGHUP);
3073 }
cd2086fe
LP
3074 }
3075
3076 if (control_pid > 0) {
3077 r = kill_and_sigcont(control_pid, sig);
3078
3079 if (r < 0 && r != -ESRCH) {
3080 _cleanup_free_ char *comm = NULL;
3081 get_process_comm(control_pid, &comm);
3082
6294b8a9 3083 log_warning_unit(u->id, "Failed to kill control process " PID_FMT " (%s): %s", control_pid, strna(comm), strerror(-r));
82659fd7 3084 } else {
cd2086fe 3085 wait_for_exit = true;
82659fd7 3086
97e0691f 3087 if (c->send_sighup && !sigkill)
82659fd7
LP
3088 kill(control_pid, SIGHUP);
3089 }
cd2086fe
LP
3090 }
3091
58ea275a 3092 if ((c->kill_mode == KILL_CONTROL_GROUP || (c->kill_mode == KILL_MIXED && sigkill)) && u->cgroup_path) {
cd2086fe
LP
3093 _cleanup_set_free_ Set *pid_set = NULL;
3094
82659fd7
LP
3095 /* Exclude the main/control pids from being killed via the cgroup */
3096 pid_set = unit_pid_set(main_pid, control_pid);
cd2086fe
LP
3097 if (!pid_set)
3098 return -ENOMEM;
3099
4ad49000 3100 r = cg_kill_recursive(SYSTEMD_CGROUP_CONTROLLER, u->cgroup_path, sig, true, true, false, pid_set);
cd2086fe
LP
3101 if (r < 0) {
3102 if (r != -EAGAIN && r != -ESRCH && r != -ENOENT)
3103 log_warning_unit(u->id, "Failed to kill control group: %s", strerror(-r));
82659fd7 3104 } else if (r > 0) {
bc6aed7b 3105
743970d2
LP
3106 /* FIXME: For now, we will not wait for the
3107 * cgroup members to die, simply because
3108 * cgroup notification is unreliable. It
3109 * doesn't work at all in containers, and
3110 * outside of containers it can be confused
3111 * easily by leaving directories in the
3112 * cgroup. */
3113
3114 /* wait_for_exit = true; */
58ea275a 3115
97e0691f 3116 if (c->send_sighup && !sigkill) {
82659fd7
LP
3117 set_free(pid_set);
3118
3119 pid_set = unit_pid_set(main_pid, control_pid);
3120 if (!pid_set)
3121 return -ENOMEM;
3122
8190da36 3123 cg_kill_recursive(SYSTEMD_CGROUP_CONTROLLER, u->cgroup_path, SIGHUP, false, true, false, pid_set);
82659fd7
LP
3124 }
3125 }
cd2086fe
LP
3126 }
3127
3128 return wait_for_exit;
3129}
3130
a57f7e2c
LP
3131int unit_require_mounts_for(Unit *u, const char *path) {
3132 char prefix[strlen(path) + 1], *p;
3133 int r;
3134
3135 assert(u);
3136 assert(path);
3137
3138 /* Registers a unit for requiring a certain path and all its
3139 * prefixes. We keep a simple array of these paths in the
3140 * unit, since its usually short. However, we build a prefix
3141 * table for all possible prefixes so that new appearing mount
3142 * units can easily determine which units to make themselves a
3143 * dependency of. */
3144
70b64bd3
ZJS
3145 if (!path_is_absolute(path))
3146 return -EINVAL;
3147
a57f7e2c
LP
3148 p = strdup(path);
3149 if (!p)
3150 return -ENOMEM;
3151
3152 path_kill_slashes(p);
3153
a57f7e2c
LP
3154 if (!path_is_safe(p)) {
3155 free(p);
3156 return -EPERM;
3157 }
3158
3159 if (strv_contains(u->requires_mounts_for, p)) {
3160 free(p);
3161 return 0;
3162 }
3163
3164 r = strv_push(&u->requires_mounts_for, p);
3165 if (r < 0) {
3166 free(p);
3167 return r;
3168 }
3169
3170 PATH_FOREACH_PREFIX_MORE(prefix, p) {
3171 Set *x;
3172
3173 x = hashmap_get(u->manager->units_requiring_mounts_for, prefix);
3174 if (!x) {
3175 char *q;
3176
3177 if (!u->manager->units_requiring_mounts_for) {
3178 u->manager->units_requiring_mounts_for = hashmap_new(string_hash_func, string_compare_func);
3179 if (!u->manager->units_requiring_mounts_for)
3180 return -ENOMEM;
3181 }
3182
3183 q = strdup(prefix);
3184 if (!q)
3185 return -ENOMEM;
3186
3187 x = set_new(NULL, NULL);
3188 if (!x) {
3189 free(q);
3190 return -ENOMEM;
3191 }
3192
3193 r = hashmap_put(u->manager->units_requiring_mounts_for, q, x);
3194 if (r < 0) {
3195 free(q);
3196 set_free(x);
3197 return r;
3198 }
3199 }
3200
3201 r = set_put(x, u);
3202 if (r < 0)
3203 return r;
3204 }
3205
3206 return 0;
3207}
3208
613b411c
LP
3209int unit_setup_exec_runtime(Unit *u) {
3210 ExecRuntime **rt;
3211 size_t offset;
3212 Iterator i;
3213 Unit *other;
3214
3215 offset = UNIT_VTABLE(u)->exec_runtime_offset;
3216 assert(offset > 0);
3217
3218 /* Check if ther already is an ExecRuntime for this unit? */
3219 rt = (ExecRuntime**) ((uint8_t*) u + offset);
3220 if (*rt)
3221 return 0;
3222
3223 /* Try to get it from somebody else */
3224 SET_FOREACH(other, u->dependencies[UNIT_JOINS_NAMESPACE_OF], i) {
3225
3226 *rt = unit_get_exec_runtime(other);
3227 if (*rt) {
3228 exec_runtime_ref(*rt);
3229 return 0;
3230 }
3231 }
3232
3233 return exec_runtime_make(rt, unit_get_exec_context(u), u->id);
3234}
3235
94f04347
LP
3236static const char* const unit_active_state_table[_UNIT_ACTIVE_STATE_MAX] = {
3237 [UNIT_ACTIVE] = "active",
032ff4af 3238 [UNIT_RELOADING] = "reloading",
94f04347 3239 [UNIT_INACTIVE] = "inactive",
fdf20a31 3240 [UNIT_FAILED] = "failed",
94f04347
LP
3241 [UNIT_ACTIVATING] = "activating",
3242 [UNIT_DEACTIVATING] = "deactivating"
3243};
3244
3245DEFINE_STRING_TABLE_LOOKUP(unit_active_state, UnitActiveState);
3246
3247static const char* const unit_dependency_table[_UNIT_DEPENDENCY_MAX] = {
3248 [UNIT_REQUIRES] = "Requires",
9e2f7c11 3249 [UNIT_REQUIRES_OVERRIDABLE] = "RequiresOverridable",
94f04347 3250 [UNIT_REQUISITE] = "Requisite",
9e2f7c11 3251 [UNIT_REQUISITE_OVERRIDABLE] = "RequisiteOverridable",
ac6a4abe
MS
3252 [UNIT_WANTS] = "Wants",
3253 [UNIT_BINDS_TO] = "BindsTo",
3254 [UNIT_PART_OF] = "PartOf",
94f04347 3255 [UNIT_REQUIRED_BY] = "RequiredBy",
9e2f7c11 3256 [UNIT_REQUIRED_BY_OVERRIDABLE] = "RequiredByOverridable",
94f04347 3257 [UNIT_WANTED_BY] = "WantedBy",
ac6a4abe
MS
3258 [UNIT_BOUND_BY] = "BoundBy",
3259 [UNIT_CONSISTS_OF] = "ConsistsOf",
94f04347 3260 [UNIT_CONFLICTS] = "Conflicts",
69dd2852 3261 [UNIT_CONFLICTED_BY] = "ConflictedBy",
94f04347
LP
3262 [UNIT_BEFORE] = "Before",
3263 [UNIT_AFTER] = "After",
57020a3a
LP
3264 [UNIT_ON_FAILURE] = "OnFailure",
3265 [UNIT_TRIGGERS] = "Triggers",
4dcc1cb4 3266 [UNIT_TRIGGERED_BY] = "TriggeredBy",
7f2cddae 3267 [UNIT_PROPAGATES_RELOAD_TO] = "PropagatesReloadTo",
ac6a4abe
MS
3268 [UNIT_RELOAD_PROPAGATED_FROM] = "ReloadPropagatedFrom",
3269 [UNIT_REFERENCES] = "References",
3270 [UNIT_REFERENCED_BY] = "ReferencedBy",
613b411c 3271 [UNIT_JOINS_NAMESPACE_OF] = "JoinsNamespaceOf",
94f04347
LP
3272};
3273
3274DEFINE_STRING_TABLE_LOOKUP(unit_dependency, UnitDependency);