]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/core/unit.c
Merge pull request #3900 from keszybz/fix-3607
[thirdparty/systemd.git] / src / core / unit.c
CommitLineData
a7334b09
LP
1/***
2 This file is part of systemd.
3
4 Copyright 2010 Lennart Poettering
5
6 systemd is free software; you can redistribute it and/or modify it
5430f7f2
LP
7 under the terms of the GNU Lesser General Public License as published by
8 the Free Software Foundation; either version 2.1 of the License, or
a7334b09
LP
9 (at your option) any later version.
10
11 systemd is distributed in the hope that it will be useful, but
12 WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
5430f7f2 14 Lesser General Public License for more details.
a7334b09 15
5430f7f2 16 You should have received a copy of the GNU Lesser General Public License
a7334b09
LP
17 along with systemd; If not, see <http://www.gnu.org/licenses/>.
18***/
19
87f0e418 20#include <errno.h>
0301abf4 21#include <stdlib.h>
4f5dd394 22#include <string.h>
45fb0699 23#include <sys/stat.h>
4f5dd394 24#include <unistd.h>
87f0e418 25
718db961
LP
26#include "sd-id128.h"
27#include "sd-messages.h"
4f5dd394 28
b5efdb8a 29#include "alloc-util.h"
4f5dd394
LP
30#include "bus-common-errors.h"
31#include "bus-util.h"
c6c18be3 32#include "cgroup-util.h"
4f5dd394
LP
33#include "dbus-unit.h"
34#include "dbus.h"
35#include "dropin.h"
36#include "escape.h"
37#include "execute.h"
a5c32cff 38#include "fileio-label.h"
6482f626 39#include "formats-util.h"
4f5dd394
LP
40#include "load-dropin.h"
41#include "load-fragment.h"
42#include "log.h"
43#include "macro.h"
44#include "missing.h"
45#include "mkdir.h"
6bedfcbb 46#include "parse-util.h"
4f5dd394 47#include "path-util.h"
0b452006 48#include "process-util.h"
4f5dd394 49#include "set.h"
6eb7c172 50#include "signal-util.h"
e9db43d5 51#include "special.h"
8fcde012 52#include "stat-util.h"
d054f0a4 53#include "stdio-util.h"
07630cea 54#include "string-util.h"
4f5dd394 55#include "strv.h"
4f4afc88 56#include "umask-util.h"
4f5dd394 57#include "unit-name.h"
e9db43d5 58#include "unit.h"
b1d4f8e1
LP
59#include "user-util.h"
60#include "virt.h"
87f0e418
LP
61
62const UnitVTable * const unit_vtable[_UNIT_TYPE_MAX] = {
63 [UNIT_SERVICE] = &service_vtable,
87f0e418 64 [UNIT_SOCKET] = &socket_vtable,
e821075a 65 [UNIT_BUSNAME] = &busname_vtable,
87f0e418
LP
66 [UNIT_TARGET] = &target_vtable,
67 [UNIT_DEVICE] = &device_vtable,
68 [UNIT_MOUNT] = &mount_vtable,
69 [UNIT_AUTOMOUNT] = &automount_vtable,
01f78473 70 [UNIT_SWAP] = &swap_vtable,
e821075a 71 [UNIT_TIMER] = &timer_vtable,
a016b922 72 [UNIT_PATH] = &path_vtable,
6c12b52e
LP
73 [UNIT_SLICE] = &slice_vtable,
74 [UNIT_SCOPE] = &scope_vtable
87f0e418
LP
75};
76
f2341e0a 77static void maybe_warn_about_dependency(Unit *u, const char *other, UnitDependency dependency);
d1fab3fe 78
7d17cfbc 79Unit *unit_new(Manager *m, size_t size) {
87f0e418
LP
80 Unit *u;
81
82 assert(m);
ac155bb8 83 assert(size >= sizeof(Unit));
87f0e418 84
7d17cfbc
MS
85 u = malloc0(size);
86 if (!u)
87f0e418
LP
87 return NULL;
88
d5099efc 89 u->names = set_new(&string_hash_ops);
ac155bb8 90 if (!u->names) {
87f0e418
LP
91 free(u);
92 return NULL;
93 }
94
ac155bb8
MS
95 u->manager = m;
96 u->type = _UNIT_TYPE_INVALID;
ac155bb8
MS
97 u->default_dependencies = true;
98 u->unit_file_state = _UNIT_FILE_STATE_INVALID;
d2dc52db 99 u->unit_file_preset = -1;
d420282b 100 u->on_failure_job_mode = JOB_REPLACE;
efdb0237 101 u->cgroup_inotify_wd = -1;
36c16a7c 102 u->job_timeout = USEC_INFINITY;
36f20ae3 103 u->sigchldgen = 0;
87f0e418 104
6bf0f408 105 RATELIMIT_INIT(u->start_limit, m->default_start_limit_interval, m->default_start_limit_burst);
67bfdc97 106 RATELIMIT_INIT(u->auto_stop_ratelimit, 10 * USEC_PER_SEC, 16);
bea355da 107
87f0e418
LP
108 return u;
109}
110
f278026d
LP
111bool unit_has_name(Unit *u, const char *name) {
112 assert(u);
113 assert(name);
114
ac155bb8 115 return !!set_get(u->names, (char*) name);
f278026d
LP
116}
117
598459ce
LP
118static void unit_init(Unit *u) {
119 CGroupContext *cc;
120 ExecContext *ec;
121 KillContext *kc;
122
123 assert(u);
124 assert(u->manager);
125 assert(u->type >= 0);
126
127 cc = unit_get_cgroup_context(u);
128 if (cc) {
129 cgroup_context_init(cc);
130
131 /* Copy in the manager defaults into the cgroup
132 * context, _before_ the rest of the settings have
133 * been initialized */
134
135 cc->cpu_accounting = u->manager->default_cpu_accounting;
13c31542 136 cc->io_accounting = u->manager->default_io_accounting;
598459ce
LP
137 cc->blockio_accounting = u->manager->default_blockio_accounting;
138 cc->memory_accounting = u->manager->default_memory_accounting;
03a7b521 139 cc->tasks_accounting = u->manager->default_tasks_accounting;
0af20ea2
LP
140
141 if (u->type != UNIT_SLICE)
142 cc->tasks_max = u->manager->default_tasks_max;
598459ce
LP
143 }
144
145 ec = unit_get_exec_context(u);
146 if (ec)
147 exec_context_init(ec);
148
149 kc = unit_get_kill_context(u);
150 if (kc)
151 kill_context_init(kc);
152
153 if (UNIT_VTABLE(u)->init)
154 UNIT_VTABLE(u)->init(u);
155}
156
87f0e418 157int unit_add_name(Unit *u, const char *text) {
598459ce 158 _cleanup_free_ char *s = NULL, *i = NULL;
87f0e418 159 UnitType t;
87f0e418
LP
160 int r;
161
162 assert(u);
163 assert(text);
164
7410616c 165 if (unit_name_is_valid(text, UNIT_NAME_TEMPLATE)) {
598459ce 166
ac155bb8 167 if (!u->instance)
9e2f7c11 168 return -EINVAL;
87f0e418 169
7410616c
LP
170 r = unit_name_replace_instance(text, u->instance, &s);
171 if (r < 0)
172 return r;
173 } else {
9e2f7c11 174 s = strdup(text);
7410616c
LP
175 if (!s)
176 return -ENOMEM;
177 }
87f0e418 178
7410616c
LP
179 if (set_contains(u->names, s))
180 return 0;
181 if (hashmap_contains(u->manager->units, s))
182 return -EEXIST;
183
184 if (!unit_name_is_valid(s, UNIT_NAME_PLAIN|UNIT_NAME_INSTANCE))
598459ce 185 return -EINVAL;
e537352b 186
7410616c
LP
187 t = unit_name_to_type(s);
188 if (t < 0)
189 return -EINVAL;
87f0e418 190
598459ce
LP
191 if (u->type != _UNIT_TYPE_INVALID && t != u->type)
192 return -EINVAL;
87f0e418 193
e48614c4
ZJS
194 r = unit_name_to_instance(s, &i);
195 if (r < 0)
598459ce 196 return r;
87f0e418 197
ce99c68a 198 if (i && !unit_type_may_template(t))
598459ce 199 return -EINVAL;
9e2f7c11 200
276c3e78 201 /* Ensure that this unit is either instanced or not instanced,
7410616c
LP
202 * but not both. Note that we do allow names with different
203 * instance names however! */
598459ce
LP
204 if (u->type != _UNIT_TYPE_INVALID && !u->instance != !i)
205 return -EINVAL;
9e2f7c11 206
8a993b61 207 if (!unit_type_may_alias(t) && !set_isempty(u->names))
598459ce 208 return -EEXIST;
9e2f7c11 209
598459ce
LP
210 if (hashmap_size(u->manager->units) >= MANAGER_MAX_NAMES)
211 return -E2BIG;
4f0f902f 212
e48614c4 213 r = set_put(u->names, s);
7410616c 214 if (r < 0)
598459ce 215 return r;
7410616c 216 assert(r > 0);
87f0e418 217
e48614c4
ZJS
218 r = hashmap_put(u->manager->units, s, u);
219 if (r < 0) {
7410616c 220 (void) set_remove(u->names, s);
598459ce 221 return r;
87f0e418
LP
222 }
223
ac155bb8 224 if (u->type == _UNIT_TYPE_INVALID) {
ac155bb8
MS
225 u->type = t;
226 u->id = s;
227 u->instance = i;
9e2f7c11 228
71fda00f 229 LIST_PREPEND(units_by_type, u->manager->units_by_type[t], u);
e537352b 230
598459ce 231 unit_init(u);
87f0e418 232
598459ce
LP
233 i = NULL;
234 }
9e2f7c11 235
598459ce 236 s = NULL;
9e2f7c11 237
598459ce
LP
238 unit_add_to_dbus_queue(u);
239 return 0;
87f0e418
LP
240}
241
0ae97ec1 242int unit_choose_id(Unit *u, const char *name) {
68eda4bd 243 _cleanup_free_ char *t = NULL;
598459ce 244 char *s, *i;
276c3e78 245 int r;
0ae97ec1
LP
246
247 assert(u);
248 assert(name);
249
7410616c 250 if (unit_name_is_valid(name, UNIT_NAME_TEMPLATE)) {
9e2f7c11 251
ac155bb8 252 if (!u->instance)
9e2f7c11
LP
253 return -EINVAL;
254
7410616c
LP
255 r = unit_name_replace_instance(name, u->instance, &t);
256 if (r < 0)
257 return r;
9e2f7c11
LP
258
259 name = t;
260 }
261
0ae97ec1 262 /* Selects one of the names of this unit as the id */
ac155bb8 263 s = set_get(u->names, (char*) name);
9e2f7c11 264 if (!s)
0ae97ec1
LP
265 return -ENOENT;
266
7410616c 267 /* Determine the new instance from the new id */
e48614c4
ZJS
268 r = unit_name_to_instance(s, &i);
269 if (r < 0)
276c3e78
LP
270 return r;
271
ac155bb8 272 u->id = s;
276c3e78 273
ac155bb8
MS
274 free(u->instance);
275 u->instance = i;
276c3e78 276
c1e1601e 277 unit_add_to_dbus_queue(u);
9e2f7c11 278
0ae97ec1
LP
279 return 0;
280}
281
f50e0a01
LP
282int unit_set_description(Unit *u, const char *description) {
283 char *s;
284
285 assert(u);
286
8aec412f
LP
287 if (isempty(description))
288 s = NULL;
289 else {
290 s = strdup(description);
291 if (!s)
292 return -ENOMEM;
293 }
f50e0a01 294
ac155bb8
MS
295 free(u->description);
296 u->description = s;
c1e1601e
LP
297
298 unit_add_to_dbus_queue(u);
f50e0a01
LP
299 return 0;
300}
301
701cc384 302bool unit_check_gc(Unit *u) {
a354329f 303 UnitActiveState state;
701cc384
LP
304 assert(u);
305
a354329f 306 if (u->job)
701cc384
LP
307 return true;
308
a354329f 309 if (u->nop_job)
6c073082
LP
310 return true;
311
a354329f
LP
312 state = unit_active_state(u);
313
314 /* If the unit is inactive and failed and no job is queued for
315 * it, then release its runtime resources */
316 if (UNIT_IS_INACTIVE_OR_FAILED(state) &&
317 UNIT_VTABLE(u)->release_resources)
318 UNIT_VTABLE(u)->release_resources(u);
319
320 /* But we keep the unit object around for longer when it is
321 * referenced or configured to not be gc'ed */
322 if (state != UNIT_INACTIVE)
701cc384
LP
323 return true;
324
a354329f 325 if (u->no_gc)
701cc384
LP
326 return true;
327
9d576438
LP
328 if (u->refs)
329 return true;
330
701cc384
LP
331 if (UNIT_VTABLE(u)->check_gc)
332 if (UNIT_VTABLE(u)->check_gc(u))
333 return true;
334
335 return false;
336}
337
87f0e418
LP
338void unit_add_to_load_queue(Unit *u) {
339 assert(u);
ac155bb8 340 assert(u->type != _UNIT_TYPE_INVALID);
87f0e418 341
ac155bb8 342 if (u->load_state != UNIT_STUB || u->in_load_queue)
87f0e418
LP
343 return;
344
71fda00f 345 LIST_PREPEND(load_queue, u->manager->load_queue, u);
ac155bb8 346 u->in_load_queue = true;
87f0e418
LP
347}
348
23a177ef
LP
349void unit_add_to_cleanup_queue(Unit *u) {
350 assert(u);
351
ac155bb8 352 if (u->in_cleanup_queue)
23a177ef
LP
353 return;
354
71fda00f 355 LIST_PREPEND(cleanup_queue, u->manager->cleanup_queue, u);
ac155bb8 356 u->in_cleanup_queue = true;
23a177ef
LP
357}
358
701cc384
LP
359void unit_add_to_gc_queue(Unit *u) {
360 assert(u);
361
ac155bb8 362 if (u->in_gc_queue || u->in_cleanup_queue)
701cc384
LP
363 return;
364
365 if (unit_check_gc(u))
366 return;
367
71fda00f 368 LIST_PREPEND(gc_queue, u->manager->gc_queue, u);
ac155bb8 369 u->in_gc_queue = true;
701cc384 370
313cefa1 371 u->manager->n_in_gc_queue++;
701cc384
LP
372}
373
c1e1601e
LP
374void unit_add_to_dbus_queue(Unit *u) {
375 assert(u);
ac155bb8 376 assert(u->type != _UNIT_TYPE_INVALID);
c1e1601e 377
ac155bb8 378 if (u->load_state == UNIT_STUB || u->in_dbus_queue)
c1e1601e
LP
379 return;
380
a567261a 381 /* Shortcut things if nobody cares */
8f8f05a9
LP
382 if (sd_bus_track_count(u->manager->subscribed) <= 0 &&
383 set_isempty(u->manager->private_buses)) {
ac155bb8 384 u->sent_dbus_new_signal = true;
94b6dfa2
LP
385 return;
386 }
387
71fda00f 388 LIST_PREPEND(dbus_queue, u->manager->dbus_unit_queue, u);
ac155bb8 389 u->in_dbus_queue = true;
c1e1601e
LP
390}
391
87f0e418
LP
392static void bidi_set_free(Unit *u, Set *s) {
393 Iterator i;
394 Unit *other;
395
396 assert(u);
397
398 /* Frees the set and makes sure we are dropped from the
399 * inverse pointers */
400
401 SET_FOREACH(other, s, i) {
402 UnitDependency d;
403
404 for (d = 0; d < _UNIT_DEPENDENCY_MAX; d++)
ac155bb8 405 set_remove(other->dependencies[d], u);
701cc384
LP
406
407 unit_add_to_gc_queue(other);
87f0e418
LP
408 }
409
410 set_free(s);
411}
412
c2756a68
LP
413static void unit_remove_transient(Unit *u) {
414 char **i;
415
416 assert(u);
417
418 if (!u->transient)
419 return;
420
421 if (u->fragment_path)
3f5e8115 422 (void) unlink(u->fragment_path);
c2756a68
LP
423
424 STRV_FOREACH(i, u->dropin_paths) {
39591351 425 _cleanup_free_ char *p = NULL, *pp = NULL;
c2756a68 426
39591351
LP
427 p = dirname_malloc(*i); /* Get the drop-in directory from the drop-in file */
428 if (!p)
429 continue;
430
431 pp = dirname_malloc(p); /* Get the config directory from the drop-in directory */
432 if (!pp)
433 continue;
434
435 /* Only drop transient drop-ins */
436 if (!path_equal(u->manager->lookup_paths.transient, pp))
437 continue;
c2756a68 438
39591351
LP
439 (void) unlink(*i);
440 (void) rmdir(p);
c2756a68
LP
441 }
442}
443
a57f7e2c
LP
444static void unit_free_requires_mounts_for(Unit *u) {
445 char **j;
446
447 STRV_FOREACH(j, u->requires_mounts_for) {
448 char s[strlen(*j) + 1];
449
450 PATH_FOREACH_PREFIX_MORE(s, *j) {
451 char *y;
452 Set *x;
453
454 x = hashmap_get2(u->manager->units_requiring_mounts_for, s, (void**) &y);
455 if (!x)
456 continue;
457
458 set_remove(x, u);
459
460 if (set_isempty(x)) {
461 hashmap_remove(u->manager->units_requiring_mounts_for, y);
462 free(y);
463 set_free(x);
464 }
465 }
466 }
467
6796073e 468 u->requires_mounts_for = strv_free(u->requires_mounts_for);
a57f7e2c
LP
469}
470
598459ce
LP
471static void unit_done(Unit *u) {
472 ExecContext *ec;
473 CGroupContext *cc;
474
475 assert(u);
476
477 if (u->type < 0)
478 return;
479
480 if (UNIT_VTABLE(u)->done)
481 UNIT_VTABLE(u)->done(u);
482
483 ec = unit_get_exec_context(u);
484 if (ec)
485 exec_context_done(ec);
486
487 cc = unit_get_cgroup_context(u);
488 if (cc)
489 cgroup_context_done(cc);
490}
491
87f0e418
LP
492void unit_free(Unit *u) {
493 UnitDependency d;
494 Iterator i;
495 char *t;
496
497 assert(u);
498
4f4afc88
LP
499 if (u->transient_file)
500 fclose(u->transient_file);
501
2c289ea8 502 if (!MANAGER_IS_RELOADING(u->manager))
c2756a68
LP
503 unit_remove_transient(u);
504
c1e1601e
LP
505 bus_unit_send_removed_signal(u);
506
598459ce 507 unit_done(u);
a013b84b 508
cf9fd508
DM
509 sd_bus_slot_unref(u->match_bus_slot);
510
a57f7e2c
LP
511 unit_free_requires_mounts_for(u);
512
ac155bb8
MS
513 SET_FOREACH(t, u->names, i)
514 hashmap_remove_value(u->manager->units, t, u);
87f0e418 515
97e7d748
MS
516 if (u->job) {
517 Job *j = u->job;
518 job_uninstall(j);
519 job_free(j);
520 }
964e0949 521
e0209d83
MS
522 if (u->nop_job) {
523 Job *j = u->nop_job;
524 job_uninstall(j);
525 job_free(j);
526 }
527
964e0949 528 for (d = 0; d < _UNIT_DEPENDENCY_MAX; d++)
ac155bb8 529 bidi_set_free(u, u->dependencies[d]);
964e0949 530
ac155bb8 531 if (u->type != _UNIT_TYPE_INVALID)
71fda00f 532 LIST_REMOVE(units_by_type, u->manager->units_by_type[u->type], u);
ef734fd6 533
ac155bb8 534 if (u->in_load_queue)
71fda00f 535 LIST_REMOVE(load_queue, u->manager->load_queue, u);
87f0e418 536
ac155bb8 537 if (u->in_dbus_queue)
71fda00f 538 LIST_REMOVE(dbus_queue, u->manager->dbus_unit_queue, u);
c1e1601e 539
ac155bb8 540 if (u->in_cleanup_queue)
71fda00f 541 LIST_REMOVE(cleanup_queue, u->manager->cleanup_queue, u);
23a177ef 542
ac155bb8 543 if (u->in_gc_queue) {
71fda00f 544 LIST_REMOVE(gc_queue, u->manager->gc_queue, u);
ac155bb8 545 u->manager->n_in_gc_queue--;
701cc384
LP
546 }
547
4ad49000 548 if (u->in_cgroup_queue)
71fda00f 549 LIST_REMOVE(cgroup_queue, u->manager->cgroup_queue, u);
87f0e418 550
efdb0237 551 unit_release_cgroup(u);
72673e86 552
5269eb6b 553 (void) manager_update_failed_units(u->manager, u, false);
db785129 554 set_remove(u->manager->startup_units, u);
f755e3b7 555
ac155bb8 556 free(u->description);
49dbfa7b 557 strv_free(u->documentation);
ac155bb8 558 free(u->fragment_path);
1b64d026 559 free(u->source_path);
ae7a7182 560 strv_free(u->dropin_paths);
ac155bb8 561 free(u->instance);
87f0e418 562
f189ab18
LP
563 free(u->job_timeout_reboot_arg);
564
ac155bb8 565 set_free_free(u->names);
87f0e418 566
a911bb9a
LP
567 unit_unwatch_all_pids(u);
568
ac155bb8 569 condition_free_list(u->conditions);
59fccdc5 570 condition_free_list(u->asserts);
52661efd 571
6bf0f408
LP
572 free(u->reboot_arg);
573
702a2d8f
LP
574 unit_ref_unset(&u->slice);
575
ac155bb8
MS
576 while (u->refs)
577 unit_ref_unset(u->refs);
57020a3a 578
87f0e418
LP
579 free(u);
580}
581
582UnitActiveState unit_active_state(Unit *u) {
583 assert(u);
584
ac155bb8 585 if (u->load_state == UNIT_MERGED)
6124958c
LP
586 return unit_active_state(unit_follow_merge(u));
587
588 /* After a reload it might happen that a unit is not correctly
589 * loaded but still has a process around. That's why we won't
fdf20a31 590 * shortcut failed loading to UNIT_INACTIVE_FAILED. */
87f0e418
LP
591
592 return UNIT_VTABLE(u)->active_state(u);
593}
594
10a94420
LP
595const char* unit_sub_state_to_string(Unit *u) {
596 assert(u);
597
598 return UNIT_VTABLE(u)->sub_state_to_string(u);
599}
600
7c0b05e5
MS
601static int complete_move(Set **s, Set **other) {
602 int r;
603
23a177ef
LP
604 assert(s);
605 assert(other);
87f0e418 606
23a177ef 607 if (!*other)
7c0b05e5 608 return 0;
87f0e418 609
7c0b05e5
MS
610 if (*s) {
611 r = set_move(*s, *other);
612 if (r < 0)
613 return r;
614 } else {
23a177ef
LP
615 *s = *other;
616 *other = NULL;
617 }
7c0b05e5
MS
618
619 return 0;
23a177ef 620}
87f0e418 621
7c0b05e5 622static int merge_names(Unit *u, Unit *other) {
23a177ef
LP
623 char *t;
624 Iterator i;
7c0b05e5 625 int r;
87f0e418 626
23a177ef
LP
627 assert(u);
628 assert(other);
629
7c0b05e5
MS
630 r = complete_move(&u->names, &other->names);
631 if (r < 0)
632 return r;
23a177ef 633
ac155bb8
MS
634 set_free_free(other->names);
635 other->names = NULL;
636 other->id = NULL;
23a177ef 637
ac155bb8
MS
638 SET_FOREACH(t, u->names, i)
639 assert_se(hashmap_replace(u->manager->units, t, u) == 0);
7c0b05e5
MS
640
641 return 0;
87f0e418
LP
642}
643
09a65f92
MS
644static int reserve_dependencies(Unit *u, Unit *other, UnitDependency d) {
645 unsigned n_reserve;
646
647 assert(u);
648 assert(other);
649 assert(d < _UNIT_DEPENDENCY_MAX);
650
651 /*
652 * If u does not have this dependency set allocated, there is no need
f131770b 653 * to reserve anything. In that case other's set will be transferred
09a65f92
MS
654 * as a whole to u by complete_move().
655 */
656 if (!u->dependencies[d])
657 return 0;
658
659 /* merge_dependencies() will skip a u-on-u dependency */
660 n_reserve = set_size(other->dependencies[d]) - !!set_get(other->dependencies[d], u);
661
662 return set_reserve(u->dependencies[d], n_reserve);
663}
664
d1fab3fe 665static void merge_dependencies(Unit *u, Unit *other, const char *other_id, UnitDependency d) {
23a177ef
LP
666 Iterator i;
667 Unit *back;
87f0e418 668 int r;
23a177ef
LP
669
670 assert(u);
671 assert(other);
672 assert(d < _UNIT_DEPENDENCY_MAX);
673
83a95334 674 /* Fix backwards pointers */
ac155bb8 675 SET_FOREACH(back, other->dependencies[d], i) {
23a177ef
LP
676 UnitDependency k;
677
e48614c4 678 for (k = 0; k < _UNIT_DEPENDENCY_MAX; k++) {
e66047ff
ZJS
679 /* Do not add dependencies between u and itself */
680 if (back == u) {
d1fab3fe 681 if (set_remove(back->dependencies[k], other))
f2341e0a 682 maybe_warn_about_dependency(u, other_id, k);
e66047ff
ZJS
683 } else {
684 r = set_remove_and_put(back->dependencies[k], other, u);
685 if (r == -EEXIST)
686 set_remove(back->dependencies[k], other);
687 else
688 assert(r >= 0 || r == -ENOENT);
689 }
e48614c4 690 }
23a177ef
LP
691 }
692
e66047ff 693 /* Also do not move dependencies on u to itself */
d1fab3fe
ZJS
694 back = set_remove(other->dependencies[d], u);
695 if (back)
f2341e0a 696 maybe_warn_about_dependency(u, other_id, d);
e66047ff 697
7c0b05e5
MS
698 /* The move cannot fail. The caller must have performed a reservation. */
699 assert_se(complete_move(&u->dependencies[d], &other->dependencies[d]) == 0);
23a177ef 700
525d3cc7 701 other->dependencies[d] = set_free(other->dependencies[d]);
23a177ef
LP
702}
703
704int unit_merge(Unit *u, Unit *other) {
87f0e418 705 UnitDependency d;
d1fab3fe 706 const char *other_id = NULL;
09a65f92 707 int r;
87f0e418
LP
708
709 assert(u);
710 assert(other);
ac155bb8
MS
711 assert(u->manager == other->manager);
712 assert(u->type != _UNIT_TYPE_INVALID);
87f0e418 713
cc916967
LP
714 other = unit_follow_merge(other);
715
23a177ef
LP
716 if (other == u)
717 return 0;
718
ac155bb8 719 if (u->type != other->type)
9e2f7c11
LP
720 return -EINVAL;
721
ac155bb8 722 if (!u->instance != !other->instance)
87f0e418
LP
723 return -EINVAL;
724
8a993b61 725 if (!unit_type_may_alias(u->type)) /* Merging only applies to unit names that support aliases */
934e749e
LP
726 return -EEXIST;
727
ac155bb8 728 if (other->load_state != UNIT_STUB &&
c2756a68 729 other->load_state != UNIT_NOT_FOUND)
23a177ef 730 return -EEXIST;
87f0e418 731
ac155bb8 732 if (other->job)
819e213f
LP
733 return -EEXIST;
734
e0209d83
MS
735 if (other->nop_job)
736 return -EEXIST;
737
fdf20a31 738 if (!UNIT_IS_INACTIVE_OR_FAILED(unit_active_state(other)))
819e213f
LP
739 return -EEXIST;
740
d1fab3fe
ZJS
741 if (other->id)
742 other_id = strdupa(other->id);
743
09a65f92
MS
744 /* Make reservations to ensure merge_dependencies() won't fail */
745 for (d = 0; d < _UNIT_DEPENDENCY_MAX; d++) {
746 r = reserve_dependencies(u, other, d);
747 /*
748 * We don't rollback reservations if we fail. We don't have
749 * a way to undo reservations. A reservation is not a leak.
750 */
751 if (r < 0)
752 return r;
753 }
754
87f0e418 755 /* Merge names */
7c0b05e5
MS
756 r = merge_names(u, other);
757 if (r < 0)
758 return r;
87f0e418 759
57020a3a 760 /* Redirect all references */
ac155bb8
MS
761 while (other->refs)
762 unit_ref_set(other->refs, u);
57020a3a 763
87f0e418
LP
764 /* Merge dependencies */
765 for (d = 0; d < _UNIT_DEPENDENCY_MAX; d++)
d1fab3fe 766 merge_dependencies(u, other, other_id, d);
87f0e418 767
ac155bb8
MS
768 other->load_state = UNIT_MERGED;
769 other->merged_into = u;
23a177ef 770
3616a49c
LP
771 /* If there is still some data attached to the other node, we
772 * don't need it anymore, and can free it. */
ac155bb8 773 if (other->load_state != UNIT_STUB)
3616a49c
LP
774 if (UNIT_VTABLE(other)->done)
775 UNIT_VTABLE(other)->done(other);
776
777 unit_add_to_dbus_queue(u);
23a177ef
LP
778 unit_add_to_cleanup_queue(other);
779
780 return 0;
781}
782
783int unit_merge_by_name(Unit *u, const char *name) {
934e749e 784 _cleanup_free_ char *s = NULL;
23a177ef 785 Unit *other;
9e2f7c11 786 int r;
23a177ef
LP
787
788 assert(u);
789 assert(name);
790
7410616c 791 if (unit_name_is_valid(name, UNIT_NAME_TEMPLATE)) {
ac155bb8 792 if (!u->instance)
9e2f7c11
LP
793 return -EINVAL;
794
7410616c
LP
795 r = unit_name_replace_instance(name, u->instance, &s);
796 if (r < 0)
797 return r;
9e2f7c11
LP
798
799 name = s;
800 }
801
c2756a68 802 other = manager_get_unit(u->manager, name);
7410616c
LP
803 if (other)
804 return unit_merge(u, other);
23a177ef 805
7410616c 806 return unit_add_name(u, name);
23a177ef
LP
807}
808
809Unit* unit_follow_merge(Unit *u) {
810 assert(u);
811
ac155bb8
MS
812 while (u->load_state == UNIT_MERGED)
813 assert_se(u = u->merged_into);
23a177ef
LP
814
815 return u;
816}
817
818int unit_add_exec_dependencies(Unit *u, ExecContext *c) {
819 int r;
820
821 assert(u);
822 assert(c);
823
36be24c8
ZJS
824 if (c->working_directory) {
825 r = unit_require_mounts_for(u, c->working_directory);
826 if (r < 0)
827 return r;
828 }
829
830 if (c->root_directory) {
831 r = unit_require_mounts_for(u, c->root_directory);
832 if (r < 0)
833 return r;
834 }
835
463d0d15 836 if (!MANAGER_IS_SYSTEM(u->manager))
b46a529c
LP
837 return 0;
838
839 if (c->private_tmp) {
840 r = unit_require_mounts_for(u, "/tmp");
841 if (r < 0)
842 return r;
843
844 r = unit_require_mounts_for(u, "/var/tmp");
845 if (r < 0)
846 return r;
847 }
848
ecc6e2b8
LP
849 if (c->std_output != EXEC_OUTPUT_KMSG &&
850 c->std_output != EXEC_OUTPUT_SYSLOG &&
706343f4 851 c->std_output != EXEC_OUTPUT_JOURNAL &&
28dbc1e8
LP
852 c->std_output != EXEC_OUTPUT_KMSG_AND_CONSOLE &&
853 c->std_output != EXEC_OUTPUT_SYSLOG_AND_CONSOLE &&
706343f4 854 c->std_output != EXEC_OUTPUT_JOURNAL_AND_CONSOLE &&
ecc6e2b8 855 c->std_error != EXEC_OUTPUT_KMSG &&
085c98af 856 c->std_error != EXEC_OUTPUT_SYSLOG &&
706343f4 857 c->std_error != EXEC_OUTPUT_JOURNAL &&
085c98af 858 c->std_error != EXEC_OUTPUT_KMSG_AND_CONSOLE &&
706343f4 859 c->std_error != EXEC_OUTPUT_JOURNAL_AND_CONSOLE &&
28dbc1e8 860 c->std_error != EXEC_OUTPUT_SYSLOG_AND_CONSOLE)
23a177ef
LP
861 return 0;
862
863 /* If syslog or kernel logging is requested, make sure our own
864 * logging daemon is run first. */
865
b46a529c
LP
866 r = unit_add_dependency_by_name(u, UNIT_AFTER, SPECIAL_JOURNALD_SOCKET, NULL, true);
867 if (r < 0)
868 return r;
23a177ef 869
87f0e418
LP
870 return 0;
871}
872
87f0e418
LP
873const char *unit_description(Unit *u) {
874 assert(u);
875
ac155bb8
MS
876 if (u->description)
877 return u->description;
87f0e418 878
ac155bb8 879 return strna(u->id);
87f0e418
LP
880}
881
882void unit_dump(Unit *u, FILE *f, const char *prefix) {
49dbfa7b 883 char *t, **j;
87f0e418
LP
884 UnitDependency d;
885 Iterator i;
47be870b 886 const char *prefix2;
173e3821 887 char
a483fb59 888 timestamp0[FORMAT_TIMESTAMP_MAX],
173e3821
LP
889 timestamp1[FORMAT_TIMESTAMP_MAX],
890 timestamp2[FORMAT_TIMESTAMP_MAX],
891 timestamp3[FORMAT_TIMESTAMP_MAX],
faf919f1
LP
892 timestamp4[FORMAT_TIMESTAMP_MAX],
893 timespan[FORMAT_TIMESPAN_MAX];
a7f241db 894 Unit *following;
eeaedb7c
LP
895 _cleanup_set_free_ Set *following_set = NULL;
896 int r;
87f0e418
LP
897
898 assert(u);
ac155bb8 899 assert(u->type >= 0);
87f0e418 900
4c940960 901 prefix = strempty(prefix);
63c372cb 902 prefix2 = strjoina(prefix, "\t");
87f0e418
LP
903
904 fprintf(f,
40d50879 905 "%s-> Unit %s:\n"
87f0e418 906 "%s\tDescription: %s\n"
9e2f7c11 907 "%s\tInstance: %s\n"
87f0e418 908 "%s\tUnit Load State: %s\n"
2fad8195 909 "%s\tUnit Active State: %s\n"
b895d155 910 "%s\tState Change Timestamp: %s\n"
173e3821 911 "%s\tInactive Exit Timestamp: %s\n"
2fad8195 912 "%s\tActive Enter Timestamp: %s\n"
701cc384 913 "%s\tActive Exit Timestamp: %s\n"
173e3821 914 "%s\tInactive Enter Timestamp: %s\n"
45fb0699 915 "%s\tGC Check Good: %s\n"
9444b1f2 916 "%s\tNeed Daemon Reload: %s\n"
c2756a68 917 "%s\tTransient: %s\n"
4ad49000
LP
918 "%s\tSlice: %s\n"
919 "%s\tCGroup: %s\n"
920 "%s\tCGroup realized: %s\n"
6414b7c9
DS
921 "%s\tCGroup mask: 0x%x\n"
922 "%s\tCGroup members mask: 0x%x\n",
ac155bb8 923 prefix, u->id,
87f0e418 924 prefix, unit_description(u),
ac155bb8
MS
925 prefix, strna(u->instance),
926 prefix, unit_load_state_to_string(u->load_state),
2fad8195 927 prefix, unit_active_state_to_string(unit_active_state(u)),
a483fb59 928 prefix, strna(format_timestamp(timestamp0, sizeof(timestamp0), u->state_change_timestamp.realtime)),
ac155bb8
MS
929 prefix, strna(format_timestamp(timestamp1, sizeof(timestamp1), u->inactive_exit_timestamp.realtime)),
930 prefix, strna(format_timestamp(timestamp2, sizeof(timestamp2), u->active_enter_timestamp.realtime)),
931 prefix, strna(format_timestamp(timestamp3, sizeof(timestamp3), u->active_exit_timestamp.realtime)),
932 prefix, strna(format_timestamp(timestamp4, sizeof(timestamp4), u->inactive_enter_timestamp.realtime)),
45fb0699 933 prefix, yes_no(unit_check_gc(u)),
9444b1f2 934 prefix, yes_no(unit_need_daemon_reload(u)),
c2756a68 935 prefix, yes_no(u->transient),
4ad49000
LP
936 prefix, strna(unit_slice_name(u)),
937 prefix, strna(u->cgroup_path),
938 prefix, yes_no(u->cgroup_realized),
bc432dc7 939 prefix, u->cgroup_realized_mask,
6414b7c9 940 prefix, u->cgroup_members_mask);
0301abf4 941
ac155bb8 942 SET_FOREACH(t, u->names, i)
87f0e418
LP
943 fprintf(f, "%s\tName: %s\n", prefix, t);
944
49dbfa7b
LP
945 STRV_FOREACH(j, u->documentation)
946 fprintf(f, "%s\tDocumentation: %s\n", prefix, *j);
947
eeaedb7c
LP
948 following = unit_following(u);
949 if (following)
ac155bb8 950 fprintf(f, "%s\tFollowing: %s\n", prefix, following->id);
8fe914ec 951
eeaedb7c
LP
952 r = unit_following_set(u, &following_set);
953 if (r >= 0) {
954 Unit *other;
955
956 SET_FOREACH(other, following_set, i)
957 fprintf(f, "%s\tFollowing Set Member: %s\n", prefix, other->id);
958 }
959
ac155bb8
MS
960 if (u->fragment_path)
961 fprintf(f, "%s\tFragment Path: %s\n", prefix, u->fragment_path);
23a177ef 962
1b64d026
LP
963 if (u->source_path)
964 fprintf(f, "%s\tSource Path: %s\n", prefix, u->source_path);
965
ae7a7182 966 STRV_FOREACH(j, u->dropin_paths)
2875e22b 967 fprintf(f, "%s\tDropIn Path: %s\n", prefix, *j);
ae7a7182 968
36c16a7c 969 if (u->job_timeout != USEC_INFINITY)
2fa4092c 970 fprintf(f, "%s\tJob Timeout: %s\n", prefix, format_timespan(timespan, sizeof(timespan), u->job_timeout, 0));
faf919f1 971
f189ab18
LP
972 if (u->job_timeout_action != FAILURE_ACTION_NONE)
973 fprintf(f, "%s\tJob Timeout Action: %s\n", prefix, failure_action_to_string(u->job_timeout_action));
974
975 if (u->job_timeout_reboot_arg)
976 fprintf(f, "%s\tJob Timeout Reboot Argument: %s\n", prefix, u->job_timeout_reboot_arg);
977
59fccdc5
LP
978 condition_dump_list(u->conditions, f, prefix, condition_type_to_string);
979 condition_dump_list(u->asserts, f, prefix, assert_type_to_string);
52661efd 980
ac155bb8 981 if (dual_timestamp_is_set(&u->condition_timestamp))
2791a8f8
LP
982 fprintf(f,
983 "%s\tCondition Timestamp: %s\n"
984 "%s\tCondition Result: %s\n",
ac155bb8
MS
985 prefix, strna(format_timestamp(timestamp1, sizeof(timestamp1), u->condition_timestamp.realtime)),
986 prefix, yes_no(u->condition_result));
2791a8f8 987
59fccdc5
LP
988 if (dual_timestamp_is_set(&u->assert_timestamp))
989 fprintf(f,
990 "%s\tAssert Timestamp: %s\n"
991 "%s\tAssert Result: %s\n",
992 prefix, strna(format_timestamp(timestamp1, sizeof(timestamp1), u->assert_timestamp.realtime)),
993 prefix, yes_no(u->assert_result));
994
87f0e418
LP
995 for (d = 0; d < _UNIT_DEPENDENCY_MAX; d++) {
996 Unit *other;
997
ac155bb8
MS
998 SET_FOREACH(other, u->dependencies[d], i)
999 fprintf(f, "%s\t%s: %s\n", prefix, unit_dependency_to_string(d), other->id);
87f0e418
LP
1000 }
1001
7c8fa05c 1002 if (!strv_isempty(u->requires_mounts_for)) {
7c8fa05c
LP
1003 fprintf(f,
1004 "%s\tRequiresMountsFor:", prefix);
1005
1006 STRV_FOREACH(j, u->requires_mounts_for)
1007 fprintf(f, " %s", *j);
1008
1009 fputs("\n", f);
1010 }
1011
ac155bb8 1012 if (u->load_state == UNIT_LOADED) {
ab1f0633 1013
b0650475 1014 fprintf(f,
a40eb732 1015 "%s\tStopWhenUnneeded: %s\n"
b5e9dba8
LP
1016 "%s\tRefuseManualStart: %s\n"
1017 "%s\tRefuseManualStop: %s\n"
222ae6a8 1018 "%s\tDefaultDependencies: %s\n"
d420282b 1019 "%s\tOnFailureJobMode: %s\n"
36b4a7ba 1020 "%s\tIgnoreOnIsolate: %s\n",
ac155bb8
MS
1021 prefix, yes_no(u->stop_when_unneeded),
1022 prefix, yes_no(u->refuse_manual_start),
1023 prefix, yes_no(u->refuse_manual_stop),
1024 prefix, yes_no(u->default_dependencies),
d420282b 1025 prefix, job_mode_to_string(u->on_failure_job_mode),
36b4a7ba 1026 prefix, yes_no(u->ignore_on_isolate));
ac155bb8 1027
23a177ef
LP
1028 if (UNIT_VTABLE(u)->dump)
1029 UNIT_VTABLE(u)->dump(u, f, prefix2);
b0650475 1030
ac155bb8 1031 } else if (u->load_state == UNIT_MERGED)
b0650475
LP
1032 fprintf(f,
1033 "%s\tMerged into: %s\n",
ac155bb8
MS
1034 prefix, u->merged_into->id);
1035 else if (u->load_state == UNIT_ERROR)
1036 fprintf(f, "%s\tLoad Error Code: %s\n", prefix, strerror(-u->load_error));
8821a00f 1037
87f0e418 1038
ac155bb8
MS
1039 if (u->job)
1040 job_dump(u->job, f, prefix2);
87f0e418 1041
e0209d83
MS
1042 if (u->nop_job)
1043 job_dump(u->nop_job, f, prefix2);
1044
87f0e418
LP
1045}
1046
1047/* Common implementation for multiple backends */
e537352b 1048int unit_load_fragment_and_dropin(Unit *u) {
23a177ef
LP
1049 int r;
1050
1051 assert(u);
23a177ef 1052
e48614c4 1053 /* Load a .{service,socket,...} file */
4ad49000
LP
1054 r = unit_load_fragment(u);
1055 if (r < 0)
23a177ef
LP
1056 return r;
1057
ac155bb8 1058 if (u->load_state == UNIT_STUB)
23a177ef
LP
1059 return -ENOENT;
1060
1061 /* Load drop-in directory data */
4ad49000
LP
1062 r = unit_load_dropin(unit_follow_merge(u));
1063 if (r < 0)
23a177ef
LP
1064 return r;
1065
1066 return 0;
1067}
1068
1069/* Common implementation for multiple backends */
e537352b 1070int unit_load_fragment_and_dropin_optional(Unit *u) {
23a177ef 1071 int r;
87f0e418
LP
1072
1073 assert(u);
1074
23a177ef
LP
1075 /* Same as unit_load_fragment_and_dropin(), but whether
1076 * something can be loaded or not doesn't matter. */
1077
1078 /* Load a .service file */
4ad49000
LP
1079 r = unit_load_fragment(u);
1080 if (r < 0)
87f0e418
LP
1081 return r;
1082
ac155bb8
MS
1083 if (u->load_state == UNIT_STUB)
1084 u->load_state = UNIT_LOADED;
d46de8a1 1085
87f0e418 1086 /* Load drop-in directory data */
4ad49000
LP
1087 r = unit_load_dropin(unit_follow_merge(u));
1088 if (r < 0)
87f0e418
LP
1089 return r;
1090
23a177ef 1091 return 0;
87f0e418
LP
1092}
1093
bba34eed 1094int unit_add_default_target_dependency(Unit *u, Unit *target) {
98bc2000
LP
1095 assert(u);
1096 assert(target);
1097
ac155bb8 1098 if (target->type != UNIT_TARGET)
98bc2000
LP
1099 return 0;
1100
35b8ca3a 1101 /* Only add the dependency if both units are loaded, so that
bba34eed 1102 * that loop check below is reliable */
ac155bb8
MS
1103 if (u->load_state != UNIT_LOADED ||
1104 target->load_state != UNIT_LOADED)
bba34eed
LP
1105 return 0;
1106
21256a2b
LP
1107 /* If either side wants no automatic dependencies, then let's
1108 * skip this */
ac155bb8
MS
1109 if (!u->default_dependencies ||
1110 !target->default_dependencies)
21256a2b
LP
1111 return 0;
1112
98bc2000 1113 /* Don't create loops */
ac155bb8 1114 if (set_get(target->dependencies[UNIT_BEFORE], u))
98bc2000
LP
1115 return 0;
1116
1117 return unit_add_dependency(target, UNIT_AFTER, u, true);
1118}
1119
e954c9cf 1120static int unit_add_target_dependencies(Unit *u) {
a016b922 1121
21256a2b
LP
1122 static const UnitDependency deps[] = {
1123 UNIT_REQUIRED_BY,
be7d9ff7 1124 UNIT_REQUISITE_OF,
21256a2b
LP
1125 UNIT_WANTED_BY,
1126 UNIT_BOUND_BY
1127 };
1128
bba34eed 1129 Unit *target;
98bc2000 1130 Iterator i;
21256a2b 1131 unsigned k;
db57f3c6 1132 int r = 0;
98bc2000
LP
1133
1134 assert(u);
1135
21256a2b 1136 for (k = 0; k < ELEMENTSOF(deps); k++)
a016b922
LP
1137 SET_FOREACH(target, u->dependencies[deps[k]], i) {
1138 r = unit_add_default_target_dependency(u, target);
1139 if (r < 0)
21256a2b 1140 return r;
a016b922
LP
1141 }
1142
e954c9cf
LP
1143 return r;
1144}
4ad49000 1145
e954c9cf
LP
1146static int unit_add_slice_dependencies(Unit *u) {
1147 assert(u);
b81884e7 1148
35b7ff80 1149 if (!UNIT_HAS_CGROUP_CONTEXT(u))
e954c9cf
LP
1150 return 0;
1151
1152 if (UNIT_ISSET(u->slice))
8c8da0e0 1153 return unit_add_two_dependencies(u, UNIT_AFTER, UNIT_REQUIRES, UNIT_DEREF(u->slice), true);
e954c9cf 1154
8c8da0e0 1155 if (unit_has_name(u, SPECIAL_ROOT_SLICE))
d1fab3fe
ZJS
1156 return 0;
1157
8c8da0e0 1158 return unit_add_two_dependencies_by_name(u, UNIT_AFTER, UNIT_REQUIRES, SPECIAL_ROOT_SLICE, NULL, true);
98bc2000
LP
1159}
1160
e954c9cf 1161static int unit_add_mount_dependencies(Unit *u) {
9588bc32
LP
1162 char **i;
1163 int r;
1164
1165 assert(u);
1166
1167 STRV_FOREACH(i, u->requires_mounts_for) {
1168 char prefix[strlen(*i) + 1];
1169
1170 PATH_FOREACH_PREFIX_MORE(prefix, *i) {
c7c89abb 1171 _cleanup_free_ char *p = NULL;
9588bc32
LP
1172 Unit *m;
1173
c7c89abb 1174 r = unit_name_from_path(prefix, ".mount", &p);
9588bc32
LP
1175 if (r < 0)
1176 return r;
c7c89abb
FB
1177
1178 m = manager_get_unit(u->manager, p);
1179 if (!m) {
1180 /* Make sure to load the mount unit if
1181 * it exists. If so the dependencies
1182 * on this unit will be added later
1183 * during the loading of the mount
1184 * unit. */
1185 (void) manager_load_unit_prepare(u->manager, p, NULL, NULL, &m);
9588bc32 1186 continue;
c7c89abb 1187 }
9588bc32
LP
1188 if (m == u)
1189 continue;
1190
1191 if (m->load_state != UNIT_LOADED)
1192 continue;
1193
1194 r = unit_add_dependency(u, UNIT_AFTER, m, true);
1195 if (r < 0)
1196 return r;
1197
1198 if (m->fragment_path) {
1199 r = unit_add_dependency(u, UNIT_REQUIRES, m, true);
1200 if (r < 0)
1201 return r;
1202 }
1203 }
1204 }
1205
1206 return 0;
1207}
1208
95ae05c0
WC
1209static int unit_add_startup_units(Unit *u) {
1210 CGroupContext *c;
5269eb6b 1211 int r;
95ae05c0
WC
1212
1213 c = unit_get_cgroup_context(u);
db785129
LP
1214 if (!c)
1215 return 0;
1216
d53d9474 1217 if (c->startup_cpu_shares == CGROUP_CPU_SHARES_INVALID &&
13c31542 1218 c->startup_io_weight == CGROUP_WEIGHT_INVALID &&
d53d9474 1219 c->startup_blockio_weight == CGROUP_BLKIO_WEIGHT_INVALID)
db785129
LP
1220 return 0;
1221
5269eb6b
LP
1222 r = set_ensure_allocated(&u->manager->startup_units, NULL);
1223 if (r < 0)
1224 return r;
1225
756c09e6 1226 return set_put(u->manager->startup_units, u);
95ae05c0
WC
1227}
1228
87f0e418
LP
1229int unit_load(Unit *u) {
1230 int r;
1231
1232 assert(u);
1233
ac155bb8 1234 if (u->in_load_queue) {
71fda00f 1235 LIST_REMOVE(load_queue, u->manager->load_queue, u);
ac155bb8 1236 u->in_load_queue = false;
87f0e418
LP
1237 }
1238
ac155bb8 1239 if (u->type == _UNIT_TYPE_INVALID)
e537352b
LP
1240 return -EINVAL;
1241
ac155bb8 1242 if (u->load_state != UNIT_STUB)
87f0e418
LP
1243 return 0;
1244
4f4afc88
LP
1245 if (u->transient_file) {
1246 r = fflush_and_check(u->transient_file);
1247 if (r < 0)
1248 goto fail;
1249
1250 fclose(u->transient_file);
1251 u->transient_file = NULL;
f9ba08fb 1252
f76707da 1253 u->fragment_mtime = now(CLOCK_REALTIME);
4f4afc88
LP
1254 }
1255
c2756a68
LP
1256 if (UNIT_VTABLE(u)->load) {
1257 r = UNIT_VTABLE(u)->load(u);
1258 if (r < 0)
87f0e418 1259 goto fail;
c2756a68 1260 }
23a177ef 1261
ac155bb8 1262 if (u->load_state == UNIT_STUB) {
23a177ef
LP
1263 r = -ENOENT;
1264 goto fail;
1265 }
1266
7c8fa05c 1267 if (u->load_state == UNIT_LOADED) {
c2756a68 1268
e954c9cf
LP
1269 r = unit_add_target_dependencies(u);
1270 if (r < 0)
1271 goto fail;
1272
1273 r = unit_add_slice_dependencies(u);
1274 if (r < 0)
1275 goto fail;
c2756a68 1276
e954c9cf 1277 r = unit_add_mount_dependencies(u);
7c8fa05c 1278 if (r < 0)
c2756a68 1279 goto fail;
7c8fa05c 1280
95ae05c0
WC
1281 r = unit_add_startup_units(u);
1282 if (r < 0)
1283 goto fail;
1284
bc432dc7 1285 if (u->on_failure_job_mode == JOB_ISOLATE && set_size(u->dependencies[UNIT_ON_FAILURE]) > 1) {
f2341e0a 1286 log_unit_error(u, "More than one OnFailure= dependencies specified but OnFailureJobMode=isolate set. Refusing.");
c2756a68
LP
1287 r = -EINVAL;
1288 goto fail;
1289 }
bc432dc7
LP
1290
1291 unit_update_cgroup_members_masks(u);
f68319bb
LP
1292 }
1293
ac155bb8 1294 assert((u->load_state != UNIT_MERGED) == !u->merged_into);
23a177ef
LP
1295
1296 unit_add_to_dbus_queue(unit_follow_merge(u));
701cc384 1297 unit_add_to_gc_queue(u);
87f0e418 1298
87f0e418
LP
1299 return 0;
1300
1301fail:
c2756a68 1302 u->load_state = u->load_state == UNIT_STUB ? UNIT_NOT_FOUND : UNIT_ERROR;
ac155bb8 1303 u->load_error = r;
c1e1601e 1304 unit_add_to_dbus_queue(u);
9a46fc3b 1305 unit_add_to_gc_queue(u);
23a177ef 1306
f2341e0a 1307 log_unit_debug_errno(u, r, "Failed to load configuration: %m");
23a177ef 1308
87f0e418
LP
1309 return r;
1310}
1311
49365733
LP
1312static bool unit_condition_test_list(Unit *u, Condition *first, const char *(*to_string)(ConditionType t)) {
1313 Condition *c;
1314 int triggered = -1;
1315
1316 assert(u);
1317 assert(to_string);
1318
1319 /* If the condition list is empty, then it is true */
1320 if (!first)
1321 return true;
1322
1323 /* Otherwise, if all of the non-trigger conditions apply and
1324 * if any of the trigger conditions apply (unless there are
1325 * none) we return true */
1326 LIST_FOREACH(conditions, c, first) {
1327 int r;
1328
1329 r = condition_test(c);
1330 if (r < 0)
f2341e0a
LP
1331 log_unit_warning(u,
1332 "Couldn't determine result for %s=%s%s%s, assuming failed: %m",
49365733
LP
1333 to_string(c->type),
1334 c->trigger ? "|" : "",
1335 c->negate ? "!" : "",
f2341e0a 1336 c->parameter);
49365733 1337 else
f2341e0a
LP
1338 log_unit_debug(u,
1339 "%s=%s%s%s %s.",
49365733
LP
1340 to_string(c->type),
1341 c->trigger ? "|" : "",
1342 c->negate ? "!" : "",
1343 c->parameter,
f2341e0a 1344 condition_result_to_string(c->result));
49365733
LP
1345
1346 if (!c->trigger && r <= 0)
1347 return false;
1348
1349 if (c->trigger && triggered <= 0)
1350 triggered = r > 0;
1351 }
1352
1353 return triggered != 0;
1354}
1355
9588bc32 1356static bool unit_condition_test(Unit *u) {
90bbc946
LP
1357 assert(u);
1358
ac155bb8 1359 dual_timestamp_get(&u->condition_timestamp);
49365733 1360 u->condition_result = unit_condition_test_list(u, u->conditions, condition_type_to_string);
90bbc946 1361
ac155bb8 1362 return u->condition_result;
90bbc946
LP
1363}
1364
59fccdc5
LP
1365static bool unit_assert_test(Unit *u) {
1366 assert(u);
1367
1368 dual_timestamp_get(&u->assert_timestamp);
49365733 1369 u->assert_result = unit_condition_test_list(u, u->asserts, assert_type_to_string);
59fccdc5
LP
1370
1371 return u->assert_result;
1372}
1373
df446f96
LP
1374void unit_status_printf(Unit *u, const char *status, const char *unit_status_msg_format) {
1375 DISABLE_WARNING_FORMAT_NONLITERAL;
1376 manager_status_printf(u->manager, STATUS_TYPE_NORMAL, status, unit_status_msg_format, unit_description(u));
1377 REENABLE_WARNING;
1378}
1379
44a6b1b6 1380_pure_ static const char* unit_get_status_message_format(Unit *u, JobType t) {
877d54e9 1381 const char *format;
a85ca902 1382 const UnitStatusMessageFormats *format_table;
877d54e9
LP
1383
1384 assert(u);
df446f96 1385 assert(IN_SET(t, JOB_START, JOB_STOP, JOB_RELOAD));
877d54e9 1386
b5bf308b 1387 if (t != JOB_RELOAD) {
a85ca902
MS
1388 format_table = &UNIT_VTABLE(u)->status_message_formats;
1389 if (format_table) {
1390 format = format_table->starting_stopping[t == JOB_STOP];
1391 if (format)
1392 return format;
1393 }
1394 }
877d54e9
LP
1395
1396 /* Return generic strings */
1397 if (t == JOB_START)
1398 return "Starting %s.";
1399 else if (t == JOB_STOP)
1400 return "Stopping %s.";
b5bf308b 1401 else
877d54e9 1402 return "Reloading %s.";
877d54e9
LP
1403}
1404
1405static void unit_status_print_starting_stopping(Unit *u, JobType t) {
1406 const char *format;
1407
1408 assert(u);
1409
df446f96
LP
1410 /* Reload status messages have traditionally not been printed to console. */
1411 if (!IN_SET(t, JOB_START, JOB_STOP))
1412 return;
1413
877d54e9 1414 format = unit_get_status_message_format(u, t);
c6918296 1415
bcfce235 1416 DISABLE_WARNING_FORMAT_NONLITERAL;
49b1d377 1417 unit_status_printf(u, "", format);
bcfce235 1418 REENABLE_WARNING;
c6918296
MS
1419}
1420
877d54e9
LP
1421static void unit_status_log_starting_stopping_reloading(Unit *u, JobType t) {
1422 const char *format;
1423 char buf[LINE_MAX];
1424 sd_id128_t mid;
1425
1426 assert(u);
1427
df446f96 1428 if (!IN_SET(t, JOB_START, JOB_STOP, JOB_RELOAD))
877d54e9
LP
1429 return;
1430
81270860
LP
1431 if (log_on_console())
1432 return;
1433
877d54e9
LP
1434 /* We log status messages for all units and all operations. */
1435
a85ca902 1436 format = unit_get_status_message_format(u, t);
877d54e9 1437
bcfce235 1438 DISABLE_WARNING_FORMAT_NONLITERAL;
d054f0a4 1439 xsprintf(buf, format, unit_description(u));
bcfce235 1440 REENABLE_WARNING;
877d54e9
LP
1441
1442 mid = t == JOB_START ? SD_MESSAGE_UNIT_STARTING :
1443 t == JOB_STOP ? SD_MESSAGE_UNIT_STOPPING :
1444 SD_MESSAGE_UNIT_RELOADING;
1445
f2341e0a
LP
1446 /* Note that we deliberately use LOG_MESSAGE() instead of
1447 * LOG_UNIT_MESSAGE() here, since this is supposed to mimic
1448 * closely what is written to screen using the status output,
1449 * which is supposed the highest level, friendliest output
1450 * possible, which means we should avoid the low-level unit
1451 * name. */
1452 log_struct(LOG_INFO,
1453 LOG_MESSAGE_ID(mid),
1454 LOG_UNIT_ID(u),
1455 LOG_MESSAGE("%s", buf),
1456 NULL);
877d54e9 1457}
877d54e9 1458
d1a34ae9 1459void unit_status_emit_starting_stopping_reloading(Unit *u, JobType t) {
df446f96
LP
1460 assert(u);
1461 assert(t >= 0);
1462 assert(t < _JOB_TYPE_MAX);
d1a34ae9
MS
1463
1464 unit_status_log_starting_stopping_reloading(u, t);
df446f96 1465 unit_status_print_starting_stopping(u, t);
d1a34ae9
MS
1466}
1467
07299350 1468int unit_start_limit_test(Unit *u) {
6bf0f408
LP
1469 assert(u);
1470
1471 if (ratelimit_test(&u->start_limit)) {
1472 u->start_limit_hit = false;
1473 return 0;
1474 }
1475
1476 log_unit_warning(u, "Start request repeated too quickly.");
1477 u->start_limit_hit = true;
1478
1479 return failure_action(u->manager, u->start_limit_action, u->reboot_arg);
1480}
1481
87f0e418 1482/* Errors:
6bf0f408
LP
1483 * -EBADR: This unit type does not support starting.
1484 * -EALREADY: Unit is already started.
1485 * -EAGAIN: An operation is already in progress. Retry later.
1486 * -ECANCELED: Too many requests for now.
1487 * -EPROTO: Assert failed
1488 * -EINVAL: Unit not loaded
1489 * -EOPNOTSUPP: Unit type not supported
87f0e418
LP
1490 */
1491int unit_start(Unit *u) {
1492 UnitActiveState state;
92ab323c 1493 Unit *following;
87f0e418
LP
1494
1495 assert(u);
1496
a82e5507
LP
1497 /* If this is already started, then this will succeed. Note
1498 * that this will even succeed if this unit is not startable
1499 * by the user. This is relied on to detect when we need to
1500 * wait for units and when waiting is finished. */
87f0e418
LP
1501 state = unit_active_state(u);
1502 if (UNIT_IS_ACTIVE_OR_RELOADING(state))
1503 return -EALREADY;
1504
6bf0f408
LP
1505 /* Units that aren't loaded cannot be started */
1506 if (u->load_state != UNIT_LOADED)
1507 return -EINVAL;
1508
a82e5507
LP
1509 /* If the conditions failed, don't do anything at all. If we
1510 * already are activating this call might still be useful to
1511 * speed up activation in case there is some hold-off time,
1512 * but we don't want to recheck the condition in that case. */
1513 if (state != UNIT_ACTIVATING &&
1514 !unit_condition_test(u)) {
f2341e0a 1515 log_unit_debug(u, "Starting requested but condition failed. Not starting unit.");
52661efd
LP
1516 return -EALREADY;
1517 }
1518
59fccdc5
LP
1519 /* If the asserts failed, fail the entire job */
1520 if (state != UNIT_ACTIVATING &&
1521 !unit_assert_test(u)) {
f2341e0a 1522 log_unit_notice(u, "Starting requested but asserts failed.");
59fccdc5
LP
1523 return -EPROTO;
1524 }
1525
d11a7645
LP
1526 /* Units of types that aren't supported cannot be
1527 * started. Note that we do this test only after the condition
1528 * checks, so that we rather return condition check errors
1529 * (which are usually not considered a true failure) than "not
1530 * supported" errors (which are considered a failure).
1531 */
1532 if (!unit_supported(u))
1533 return -EOPNOTSUPP;
1534
92ab323c 1535 /* Forward to the main object, if we aren't it. */
52990c2e
ZJS
1536 following = unit_following(u);
1537 if (following) {
f2341e0a 1538 log_unit_debug(u, "Redirecting start request from %s to %s.", u->id, following->id);
92ab323c
LP
1539 return unit_start(following);
1540 }
1541
1542 /* If it is stopped, but we cannot start it, then fail */
1543 if (!UNIT_VTABLE(u)->start)
1544 return -EBADR;
1545
87f0e418
LP
1546 /* We don't suppress calls to ->start() here when we are
1547 * already starting, to allow this request to be used as a
1548 * "hurry up" call, for example when the unit is in some "auto
1549 * restart" state where it waits for a holdoff timer to elapse
1550 * before it will start again. */
1551
c1e1601e 1552 unit_add_to_dbus_queue(u);
9e58ff9c 1553
d1a34ae9 1554 return UNIT_VTABLE(u)->start(u);
87f0e418
LP
1555}
1556
1557bool unit_can_start(Unit *u) {
1558 assert(u);
1559
8ff4d2ab
LP
1560 if (u->load_state != UNIT_LOADED)
1561 return false;
1562
1563 if (!unit_supported(u))
1564 return false;
1565
87f0e418
LP
1566 return !!UNIT_VTABLE(u)->start;
1567}
1568
2528a7a6
LP
1569bool unit_can_isolate(Unit *u) {
1570 assert(u);
1571
1572 return unit_can_start(u) &&
ac155bb8 1573 u->allow_isolate;
2528a7a6
LP
1574}
1575
87f0e418
LP
1576/* Errors:
1577 * -EBADR: This unit type does not support stopping.
1578 * -EALREADY: Unit is already stopped.
1579 * -EAGAIN: An operation is already in progress. Retry later.
1580 */
1581int unit_stop(Unit *u) {
1582 UnitActiveState state;
92ab323c 1583 Unit *following;
87f0e418
LP
1584
1585 assert(u);
1586
87f0e418 1587 state = unit_active_state(u);
fdf20a31 1588 if (UNIT_IS_INACTIVE_OR_FAILED(state))
87f0e418
LP
1589 return -EALREADY;
1590
0faacd47
LP
1591 following = unit_following(u);
1592 if (following) {
f2341e0a 1593 log_unit_debug(u, "Redirecting stop request from %s to %s.", u->id, following->id);
92ab323c
LP
1594 return unit_stop(following);
1595 }
1596
7898b0cf
LP
1597 if (!UNIT_VTABLE(u)->stop)
1598 return -EBADR;
1599
c1e1601e 1600 unit_add_to_dbus_queue(u);
9e58ff9c 1601
d1a34ae9 1602 return UNIT_VTABLE(u)->stop(u);
87f0e418
LP
1603}
1604
1605/* Errors:
1606 * -EBADR: This unit type does not support reloading.
1607 * -ENOEXEC: Unit is not started.
1608 * -EAGAIN: An operation is already in progress. Retry later.
1609 */
1610int unit_reload(Unit *u) {
1611 UnitActiveState state;
92ab323c 1612 Unit *following;
87f0e418
LP
1613
1614 assert(u);
1615
ac155bb8 1616 if (u->load_state != UNIT_LOADED)
6124958c
LP
1617 return -EINVAL;
1618
87f0e418
LP
1619 if (!unit_can_reload(u))
1620 return -EBADR;
1621
1622 state = unit_active_state(u);
e364ad06 1623 if (state == UNIT_RELOADING)
87f0e418
LP
1624 return -EALREADY;
1625
6a371e23 1626 if (state != UNIT_ACTIVE) {
f2341e0a 1627 log_unit_warning(u, "Unit cannot be reloaded because it is inactive.");
87f0e418 1628 return -ENOEXEC;
6a371e23 1629 }
87f0e418 1630
e48614c4
ZJS
1631 following = unit_following(u);
1632 if (following) {
f2341e0a 1633 log_unit_debug(u, "Redirecting reload request from %s to %s.", u->id, following->id);
92ab323c
LP
1634 return unit_reload(following);
1635 }
1636
c1e1601e 1637 unit_add_to_dbus_queue(u);
82a2b6bb 1638
d1a34ae9 1639 return UNIT_VTABLE(u)->reload(u);
87f0e418
LP
1640}
1641
1642bool unit_can_reload(Unit *u) {
1643 assert(u);
1644
1645 if (!UNIT_VTABLE(u)->reload)
1646 return false;
1647
1648 if (!UNIT_VTABLE(u)->can_reload)
1649 return true;
1650
1651 return UNIT_VTABLE(u)->can_reload(u);
1652}
1653
b4a16b7b 1654static void unit_check_unneeded(Unit *u) {
be7d9ff7 1655
4afd3348 1656 _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
4bd29fe5 1657
be7d9ff7
LP
1658 static const UnitDependency needed_dependencies[] = {
1659 UNIT_REQUIRED_BY,
084918ba 1660 UNIT_REQUISITE_OF,
be7d9ff7
LP
1661 UNIT_WANTED_BY,
1662 UNIT_BOUND_BY,
1663 };
1664
f3bff0eb 1665 Unit *other;
be7d9ff7
LP
1666 Iterator i;
1667 unsigned j;
1668 int r;
f3bff0eb
LP
1669
1670 assert(u);
1671
1672 /* If this service shall be shut down when unneeded then do
1673 * so. */
1674
ac155bb8 1675 if (!u->stop_when_unneeded)
f3bff0eb
LP
1676 return;
1677
1678 if (!UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u)))
1679 return;
1680
be7d9ff7 1681 for (j = 0; j < ELEMENTSOF(needed_dependencies); j++)
f3b85044 1682 SET_FOREACH(other, u->dependencies[needed_dependencies[j]], i)
be7d9ff7
LP
1683 if (unit_active_or_pending(other))
1684 return;
b81884e7 1685
595bfe7d 1686 /* If stopping a unit fails continuously we might enter a stop
bea355da
LP
1687 * loop here, hence stop acting on the service being
1688 * unnecessary after a while. */
67bfdc97 1689 if (!ratelimit_test(&u->auto_stop_ratelimit)) {
bea355da
LP
1690 log_unit_warning(u, "Unit not needed anymore, but not stopping since we tried this too often recently.");
1691 return;
1692 }
1693
f2341e0a 1694 log_unit_info(u, "Unit not needed anymore. Stopping.");
f3bff0eb
LP
1695
1696 /* Ok, nobody needs us anymore. Sniff. Then let's commit suicide */
4bd29fe5 1697 r = manager_add_job(u->manager, JOB_STOP, u, JOB_FAIL, &error, NULL);
be7d9ff7 1698 if (r < 0)
4bd29fe5 1699 log_unit_warning_errno(u, r, "Failed to enqueue stop job, ignoring: %s", bus_error_message(&error, r));
f3bff0eb
LP
1700}
1701
ff502445 1702static void unit_check_binds_to(Unit *u) {
4afd3348 1703 _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
ff502445
LP
1704 bool stop = false;
1705 Unit *other;
1706 Iterator i;
67bfdc97 1707 int r;
ff502445
LP
1708
1709 assert(u);
1710
1711 if (u->job)
1712 return;
1713
1714 if (unit_active_state(u) != UNIT_ACTIVE)
1715 return;
1716
1717 SET_FOREACH(other, u->dependencies[UNIT_BINDS_TO], i) {
1718 if (other->job)
1719 continue;
1720
1721 if (!UNIT_IS_INACTIVE_OR_FAILED(unit_active_state(other)))
1722 continue;
1723
1724 stop = true;
98f738b6 1725 break;
ff502445
LP
1726 }
1727
1728 if (!stop)
1729 return;
1730
595bfe7d 1731 /* If stopping a unit fails continuously we might enter a stop
67bfdc97
LP
1732 * loop here, hence stop acting on the service being
1733 * unnecessary after a while. */
1734 if (!ratelimit_test(&u->auto_stop_ratelimit)) {
1735 log_unit_warning(u, "Unit is bound to inactive unit %s, but not stopping since we tried this too often recently.", other->id);
1736 return;
1737 }
1738
98f738b6 1739 assert(other);
f2341e0a 1740 log_unit_info(u, "Unit is bound to inactive unit %s. Stopping, too.", other->id);
ff502445
LP
1741
1742 /* A unit we need to run is gone. Sniff. Let's stop this. */
4bd29fe5 1743 r = manager_add_job(u->manager, JOB_STOP, u, JOB_FAIL, &error, NULL);
67bfdc97 1744 if (r < 0)
4bd29fe5 1745 log_unit_warning_errno(u, r, "Failed to enqueue stop job, ignoring: %s", bus_error_message(&error, r));
ff502445
LP
1746}
1747
87f0e418
LP
1748static void retroactively_start_dependencies(Unit *u) {
1749 Iterator i;
1750 Unit *other;
1751
1752 assert(u);
1753 assert(UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u)));
1754
ac155bb8
MS
1755 SET_FOREACH(other, u->dependencies[UNIT_REQUIRES], i)
1756 if (!set_get(u->dependencies[UNIT_AFTER], other) &&
b81884e7 1757 !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other)))
4bd29fe5 1758 manager_add_job(u->manager, JOB_START, other, JOB_REPLACE, NULL, NULL);
b81884e7 1759
7f2cddae 1760 SET_FOREACH(other, u->dependencies[UNIT_BINDS_TO], i)
ac155bb8 1761 if (!set_get(u->dependencies[UNIT_AFTER], other) &&
b81884e7 1762 !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other)))
4bd29fe5 1763 manager_add_job(u->manager, JOB_START, other, JOB_REPLACE, NULL, NULL);
87f0e418 1764
ac155bb8
MS
1765 SET_FOREACH(other, u->dependencies[UNIT_WANTS], i)
1766 if (!set_get(u->dependencies[UNIT_AFTER], other) &&
b81884e7 1767 !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other)))
4bd29fe5 1768 manager_add_job(u->manager, JOB_START, other, JOB_FAIL, NULL, NULL);
87f0e418 1769
ac155bb8 1770 SET_FOREACH(other, u->dependencies[UNIT_CONFLICTS], i)
b81884e7 1771 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
4bd29fe5 1772 manager_add_job(u->manager, JOB_STOP, other, JOB_REPLACE, NULL, NULL);
69dd2852 1773
ac155bb8 1774 SET_FOREACH(other, u->dependencies[UNIT_CONFLICTED_BY], i)
b81884e7 1775 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
4bd29fe5 1776 manager_add_job(u->manager, JOB_STOP, other, JOB_REPLACE, NULL, NULL);
87f0e418
LP
1777}
1778
1779static void retroactively_stop_dependencies(Unit *u) {
1780 Iterator i;
1781 Unit *other;
1782
1783 assert(u);
1784 assert(UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(u)));
1785
b81884e7 1786 /* Pull down units which are bound to us recursively if enabled */
ac155bb8 1787 SET_FOREACH(other, u->dependencies[UNIT_BOUND_BY], i)
b81884e7 1788 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
4bd29fe5 1789 manager_add_job(u->manager, JOB_STOP, other, JOB_REPLACE, NULL, NULL);
cd0504d0
MS
1790}
1791
1792static void check_unneeded_dependencies(Unit *u) {
1793 Iterator i;
1794 Unit *other;
1795
1796 assert(u);
1797 assert(UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(u)));
f3bff0eb
LP
1798
1799 /* Garbage collect services that might not be needed anymore, if enabled */
ac155bb8 1800 SET_FOREACH(other, u->dependencies[UNIT_REQUIRES], i)
87f0e418 1801 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
b4a16b7b 1802 unit_check_unneeded(other);
ac155bb8 1803 SET_FOREACH(other, u->dependencies[UNIT_WANTS], i)
f3bff0eb 1804 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
b4a16b7b 1805 unit_check_unneeded(other);
ac155bb8 1806 SET_FOREACH(other, u->dependencies[UNIT_REQUISITE], i)
f3bff0eb 1807 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
b4a16b7b 1808 unit_check_unneeded(other);
7f2cddae 1809 SET_FOREACH(other, u->dependencies[UNIT_BINDS_TO], i)
b81884e7
LP
1810 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
1811 unit_check_unneeded(other);
87f0e418
LP
1812}
1813
3ecaa09b 1814void unit_start_on_failure(Unit *u) {
c0daa706
LP
1815 Unit *other;
1816 Iterator i;
1817
1818 assert(u);
1819
ac155bb8 1820 if (set_size(u->dependencies[UNIT_ON_FAILURE]) <= 0)
222ae6a8
LP
1821 return;
1822
f2341e0a 1823 log_unit_info(u, "Triggering OnFailure= dependencies.");
222ae6a8 1824
ac155bb8 1825 SET_FOREACH(other, u->dependencies[UNIT_ON_FAILURE], i) {
222ae6a8
LP
1826 int r;
1827
4bd29fe5 1828 r = manager_add_job(u->manager, JOB_START, other, u->on_failure_job_mode, NULL, NULL);
c1b6628d 1829 if (r < 0)
f2341e0a 1830 log_unit_error_errno(u, r, "Failed to enqueue OnFailure= job: %m");
222ae6a8 1831 }
c0daa706
LP
1832}
1833
3ecaa09b
LP
1834void unit_trigger_notify(Unit *u) {
1835 Unit *other;
1836 Iterator i;
1837
1838 assert(u);
1839
1840 SET_FOREACH(other, u->dependencies[UNIT_TRIGGERED_BY], i)
1841 if (UNIT_VTABLE(other)->trigger_notify)
1842 UNIT_VTABLE(other)->trigger_notify(other, u);
1843}
1844
e2f3b44c 1845void unit_notify(Unit *u, UnitActiveState os, UnitActiveState ns, bool reload_success) {
546ac4f0 1846 Manager *m;
7e6e7b06 1847 bool unexpected;
a096ed36 1848
87f0e418
LP
1849 assert(u);
1850 assert(os < _UNIT_ACTIVE_STATE_MAX);
1851 assert(ns < _UNIT_ACTIVE_STATE_MAX);
87f0e418 1852
8e471ccd
LP
1853 /* Note that this is called for all low-level state changes,
1854 * even if they might map to the same high-level
865cc19a 1855 * UnitActiveState! That means that ns == os is an expected
c5315881 1856 * behavior here. For example: if a mount point is remounted
cd6d0a45 1857 * this function will be called too! */
87f0e418 1858
546ac4f0
MS
1859 m = u->manager;
1860
f755e3b7 1861 /* Update timestamps for state changes */
2c289ea8 1862 if (!MANAGER_IS_RELOADING(m)) {
a483fb59 1863 dual_timestamp_get(&u->state_change_timestamp);
173e3821 1864
bdbf9951 1865 if (UNIT_IS_INACTIVE_OR_FAILED(os) && !UNIT_IS_INACTIVE_OR_FAILED(ns))
a483fb59 1866 u->inactive_exit_timestamp = u->state_change_timestamp;
bdbf9951 1867 else if (!UNIT_IS_INACTIVE_OR_FAILED(os) && UNIT_IS_INACTIVE_OR_FAILED(ns))
a483fb59 1868 u->inactive_enter_timestamp = u->state_change_timestamp;
bdbf9951
LP
1869
1870 if (!UNIT_IS_ACTIVE_OR_RELOADING(os) && UNIT_IS_ACTIVE_OR_RELOADING(ns))
a483fb59 1871 u->active_enter_timestamp = u->state_change_timestamp;
bdbf9951 1872 else if (UNIT_IS_ACTIVE_OR_RELOADING(os) && !UNIT_IS_ACTIVE_OR_RELOADING(ns))
a483fb59 1873 u->active_exit_timestamp = u->state_change_timestamp;
bdbf9951 1874 }
87f0e418 1875
865cc19a 1876 /* Keep track of failed units */
5269eb6b 1877 (void) manager_update_failed_units(u->manager, u, ns == UNIT_FAILED);
f755e3b7
LP
1878
1879 /* Make sure the cgroup is always removed when we become inactive */
fdf20a31 1880 if (UNIT_IS_INACTIVE_OR_FAILED(ns))
efdb0237 1881 unit_prune_cgroup(u);
fb385181 1882
9cd86184 1883 /* Note that this doesn't apply to RemainAfterExit services exiting
6f285378 1884 * successfully, since there's no change of state in that case. Which is
9cd86184 1885 * why it is handled in service_set_state() */
7ed9f6cd 1886 if (UNIT_IS_INACTIVE_OR_FAILED(os) != UNIT_IS_INACTIVE_OR_FAILED(ns)) {
b33918c2
LP
1887 ExecContext *ec;
1888
1889 ec = unit_get_exec_context(u);
7ed9f6cd 1890 if (ec && exec_context_may_touch_console(ec)) {
31a7eb86 1891 if (UNIT_IS_INACTIVE_OR_FAILED(ns)) {
313cefa1 1892 m->n_on_console--;
31a7eb86
ZJS
1893
1894 if (m->n_on_console == 0)
1895 /* unset no_console_output flag, since the console is free */
2f38577f 1896 m->no_console_output = false;
31a7eb86 1897 } else
313cefa1 1898 m->n_on_console++;
7ed9f6cd
MS
1899 }
1900 }
1901
ac155bb8 1902 if (u->job) {
7e6e7b06 1903 unexpected = false;
87f0e418 1904
ac155bb8 1905 if (u->job->state == JOB_WAITING)
87f0e418
LP
1906
1907 /* So we reached a different state for this
1908 * job. Let's see if we can run it now if it
1909 * failed previously due to EAGAIN. */
ac155bb8 1910 job_add_to_run_queue(u->job);
87f0e418 1911
b410e6b9 1912 /* Let's check whether this state change constitutes a
35b8ca3a 1913 * finished job, or maybe contradicts a running job and
b410e6b9 1914 * hence needs to invalidate jobs. */
87f0e418 1915
ac155bb8 1916 switch (u->job->type) {
87f0e418 1917
b410e6b9
LP
1918 case JOB_START:
1919 case JOB_VERIFY_ACTIVE:
87f0e418 1920
b410e6b9 1921 if (UNIT_IS_ACTIVE_OR_RELOADING(ns))
833f92ad 1922 job_finish_and_invalidate(u->job, JOB_DONE, true, false);
ac155bb8 1923 else if (u->job->state == JOB_RUNNING && ns != UNIT_ACTIVATING) {
b410e6b9 1924 unexpected = true;
41b02ec7 1925
fdf20a31 1926 if (UNIT_IS_INACTIVE_OR_FAILED(ns))
833f92ad 1927 job_finish_and_invalidate(u->job, ns == UNIT_FAILED ? JOB_FAILED : JOB_DONE, true, false);
b410e6b9 1928 }
87f0e418 1929
b410e6b9 1930 break;
87f0e418 1931
b410e6b9
LP
1932 case JOB_RELOAD:
1933 case JOB_RELOAD_OR_START:
3282591d 1934 case JOB_TRY_RELOAD:
87f0e418 1935
ac155bb8 1936 if (u->job->state == JOB_RUNNING) {
a096ed36 1937 if (ns == UNIT_ACTIVE)
833f92ad 1938 job_finish_and_invalidate(u->job, reload_success ? JOB_DONE : JOB_FAILED, true, false);
032ff4af 1939 else if (ns != UNIT_ACTIVATING && ns != UNIT_RELOADING) {
a096ed36 1940 unexpected = true;
41b02ec7 1941
fdf20a31 1942 if (UNIT_IS_INACTIVE_OR_FAILED(ns))
833f92ad 1943 job_finish_and_invalidate(u->job, ns == UNIT_FAILED ? JOB_FAILED : JOB_DONE, true, false);
a096ed36 1944 }
b410e6b9 1945 }
87f0e418 1946
b410e6b9 1947 break;
87f0e418 1948
b410e6b9
LP
1949 case JOB_STOP:
1950 case JOB_RESTART:
1951 case JOB_TRY_RESTART:
87f0e418 1952
fdf20a31 1953 if (UNIT_IS_INACTIVE_OR_FAILED(ns))
833f92ad 1954 job_finish_and_invalidate(u->job, JOB_DONE, true, false);
ac155bb8 1955 else if (u->job->state == JOB_RUNNING && ns != UNIT_DEACTIVATING) {
b410e6b9 1956 unexpected = true;
833f92ad 1957 job_finish_and_invalidate(u->job, JOB_FAILED, true, false);
b410e6b9 1958 }
87f0e418 1959
b410e6b9 1960 break;
87f0e418 1961
b410e6b9
LP
1962 default:
1963 assert_not_reached("Job type unknown");
87f0e418 1964 }
87f0e418 1965
7e6e7b06
LP
1966 } else
1967 unexpected = true;
1968
2c289ea8 1969 if (!MANAGER_IS_RELOADING(m)) {
f3bff0eb 1970
bdbf9951
LP
1971 /* If this state change happened without being
1972 * requested by a job, then let's retroactively start
1973 * or stop dependencies. We skip that step when
1974 * deserializing, since we don't want to create any
1975 * additional jobs just because something is already
1976 * activated. */
1977
1978 if (unexpected) {
1979 if (UNIT_IS_INACTIVE_OR_FAILED(os) && UNIT_IS_ACTIVE_OR_ACTIVATING(ns))
1980 retroactively_start_dependencies(u);
1981 else if (UNIT_IS_ACTIVE_OR_ACTIVATING(os) && UNIT_IS_INACTIVE_OR_DEACTIVATING(ns))
1982 retroactively_stop_dependencies(u);
1983 }
5de9682c 1984
cd0504d0 1985 /* stop unneeded units regardless if going down was expected or not */
b33918c2 1986 if (UNIT_IS_INACTIVE_OR_DEACTIVATING(ns))
cd0504d0
MS
1987 check_unneeded_dependencies(u);
1988
bdbf9951 1989 if (ns != os && ns == UNIT_FAILED) {
f2341e0a 1990 log_unit_notice(u, "Unit entered failed state.");
3ecaa09b 1991 unit_start_on_failure(u);
cd6d0a45 1992 }
3b2775c5 1993 }
e537352b 1994
3b2775c5
LP
1995 /* Some names are special */
1996 if (UNIT_IS_ACTIVE_OR_RELOADING(ns)) {
1997
1998 if (unit_has_name(u, SPECIAL_DBUS_SERVICE))
865cc19a 1999 /* The bus might have just become available,
3b2775c5
LP
2000 * hence try to connect to it, if we aren't
2001 * yet connected. */
546ac4f0 2002 bus_init(m, true);
3b2775c5 2003
ac155bb8 2004 if (u->type == UNIT_SERVICE &&
3b2775c5 2005 !UNIT_IS_ACTIVE_OR_RELOADING(os) &&
2c289ea8 2006 !MANAGER_IS_RELOADING(m)) {
3b2775c5 2007 /* Write audit record if we have just finished starting up */
546ac4f0 2008 manager_send_unit_audit(m, u, AUDIT_SERVICE_START, true);
ac155bb8 2009 u->in_audit = true;
3b2775c5 2010 }
e983b760 2011
3b2775c5 2012 if (!UNIT_IS_ACTIVE_OR_RELOADING(os))
546ac4f0 2013 manager_send_unit_plymouth(m, u);
bdbf9951 2014
3b2775c5 2015 } else {
bdbf9951 2016
3b2775c5
LP
2017 /* We don't care about D-Bus here, since we'll get an
2018 * asynchronous notification for it anyway. */
cd6d0a45 2019
ac155bb8 2020 if (u->type == UNIT_SERVICE &&
3b2775c5
LP
2021 UNIT_IS_INACTIVE_OR_FAILED(ns) &&
2022 !UNIT_IS_INACTIVE_OR_FAILED(os) &&
2c289ea8 2023 !MANAGER_IS_RELOADING(m)) {
4927fcae 2024
3b2775c5
LP
2025 /* Hmm, if there was no start record written
2026 * write it now, so that we always have a nice
2027 * pair */
ac155bb8 2028 if (!u->in_audit) {
546ac4f0 2029 manager_send_unit_audit(m, u, AUDIT_SERVICE_START, ns == UNIT_INACTIVE);
cd6d0a45 2030
3b2775c5 2031 if (ns == UNIT_INACTIVE)
546ac4f0 2032 manager_send_unit_audit(m, u, AUDIT_SERVICE_STOP, true);
3b2775c5
LP
2033 } else
2034 /* Write audit record if we have just finished shutting down */
546ac4f0 2035 manager_send_unit_audit(m, u, AUDIT_SERVICE_STOP, ns == UNIT_INACTIVE);
bdbf9951 2036
ac155bb8 2037 u->in_audit = false;
cd6d0a45 2038 }
f278026d
LP
2039 }
2040
546ac4f0 2041 manager_recheck_journal(m);
3ecaa09b 2042 unit_trigger_notify(u);
3b2775c5 2043
2c289ea8 2044 if (!MANAGER_IS_RELOADING(u->manager)) {
ff502445
LP
2045 /* Maybe we finished startup and are now ready for
2046 * being stopped because unneeded? */
bf6dcfa6 2047 unit_check_unneeded(u);
c1e1601e 2048
ff502445
LP
2049 /* Maybe we finished startup, but something we needed
2050 * has vanished? Let's die then. (This happens when
2051 * something BindsTo= to a Type=oneshot unit, as these
2052 * units go directly from starting to inactive,
2053 * without ever entering started.) */
2054 unit_check_binds_to(u);
2055 }
2056
c1e1601e 2057 unit_add_to_dbus_queue(u);
701cc384 2058 unit_add_to_gc_queue(u);
87f0e418
LP
2059}
2060
87f0e418 2061int unit_watch_pid(Unit *u, pid_t pid) {
a911bb9a
LP
2062 int q, r;
2063
87f0e418
LP
2064 assert(u);
2065 assert(pid >= 1);
2066
5ba6985b
LP
2067 /* Watch a specific PID. We only support one or two units
2068 * watching each PID for now, not more. */
2069
d5099efc 2070 r = set_ensure_allocated(&u->pids, NULL);
5ba6985b
LP
2071 if (r < 0)
2072 return r;
2073
d5099efc 2074 r = hashmap_ensure_allocated(&u->manager->watch_pids1, NULL);
a911bb9a
LP
2075 if (r < 0)
2076 return r;
2077
fea72cc0 2078 r = hashmap_put(u->manager->watch_pids1, PID_TO_PTR(pid), u);
5ba6985b 2079 if (r == -EEXIST) {
d5099efc 2080 r = hashmap_ensure_allocated(&u->manager->watch_pids2, NULL);
5ba6985b
LP
2081 if (r < 0)
2082 return r;
05e343b7 2083
fea72cc0 2084 r = hashmap_put(u->manager->watch_pids2, PID_TO_PTR(pid), u);
5ba6985b 2085 }
a911bb9a 2086
fea72cc0 2087 q = set_put(u->pids, PID_TO_PTR(pid));
a911bb9a
LP
2088 if (q < 0)
2089 return q;
2090
2091 return r;
87f0e418
LP
2092}
2093
2094void unit_unwatch_pid(Unit *u, pid_t pid) {
2095 assert(u);
2096 assert(pid >= 1);
2097
fea72cc0
LP
2098 (void) hashmap_remove_value(u->manager->watch_pids1, PID_TO_PTR(pid), u);
2099 (void) hashmap_remove_value(u->manager->watch_pids2, PID_TO_PTR(pid), u);
2100 (void) set_remove(u->pids, PID_TO_PTR(pid));
a911bb9a
LP
2101}
2102
bd44e61b
LP
2103void unit_unwatch_all_pids(Unit *u) {
2104 assert(u);
2105
2106 while (!set_isempty(u->pids))
fea72cc0 2107 unit_unwatch_pid(u, PTR_TO_PID(set_first(u->pids)));
bd44e61b 2108
efdb0237 2109 u->pids = set_free(u->pids);
a911bb9a
LP
2110}
2111
2112void unit_tidy_watch_pids(Unit *u, pid_t except1, pid_t except2) {
2113 Iterator i;
2114 void *e;
2115
2116 assert(u);
2117
2118 /* Cleans dead PIDs from our list */
2119
2120 SET_FOREACH(e, u->pids, i) {
fea72cc0 2121 pid_t pid = PTR_TO_PID(e);
a911bb9a
LP
2122
2123 if (pid == except1 || pid == except2)
2124 continue;
2125
9f5650ae 2126 if (!pid_is_unwaited(pid))
bd44e61b 2127 unit_unwatch_pid(u, pid);
a911bb9a 2128 }
87f0e418
LP
2129}
2130
87f0e418
LP
2131bool unit_job_is_applicable(Unit *u, JobType j) {
2132 assert(u);
2133 assert(j >= 0 && j < _JOB_TYPE_MAX);
2134
2135 switch (j) {
2136
2137 case JOB_VERIFY_ACTIVE:
2138 case JOB_START:
57339f47 2139 case JOB_STOP:
e0209d83 2140 case JOB_NOP:
87f0e418
LP
2141 return true;
2142
87f0e418
LP
2143 case JOB_RESTART:
2144 case JOB_TRY_RESTART:
2145 return unit_can_start(u);
2146
2147 case JOB_RELOAD:
3282591d 2148 case JOB_TRY_RELOAD:
87f0e418
LP
2149 return unit_can_reload(u);
2150
2151 case JOB_RELOAD_OR_START:
2152 return unit_can_reload(u) && unit_can_start(u);
2153
2154 default:
2155 assert_not_reached("Invalid job type");
2156 }
2157}
2158
f2341e0a
LP
2159static void maybe_warn_about_dependency(Unit *u, const char *other, UnitDependency dependency) {
2160 assert(u);
d1fab3fe 2161
f2341e0a
LP
2162 /* Only warn about some unit types */
2163 if (!IN_SET(dependency, UNIT_CONFLICTS, UNIT_CONFLICTED_BY, UNIT_BEFORE, UNIT_AFTER, UNIT_ON_FAILURE, UNIT_TRIGGERS, UNIT_TRIGGERED_BY))
2164 return;
3f3cc397 2165
f2341e0a
LP
2166 if (streq_ptr(u->id, other))
2167 log_unit_warning(u, "Dependency %s=%s dropped", unit_dependency_to_string(dependency), u->id);
2168 else
2169 log_unit_warning(u, "Dependency %s=%s dropped, merged into %s", unit_dependency_to_string(dependency), strna(other), u->id);
d1fab3fe
ZJS
2170}
2171
701cc384 2172int unit_add_dependency(Unit *u, UnitDependency d, Unit *other, bool add_reference) {
87f0e418
LP
2173
2174 static const UnitDependency inverse_table[_UNIT_DEPENDENCY_MAX] = {
2175 [UNIT_REQUIRES] = UNIT_REQUIRED_BY,
87f0e418 2176 [UNIT_WANTS] = UNIT_WANTED_BY,
be7d9ff7 2177 [UNIT_REQUISITE] = UNIT_REQUISITE_OF,
7f2cddae 2178 [UNIT_BINDS_TO] = UNIT_BOUND_BY,
60649f17 2179 [UNIT_PART_OF] = UNIT_CONSISTS_OF,
be7d9ff7 2180 [UNIT_REQUIRED_BY] = UNIT_REQUIRES,
be7d9ff7 2181 [UNIT_REQUISITE_OF] = UNIT_REQUISITE,
be7d9ff7 2182 [UNIT_WANTED_BY] = UNIT_WANTS,
7f2cddae 2183 [UNIT_BOUND_BY] = UNIT_BINDS_TO,
60649f17 2184 [UNIT_CONSISTS_OF] = UNIT_PART_OF,
69dd2852
LP
2185 [UNIT_CONFLICTS] = UNIT_CONFLICTED_BY,
2186 [UNIT_CONFLICTED_BY] = UNIT_CONFLICTS,
87f0e418 2187 [UNIT_BEFORE] = UNIT_AFTER,
701cc384 2188 [UNIT_AFTER] = UNIT_BEFORE,
5de9682c 2189 [UNIT_ON_FAILURE] = _UNIT_DEPENDENCY_INVALID,
701cc384 2190 [UNIT_REFERENCES] = UNIT_REFERENCED_BY,
57020a3a
LP
2191 [UNIT_REFERENCED_BY] = UNIT_REFERENCES,
2192 [UNIT_TRIGGERS] = UNIT_TRIGGERED_BY,
4dcc1cb4 2193 [UNIT_TRIGGERED_BY] = UNIT_TRIGGERS,
7f2cddae 2194 [UNIT_PROPAGATES_RELOAD_TO] = UNIT_RELOAD_PROPAGATED_FROM,
85e9a101 2195 [UNIT_RELOAD_PROPAGATED_FROM] = UNIT_PROPAGATES_RELOAD_TO,
613b411c 2196 [UNIT_JOINS_NAMESPACE_OF] = UNIT_JOINS_NAMESPACE_OF,
87f0e418 2197 };
701cc384 2198 int r, q = 0, v = 0, w = 0;
d1fab3fe 2199 Unit *orig_u = u, *orig_other = other;
87f0e418
LP
2200
2201 assert(u);
2202 assert(d >= 0 && d < _UNIT_DEPENDENCY_MAX);
87f0e418
LP
2203 assert(other);
2204
9f151f29
LP
2205 u = unit_follow_merge(u);
2206 other = unit_follow_merge(other);
2207
87f0e418
LP
2208 /* We won't allow dependencies on ourselves. We will not
2209 * consider them an error however. */
d1fab3fe 2210 if (u == other) {
f2341e0a 2211 maybe_warn_about_dependency(orig_u, orig_other->id, d);
87f0e418 2212 return 0;
d1fab3fe 2213 }
87f0e418 2214
d5099efc 2215 r = set_ensure_allocated(&u->dependencies[d], NULL);
613b411c 2216 if (r < 0)
87f0e418
LP
2217 return r;
2218
613b411c 2219 if (inverse_table[d] != _UNIT_DEPENDENCY_INVALID) {
d5099efc 2220 r = set_ensure_allocated(&other->dependencies[inverse_table[d]], NULL);
613b411c
LP
2221 if (r < 0)
2222 return r;
2223 }
2224
2225 if (add_reference) {
d5099efc 2226 r = set_ensure_allocated(&u->dependencies[UNIT_REFERENCES], NULL);
613b411c 2227 if (r < 0)
5de9682c
LP
2228 return r;
2229
d5099efc 2230 r = set_ensure_allocated(&other->dependencies[UNIT_REFERENCED_BY], NULL);
613b411c 2231 if (r < 0)
701cc384 2232 return r;
613b411c 2233 }
87f0e418 2234
613b411c
LP
2235 q = set_put(u->dependencies[d], other);
2236 if (q < 0)
701cc384 2237 return q;
87f0e418 2238
613b411c
LP
2239 if (inverse_table[d] != _UNIT_DEPENDENCY_INVALID && inverse_table[d] != d) {
2240 v = set_put(other->dependencies[inverse_table[d]], u);
2241 if (v < 0) {
5de9682c
LP
2242 r = v;
2243 goto fail;
2244 }
613b411c 2245 }
701cc384
LP
2246
2247 if (add_reference) {
613b411c
LP
2248 w = set_put(u->dependencies[UNIT_REFERENCES], other);
2249 if (w < 0) {
701cc384
LP
2250 r = w;
2251 goto fail;
2252 }
2253
613b411c
LP
2254 r = set_put(other->dependencies[UNIT_REFERENCED_BY], u);
2255 if (r < 0)
701cc384 2256 goto fail;
87f0e418
LP
2257 }
2258
c1e1601e 2259 unit_add_to_dbus_queue(u);
87f0e418 2260 return 0;
701cc384
LP
2261
2262fail:
2263 if (q > 0)
ac155bb8 2264 set_remove(u->dependencies[d], other);
701cc384
LP
2265
2266 if (v > 0)
ac155bb8 2267 set_remove(other->dependencies[inverse_table[d]], u);
701cc384
LP
2268
2269 if (w > 0)
ac155bb8 2270 set_remove(u->dependencies[UNIT_REFERENCES], other);
701cc384
LP
2271
2272 return r;
87f0e418 2273}
0301abf4 2274
2c966c03
LP
2275int unit_add_two_dependencies(Unit *u, UnitDependency d, UnitDependency e, Unit *other, bool add_reference) {
2276 int r;
2277
2278 assert(u);
2279
3f3cc397
LP
2280 r = unit_add_dependency(u, d, other, add_reference);
2281 if (r < 0)
2c966c03
LP
2282 return r;
2283
7410616c 2284 return unit_add_dependency(u, e, other, add_reference);
2c966c03
LP
2285}
2286
7410616c
LP
2287static int resolve_template(Unit *u, const char *name, const char*path, char **buf, const char **ret) {
2288 int r;
9e2f7c11
LP
2289
2290 assert(u);
2291 assert(name || path);
7410616c
LP
2292 assert(buf);
2293 assert(ret);
9e2f7c11
LP
2294
2295 if (!name)
2b6bf07d 2296 name = basename(path);
9e2f7c11 2297
7410616c
LP
2298 if (!unit_name_is_valid(name, UNIT_NAME_TEMPLATE)) {
2299 *buf = NULL;
2300 *ret = name;
2301 return 0;
9e2f7c11
LP
2302 }
2303
ac155bb8 2304 if (u->instance)
7410616c 2305 r = unit_name_replace_instance(name, u->instance, buf);
9e2f7c11 2306 else {
ae018d9b 2307 _cleanup_free_ char *i = NULL;
9e2f7c11 2308
7410616c
LP
2309 r = unit_name_to_prefix(u->id, &i);
2310 if (r < 0)
2311 return r;
9e2f7c11 2312
7410616c 2313 r = unit_name_replace_instance(name, i, buf);
9e2f7c11 2314 }
7410616c
LP
2315 if (r < 0)
2316 return r;
9e2f7c11 2317
7410616c
LP
2318 *ret = *buf;
2319 return 0;
9e2f7c11
LP
2320}
2321
701cc384 2322int unit_add_dependency_by_name(Unit *u, UnitDependency d, const char *name, const char *path, bool add_reference) {
7410616c 2323 _cleanup_free_ char *buf = NULL;
09b6b09f
LP
2324 Unit *other;
2325 int r;
2326
9e2f7c11
LP
2327 assert(u);
2328 assert(name || path);
09b6b09f 2329
7410616c
LP
2330 r = resolve_template(u, name, path, &buf, &name);
2331 if (r < 0)
2332 return r;
09b6b09f 2333
8afbb8e1
LP
2334 r = manager_load_unit(u->manager, name, path, NULL, &other);
2335 if (r < 0)
2336 return r;
9e2f7c11 2337
8afbb8e1 2338 return unit_add_dependency(u, d, other, add_reference);
09b6b09f
LP
2339}
2340
2c966c03 2341int unit_add_two_dependencies_by_name(Unit *u, UnitDependency d, UnitDependency e, const char *name, const char *path, bool add_reference) {
7410616c 2342 _cleanup_free_ char *buf = NULL;
2c966c03
LP
2343 Unit *other;
2344 int r;
2c966c03
LP
2345
2346 assert(u);
2347 assert(name || path);
2348
7410616c
LP
2349 r = resolve_template(u, name, path, &buf, &name);
2350 if (r < 0)
2351 return r;
2c966c03 2352
3f3cc397
LP
2353 r = manager_load_unit(u->manager, name, path, NULL, &other);
2354 if (r < 0)
68eda4bd 2355 return r;
2c966c03 2356
3f3cc397 2357 return unit_add_two_dependencies(u, d, e, other, add_reference);
2c966c03
LP
2358}
2359
0301abf4 2360int set_unit_path(const char *p) {
0301abf4 2361 /* This is mostly for debug purposes */
cbe46ead 2362 if (setenv("SYSTEMD_UNIT_PATH", p, 1) < 0)
26d04f86 2363 return -errno;
0301abf4
LP
2364
2365 return 0;
2366}
88066b3a 2367
ea430986 2368char *unit_dbus_path(Unit *u) {
ea430986
LP
2369 assert(u);
2370
ac155bb8 2371 if (!u->id)
04ade7d2
LP
2372 return NULL;
2373
48899192 2374 return unit_dbus_path_from_name(u->id);
ea430986
LP
2375}
2376
d79200e2
LP
2377int unit_set_slice(Unit *u, Unit *slice) {
2378 assert(u);
2379 assert(slice);
2380
2381 /* Sets the unit slice if it has not been set before. Is extra
2382 * careful, to only allow this for units that actually have a
2383 * cgroup context. Also, we don't allow to set this for slices
2384 * (since the parent slice is derived from the name). Make
2385 * sure the unit we set is actually a slice. */
2386
2387 if (!UNIT_HAS_CGROUP_CONTEXT(u))
2388 return -EOPNOTSUPP;
2389
2390 if (u->type == UNIT_SLICE)
2391 return -EINVAL;
2392
102ef982
LP
2393 if (unit_active_state(u) != UNIT_INACTIVE)
2394 return -EBUSY;
2395
d79200e2
LP
2396 if (slice->type != UNIT_SLICE)
2397 return -EINVAL;
2398
efdb0237
LP
2399 if (unit_has_name(u, SPECIAL_INIT_SCOPE) &&
2400 !unit_has_name(slice, SPECIAL_ROOT_SLICE))
2401 return -EPERM;
2402
d79200e2
LP
2403 if (UNIT_DEREF(u->slice) == slice)
2404 return 0;
2405
99e66921
TH
2406 /* Disallow slice changes if @u is already bound to cgroups */
2407 if (UNIT_ISSET(u->slice) && u->cgroup_realized)
d79200e2
LP
2408 return -EBUSY;
2409
99e66921 2410 unit_ref_unset(&u->slice);
d79200e2
LP
2411 unit_ref_set(&u->slice, slice);
2412 return 1;
2413}
2414
2415int unit_set_default_slice(Unit *u) {
a8833944
LP
2416 _cleanup_free_ char *b = NULL;
2417 const char *slice_name;
a016b922
LP
2418 Unit *slice;
2419 int r;
2420
2421 assert(u);
2422
9444b1f2 2423 if (UNIT_ISSET(u->slice))
a016b922
LP
2424 return 0;
2425
a8833944
LP
2426 if (u->instance) {
2427 _cleanup_free_ char *prefix = NULL, *escaped = NULL;
68eda4bd 2428
a8833944
LP
2429 /* Implicitly place all instantiated units in their
2430 * own per-template slice */
2431
7410616c
LP
2432 r = unit_name_to_prefix(u->id, &prefix);
2433 if (r < 0)
2434 return r;
a8833944
LP
2435
2436 /* The prefix is already escaped, but it might include
2437 * "-" which has a special meaning for slice units,
2438 * hence escape it here extra. */
7410616c 2439 escaped = unit_name_escape(prefix);
a8833944
LP
2440 if (!escaped)
2441 return -ENOMEM;
2442
463d0d15 2443 if (MANAGER_IS_SYSTEM(u->manager))
a8833944
LP
2444 b = strjoin("system-", escaped, ".slice", NULL);
2445 else
2446 b = strappend(escaped, ".slice");
2447 if (!b)
2448 return -ENOMEM;
2449
2450 slice_name = b;
2451 } else
2452 slice_name =
463d0d15 2453 MANAGER_IS_SYSTEM(u->manager) && !unit_has_name(u, SPECIAL_INIT_SCOPE)
a8833944
LP
2454 ? SPECIAL_SYSTEM_SLICE
2455 : SPECIAL_ROOT_SLICE;
2456
2457 r = manager_load_unit(u->manager, slice_name, NULL, NULL, &slice);
a016b922
LP
2458 if (r < 0)
2459 return r;
2460
d79200e2 2461 return unit_set_slice(u, slice);
a016b922
LP
2462}
2463
9444b1f2
LP
2464const char *unit_slice_name(Unit *u) {
2465 assert(u);
2466
2467 if (!UNIT_ISSET(u->slice))
2468 return NULL;
2469
2470 return UNIT_DEREF(u->slice)->id;
2471}
2472
f6ff8c29 2473int unit_load_related_unit(Unit *u, const char *type, Unit **_found) {
78edb35a 2474 _cleanup_free_ char *t = NULL;
f6ff8c29
LP
2475 int r;
2476
2477 assert(u);
2478 assert(type);
2479 assert(_found);
2480
7410616c
LP
2481 r = unit_name_change_suffix(u->id, type, &t);
2482 if (r < 0)
2483 return r;
2484 if (unit_has_name(u, t))
2485 return -EINVAL;
f6ff8c29 2486
ac155bb8 2487 r = manager_load_unit(u->manager, t, NULL, NULL, _found);
9e2f7c11 2488 assert(r < 0 || *_found != u);
f6ff8c29
LP
2489 return r;
2490}
2491
bbc29086
DM
2492static int signal_name_owner_changed(sd_bus_message *message, void *userdata, sd_bus_error *error) {
2493 const char *name, *old_owner, *new_owner;
2494 Unit *u = userdata;
2495 int r;
2496
2497 assert(message);
2498 assert(u);
2499
2500 r = sd_bus_message_read(message, "sss", &name, &old_owner, &new_owner);
2501 if (r < 0) {
2502 bus_log_parse_error(r);
2503 return 0;
2504 }
2505
2506 if (UNIT_VTABLE(u)->bus_name_owner_change)
2507 UNIT_VTABLE(u)->bus_name_owner_change(u, name, old_owner, new_owner);
2508
2509 return 0;
2510}
2511
9806e87d
LP
2512int unit_install_bus_match(Unit *u, sd_bus *bus, const char *name) {
2513 const char *match;
bbc29086 2514
9806e87d
LP
2515 assert(u);
2516 assert(bus);
2517 assert(name);
bbc29086
DM
2518
2519 if (u->match_bus_slot)
2520 return -EBUSY;
2521
9806e87d 2522 match = strjoina("type='signal',"
81d62103
ZJS
2523 "sender='org.freedesktop.DBus',"
2524 "path='/org/freedesktop/DBus',"
2525 "interface='org.freedesktop.DBus',"
2526 "member='NameOwnerChanged',"
2527 "arg0='", name, "'");
bbc29086
DM
2528
2529 return sd_bus_add_match(bus, &u->match_bus_slot, match, signal_name_owner_changed, u);
2530}
2531
05e343b7 2532int unit_watch_bus_name(Unit *u, const char *name) {
bbc29086
DM
2533 int r;
2534
05e343b7
LP
2535 assert(u);
2536 assert(name);
2537
2538 /* Watch a specific name on the bus. We only support one unit
2539 * watching each name for now. */
2540
bbc29086
DM
2541 if (u->manager->api_bus) {
2542 /* If the bus is already available, install the match directly.
2543 * Otherwise, just put the name in the list. bus_setup_api() will take care later. */
9806e87d 2544 r = unit_install_bus_match(u, u->manager->api_bus, name);
bbc29086 2545 if (r < 0)
8ea823b6 2546 return log_warning_errno(r, "Failed to subscribe to NameOwnerChanged signal for '%s': %m", name);
bbc29086
DM
2547 }
2548
2549 r = hashmap_put(u->manager->watch_bus, name, u);
2550 if (r < 0) {
2551 u->match_bus_slot = sd_bus_slot_unref(u->match_bus_slot);
2552 return log_warning_errno(r, "Failed to put bus name to hashmap: %m");
2553 }
2554
2555 return 0;
05e343b7
LP
2556}
2557
2558void unit_unwatch_bus_name(Unit *u, const char *name) {
2559 assert(u);
2560 assert(name);
2561
ac155bb8 2562 hashmap_remove_value(u->manager->watch_bus, name, u);
bbc29086 2563 u->match_bus_slot = sd_bus_slot_unref(u->match_bus_slot);
05e343b7
LP
2564}
2565
a16e1123
LP
2566bool unit_can_serialize(Unit *u) {
2567 assert(u);
2568
2569 return UNIT_VTABLE(u)->serialize && UNIT_VTABLE(u)->deserialize_item;
2570}
2571
6b78f9b4 2572int unit_serialize(Unit *u, FILE *f, FDSet *fds, bool serialize_jobs) {
a16e1123
LP
2573 int r;
2574
2575 assert(u);
2576 assert(f);
2577 assert(fds);
2578
9bdb98c5
LP
2579 if (unit_can_serialize(u)) {
2580 ExecRuntime *rt;
a16e1123 2581
9bdb98c5 2582 r = UNIT_VTABLE(u)->serialize(u, f, fds);
613b411c
LP
2583 if (r < 0)
2584 return r;
9bdb98c5
LP
2585
2586 rt = unit_get_exec_runtime(u);
2587 if (rt) {
f2341e0a 2588 r = exec_runtime_serialize(u, rt, f, fds);
9bdb98c5
LP
2589 if (r < 0)
2590 return r;
2591 }
e0209d83
MS
2592 }
2593
a483fb59
LP
2594 dual_timestamp_serialize(f, "state-change-timestamp", &u->state_change_timestamp);
2595
ac155bb8
MS
2596 dual_timestamp_serialize(f, "inactive-exit-timestamp", &u->inactive_exit_timestamp);
2597 dual_timestamp_serialize(f, "active-enter-timestamp", &u->active_enter_timestamp);
2598 dual_timestamp_serialize(f, "active-exit-timestamp", &u->active_exit_timestamp);
2599 dual_timestamp_serialize(f, "inactive-enter-timestamp", &u->inactive_enter_timestamp);
a483fb59 2600
ac155bb8 2601 dual_timestamp_serialize(f, "condition-timestamp", &u->condition_timestamp);
59fccdc5 2602 dual_timestamp_serialize(f, "assert-timestamp", &u->assert_timestamp);
2791a8f8 2603
ac155bb8
MS
2604 if (dual_timestamp_is_set(&u->condition_timestamp))
2605 unit_serialize_item(u, f, "condition-result", yes_no(u->condition_result));
10717a1a 2606
59fccdc5
LP
2607 if (dual_timestamp_is_set(&u->assert_timestamp))
2608 unit_serialize_item(u, f, "assert-result", yes_no(u->assert_result));
2609
c2756a68 2610 unit_serialize_item(u, f, "transient", yes_no(u->transient));
5ad096b3 2611 unit_serialize_item_format(u, f, "cpuacct-usage-base", "%" PRIu64, u->cpuacct_usage_base);
c2756a68
LP
2612
2613 if (u->cgroup_path)
2614 unit_serialize_item(u, f, "cgroup", u->cgroup_path);
de1d4f9b 2615 unit_serialize_item(u, f, "cgroup-realized", yes_no(u->cgroup_realized));
c2756a68 2616
613b411c
LP
2617 if (serialize_jobs) {
2618 if (u->job) {
2619 fprintf(f, "job\n");
2620 job_serialize(u->job, f, fds);
2621 }
2622
2623 if (u->nop_job) {
2624 fprintf(f, "job\n");
2625 job_serialize(u->nop_job, f, fds);
2626 }
2627 }
2628
a16e1123
LP
2629 /* End marker */
2630 fputc('\n', f);
2631 return 0;
2632}
2633
a34ceba6
LP
2634int unit_serialize_item(Unit *u, FILE *f, const char *key, const char *value) {
2635 assert(u);
2636 assert(f);
2637 assert(key);
2638
2639 if (!value)
2640 return 0;
2641
2642 fputs(key, f);
2643 fputc('=', f);
2644 fputs(value, f);
2645 fputc('\n', f);
2646
2647 return 1;
2648}
2649
2650int unit_serialize_item_escaped(Unit *u, FILE *f, const char *key, const char *value) {
2651 _cleanup_free_ char *c = NULL;
2652
2653 assert(u);
2654 assert(f);
2655 assert(key);
2656
2657 if (!value)
2658 return 0;
2659
2660 c = cescape(value);
2661 if (!c)
2662 return -ENOMEM;
2663
2664 fputs(key, f);
2665 fputc('=', f);
2666 fputs(c, f);
2667 fputc('\n', f);
2668
2669 return 1;
2670}
2671
2672int unit_serialize_item_fd(Unit *u, FILE *f, FDSet *fds, const char *key, int fd) {
2673 int copy;
2674
2675 assert(u);
2676 assert(f);
2677 assert(key);
2678
2679 if (fd < 0)
2680 return 0;
2681
2682 copy = fdset_put_dup(fds, fd);
2683 if (copy < 0)
2684 return copy;
2685
2686 fprintf(f, "%s=%i\n", key, copy);
2687 return 1;
2688}
2689
a16e1123
LP
2690void unit_serialize_item_format(Unit *u, FILE *f, const char *key, const char *format, ...) {
2691 va_list ap;
2692
2693 assert(u);
2694 assert(f);
2695 assert(key);
2696 assert(format);
2697
2698 fputs(key, f);
2699 fputc('=', f);
2700
2701 va_start(ap, format);
2702 vfprintf(f, format, ap);
2703 va_end(ap);
2704
2705 fputc('\n', f);
2706}
2707
a16e1123 2708int unit_deserialize(Unit *u, FILE *f, FDSet *fds) {
28b99ccd 2709 ExecRuntime **rt = NULL;
9bdb98c5 2710 size_t offset;
a16e1123
LP
2711 int r;
2712
2713 assert(u);
2714 assert(f);
2715 assert(fds);
2716
613b411c
LP
2717 offset = UNIT_VTABLE(u)->exec_runtime_offset;
2718 if (offset > 0)
2719 rt = (ExecRuntime**) ((uint8_t*) u + offset);
2720
a16e1123 2721 for (;;) {
20c03b7b 2722 char line[LINE_MAX], *l, *v;
a16e1123
LP
2723 size_t k;
2724
2725 if (!fgets(line, sizeof(line), f)) {
2726 if (feof(f))
2727 return 0;
2728 return -errno;
2729 }
2730
10f8e83c 2731 char_array_0(line);
a16e1123
LP
2732 l = strstrip(line);
2733
2734 /* End marker */
e911de99 2735 if (isempty(l))
a483fb59 2736 break;
a16e1123
LP
2737
2738 k = strcspn(l, "=");
2739
2740 if (l[k] == '=') {
2741 l[k] = 0;
2742 v = l+k+1;
2743 } else
2744 v = l+k;
2745
cca098b0 2746 if (streq(l, "job")) {
39a18c60
MS
2747 if (v[0] == '\0') {
2748 /* new-style serialized job */
9c3349e2
LP
2749 Job *j;
2750
2751 j = job_new_raw(u);
39a18c60 2752 if (!j)
e911de99 2753 return log_oom();
39a18c60
MS
2754
2755 r = job_deserialize(j, f, fds);
2756 if (r < 0) {
2757 job_free(j);
2758 return r;
2759 }
cca098b0 2760
39a18c60
MS
2761 r = hashmap_put(u->manager->jobs, UINT32_TO_PTR(j->id), j);
2762 if (r < 0) {
2763 job_free(j);
2764 return r;
2765 }
e0209d83
MS
2766
2767 r = job_install_deserialized(j);
2768 if (r < 0) {
2769 hashmap_remove(u->manager->jobs, UINT32_TO_PTR(j->id));
2770 job_free(j);
2771 return r;
2772 }
ed10fa8c
LP
2773 } else /* legacy for pre-44 */
2774 log_unit_warning(u, "Update from too old systemd versions are unsupported, cannot deserialize job: %s", v);
cca098b0 2775 continue;
a483fb59
LP
2776 } else if (streq(l, "state-change-timestamp")) {
2777 dual_timestamp_deserialize(v, &u->state_change_timestamp);
2778 continue;
8aaf019b 2779 } else if (streq(l, "inactive-exit-timestamp")) {
ac155bb8 2780 dual_timestamp_deserialize(v, &u->inactive_exit_timestamp);
8aaf019b
LP
2781 continue;
2782 } else if (streq(l, "active-enter-timestamp")) {
ac155bb8 2783 dual_timestamp_deserialize(v, &u->active_enter_timestamp);
8aaf019b
LP
2784 continue;
2785 } else if (streq(l, "active-exit-timestamp")) {
ac155bb8 2786 dual_timestamp_deserialize(v, &u->active_exit_timestamp);
8aaf019b
LP
2787 continue;
2788 } else if (streq(l, "inactive-enter-timestamp")) {
ac155bb8 2789 dual_timestamp_deserialize(v, &u->inactive_enter_timestamp);
8aaf019b 2790 continue;
2791a8f8 2791 } else if (streq(l, "condition-timestamp")) {
ac155bb8 2792 dual_timestamp_deserialize(v, &u->condition_timestamp);
2791a8f8 2793 continue;
59fccdc5
LP
2794 } else if (streq(l, "assert-timestamp")) {
2795 dual_timestamp_deserialize(v, &u->assert_timestamp);
2796 continue;
2791a8f8 2797 } else if (streq(l, "condition-result")) {
2791a8f8 2798
e911de99
LP
2799 r = parse_boolean(v);
2800 if (r < 0)
f2341e0a 2801 log_unit_debug(u, "Failed to parse condition result value %s, ignoring.", v);
2791a8f8 2802 else
e911de99 2803 u->condition_result = r;
efbac6d2
LP
2804
2805 continue;
c2756a68 2806
59fccdc5 2807 } else if (streq(l, "assert-result")) {
59fccdc5 2808
e911de99
LP
2809 r = parse_boolean(v);
2810 if (r < 0)
f2341e0a 2811 log_unit_debug(u, "Failed to parse assert result value %s, ignoring.", v);
59fccdc5 2812 else
e911de99 2813 u->assert_result = r;
59fccdc5
LP
2814
2815 continue;
2816
c2756a68 2817 } else if (streq(l, "transient")) {
c2756a68 2818
e911de99
LP
2819 r = parse_boolean(v);
2820 if (r < 0)
f2341e0a 2821 log_unit_debug(u, "Failed to parse transient bool %s, ignoring.", v);
c2756a68 2822 else
e911de99 2823 u->transient = r;
c2756a68
LP
2824
2825 continue;
e911de99 2826
5ad096b3
LP
2827 } else if (streq(l, "cpuacct-usage-base")) {
2828
2829 r = safe_atou64(v, &u->cpuacct_usage_base);
2830 if (r < 0)
f2341e0a 2831 log_unit_debug(u, "Failed to parse CPU usage %s, ignoring.", v);
5ad096b3 2832
0f908397 2833 continue;
4e595329 2834
e911de99 2835 } else if (streq(l, "cgroup")) {
72673e86 2836
e911de99
LP
2837 r = unit_set_cgroup_path(u, v);
2838 if (r < 0)
f2341e0a 2839 log_unit_debug_errno(u, r, "Failed to set cgroup path %s, ignoring: %m", v);
4e595329 2840
efdb0237
LP
2841 (void) unit_watch_cgroup(u);
2842
de1d4f9b
WF
2843 continue;
2844 } else if (streq(l, "cgroup-realized")) {
2845 int b;
2846
2847 b = parse_boolean(v);
2848 if (b < 0)
2849 log_unit_debug(u, "Failed to parse cgroup-realized bool %s, ignoring.", v);
2850 else
2851 u->cgroup_realized = b;
2852
c2756a68 2853 continue;
8aaf019b 2854 }
cca098b0 2855
9bdb98c5
LP
2856 if (unit_can_serialize(u)) {
2857 if (rt) {
f2341e0a 2858 r = exec_runtime_deserialize_item(u, rt, l, v, fds);
e911de99 2859 if (r < 0) {
f2341e0a 2860 log_unit_warning(u, "Failed to deserialize runtime parameter '%s', ignoring.", l);
e911de99
LP
2861 continue;
2862 }
2863
2864 /* Returns positive if key was handled by the call */
9bdb98c5
LP
2865 if (r > 0)
2866 continue;
2867 }
2868
2869 r = UNIT_VTABLE(u)->deserialize_item(u, l, v, fds);
613b411c 2870 if (r < 0)
f2341e0a 2871 log_unit_warning(u, "Failed to deserialize unit parameter '%s', ignoring.", l);
613b411c 2872 }
a16e1123 2873 }
a483fb59
LP
2874
2875 /* Versions before 228 did not carry a state change timestamp. In this case, take the current time. This is
2876 * useful, so that timeouts based on this timestamp don't trigger too early, and is in-line with the logic from
1f133e0d 2877 * before 228 where the base for timeouts was not persistent across reboots. */
a483fb59
LP
2878
2879 if (!dual_timestamp_is_set(&u->state_change_timestamp))
2880 dual_timestamp_get(&u->state_change_timestamp);
2881
2882 return 0;
a16e1123
LP
2883}
2884
9d06297e 2885int unit_add_node_link(Unit *u, const char *what, bool wants, UnitDependency dep) {
6e2ef85b 2886 Unit *device;
68eda4bd 2887 _cleanup_free_ char *e = NULL;
6e2ef85b
LP
2888 int r;
2889
2890 assert(u);
2891
6e2ef85b 2892 /* Adds in links to the device node that this unit is based on */
47bc12e1
LP
2893 if (isempty(what))
2894 return 0;
6e2ef85b 2895
8407a5d0 2896 if (!is_device_path(what))
6e2ef85b
LP
2897 return 0;
2898
47bc12e1
LP
2899 /* When device units aren't supported (such as in a
2900 * container), don't create dependencies on them. */
1c2e9646 2901 if (!unit_type_supported(UNIT_DEVICE))
47bc12e1
LP
2902 return 0;
2903
7410616c
LP
2904 r = unit_name_from_path(what, ".device", &e);
2905 if (r < 0)
2906 return r;
6e2ef85b 2907
ac155bb8 2908 r = manager_load_unit(u->manager, e, NULL, NULL, &device);
6e2ef85b
LP
2909 if (r < 0)
2910 return r;
2911
9d06297e 2912 r = unit_add_two_dependencies(u, UNIT_AFTER,
463d0d15 2913 MANAGER_IS_SYSTEM(u->manager) ? dep : UNIT_WANTS,
9d06297e 2914 device, true);
faa368e3 2915 if (r < 0)
6e2ef85b
LP
2916 return r;
2917
faa368e3
LP
2918 if (wants) {
2919 r = unit_add_dependency(device, UNIT_WANTS, u, false);
2920 if (r < 0)
6e2ef85b 2921 return r;
faa368e3 2922 }
6e2ef85b
LP
2923
2924 return 0;
2925}
a16e1123 2926
be847e82 2927int unit_coldplug(Unit *u) {
5a6158b6 2928 int r = 0, q = 0;
cca098b0
LP
2929
2930 assert(u);
2931
f78f265f
LP
2932 /* Make sure we don't enter a loop, when coldplugging
2933 * recursively. */
2934 if (u->coldplugged)
2935 return 0;
2936
2937 u->coldplugged = true;
2938
5a6158b6 2939 if (UNIT_VTABLE(u)->coldplug)
f78f265f 2940 r = UNIT_VTABLE(u)->coldplug(u);
cca098b0 2941
5a6158b6
LP
2942 if (u->job)
2943 q = job_coldplug(u->job);
2944
2945 if (r < 0)
2946 return r;
2947 if (q < 0)
2948 return q;
cca098b0
LP
2949
2950 return 0;
2951}
2952
87ec20ef 2953static bool fragment_mtime_newer(const char *path, usec_t mtime) {
21b95806
ZJS
2954 struct stat st;
2955
2956 if (!path)
2957 return false;
2958
2959 if (stat(path, &st) < 0)
2960 /* What, cannot access this anymore? */
2961 return true;
2962
3a8db9fe
ZJS
2963 if (mtime > 0)
2964 /* For non-empty files check the mtime */
87ec20ef 2965 return timespec_load(&st.st_mtim) > mtime;
3a8db9fe
ZJS
2966 else if (!null_or_empty(&st))
2967 /* For masked files check if they are still so */
21b95806
ZJS
2968 return true;
2969
2970 return false;
2971}
2972
45fb0699 2973bool unit_need_daemon_reload(Unit *u) {
ae7a7182
OS
2974 _cleanup_strv_free_ char **t = NULL;
2975 char **path;
1b64d026 2976
45fb0699
LP
2977 assert(u);
2978
ab932a62 2979 if (fragment_mtime_newer(u->fragment_path, u->fragment_mtime))
21b95806 2980 return true;
5f4b19f4 2981
ab932a62
LP
2982 if (fragment_mtime_newer(u->source_path, u->source_mtime))
2983 return true;
ae7a7182 2984
ab932a62
LP
2985 (void) unit_find_dropin_paths(u, &t);
2986 if (!strv_equal(u->dropin_paths, t))
2987 return true;
6d10d308 2988
ab932a62
LP
2989 STRV_FOREACH(path, u->dropin_paths)
2990 if (fragment_mtime_newer(*path, u->dropin_mtime))
2991 return true;
21b95806 2992
ab932a62 2993 return false;
45fb0699
LP
2994}
2995
fdf20a31 2996void unit_reset_failed(Unit *u) {
5632e374
LP
2997 assert(u);
2998
fdf20a31
MM
2999 if (UNIT_VTABLE(u)->reset_failed)
3000 UNIT_VTABLE(u)->reset_failed(u);
6bf0f408
LP
3001
3002 RATELIMIT_RESET(u->start_limit);
3003 u->start_limit_hit = false;
5632e374
LP
3004}
3005
a7f241db
LP
3006Unit *unit_following(Unit *u) {
3007 assert(u);
3008
3009 if (UNIT_VTABLE(u)->following)
3010 return UNIT_VTABLE(u)->following(u);
3011
3012 return NULL;
3013}
3014
31afa0a4 3015bool unit_stop_pending(Unit *u) {
18ffdfda
LP
3016 assert(u);
3017
31afa0a4
LP
3018 /* This call does check the current state of the unit. It's
3019 * hence useful to be called from state change calls of the
3020 * unit itself, where the state isn't updated yet. This is
3021 * different from unit_inactive_or_pending() which checks both
3022 * the current state and for a queued job. */
18ffdfda 3023
31afa0a4
LP
3024 return u->job && u->job->type == JOB_STOP;
3025}
3026
3027bool unit_inactive_or_pending(Unit *u) {
3028 assert(u);
3029
3030 /* Returns true if the unit is inactive or going down */
18ffdfda 3031
d956ac29
LP
3032 if (UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(u)))
3033 return true;
3034
31afa0a4 3035 if (unit_stop_pending(u))
18ffdfda
LP
3036 return true;
3037
3038 return false;
3039}
3040
31afa0a4 3041bool unit_active_or_pending(Unit *u) {
f976f3f6
LP
3042 assert(u);
3043
f60c2665 3044 /* Returns true if the unit is active or going up */
f976f3f6
LP
3045
3046 if (UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u)))
3047 return true;
3048
ac155bb8
MS
3049 if (u->job &&
3050 (u->job->type == JOB_START ||
3051 u->job->type == JOB_RELOAD_OR_START ||
3052 u->job->type == JOB_RESTART))
f976f3f6
LP
3053 return true;
3054
3055 return false;
3056}
3057
718db961 3058int unit_kill(Unit *u, KillWho w, int signo, sd_bus_error *error) {
8a0867d6
LP
3059 assert(u);
3060 assert(w >= 0 && w < _KILL_WHO_MAX);
6eb7c172 3061 assert(SIGNAL_VALID(signo));
8a0867d6 3062
8a0867d6 3063 if (!UNIT_VTABLE(u)->kill)
15411c0c 3064 return -EOPNOTSUPP;
8a0867d6 3065
c74f17d9 3066 return UNIT_VTABLE(u)->kill(u, w, signo, error);
8a0867d6
LP
3067}
3068
82659fd7
LP
3069static Set *unit_pid_set(pid_t main_pid, pid_t control_pid) {
3070 Set *pid_set;
3071 int r;
3072
d5099efc 3073 pid_set = set_new(NULL);
82659fd7
LP
3074 if (!pid_set)
3075 return NULL;
3076
3077 /* Exclude the main/control pids from being killed via the cgroup */
3078 if (main_pid > 0) {
fea72cc0 3079 r = set_put(pid_set, PID_TO_PTR(main_pid));
82659fd7
LP
3080 if (r < 0)
3081 goto fail;
3082 }
3083
3084 if (control_pid > 0) {
fea72cc0 3085 r = set_put(pid_set, PID_TO_PTR(control_pid));
82659fd7
LP
3086 if (r < 0)
3087 goto fail;
3088 }
3089
3090 return pid_set;
3091
3092fail:
3093 set_free(pid_set);
3094 return NULL;
3095}
3096
d91c34f2
LP
3097int unit_kill_common(
3098 Unit *u,
3099 KillWho who,
3100 int signo,
3101 pid_t main_pid,
3102 pid_t control_pid,
718db961 3103 sd_bus_error *error) {
d91c34f2 3104
814cc562 3105 int r = 0;
ac5e3a50 3106 bool killed = false;
814cc562 3107
ac5e3a50 3108 if (IN_SET(who, KILL_MAIN, KILL_MAIN_FAIL)) {
814cc562 3109 if (main_pid < 0)
7358dc02 3110 return sd_bus_error_setf(error, BUS_ERROR_NO_SUCH_PROCESS, "%s units have no main processes", unit_type_to_string(u->type));
52f448c3 3111 else if (main_pid == 0)
7358dc02 3112 return sd_bus_error_set_const(error, BUS_ERROR_NO_SUCH_PROCESS, "No main process to kill");
814cc562
MS
3113 }
3114
ac5e3a50 3115 if (IN_SET(who, KILL_CONTROL, KILL_CONTROL_FAIL)) {
814cc562 3116 if (control_pid < 0)
7358dc02 3117 return sd_bus_error_setf(error, BUS_ERROR_NO_SUCH_PROCESS, "%s units have no control processes", unit_type_to_string(u->type));
52f448c3 3118 else if (control_pid == 0)
7358dc02 3119 return sd_bus_error_set_const(error, BUS_ERROR_NO_SUCH_PROCESS, "No control process to kill");
814cc562
MS
3120 }
3121
ac5e3a50
JS
3122 if (IN_SET(who, KILL_CONTROL, KILL_CONTROL_FAIL, KILL_ALL, KILL_ALL_FAIL))
3123 if (control_pid > 0) {
814cc562
MS
3124 if (kill(control_pid, signo) < 0)
3125 r = -errno;
ac5e3a50
JS
3126 else
3127 killed = true;
3128 }
814cc562 3129
ac5e3a50
JS
3130 if (IN_SET(who, KILL_MAIN, KILL_MAIN_FAIL, KILL_ALL, KILL_ALL_FAIL))
3131 if (main_pid > 0) {
814cc562
MS
3132 if (kill(main_pid, signo) < 0)
3133 r = -errno;
ac5e3a50
JS
3134 else
3135 killed = true;
3136 }
814cc562 3137
ac5e3a50 3138 if (IN_SET(who, KILL_ALL, KILL_ALL_FAIL) && u->cgroup_path) {
814cc562
MS
3139 _cleanup_set_free_ Set *pid_set = NULL;
3140 int q;
3141
82659fd7
LP
3142 /* Exclude the main/control pids from being killed via the cgroup */
3143 pid_set = unit_pid_set(main_pid, control_pid);
814cc562
MS
3144 if (!pid_set)
3145 return -ENOMEM;
3146
1d98fef1 3147 q = cg_kill_recursive(SYSTEMD_CGROUP_CONTROLLER, u->cgroup_path, signo, 0, pid_set, NULL, NULL);
814cc562
MS
3148 if (q < 0 && q != -EAGAIN && q != -ESRCH && q != -ENOENT)
3149 r = q;
ac5e3a50
JS
3150 else
3151 killed = true;
814cc562
MS
3152 }
3153
201f0c91 3154 if (r == 0 && !killed && IN_SET(who, KILL_ALL_FAIL, KILL_CONTROL_FAIL))
ac5e3a50
JS
3155 return -ESRCH;
3156
814cc562
MS
3157 return r;
3158}
3159
6210e7fc
LP
3160int unit_following_set(Unit *u, Set **s) {
3161 assert(u);
3162 assert(s);
3163
3164 if (UNIT_VTABLE(u)->following_set)
3165 return UNIT_VTABLE(u)->following_set(u, s);
3166
3167 *s = NULL;
3168 return 0;
3169}
3170
a4375746 3171UnitFileState unit_get_unit_file_state(Unit *u) {
0ec0deaa
LP
3172 int r;
3173
a4375746
LP
3174 assert(u);
3175
0ec0deaa
LP
3176 if (u->unit_file_state < 0 && u->fragment_path) {
3177 r = unit_file_get_state(
463d0d15 3178 u->manager->unit_file_scope,
0ec0deaa
LP
3179 NULL,
3180 basename(u->fragment_path),
3181 &u->unit_file_state);
3182 if (r < 0)
3183 u->unit_file_state = UNIT_FILE_BAD;
3184 }
a4375746 3185
ac155bb8 3186 return u->unit_file_state;
a4375746
LP
3187}
3188
d2dc52db
LP
3189int unit_get_unit_file_preset(Unit *u) {
3190 assert(u);
3191
3192 if (u->unit_file_preset < 0 && u->fragment_path)
3193 u->unit_file_preset = unit_file_query_preset(
463d0d15 3194 u->manager->unit_file_scope,
0ec0deaa
LP
3195 NULL,
3196 basename(u->fragment_path));
d2dc52db
LP
3197
3198 return u->unit_file_preset;
3199}
3200
57020a3a
LP
3201Unit* unit_ref_set(UnitRef *ref, Unit *u) {
3202 assert(ref);
3203 assert(u);
3204
3205 if (ref->unit)
3206 unit_ref_unset(ref);
3207
3208 ref->unit = u;
71fda00f 3209 LIST_PREPEND(refs, u->refs, ref);
57020a3a
LP
3210 return u;
3211}
3212
3213void unit_ref_unset(UnitRef *ref) {
3214 assert(ref);
3215
3216 if (!ref->unit)
3217 return;
3218
b75102e5
LP
3219 /* We are about to drop a reference to the unit, make sure the garbage collection has a look at it as it might
3220 * be unreferenced now. */
3221 unit_add_to_gc_queue(ref->unit);
3222
71fda00f 3223 LIST_REMOVE(refs, ref->unit->refs, ref);
57020a3a
LP
3224 ref->unit = NULL;
3225}
3226
29206d46
LP
3227static int user_from_unit_name(Unit *u, char **ret) {
3228
3229 static const uint8_t hash_key[] = {
3230 0x58, 0x1a, 0xaf, 0xe6, 0x28, 0x58, 0x4e, 0x96,
3231 0xb4, 0x4e, 0xf5, 0x3b, 0x8c, 0x92, 0x07, 0xec
3232 };
3233
3234 _cleanup_free_ char *n = NULL;
3235 int r;
3236
3237 r = unit_name_to_prefix(u->id, &n);
3238 if (r < 0)
3239 return r;
3240
3241 if (valid_user_group_name(n)) {
3242 *ret = n;
3243 n = NULL;
3244 return 0;
3245 }
3246
3247 /* If we can't use the unit name as a user name, then let's hash it and use that */
3248 if (asprintf(ret, "_du%016" PRIx64, siphash24(n, strlen(n), hash_key)) < 0)
3249 return -ENOMEM;
3250
3251 return 0;
3252}
3253
598459ce
LP
3254int unit_patch_contexts(Unit *u) {
3255 CGroupContext *cc;
3256 ExecContext *ec;
cba6e062
LP
3257 unsigned i;
3258 int r;
3259
e06c73cc 3260 assert(u);
e06c73cc 3261
598459ce
LP
3262 /* Patch in the manager defaults into the exec and cgroup
3263 * contexts, _after_ the rest of the settings have been
3264 * initialized */
085afe36 3265
598459ce
LP
3266 ec = unit_get_exec_context(u);
3267 if (ec) {
3268 /* This only copies in the ones that need memory */
3269 for (i = 0; i < _RLIMIT_MAX; i++)
3270 if (u->manager->rlimit[i] && !ec->rlimit[i]) {
3271 ec->rlimit[i] = newdup(struct rlimit, u->manager->rlimit[i], 1);
3272 if (!ec->rlimit[i])
3273 return -ENOMEM;
3274 }
3275
463d0d15 3276 if (MANAGER_IS_USER(u->manager) &&
598459ce
LP
3277 !ec->working_directory) {
3278
3279 r = get_home_dir(&ec->working_directory);
3280 if (r < 0)
3281 return r;
4c08c824
LP
3282
3283 /* Allow user services to run, even if the
3284 * home directory is missing */
3285 ec->working_directory_missing_ok = true;
cba6e062
LP
3286 }
3287
463d0d15 3288 if (MANAGER_IS_USER(u->manager) &&
598459ce
LP
3289 (ec->syscall_whitelist ||
3290 !set_isempty(ec->syscall_filter) ||
3291 !set_isempty(ec->syscall_archs) ||
3292 ec->address_families_whitelist ||
3293 !set_isempty(ec->address_families)))
3294 ec->no_new_privileges = true;
e06c73cc 3295
598459ce 3296 if (ec->private_devices)
a103496c 3297 ec->capability_bounding_set &= ~(UINT64_C(1) << CAP_MKNOD);
29206d46
LP
3298
3299 if (ec->dynamic_user) {
3300 if (!ec->user) {
3301 r = user_from_unit_name(u, &ec->user);
3302 if (r < 0)
3303 return r;
3304 }
3305
3306 if (!ec->group) {
3307 ec->group = strdup(ec->user);
3308 if (!ec->group)
3309 return -ENOMEM;
3310 }
3311
3312 ec->private_tmp = true;
3313 }
cba6e062
LP
3314 }
3315
598459ce
LP
3316 cc = unit_get_cgroup_context(u);
3317 if (cc) {
f513e420 3318
598459ce
LP
3319 if (ec &&
3320 ec->private_devices &&
3321 cc->device_policy == CGROUP_AUTO)
3322 cc->device_policy = CGROUP_CLOSED;
3323 }
f1660f96 3324
cba6e062 3325 return 0;
e06c73cc
LP
3326}
3327
3ef63c31
LP
3328ExecContext *unit_get_exec_context(Unit *u) {
3329 size_t offset;
3330 assert(u);
3331
598459ce
LP
3332 if (u->type < 0)
3333 return NULL;
3334
3ef63c31
LP
3335 offset = UNIT_VTABLE(u)->exec_context_offset;
3336 if (offset <= 0)
3337 return NULL;
3338
3339 return (ExecContext*) ((uint8_t*) u + offset);
3340}
3341
718db961
LP
3342KillContext *unit_get_kill_context(Unit *u) {
3343 size_t offset;
3344 assert(u);
3345
598459ce
LP
3346 if (u->type < 0)
3347 return NULL;
3348
718db961
LP
3349 offset = UNIT_VTABLE(u)->kill_context_offset;
3350 if (offset <= 0)
3351 return NULL;
3352
3353 return (KillContext*) ((uint8_t*) u + offset);
3354}
3355
4ad49000
LP
3356CGroupContext *unit_get_cgroup_context(Unit *u) {
3357 size_t offset;
3358
598459ce
LP
3359 if (u->type < 0)
3360 return NULL;
3361
4ad49000
LP
3362 offset = UNIT_VTABLE(u)->cgroup_context_offset;
3363 if (offset <= 0)
3364 return NULL;
3365
3366 return (CGroupContext*) ((uint8_t*) u + offset);
3367}
3368
613b411c
LP
3369ExecRuntime *unit_get_exec_runtime(Unit *u) {
3370 size_t offset;
3371
598459ce
LP
3372 if (u->type < 0)
3373 return NULL;
3374
613b411c
LP
3375 offset = UNIT_VTABLE(u)->exec_runtime_offset;
3376 if (offset <= 0)
3377 return NULL;
3378
3379 return *(ExecRuntime**) ((uint8_t*) u + offset);
3380}
3381
39591351 3382static const char* unit_drop_in_dir(Unit *u, UnitSetPropertiesMode mode) {
3f5e8115
LP
3383 assert(u);
3384
4f4afc88
LP
3385 if (!IN_SET(mode, UNIT_RUNTIME, UNIT_PERSISTENT))
3386 return NULL;
3387
39591351
LP
3388 if (u->transient) /* Redirect drop-ins for transient units always into the transient directory. */
3389 return u->manager->lookup_paths.transient;
26d04f86 3390
39591351 3391 if (mode == UNIT_RUNTIME)
4f4afc88 3392 return u->manager->lookup_paths.runtime_control;
3f5e8115 3393
39591351 3394 if (mode == UNIT_PERSISTENT)
4f4afc88 3395 return u->manager->lookup_paths.persistent_control;
26d04f86 3396
39591351 3397 return NULL;
71645aca
LP
3398}
3399
8e2af478 3400int unit_write_drop_in(Unit *u, UnitSetPropertiesMode mode, const char *name, const char *data) {
39591351 3401 _cleanup_free_ char *p = NULL, *q = NULL;
2a9a6f8a 3402 const char *dir, *wrapped;
26d04f86 3403 int r;
71645aca
LP
3404
3405 assert(u);
3406
4f4afc88
LP
3407 if (u->transient_file) {
3408 /* When this is a transient unit file in creation, then let's not create a new drop-in but instead
3409 * write to the transient unit file. */
3410 fputs(data, u->transient_file);
fc40065b 3411 fputc('\n', u->transient_file);
4f4afc88
LP
3412 return 0;
3413 }
3414
6d235724 3415 if (!IN_SET(mode, UNIT_PERSISTENT, UNIT_RUNTIME))
8e2af478
LP
3416 return 0;
3417
39591351
LP
3418 dir = unit_drop_in_dir(u, mode);
3419 if (!dir)
3420 return -EINVAL;
71645aca 3421
2a9a6f8a 3422 wrapped = strjoina("# This is a drop-in unit file extension, created via \"systemctl set-property\"\n"
3f71dec5 3423 "# or an equivalent operation. Do not edit.\n",
2a9a6f8a
ZJS
3424 data,
3425 "\n");
e20b2a86 3426
815b09d3 3427 r = drop_in_file(dir, u->id, 50, name, &p, &q);
adb76a70
WC
3428 if (r < 0)
3429 return r;
3430
815b09d3 3431 (void) mkdir_p(p, 0755);
2a9a6f8a 3432 r = write_string_file_atomic_label(q, wrapped);
adb76a70
WC
3433 if (r < 0)
3434 return r;
3435
815b09d3 3436 r = strv_push(&u->dropin_paths, q);
adb76a70
WC
3437 if (r < 0)
3438 return r;
815b09d3 3439 q = NULL;
adb76a70 3440
adb76a70
WC
3441 strv_uniq(u->dropin_paths);
3442
3443 u->dropin_mtime = now(CLOCK_REALTIME);
3444
3445 return 0;
26d04f86 3446}
71645aca 3447
b9ec9359
LP
3448int unit_write_drop_in_format(Unit *u, UnitSetPropertiesMode mode, const char *name, const char *format, ...) {
3449 _cleanup_free_ char *p = NULL;
3450 va_list ap;
3451 int r;
3452
3453 assert(u);
3454 assert(name);
3455 assert(format);
3456
6d235724 3457 if (!IN_SET(mode, UNIT_PERSISTENT, UNIT_RUNTIME))
b9ec9359
LP
3458 return 0;
3459
3460 va_start(ap, format);
3461 r = vasprintf(&p, format, ap);
3462 va_end(ap);
3463
3464 if (r < 0)
3465 return -ENOMEM;
3466
3467 return unit_write_drop_in(u, mode, name, p);
3468}
3469
3470int unit_write_drop_in_private(Unit *u, UnitSetPropertiesMode mode, const char *name, const char *data) {
39591351 3471 const char *ndata;
b42defe3
LP
3472
3473 assert(u);
3474 assert(name);
3475 assert(data);
3476
3477 if (!UNIT_VTABLE(u)->private_section)
3478 return -EINVAL;
3479
6d235724 3480 if (!IN_SET(mode, UNIT_PERSISTENT, UNIT_RUNTIME))
b9ec9359
LP
3481 return 0;
3482
81d62103 3483 ndata = strjoina("[", UNIT_VTABLE(u)->private_section, "]\n", data);
b42defe3
LP
3484
3485 return unit_write_drop_in(u, mode, name, ndata);
3486}
3487
b9ec9359
LP
3488int unit_write_drop_in_private_format(Unit *u, UnitSetPropertiesMode mode, const char *name, const char *format, ...) {
3489 _cleanup_free_ char *p = NULL;
3490 va_list ap;
3491 int r;
3492
3493 assert(u);
3494 assert(name);
3495 assert(format);
3496
6d235724 3497 if (!IN_SET(mode, UNIT_PERSISTENT, UNIT_RUNTIME))
b9ec9359
LP
3498 return 0;
3499
3500 va_start(ap, format);
3501 r = vasprintf(&p, format, ap);
3502 va_end(ap);
3503
3504 if (r < 0)
3505 return -ENOMEM;
3506
3507 return unit_write_drop_in_private(u, mode, name, p);
3508}
71645aca 3509
c2756a68 3510int unit_make_transient(Unit *u) {
4f4afc88
LP
3511 FILE *f;
3512 char *path;
3513
c2756a68
LP
3514 assert(u);
3515
3f5e8115
LP
3516 if (!UNIT_VTABLE(u)->can_transient)
3517 return -EOPNOTSUPP;
3518
4f4afc88
LP
3519 path = strjoin(u->manager->lookup_paths.transient, "/", u->id, NULL);
3520 if (!path)
3521 return -ENOMEM;
3522
3523 /* Let's open the file we'll write the transient settings into. This file is kept open as long as we are
3524 * creating the transient, and is closed in unit_load(), as soon as we start loading the file. */
3525
78e334b5 3526 RUN_WITH_UMASK(0022) {
4f4afc88 3527 f = fopen(path, "we");
78e334b5
ZJS
3528 if (!f) {
3529 free(path);
3530 return -errno;
3531 }
4f4afc88
LP
3532 }
3533
3534 if (u->transient_file)
3535 fclose(u->transient_file);
3536 u->transient_file = f;
3537
3538 free(u->fragment_path);
3539 u->fragment_path = path;
7c65093a 3540
7c65093a
LP
3541 u->source_path = mfree(u->source_path);
3542 u->dropin_paths = strv_free(u->dropin_paths);
3543 u->fragment_mtime = u->source_mtime = u->dropin_mtime = 0;
3544
4f4afc88
LP
3545 u->load_state = UNIT_STUB;
3546 u->load_error = 0;
3547 u->transient = true;
3548
7c65093a
LP
3549 unit_add_to_dbus_queue(u);
3550 unit_add_to_gc_queue(u);
c2756a68 3551
4f4afc88
LP
3552 fputs("# This is a transient unit file, created programmatically via the systemd API. Do not edit.\n",
3553 u->transient_file);
3554
3f5e8115 3555 return 0;
c2756a68
LP
3556}
3557
1d98fef1
LP
3558static void log_kill(pid_t pid, int sig, void *userdata) {
3559 _cleanup_free_ char *comm = NULL;
3560
3561 (void) get_process_comm(pid, &comm);
3562
3563 /* Don't log about processes marked with brackets, under the assumption that these are temporary processes
3564 only, like for example systemd's own PAM stub process. */
3565 if (comm && comm[0] == '(')
3566 return;
3567
3568 log_unit_notice(userdata,
3569 "Killing process " PID_FMT " (%s) with signal SIG%s.",
3570 pid,
3571 strna(comm),
3572 signal_to_string(sig));
3573}
3574
3575static int operation_to_signal(KillContext *c, KillOperation k) {
3576 assert(c);
3577
3578 switch (k) {
3579
3580 case KILL_TERMINATE:
3581 case KILL_TERMINATE_AND_LOG:
3582 return c->kill_signal;
3583
3584 case KILL_KILL:
3585 return SIGKILL;
3586
3587 case KILL_ABORT:
3588 return SIGABRT;
3589
3590 default:
3591 assert_not_reached("KillOperation unknown");
3592 }
3593}
3594
cd2086fe
LP
3595int unit_kill_context(
3596 Unit *u,
3597 KillContext *c,
db2cb23b 3598 KillOperation k,
cd2086fe
LP
3599 pid_t main_pid,
3600 pid_t control_pid,
3601 bool main_pid_alien) {
3602
1d98fef1
LP
3603 bool wait_for_exit = false, send_sighup;
3604 cg_kill_log_func_t log_func;
b821a397 3605 int sig, r;
cd2086fe
LP
3606
3607 assert(u);
3608 assert(c);
3609
1d98fef1
LP
3610 /* Kill the processes belonging to this unit, in preparation for shutting the unit down. Returns > 0 if we
3611 * killed something worth waiting for, 0 otherwise. */
3612
cd2086fe
LP
3613 if (c->kill_mode == KILL_NONE)
3614 return 0;
3615
1d98fef1
LP
3616 sig = operation_to_signal(c, k);
3617
3618 send_sighup =
3619 c->send_sighup &&
3620 IN_SET(k, KILL_TERMINATE, KILL_TERMINATE_AND_LOG) &&
3621 sig != SIGHUP;
3622
3623 log_func =
3624 k != KILL_TERMINATE ||
3625 IN_SET(sig, SIGKILL, SIGABRT) ? log_kill : NULL;
cd2086fe
LP
3626
3627 if (main_pid > 0) {
1d98fef1
LP
3628 if (log_func)
3629 log_func(main_pid, sig, u);
cd2086fe 3630
1d98fef1 3631 r = kill_and_sigcont(main_pid, sig);
cd2086fe
LP
3632 if (r < 0 && r != -ESRCH) {
3633 _cleanup_free_ char *comm = NULL;
1d98fef1 3634 (void) get_process_comm(main_pid, &comm);
cd2086fe 3635
b821a397 3636 log_unit_warning_errno(u, r, "Failed to kill main process " PID_FMT " (%s), ignoring: %m", main_pid, strna(comm));
82659fd7 3637 } else {
bc6aed7b
LP
3638 if (!main_pid_alien)
3639 wait_for_exit = true;
82659fd7 3640
1d98fef1 3641 if (r != -ESRCH && send_sighup)
d0667321 3642 (void) kill(main_pid, SIGHUP);
82659fd7 3643 }
cd2086fe
LP
3644 }
3645
3646 if (control_pid > 0) {
1d98fef1
LP
3647 if (log_func)
3648 log_func(control_pid, sig, u);
cd2086fe 3649
1d98fef1 3650 r = kill_and_sigcont(control_pid, sig);
cd2086fe
LP
3651 if (r < 0 && r != -ESRCH) {
3652 _cleanup_free_ char *comm = NULL;
1d98fef1 3653 (void) get_process_comm(control_pid, &comm);
cd2086fe 3654
b821a397 3655 log_unit_warning_errno(u, r, "Failed to kill control process " PID_FMT " (%s), ignoring: %m", control_pid, strna(comm));
82659fd7 3656 } else {
cd2086fe 3657 wait_for_exit = true;
82659fd7 3658
1d98fef1 3659 if (r != -ESRCH && send_sighup)
d0667321 3660 (void) kill(control_pid, SIGHUP);
82659fd7 3661 }
cd2086fe
LP
3662 }
3663
b821a397
LP
3664 if (u->cgroup_path &&
3665 (c->kill_mode == KILL_CONTROL_GROUP || (c->kill_mode == KILL_MIXED && k == KILL_KILL))) {
cd2086fe
LP
3666 _cleanup_set_free_ Set *pid_set = NULL;
3667
82659fd7
LP
3668 /* Exclude the main/control pids from being killed via the cgroup */
3669 pid_set = unit_pid_set(main_pid, control_pid);
cd2086fe
LP
3670 if (!pid_set)
3671 return -ENOMEM;
3672
1d98fef1
LP
3673 r = cg_kill_recursive(SYSTEMD_CGROUP_CONTROLLER, u->cgroup_path,
3674 sig,
3675 CGROUP_SIGCONT|CGROUP_IGNORE_SELF,
3676 pid_set,
3677 log_func, u);
cd2086fe
LP
3678 if (r < 0) {
3679 if (r != -EAGAIN && r != -ESRCH && r != -ENOENT)
b821a397
LP
3680 log_unit_warning_errno(u, r, "Failed to kill control group %s, ignoring: %m", u->cgroup_path);
3681
82659fd7 3682 } else if (r > 0) {
bc6aed7b 3683
efdb0237
LP
3684 /* FIXME: For now, on the legacy hierarchy, we
3685 * will not wait for the cgroup members to die
3686 * if we are running in a container or if this
3687 * is a delegation unit, simply because cgroup
3688 * notification is unreliable in these
3689 * cases. It doesn't work at all in
3690 * containers, and outside of containers it
3691 * can be confused easily by left-over
ccddd104 3692 * directories in the cgroup — which however
efdb0237
LP
3693 * should not exist in non-delegated units. On
3694 * the unified hierarchy that's different,
3695 * there we get proper events. Hence rely on
3696 * them.*/
3697
3698 if (cg_unified() > 0 ||
75f86906 3699 (detect_container() == 0 && !unit_cgroup_delegate(u)))
e9db43d5 3700 wait_for_exit = true;
58ea275a 3701
1d98fef1 3702 if (send_sighup) {
82659fd7
LP
3703 set_free(pid_set);
3704
3705 pid_set = unit_pid_set(main_pid, control_pid);
3706 if (!pid_set)
3707 return -ENOMEM;
3708
1d98fef1
LP
3709 cg_kill_recursive(SYSTEMD_CGROUP_CONTROLLER, u->cgroup_path,
3710 SIGHUP,
3711 CGROUP_IGNORE_SELF,
3712 pid_set,
3713 NULL, NULL);
82659fd7
LP
3714 }
3715 }
cd2086fe
LP
3716 }
3717
3718 return wait_for_exit;
3719}
3720
a57f7e2c
LP
3721int unit_require_mounts_for(Unit *u, const char *path) {
3722 char prefix[strlen(path) + 1], *p;
3723 int r;
3724
3725 assert(u);
3726 assert(path);
3727
3728 /* Registers a unit for requiring a certain path and all its
3729 * prefixes. We keep a simple array of these paths in the
3730 * unit, since its usually short. However, we build a prefix
3731 * table for all possible prefixes so that new appearing mount
3732 * units can easily determine which units to make themselves a
3733 * dependency of. */
3734
70b64bd3
ZJS
3735 if (!path_is_absolute(path))
3736 return -EINVAL;
3737
a57f7e2c
LP
3738 p = strdup(path);
3739 if (!p)
3740 return -ENOMEM;
3741
3742 path_kill_slashes(p);
3743
a57f7e2c
LP
3744 if (!path_is_safe(p)) {
3745 free(p);
3746 return -EPERM;
3747 }
3748
3749 if (strv_contains(u->requires_mounts_for, p)) {
3750 free(p);
3751 return 0;
3752 }
3753
6e18964d
ZJS
3754 r = strv_consume(&u->requires_mounts_for, p);
3755 if (r < 0)
a57f7e2c 3756 return r;
a57f7e2c
LP
3757
3758 PATH_FOREACH_PREFIX_MORE(prefix, p) {
3759 Set *x;
3760
3761 x = hashmap_get(u->manager->units_requiring_mounts_for, prefix);
3762 if (!x) {
3763 char *q;
3764
742f41ad
LP
3765 r = hashmap_ensure_allocated(&u->manager->units_requiring_mounts_for, &string_hash_ops);
3766 if (r < 0)
3767 return r;
a57f7e2c
LP
3768
3769 q = strdup(prefix);
3770 if (!q)
3771 return -ENOMEM;
3772
d5099efc 3773 x = set_new(NULL);
a57f7e2c
LP
3774 if (!x) {
3775 free(q);
3776 return -ENOMEM;
3777 }
3778
3779 r = hashmap_put(u->manager->units_requiring_mounts_for, q, x);
3780 if (r < 0) {
3781 free(q);
3782 set_free(x);
3783 return r;
3784 }
3785 }
3786
3787 r = set_put(x, u);
3788 if (r < 0)
3789 return r;
3790 }
3791
3792 return 0;
3793}
3794
613b411c
LP
3795int unit_setup_exec_runtime(Unit *u) {
3796 ExecRuntime **rt;
3797 size_t offset;
3798 Iterator i;
3799 Unit *other;
3800
3801 offset = UNIT_VTABLE(u)->exec_runtime_offset;
3802 assert(offset > 0);
3803
06b643e7 3804 /* Check if there already is an ExecRuntime for this unit? */
613b411c
LP
3805 rt = (ExecRuntime**) ((uint8_t*) u + offset);
3806 if (*rt)
3807 return 0;
3808
3809 /* Try to get it from somebody else */
3810 SET_FOREACH(other, u->dependencies[UNIT_JOINS_NAMESPACE_OF], i) {
3811
3812 *rt = unit_get_exec_runtime(other);
3813 if (*rt) {
3814 exec_runtime_ref(*rt);
3815 return 0;
3816 }
3817 }
3818
3819 return exec_runtime_make(rt, unit_get_exec_context(u), u->id);
3820}
3821
29206d46
LP
3822int unit_setup_dynamic_creds(Unit *u) {
3823 ExecContext *ec;
3824 DynamicCreds *dcreds;
3825 size_t offset;
3826
3827 assert(u);
3828
3829 offset = UNIT_VTABLE(u)->dynamic_creds_offset;
3830 assert(offset > 0);
3831 dcreds = (DynamicCreds*) ((uint8_t*) u + offset);
3832
3833 ec = unit_get_exec_context(u);
3834 assert(ec);
3835
3836 if (!ec->dynamic_user)
3837 return 0;
3838
3839 return dynamic_creds_acquire(dcreds, u->manager, ec->user, ec->group);
3840}
3841
1c2e9646
LP
3842bool unit_type_supported(UnitType t) {
3843 if (_unlikely_(t < 0))
3844 return false;
3845 if (_unlikely_(t >= _UNIT_TYPE_MAX))
3846 return false;
3847
3848 if (!unit_vtable[t]->supported)
3849 return true;
3850
3851 return unit_vtable[t]->supported();
3852}
3853
8b4305c7
LP
3854void unit_warn_if_dir_nonempty(Unit *u, const char* where) {
3855 int r;
3856
3857 assert(u);
3858 assert(where);
3859
3860 r = dir_is_empty(where);
3861 if (r > 0)
3862 return;
3863 if (r < 0) {
3864 log_unit_warning_errno(u, r, "Failed to check directory %s: %m", where);
3865 return;
3866 }
3867
3868 log_struct(LOG_NOTICE,
3869 LOG_MESSAGE_ID(SD_MESSAGE_OVERMOUNTING),
3870 LOG_UNIT_ID(u),
3871 LOG_UNIT_MESSAGE(u, "Directory %s to mount over is not empty, mounting anyway.", where),
3872 "WHERE=%s", where,
3873 NULL);
3874}
3875
3876int unit_fail_if_symlink(Unit *u, const char* where) {
3877 int r;
3878
3879 assert(u);
3880 assert(where);
3881
3882 r = is_symlink(where);
3883 if (r < 0) {
3884 log_unit_debug_errno(u, r, "Failed to check symlink %s, ignoring: %m", where);
3885 return 0;
3886 }
3887 if (r == 0)
3888 return 0;
3889
3890 log_struct(LOG_ERR,
3891 LOG_MESSAGE_ID(SD_MESSAGE_OVERMOUNTING),
3892 LOG_UNIT_ID(u),
3893 LOG_UNIT_MESSAGE(u, "Mount on symlink %s not allowed.", where),
3894 "WHERE=%s", where,
3895 NULL);
3896
3897 return -ELOOP;
3898}
0f13f3bd
LP
3899
3900bool unit_is_pristine(Unit *u) {
3901 assert(u);
3902
7c65093a 3903 /* Check if the unit already exists or is already around,
0f13f3bd
LP
3904 * in a number of different ways. Note that to cater for unit
3905 * types such as slice, we are generally fine with units that
61233823 3906 * are marked UNIT_LOADED even though nothing was
0f13f3bd
LP
3907 * actually loaded, as those unit types don't require a file
3908 * on disk to validly load. */
3909
3910 return !(!IN_SET(u->load_state, UNIT_NOT_FOUND, UNIT_LOADED) ||
3911 u->fragment_path ||
3912 u->source_path ||
3913 !strv_isempty(u->dropin_paths) ||
0f13f3bd
LP
3914 u->job ||
3915 u->merged_into);
3916}
291d565a
LP
3917
3918pid_t unit_control_pid(Unit *u) {
3919 assert(u);
3920
3921 if (UNIT_VTABLE(u)->control_pid)
3922 return UNIT_VTABLE(u)->control_pid(u);
3923
3924 return 0;
3925}
3926
3927pid_t unit_main_pid(Unit *u) {
3928 assert(u);
3929
3930 if (UNIT_VTABLE(u)->main_pid)
3931 return UNIT_VTABLE(u)->main_pid(u);
3932
3933 return 0;
3934}