]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/core/unit.c
fstab-generator: allow x-systemd.device-timeout for swap units
[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) {
26d04f86 2168 _cleanup_free_ char *c = NULL;
0301abf4
LP
2169
2170 /* This is mostly for debug purposes */
26d04f86
LP
2171 c = path_make_absolute_cwd(p);
2172 if (setenv("SYSTEMD_UNIT_PATH", c, 0) < 0)
2173 return -errno;
0301abf4
LP
2174
2175 return 0;
2176}
88066b3a 2177
ea430986 2178char *unit_dbus_path(Unit *u) {
ea430986
LP
2179 assert(u);
2180
ac155bb8 2181 if (!u->id)
04ade7d2
LP
2182 return NULL;
2183
48899192 2184 return unit_dbus_path_from_name(u->id);
ea430986
LP
2185}
2186
41f9172f 2187char *unit_default_cgroup_path(Unit *u) {
d7bd3de0 2188 _cleanup_free_ char *escaped = NULL, *slice = NULL;
a016b922 2189 int r;
5954c074 2190
013b87c0
LP
2191 assert(u);
2192
4ad49000
LP
2193 if (unit_has_name(u, SPECIAL_ROOT_SLICE))
2194 return strdup(u->manager->cgroup_root);
2195
2196 if (UNIT_ISSET(u->slice) && !unit_has_name(UNIT_DEREF(u->slice), SPECIAL_ROOT_SLICE)) {
a016b922
LP
2197 r = cg_slice_to_path(UNIT_DEREF(u->slice)->id, &slice);
2198 if (r < 0)
2199 return NULL;
2200 }
2201
d7bd3de0
LP
2202 escaped = cg_escape(u->id);
2203 if (!escaped)
5954c074
LP
2204 return NULL;
2205
d7bd3de0
LP
2206 if (slice)
2207 return strjoin(u->manager->cgroup_root, "/", slice, "/", escaped, NULL);
2208 else
2209 return strjoin(u->manager->cgroup_root, "/", escaped, NULL);
013b87c0
LP
2210}
2211
598459ce 2212int unit_add_default_slice(Unit *u, CGroupContext *c) {
a8833944
LP
2213 _cleanup_free_ char *b = NULL;
2214 const char *slice_name;
a016b922
LP
2215 Unit *slice;
2216 int r;
2217
2218 assert(u);
598459ce 2219 assert(c);
a016b922 2220
9444b1f2 2221 if (UNIT_ISSET(u->slice))
a016b922
LP
2222 return 0;
2223
a8833944
LP
2224 if (u->instance) {
2225 _cleanup_free_ char *prefix = NULL, *escaped = NULL;
68eda4bd 2226
a8833944
LP
2227 /* Implicitly place all instantiated units in their
2228 * own per-template slice */
2229
2230 prefix = unit_name_to_prefix(u->id);
2231 if (!prefix)
2232 return -ENOMEM;
2233
2234 /* The prefix is already escaped, but it might include
2235 * "-" which has a special meaning for slice units,
2236 * hence escape it here extra. */
2237 escaped = strreplace(prefix, "-", "\\x2d");
2238 if (!escaped)
2239 return -ENOMEM;
2240
2241 if (u->manager->running_as == SYSTEMD_SYSTEM)
2242 b = strjoin("system-", escaped, ".slice", NULL);
2243 else
2244 b = strappend(escaped, ".slice");
2245 if (!b)
2246 return -ENOMEM;
2247
2248 slice_name = b;
2249 } else
2250 slice_name =
2251 u->manager->running_as == SYSTEMD_SYSTEM
2252 ? SPECIAL_SYSTEM_SLICE
2253 : SPECIAL_ROOT_SLICE;
2254
2255 r = manager_load_unit(u->manager, slice_name, NULL, NULL, &slice);
a016b922
LP
2256 if (r < 0)
2257 return r;
2258
2259 unit_ref_set(&u->slice, slice);
2260 return 0;
2261}
2262
9444b1f2
LP
2263const char *unit_slice_name(Unit *u) {
2264 assert(u);
2265
2266 if (!UNIT_ISSET(u->slice))
2267 return NULL;
2268
2269 return UNIT_DEREF(u->slice)->id;
2270}
2271
f6ff8c29 2272int unit_load_related_unit(Unit *u, const char *type, Unit **_found) {
78edb35a 2273 _cleanup_free_ char *t = NULL;
f6ff8c29
LP
2274 int r;
2275
2276 assert(u);
2277 assert(type);
2278 assert(_found);
2279
78edb35a
LP
2280 t = unit_name_change_suffix(u->id, type);
2281 if (!t)
f6ff8c29
LP
2282 return -ENOMEM;
2283
2284 assert(!unit_has_name(u, t));
2285
ac155bb8 2286 r = manager_load_unit(u->manager, t, NULL, NULL, _found);
9e2f7c11 2287 assert(r < 0 || *_found != u);
f6ff8c29
LP
2288 return r;
2289}
2290
05e343b7
LP
2291int unit_watch_bus_name(Unit *u, const char *name) {
2292 assert(u);
2293 assert(name);
2294
2295 /* Watch a specific name on the bus. We only support one unit
2296 * watching each name for now. */
2297
ac155bb8 2298 return hashmap_put(u->manager->watch_bus, name, u);
05e343b7
LP
2299}
2300
2301void unit_unwatch_bus_name(Unit *u, const char *name) {
2302 assert(u);
2303 assert(name);
2304
ac155bb8 2305 hashmap_remove_value(u->manager->watch_bus, name, u);
05e343b7
LP
2306}
2307
a16e1123
LP
2308bool unit_can_serialize(Unit *u) {
2309 assert(u);
2310
2311 return UNIT_VTABLE(u)->serialize && UNIT_VTABLE(u)->deserialize_item;
2312}
2313
6b78f9b4 2314int unit_serialize(Unit *u, FILE *f, FDSet *fds, bool serialize_jobs) {
a16e1123
LP
2315 int r;
2316
2317 assert(u);
2318 assert(f);
2319 assert(fds);
2320
9bdb98c5
LP
2321 if (unit_can_serialize(u)) {
2322 ExecRuntime *rt;
a16e1123 2323
9bdb98c5 2324 r = UNIT_VTABLE(u)->serialize(u, f, fds);
613b411c
LP
2325 if (r < 0)
2326 return r;
9bdb98c5
LP
2327
2328 rt = unit_get_exec_runtime(u);
2329 if (rt) {
2330 r = exec_runtime_serialize(rt, u, f, fds);
2331 if (r < 0)
2332 return r;
2333 }
e0209d83
MS
2334 }
2335
ac155bb8
MS
2336 dual_timestamp_serialize(f, "inactive-exit-timestamp", &u->inactive_exit_timestamp);
2337 dual_timestamp_serialize(f, "active-enter-timestamp", &u->active_enter_timestamp);
2338 dual_timestamp_serialize(f, "active-exit-timestamp", &u->active_exit_timestamp);
2339 dual_timestamp_serialize(f, "inactive-enter-timestamp", &u->inactive_enter_timestamp);
2340 dual_timestamp_serialize(f, "condition-timestamp", &u->condition_timestamp);
2791a8f8 2341
ac155bb8
MS
2342 if (dual_timestamp_is_set(&u->condition_timestamp))
2343 unit_serialize_item(u, f, "condition-result", yes_no(u->condition_result));
10717a1a 2344
c2756a68
LP
2345 unit_serialize_item(u, f, "transient", yes_no(u->transient));
2346
2347 if (u->cgroup_path)
2348 unit_serialize_item(u, f, "cgroup", u->cgroup_path);
2349
613b411c
LP
2350 if (serialize_jobs) {
2351 if (u->job) {
2352 fprintf(f, "job\n");
2353 job_serialize(u->job, f, fds);
2354 }
2355
2356 if (u->nop_job) {
2357 fprintf(f, "job\n");
2358 job_serialize(u->nop_job, f, fds);
2359 }
2360 }
2361
a16e1123
LP
2362 /* End marker */
2363 fputc('\n', f);
2364 return 0;
2365}
2366
2367void unit_serialize_item_format(Unit *u, FILE *f, const char *key, const char *format, ...) {
2368 va_list ap;
2369
2370 assert(u);
2371 assert(f);
2372 assert(key);
2373 assert(format);
2374
2375 fputs(key, f);
2376 fputc('=', f);
2377
2378 va_start(ap, format);
2379 vfprintf(f, format, ap);
2380 va_end(ap);
2381
2382 fputc('\n', f);
2383}
2384
2385void unit_serialize_item(Unit *u, FILE *f, const char *key, const char *value) {
2386 assert(u);
2387 assert(f);
2388 assert(key);
2389 assert(value);
2390
2391 fprintf(f, "%s=%s\n", key, value);
2392}
2393
2394int unit_deserialize(Unit *u, FILE *f, FDSet *fds) {
28b99ccd 2395 ExecRuntime **rt = NULL;
9bdb98c5 2396 size_t offset;
a16e1123
LP
2397 int r;
2398
2399 assert(u);
2400 assert(f);
2401 assert(fds);
2402
613b411c
LP
2403 offset = UNIT_VTABLE(u)->exec_runtime_offset;
2404 if (offset > 0)
2405 rt = (ExecRuntime**) ((uint8_t*) u + offset);
2406
a16e1123 2407 for (;;) {
20c03b7b 2408 char line[LINE_MAX], *l, *v;
a16e1123
LP
2409 size_t k;
2410
2411 if (!fgets(line, sizeof(line), f)) {
2412 if (feof(f))
2413 return 0;
2414 return -errno;
2415 }
2416
10f8e83c 2417 char_array_0(line);
a16e1123
LP
2418 l = strstrip(line);
2419
2420 /* End marker */
2421 if (l[0] == 0)
2422 return 0;
2423
2424 k = strcspn(l, "=");
2425
2426 if (l[k] == '=') {
2427 l[k] = 0;
2428 v = l+k+1;
2429 } else
2430 v = l+k;
2431
cca098b0 2432 if (streq(l, "job")) {
39a18c60
MS
2433 if (v[0] == '\0') {
2434 /* new-style serialized job */
2435 Job *j = job_new_raw(u);
2436 if (!j)
2437 return -ENOMEM;
2438
2439 r = job_deserialize(j, f, fds);
2440 if (r < 0) {
2441 job_free(j);
2442 return r;
2443 }
cca098b0 2444
39a18c60
MS
2445 r = hashmap_put(u->manager->jobs, UINT32_TO_PTR(j->id), j);
2446 if (r < 0) {
2447 job_free(j);
2448 return r;
2449 }
e0209d83
MS
2450
2451 r = job_install_deserialized(j);
2452 if (r < 0) {
2453 hashmap_remove(u->manager->jobs, UINT32_TO_PTR(j->id));
2454 job_free(j);
2455 return r;
2456 }
6b19ad24
MS
2457
2458 if (j->state == JOB_RUNNING)
2459 u->manager->n_running_jobs++;
39a18c60
MS
2460 } else {
2461 /* legacy */
2462 JobType type = job_type_from_string(v);
2463 if (type < 0)
2464 log_debug("Failed to parse job type value %s", v);
2465 else
2466 u->deserialized_job = type;
2467 }
cca098b0 2468 continue;
8aaf019b 2469 } else if (streq(l, "inactive-exit-timestamp")) {
ac155bb8 2470 dual_timestamp_deserialize(v, &u->inactive_exit_timestamp);
8aaf019b
LP
2471 continue;
2472 } else if (streq(l, "active-enter-timestamp")) {
ac155bb8 2473 dual_timestamp_deserialize(v, &u->active_enter_timestamp);
8aaf019b
LP
2474 continue;
2475 } else if (streq(l, "active-exit-timestamp")) {
ac155bb8 2476 dual_timestamp_deserialize(v, &u->active_exit_timestamp);
8aaf019b
LP
2477 continue;
2478 } else if (streq(l, "inactive-enter-timestamp")) {
ac155bb8 2479 dual_timestamp_deserialize(v, &u->inactive_enter_timestamp);
8aaf019b 2480 continue;
2791a8f8 2481 } else if (streq(l, "condition-timestamp")) {
ac155bb8 2482 dual_timestamp_deserialize(v, &u->condition_timestamp);
2791a8f8
LP
2483 continue;
2484 } else if (streq(l, "condition-result")) {
2485 int b;
2486
c2756a68
LP
2487 b = parse_boolean(v);
2488 if (b < 0)
2791a8f8
LP
2489 log_debug("Failed to parse condition result value %s", v);
2490 else
ac155bb8 2491 u->condition_result = b;
efbac6d2
LP
2492
2493 continue;
c2756a68
LP
2494
2495 } else if (streq(l, "transient")) {
2496 int b;
2497
2498 b = parse_boolean(v);
2499 if (b < 0)
2500 log_debug("Failed to parse transient bool %s", v);
2501 else
2502 u->transient = b;
2503
2504 continue;
2505 } else if (streq(l, "cgroup")) {
2506 char *s;
2507
2508 s = strdup(v);
f440e1bb 2509 if (!s)
c2756a68
LP
2510 return -ENOMEM;
2511
4e595329
ZJS
2512 if (u->cgroup_path) {
2513 void *p;
2514
2515 p = hashmap_remove(u->manager->cgroup_unit, u->cgroup_path);
2516 log_info("Removing cgroup_path %s from hashmap (%p)",
2517 u->cgroup_path, p);
2518 free(u->cgroup_path);
2519 }
72673e86 2520
4e595329 2521 u->cgroup_path = s;
b58b8e11 2522 assert(hashmap_put(u->manager->cgroup_unit, s, u) == 1);
4e595329 2523
c2756a68 2524 continue;
8aaf019b 2525 }
cca098b0 2526
9bdb98c5
LP
2527 if (unit_can_serialize(u)) {
2528 if (rt) {
2529 r = exec_runtime_deserialize_item(rt, u, l, v, fds);
2530 if (r < 0)
2531 return r;
2532 if (r > 0)
2533 continue;
2534 }
2535
2536 r = UNIT_VTABLE(u)->deserialize_item(u, l, v, fds);
613b411c
LP
2537 if (r < 0)
2538 return r;
613b411c 2539 }
a16e1123
LP
2540 }
2541}
2542
6e2ef85b
LP
2543int unit_add_node_link(Unit *u, const char *what, bool wants) {
2544 Unit *device;
68eda4bd 2545 _cleanup_free_ char *e = NULL;
6e2ef85b
LP
2546 int r;
2547
2548 assert(u);
2549
2550 if (!what)
2551 return 0;
2552
2553 /* Adds in links to the device node that this unit is based on */
2554
8407a5d0 2555 if (!is_device_path(what))
6e2ef85b
LP
2556 return 0;
2557
35eb6b12
LP
2558 e = unit_name_from_path(what, ".device");
2559 if (!e)
6e2ef85b
LP
2560 return -ENOMEM;
2561
ac155bb8 2562 r = manager_load_unit(u->manager, e, NULL, NULL, &device);
68eda4bd 2563
6e2ef85b
LP
2564 if (r < 0)
2565 return r;
2566
faa368e3
LP
2567 r = unit_add_two_dependencies(u, UNIT_AFTER, UNIT_BINDS_TO, device, true);
2568 if (r < 0)
6e2ef85b
LP
2569 return r;
2570
faa368e3
LP
2571 if (wants) {
2572 r = unit_add_dependency(device, UNIT_WANTS, u, false);
2573 if (r < 0)
6e2ef85b 2574 return r;
faa368e3 2575 }
6e2ef85b
LP
2576
2577 return 0;
2578}
a16e1123 2579
cca098b0
LP
2580int unit_coldplug(Unit *u) {
2581 int r;
2582
2583 assert(u);
2584
2585 if (UNIT_VTABLE(u)->coldplug)
2586 if ((r = UNIT_VTABLE(u)->coldplug(u)) < 0)
2587 return r;
2588
39a18c60
MS
2589 if (u->job) {
2590 r = job_coldplug(u->job);
2591 if (r < 0)
2592 return r;
2593 } else if (u->deserialized_job >= 0) {
2594 /* legacy */
2595 r = manager_add_job(u->manager, u->deserialized_job, u, JOB_IGNORE_REQUIREMENTS, false, NULL, NULL);
2596 if (r < 0)
cca098b0
LP
2597 return r;
2598
ac155bb8 2599 u->deserialized_job = _JOB_TYPE_INVALID;
cca098b0
LP
2600 }
2601
2602 return 0;
2603}
2604
49b1d377 2605void unit_status_printf(Unit *u, const char *status, const char *unit_status_msg_format) {
bcfce235 2606 DISABLE_WARNING_FORMAT_NONLITERAL;
49b1d377 2607 manager_status_printf(u->manager, false, status, unit_status_msg_format, unit_description(u));
bcfce235 2608 REENABLE_WARNING;
49b1d377
MS
2609}
2610
45fb0699 2611bool unit_need_daemon_reload(Unit *u) {
ae7a7182
OS
2612 _cleanup_strv_free_ char **t = NULL;
2613 char **path;
1b64d026 2614 struct stat st;
ae7a7182 2615 unsigned loaded_cnt, current_cnt;
1b64d026 2616
45fb0699
LP
2617 assert(u);
2618
ac155bb8 2619 if (u->fragment_path) {
5f4b19f4 2620 zero(st);
ac155bb8 2621 if (stat(u->fragment_path, &st) < 0)
5f4b19f4
LP
2622 /* What, cannot access this anymore? */
2623 return true;
45fb0699 2624
ac155bb8
MS
2625 if (u->fragment_mtime > 0 &&
2626 timespec_load(&st.st_mtim) != u->fragment_mtime)
5f4b19f4
LP
2627 return true;
2628 }
2629
1b64d026
LP
2630 if (u->source_path) {
2631 zero(st);
2632 if (stat(u->source_path, &st) < 0)
2633 return true;
2634
2635 if (u->source_mtime > 0 &&
2636 timespec_load(&st.st_mtim) != u->source_mtime)
2637 return true;
2638 }
5f4b19f4 2639
ae7a7182
OS
2640 t = unit_find_dropin_paths(u);
2641 loaded_cnt = strv_length(t);
2642 current_cnt = strv_length(u->dropin_paths);
2643
2644 if (loaded_cnt == current_cnt) {
2645 if (loaded_cnt == 0)
2646 return false;
2647
2648 if (strv_overlap(u->dropin_paths, t)) {
2649 STRV_FOREACH(path, u->dropin_paths) {
2650 zero(st);
2651 if (stat(*path, &st) < 0)
2652 return true;
2653
2654 if (u->dropin_mtime > 0 &&
2655 timespec_load(&st.st_mtim) > u->dropin_mtime)
2656 return true;
2657 }
2658
2659 return false;
2660 } else
2661 return true;
2662 } else
2663 return true;
45fb0699
LP
2664}
2665
fdf20a31 2666void unit_reset_failed(Unit *u) {
5632e374
LP
2667 assert(u);
2668
fdf20a31
MM
2669 if (UNIT_VTABLE(u)->reset_failed)
2670 UNIT_VTABLE(u)->reset_failed(u);
5632e374
LP
2671}
2672
a7f241db
LP
2673Unit *unit_following(Unit *u) {
2674 assert(u);
2675
2676 if (UNIT_VTABLE(u)->following)
2677 return UNIT_VTABLE(u)->following(u);
2678
2679 return NULL;
2680}
2681
31afa0a4 2682bool unit_stop_pending(Unit *u) {
18ffdfda
LP
2683 assert(u);
2684
31afa0a4
LP
2685 /* This call does check the current state of the unit. It's
2686 * hence useful to be called from state change calls of the
2687 * unit itself, where the state isn't updated yet. This is
2688 * different from unit_inactive_or_pending() which checks both
2689 * the current state and for a queued job. */
18ffdfda 2690
31afa0a4
LP
2691 return u->job && u->job->type == JOB_STOP;
2692}
2693
2694bool unit_inactive_or_pending(Unit *u) {
2695 assert(u);
2696
2697 /* Returns true if the unit is inactive or going down */
18ffdfda 2698
d956ac29
LP
2699 if (UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(u)))
2700 return true;
2701
31afa0a4 2702 if (unit_stop_pending(u))
18ffdfda
LP
2703 return true;
2704
2705 return false;
2706}
2707
31afa0a4 2708bool unit_active_or_pending(Unit *u) {
f976f3f6
LP
2709 assert(u);
2710
f60c2665 2711 /* Returns true if the unit is active or going up */
f976f3f6
LP
2712
2713 if (UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u)))
2714 return true;
2715
ac155bb8
MS
2716 if (u->job &&
2717 (u->job->type == JOB_START ||
2718 u->job->type == JOB_RELOAD_OR_START ||
2719 u->job->type == JOB_RESTART))
f976f3f6
LP
2720 return true;
2721
2722 return false;
2723}
2724
718db961 2725int unit_kill(Unit *u, KillWho w, int signo, sd_bus_error *error) {
8a0867d6
LP
2726 assert(u);
2727 assert(w >= 0 && w < _KILL_WHO_MAX);
8a0867d6
LP
2728 assert(signo > 0);
2729 assert(signo < _NSIG);
2730
8a0867d6
LP
2731 if (!UNIT_VTABLE(u)->kill)
2732 return -ENOTSUP;
2733
c74f17d9 2734 return UNIT_VTABLE(u)->kill(u, w, signo, error);
8a0867d6
LP
2735}
2736
82659fd7
LP
2737static Set *unit_pid_set(pid_t main_pid, pid_t control_pid) {
2738 Set *pid_set;
2739 int r;
2740
2741 pid_set = set_new(trivial_hash_func, trivial_compare_func);
2742 if (!pid_set)
2743 return NULL;
2744
2745 /* Exclude the main/control pids from being killed via the cgroup */
2746 if (main_pid > 0) {
2747 r = set_put(pid_set, LONG_TO_PTR(main_pid));
2748 if (r < 0)
2749 goto fail;
2750 }
2751
2752 if (control_pid > 0) {
2753 r = set_put(pid_set, LONG_TO_PTR(control_pid));
2754 if (r < 0)
2755 goto fail;
2756 }
2757
2758 return pid_set;
2759
2760fail:
2761 set_free(pid_set);
2762 return NULL;
2763}
2764
d91c34f2
LP
2765int unit_kill_common(
2766 Unit *u,
2767 KillWho who,
2768 int signo,
2769 pid_t main_pid,
2770 pid_t control_pid,
718db961 2771 sd_bus_error *error) {
d91c34f2 2772
814cc562
MS
2773 int r = 0;
2774
2775 if (who == KILL_MAIN && main_pid <= 0) {
2776 if (main_pid < 0)
718db961 2777 sd_bus_error_setf(error, BUS_ERROR_NO_SUCH_PROCESS, "%s units have no main processes", unit_type_to_string(u->type));
814cc562 2778 else
718db961 2779 sd_bus_error_set_const(error, BUS_ERROR_NO_SUCH_PROCESS, "No main process to kill");
814cc562
MS
2780 return -ESRCH;
2781 }
2782
2783 if (who == KILL_CONTROL && control_pid <= 0) {
2784 if (control_pid < 0)
718db961 2785 sd_bus_error_setf(error, BUS_ERROR_NO_SUCH_PROCESS, "%s units have no control processes", unit_type_to_string(u->type));
814cc562 2786 else
718db961 2787 sd_bus_error_set_const(error, BUS_ERROR_NO_SUCH_PROCESS, "No control process to kill");
814cc562
MS
2788 return -ESRCH;
2789 }
2790
2791 if (who == KILL_CONTROL || who == KILL_ALL)
2792 if (control_pid > 0)
2793 if (kill(control_pid, signo) < 0)
2794 r = -errno;
2795
2796 if (who == KILL_MAIN || who == KILL_ALL)
2797 if (main_pid > 0)
2798 if (kill(main_pid, signo) < 0)
2799 r = -errno;
2800
4ad49000 2801 if (who == KILL_ALL && u->cgroup_path) {
814cc562
MS
2802 _cleanup_set_free_ Set *pid_set = NULL;
2803 int q;
2804
82659fd7
LP
2805 /* Exclude the main/control pids from being killed via the cgroup */
2806 pid_set = unit_pid_set(main_pid, control_pid);
814cc562
MS
2807 if (!pid_set)
2808 return -ENOMEM;
2809
4ad49000 2810 q = cg_kill_recursive(SYSTEMD_CGROUP_CONTROLLER, u->cgroup_path, signo, false, true, false, pid_set);
814cc562
MS
2811 if (q < 0 && q != -EAGAIN && q != -ESRCH && q != -ENOENT)
2812 r = q;
2813 }
2814
2815 return r;
2816}
2817
6210e7fc
LP
2818int unit_following_set(Unit *u, Set **s) {
2819 assert(u);
2820 assert(s);
2821
2822 if (UNIT_VTABLE(u)->following_set)
2823 return UNIT_VTABLE(u)->following_set(u, s);
2824
2825 *s = NULL;
2826 return 0;
2827}
2828
a4375746
LP
2829UnitFileState unit_get_unit_file_state(Unit *u) {
2830 assert(u);
2831
ac155bb8
MS
2832 if (u->unit_file_state < 0 && u->fragment_path)
2833 u->unit_file_state = unit_file_get_state(
67445f4e 2834 u->manager->running_as == SYSTEMD_SYSTEM ? UNIT_FILE_SYSTEM : UNIT_FILE_USER,
2b6bf07d 2835 NULL, basename(u->fragment_path));
a4375746 2836
ac155bb8 2837 return u->unit_file_state;
a4375746
LP
2838}
2839
57020a3a
LP
2840Unit* unit_ref_set(UnitRef *ref, Unit *u) {
2841 assert(ref);
2842 assert(u);
2843
2844 if (ref->unit)
2845 unit_ref_unset(ref);
2846
2847 ref->unit = u;
71fda00f 2848 LIST_PREPEND(refs, u->refs, ref);
57020a3a
LP
2849 return u;
2850}
2851
2852void unit_ref_unset(UnitRef *ref) {
2853 assert(ref);
2854
2855 if (!ref->unit)
2856 return;
2857
71fda00f 2858 LIST_REMOVE(refs, ref->unit->refs, ref);
57020a3a
LP
2859 ref->unit = NULL;
2860}
2861
598459ce
LP
2862int unit_patch_contexts(Unit *u) {
2863 CGroupContext *cc;
2864 ExecContext *ec;
cba6e062
LP
2865 unsigned i;
2866 int r;
2867
e06c73cc 2868 assert(u);
e06c73cc 2869
598459ce
LP
2870 /* Patch in the manager defaults into the exec and cgroup
2871 * contexts, _after_ the rest of the settings have been
2872 * initialized */
085afe36 2873
598459ce
LP
2874 ec = unit_get_exec_context(u);
2875 if (ec) {
2876 /* This only copies in the ones that need memory */
2877 for (i = 0; i < _RLIMIT_MAX; i++)
2878 if (u->manager->rlimit[i] && !ec->rlimit[i]) {
2879 ec->rlimit[i] = newdup(struct rlimit, u->manager->rlimit[i], 1);
2880 if (!ec->rlimit[i])
2881 return -ENOMEM;
2882 }
2883
2884 if (u->manager->running_as == SYSTEMD_USER &&
2885 !ec->working_directory) {
2886
2887 r = get_home_dir(&ec->working_directory);
2888 if (r < 0)
2889 return r;
cba6e062
LP
2890 }
2891
598459ce
LP
2892 if (u->manager->running_as == SYSTEMD_USER &&
2893 (ec->syscall_whitelist ||
2894 !set_isempty(ec->syscall_filter) ||
2895 !set_isempty(ec->syscall_archs) ||
2896 ec->address_families_whitelist ||
2897 !set_isempty(ec->address_families)))
2898 ec->no_new_privileges = true;
e06c73cc 2899
598459ce
LP
2900 if (ec->private_devices)
2901 ec->capability_bounding_set_drop |= (uint64_t) 1ULL << (uint64_t) CAP_MKNOD;
cba6e062
LP
2902 }
2903
598459ce
LP
2904 cc = unit_get_cgroup_context(u);
2905 if (cc) {
f513e420 2906
598459ce
LP
2907 if (ec &&
2908 ec->private_devices &&
2909 cc->device_policy == CGROUP_AUTO)
2910 cc->device_policy = CGROUP_CLOSED;
2911 }
f1660f96 2912
cba6e062 2913 return 0;
e06c73cc
LP
2914}
2915
3ef63c31
LP
2916ExecContext *unit_get_exec_context(Unit *u) {
2917 size_t offset;
2918 assert(u);
2919
598459ce
LP
2920 if (u->type < 0)
2921 return NULL;
2922
3ef63c31
LP
2923 offset = UNIT_VTABLE(u)->exec_context_offset;
2924 if (offset <= 0)
2925 return NULL;
2926
2927 return (ExecContext*) ((uint8_t*) u + offset);
2928}
2929
718db961
LP
2930KillContext *unit_get_kill_context(Unit *u) {
2931 size_t offset;
2932 assert(u);
2933
598459ce
LP
2934 if (u->type < 0)
2935 return NULL;
2936
718db961
LP
2937 offset = UNIT_VTABLE(u)->kill_context_offset;
2938 if (offset <= 0)
2939 return NULL;
2940
2941 return (KillContext*) ((uint8_t*) u + offset);
2942}
2943
4ad49000
LP
2944CGroupContext *unit_get_cgroup_context(Unit *u) {
2945 size_t offset;
2946
598459ce
LP
2947 if (u->type < 0)
2948 return NULL;
2949
4ad49000
LP
2950 offset = UNIT_VTABLE(u)->cgroup_context_offset;
2951 if (offset <= 0)
2952 return NULL;
2953
2954 return (CGroupContext*) ((uint8_t*) u + offset);
2955}
2956
613b411c
LP
2957ExecRuntime *unit_get_exec_runtime(Unit *u) {
2958 size_t offset;
2959
598459ce
LP
2960 if (u->type < 0)
2961 return NULL;
2962
613b411c
LP
2963 offset = UNIT_VTABLE(u)->exec_runtime_offset;
2964 if (offset <= 0)
2965 return NULL;
2966
2967 return *(ExecRuntime**) ((uint8_t*) u + offset);
2968}
2969
29686440 2970static int unit_drop_in_dir(Unit *u, UnitSetPropertiesMode mode, bool transient, char **dir) {
26d04f86 2971 if (u->manager->running_as == SYSTEMD_USER) {
29686440 2972 int r;
26d04f86 2973
29686440 2974 r = user_config_home(dir);
26d04f86
LP
2975 if (r == 0)
2976 return -ENOENT;
29686440
ZJS
2977 return r;
2978 }
26d04f86 2979
29686440
ZJS
2980 if (mode == UNIT_PERSISTENT && !transient)
2981 *dir = strdup("/etc/systemd/system");
8e2af478 2982 else
29686440
ZJS
2983 *dir = strdup("/run/systemd/system");
2984 if (!*dir)
71645aca
LP
2985 return -ENOMEM;
2986
26d04f86 2987 return 0;
71645aca
LP
2988}
2989
29686440
ZJS
2990static int unit_drop_in_file(Unit *u,
2991 UnitSetPropertiesMode mode, const char *name, char **p, char **q) {
2992 _cleanup_free_ char *dir = NULL;
2993 int r;
2994
2995 assert(u);
2996
2997 r = unit_drop_in_dir(u, mode, u->transient, &dir);
2998 if (r < 0)
2999 return r;
3000
3001 return drop_in_file(dir, u->id, name, p, q);
3002}
3003
8e2af478 3004int unit_write_drop_in(Unit *u, UnitSetPropertiesMode mode, const char *name, const char *data) {
29686440
ZJS
3005
3006 _cleanup_free_ char *dir = NULL;
26d04f86 3007 int r;
71645aca
LP
3008
3009 assert(u);
3010
6d235724 3011 if (!IN_SET(mode, UNIT_PERSISTENT, UNIT_RUNTIME))
8e2af478
LP
3012 return 0;
3013
29686440 3014 r = unit_drop_in_dir(u, mode, u->transient, &dir);
26d04f86
LP
3015 if (r < 0)
3016 return r;
71645aca 3017
29686440 3018 return write_drop_in(dir, u->id, name, data);
26d04f86 3019}
71645aca 3020
b9ec9359
LP
3021int unit_write_drop_in_format(Unit *u, UnitSetPropertiesMode mode, const char *name, const char *format, ...) {
3022 _cleanup_free_ char *p = NULL;
3023 va_list ap;
3024 int r;
3025
3026 assert(u);
3027 assert(name);
3028 assert(format);
3029
6d235724 3030 if (!IN_SET(mode, UNIT_PERSISTENT, UNIT_RUNTIME))
b9ec9359
LP
3031 return 0;
3032
3033 va_start(ap, format);
3034 r = vasprintf(&p, format, ap);
3035 va_end(ap);
3036
3037 if (r < 0)
3038 return -ENOMEM;
3039
3040 return unit_write_drop_in(u, mode, name, p);
3041}
3042
3043int unit_write_drop_in_private(Unit *u, UnitSetPropertiesMode mode, const char *name, const char *data) {
b42defe3
LP
3044 _cleanup_free_ char *ndata = NULL;
3045
3046 assert(u);
3047 assert(name);
3048 assert(data);
3049
3050 if (!UNIT_VTABLE(u)->private_section)
3051 return -EINVAL;
3052
6d235724 3053 if (!IN_SET(mode, UNIT_PERSISTENT, UNIT_RUNTIME))
b9ec9359
LP
3054 return 0;
3055
b42defe3
LP
3056 ndata = strjoin("[", UNIT_VTABLE(u)->private_section, "]\n", data, NULL);
3057 if (!ndata)
3058 return -ENOMEM;
3059
3060 return unit_write_drop_in(u, mode, name, ndata);
3061}
3062
b9ec9359
LP
3063int unit_write_drop_in_private_format(Unit *u, UnitSetPropertiesMode mode, const char *name, const char *format, ...) {
3064 _cleanup_free_ char *p = NULL;
3065 va_list ap;
3066 int r;
3067
3068 assert(u);
3069 assert(name);
3070 assert(format);
3071
6d235724 3072 if (!IN_SET(mode, UNIT_PERSISTENT, UNIT_RUNTIME))
b9ec9359
LP
3073 return 0;
3074
3075 va_start(ap, format);
3076 r = vasprintf(&p, format, ap);
3077 va_end(ap);
3078
3079 if (r < 0)
3080 return -ENOMEM;
3081
3082 return unit_write_drop_in_private(u, mode, name, p);
3083}
3084
8e2af478 3085int unit_remove_drop_in(Unit *u, UnitSetPropertiesMode mode, const char *name) {
26d04f86
LP
3086 _cleanup_free_ char *p = NULL, *q = NULL;
3087 int r;
71645aca 3088
26d04f86 3089 assert(u);
71645aca 3090
6d235724 3091 if (!IN_SET(mode, UNIT_PERSISTENT, UNIT_RUNTIME))
8e2af478
LP
3092 return 0;
3093
29686440 3094 r = unit_drop_in_file(u, mode, name, &p, &q);
6891529f
ZJS
3095 if (r < 0)
3096 return r;
3097
71645aca 3098 if (unlink(q) < 0)
241da328 3099 r = errno == ENOENT ? 0 : -errno;
26d04f86 3100 else
241da328 3101 r = 1;
71645aca
LP
3102
3103 rmdir(p);
26d04f86 3104 return r;
71645aca
LP
3105}
3106
c2756a68
LP
3107int unit_make_transient(Unit *u) {
3108 int r;
3109
3110 assert(u);
3111
3112 u->load_state = UNIT_STUB;
3113 u->load_error = 0;
3114 u->transient = true;
3115
3116 free(u->fragment_path);
3117 u->fragment_path = NULL;
3118
3119 if (u->manager->running_as == SYSTEMD_USER) {
3120 _cleanup_free_ char *c = NULL;
3121
3122 r = user_config_home(&c);
3123 if (r < 0)
3124 return r;
3125 if (r == 0)
3126 return -ENOENT;
3127
3128 u->fragment_path = strjoin(c, "/", u->id, NULL);
3129 if (!u->fragment_path)
3130 return -ENOMEM;
3131
3132 mkdir_p(c, 0755);
3133 } else {
3134 u->fragment_path = strappend("/run/systemd/system/", u->id);
3135 if (!u->fragment_path)
3136 return -ENOMEM;
3137
3138 mkdir_p("/run/systemd/system", 0755);
3139 }
3140
3141 return write_string_file_atomic_label(u->fragment_path, "# Transient stub");
3142}
3143
cd2086fe
LP
3144int unit_kill_context(
3145 Unit *u,
3146 KillContext *c,
3147 bool sigkill,
3148 pid_t main_pid,
3149 pid_t control_pid,
3150 bool main_pid_alien) {
3151
bc6aed7b 3152 int sig, wait_for_exit = false, r;
cd2086fe
LP
3153
3154 assert(u);
3155 assert(c);
3156
3157 if (c->kill_mode == KILL_NONE)
3158 return 0;
3159
3160 sig = sigkill ? SIGKILL : c->kill_signal;
3161
3162 if (main_pid > 0) {
3163 r = kill_and_sigcont(main_pid, sig);
3164
3165 if (r < 0 && r != -ESRCH) {
3166 _cleanup_free_ char *comm = NULL;
3167 get_process_comm(main_pid, &comm);
3168
6294b8a9 3169 log_warning_unit(u->id, "Failed to kill main process " PID_FMT " (%s): %s", main_pid, strna(comm), strerror(-r));
82659fd7 3170 } else {
bc6aed7b
LP
3171 if (!main_pid_alien)
3172 wait_for_exit = true;
82659fd7 3173
97e0691f 3174 if (c->send_sighup && !sigkill)
82659fd7
LP
3175 kill(main_pid, SIGHUP);
3176 }
cd2086fe
LP
3177 }
3178
3179 if (control_pid > 0) {
3180 r = kill_and_sigcont(control_pid, sig);
3181
3182 if (r < 0 && r != -ESRCH) {
3183 _cleanup_free_ char *comm = NULL;
3184 get_process_comm(control_pid, &comm);
3185
6294b8a9 3186 log_warning_unit(u->id, "Failed to kill control process " PID_FMT " (%s): %s", control_pid, strna(comm), strerror(-r));
82659fd7 3187 } else {
cd2086fe 3188 wait_for_exit = true;
82659fd7 3189
97e0691f 3190 if (c->send_sighup && !sigkill)
82659fd7
LP
3191 kill(control_pid, SIGHUP);
3192 }
cd2086fe
LP
3193 }
3194
58ea275a 3195 if ((c->kill_mode == KILL_CONTROL_GROUP || (c->kill_mode == KILL_MIXED && sigkill)) && u->cgroup_path) {
cd2086fe
LP
3196 _cleanup_set_free_ Set *pid_set = NULL;
3197
82659fd7
LP
3198 /* Exclude the main/control pids from being killed via the cgroup */
3199 pid_set = unit_pid_set(main_pid, control_pid);
cd2086fe
LP
3200 if (!pid_set)
3201 return -ENOMEM;
3202
4ad49000 3203 r = cg_kill_recursive(SYSTEMD_CGROUP_CONTROLLER, u->cgroup_path, sig, true, true, false, pid_set);
cd2086fe
LP
3204 if (r < 0) {
3205 if (r != -EAGAIN && r != -ESRCH && r != -ENOENT)
3206 log_warning_unit(u->id, "Failed to kill control group: %s", strerror(-r));
82659fd7 3207 } else if (r > 0) {
bc6aed7b 3208
743970d2
LP
3209 /* FIXME: For now, we will not wait for the
3210 * cgroup members to die, simply because
3211 * cgroup notification is unreliable. It
3212 * doesn't work at all in containers, and
3213 * outside of containers it can be confused
3214 * easily by leaving directories in the
3215 * cgroup. */
3216
3217 /* wait_for_exit = true; */
58ea275a 3218
97e0691f 3219 if (c->send_sighup && !sigkill) {
82659fd7
LP
3220 set_free(pid_set);
3221
3222 pid_set = unit_pid_set(main_pid, control_pid);
3223 if (!pid_set)
3224 return -ENOMEM;
3225
8190da36 3226 cg_kill_recursive(SYSTEMD_CGROUP_CONTROLLER, u->cgroup_path, SIGHUP, false, true, false, pid_set);
82659fd7
LP
3227 }
3228 }
cd2086fe
LP
3229 }
3230
3231 return wait_for_exit;
3232}
3233
a57f7e2c
LP
3234int unit_require_mounts_for(Unit *u, const char *path) {
3235 char prefix[strlen(path) + 1], *p;
3236 int r;
3237
3238 assert(u);
3239 assert(path);
3240
3241 /* Registers a unit for requiring a certain path and all its
3242 * prefixes. We keep a simple array of these paths in the
3243 * unit, since its usually short. However, we build a prefix
3244 * table for all possible prefixes so that new appearing mount
3245 * units can easily determine which units to make themselves a
3246 * dependency of. */
3247
70b64bd3
ZJS
3248 if (!path_is_absolute(path))
3249 return -EINVAL;
3250
a57f7e2c
LP
3251 p = strdup(path);
3252 if (!p)
3253 return -ENOMEM;
3254
3255 path_kill_slashes(p);
3256
a57f7e2c
LP
3257 if (!path_is_safe(p)) {
3258 free(p);
3259 return -EPERM;
3260 }
3261
3262 if (strv_contains(u->requires_mounts_for, p)) {
3263 free(p);
3264 return 0;
3265 }
3266
6e18964d
ZJS
3267 r = strv_consume(&u->requires_mounts_for, p);
3268 if (r < 0)
a57f7e2c 3269 return r;
a57f7e2c
LP
3270
3271 PATH_FOREACH_PREFIX_MORE(prefix, p) {
3272 Set *x;
3273
3274 x = hashmap_get(u->manager->units_requiring_mounts_for, prefix);
3275 if (!x) {
3276 char *q;
3277
3278 if (!u->manager->units_requiring_mounts_for) {
3279 u->manager->units_requiring_mounts_for = hashmap_new(string_hash_func, string_compare_func);
3280 if (!u->manager->units_requiring_mounts_for)
3281 return -ENOMEM;
3282 }
3283
3284 q = strdup(prefix);
3285 if (!q)
3286 return -ENOMEM;
3287
3288 x = set_new(NULL, NULL);
3289 if (!x) {
3290 free(q);
3291 return -ENOMEM;
3292 }
3293
3294 r = hashmap_put(u->manager->units_requiring_mounts_for, q, x);
3295 if (r < 0) {
3296 free(q);
3297 set_free(x);
3298 return r;
3299 }
3300 }
3301
3302 r = set_put(x, u);
3303 if (r < 0)
3304 return r;
3305 }
3306
3307 return 0;
3308}
3309
613b411c
LP
3310int unit_setup_exec_runtime(Unit *u) {
3311 ExecRuntime **rt;
3312 size_t offset;
3313 Iterator i;
3314 Unit *other;
3315
3316 offset = UNIT_VTABLE(u)->exec_runtime_offset;
3317 assert(offset > 0);
3318
3319 /* Check if ther already is an ExecRuntime for this unit? */
3320 rt = (ExecRuntime**) ((uint8_t*) u + offset);
3321 if (*rt)
3322 return 0;
3323
3324 /* Try to get it from somebody else */
3325 SET_FOREACH(other, u->dependencies[UNIT_JOINS_NAMESPACE_OF], i) {
3326
3327 *rt = unit_get_exec_runtime(other);
3328 if (*rt) {
3329 exec_runtime_ref(*rt);
3330 return 0;
3331 }
3332 }
3333
3334 return exec_runtime_make(rt, unit_get_exec_context(u), u->id);
3335}
3336
94f04347
LP
3337static const char* const unit_active_state_table[_UNIT_ACTIVE_STATE_MAX] = {
3338 [UNIT_ACTIVE] = "active",
032ff4af 3339 [UNIT_RELOADING] = "reloading",
94f04347 3340 [UNIT_INACTIVE] = "inactive",
fdf20a31 3341 [UNIT_FAILED] = "failed",
94f04347
LP
3342 [UNIT_ACTIVATING] = "activating",
3343 [UNIT_DEACTIVATING] = "deactivating"
3344};
3345
3346DEFINE_STRING_TABLE_LOOKUP(unit_active_state, UnitActiveState);
3347
3348static const char* const unit_dependency_table[_UNIT_DEPENDENCY_MAX] = {
3349 [UNIT_REQUIRES] = "Requires",
9e2f7c11 3350 [UNIT_REQUIRES_OVERRIDABLE] = "RequiresOverridable",
94f04347 3351 [UNIT_REQUISITE] = "Requisite",
9e2f7c11 3352 [UNIT_REQUISITE_OVERRIDABLE] = "RequisiteOverridable",
ac6a4abe
MS
3353 [UNIT_WANTS] = "Wants",
3354 [UNIT_BINDS_TO] = "BindsTo",
3355 [UNIT_PART_OF] = "PartOf",
94f04347 3356 [UNIT_REQUIRED_BY] = "RequiredBy",
9e2f7c11 3357 [UNIT_REQUIRED_BY_OVERRIDABLE] = "RequiredByOverridable",
94f04347 3358 [UNIT_WANTED_BY] = "WantedBy",
ac6a4abe
MS
3359 [UNIT_BOUND_BY] = "BoundBy",
3360 [UNIT_CONSISTS_OF] = "ConsistsOf",
94f04347 3361 [UNIT_CONFLICTS] = "Conflicts",
69dd2852 3362 [UNIT_CONFLICTED_BY] = "ConflictedBy",
94f04347
LP
3363 [UNIT_BEFORE] = "Before",
3364 [UNIT_AFTER] = "After",
57020a3a
LP
3365 [UNIT_ON_FAILURE] = "OnFailure",
3366 [UNIT_TRIGGERS] = "Triggers",
4dcc1cb4 3367 [UNIT_TRIGGERED_BY] = "TriggeredBy",
7f2cddae 3368 [UNIT_PROPAGATES_RELOAD_TO] = "PropagatesReloadTo",
ac6a4abe 3369 [UNIT_RELOAD_PROPAGATED_FROM] = "ReloadPropagatedFrom",
2c5859af 3370 [UNIT_JOINS_NAMESPACE_OF] = "JoinsNamespaceOf",
ac6a4abe
MS
3371 [UNIT_REFERENCES] = "References",
3372 [UNIT_REFERENCED_BY] = "ReferencedBy",
94f04347
LP
3373};
3374
3375DEFINE_STRING_TABLE_LOOKUP(unit_dependency, UnitDependency);