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