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