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