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