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