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