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