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