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