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