]> git.ipfire.org Git - thirdparty/systemd.git/blob - src/core/unit.c
cgroup: additional validity checks for cgroup attribute names
[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_unit(LOG_INFO,
1026 u->id,
1027 MESSAGE_ID(mid),
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_unit(LOG_NOTICE,
1442 u->id,
1443 "MESSAGE=Unit %s entered failed state", 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, clockid_t clock_id, bool relative, usec_t usec, 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_id, 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 (usec <= 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, usec);
1600 flags = relative ? 0 : TFD_TIMER_ABSTIME;
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 assert(p);
1785
1786 if (!name)
1787 name = path_get_file_name(path);
1788
1789 if (!unit_name_is_template(name)) {
1790 *p = NULL;
1791 return name;
1792 }
1793
1794 if (u->instance)
1795 s = unit_name_replace_instance(name, u->instance);
1796 else {
1797 char *i;
1798
1799 i = unit_name_to_prefix(u->id);
1800 if (!i)
1801 return NULL;
1802
1803 s = unit_name_replace_instance(name, i);
1804 free(i);
1805 }
1806
1807 if (!s)
1808 return NULL;
1809
1810 *p = s;
1811 return s;
1812 }
1813
1814 int unit_add_dependency_by_name(Unit *u, UnitDependency d, const char *name, const char *path, bool add_reference) {
1815 Unit *other;
1816 int r;
1817 _cleanup_free_ char *s = NULL;
1818
1819 assert(u);
1820 assert(name || path);
1821
1822 name = resolve_template(u, name, path, &s);
1823 if (!name)
1824 return -ENOMEM;
1825
1826 r = manager_load_unit(u->manager, name, path, NULL, &other);
1827 if (r < 0)
1828 return r;
1829
1830 return unit_add_dependency(u, d, other, add_reference);
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 b->controller = strdup(SYSTEMD_CGROUP_CONTROLLER);
1945 if (!b->controller)
1946 return log_oom();
1947
1948 b->ours = true;
1949 }
1950
1951 /* Ensure this hasn't been added yet */
1952 assert(!b->unit);
1953
1954 if (streq(b->controller, SYSTEMD_CGROUP_CONTROLLER)) {
1955 CGroupBonding *l;
1956
1957 l = hashmap_get(u->manager->cgroup_bondings, b->path);
1958 LIST_PREPEND(CGroupBonding, by_path, l, b);
1959
1960 r = hashmap_replace(u->manager->cgroup_bondings, b->path, l);
1961 if (r < 0) {
1962 LIST_REMOVE(CGroupBonding, by_path, l, b);
1963 return r;
1964 }
1965 }
1966
1967 LIST_PREPEND(CGroupBonding, by_unit, u->cgroup_bondings, b);
1968 b->unit = u;
1969
1970 return 0;
1971 }
1972
1973 char *unit_default_cgroup_path(Unit *u) {
1974 assert(u);
1975
1976 if (u->instance) {
1977 _cleanup_free_ char *t = NULL;
1978
1979 t = unit_name_template(u->id);
1980 if (!t)
1981 return NULL;
1982
1983 return strjoin(u->manager->cgroup_hierarchy, "/", t, "/", u->instance, NULL);
1984 } else
1985 return strjoin(u->manager->cgroup_hierarchy, "/", u->id, NULL);
1986 }
1987
1988 int unit_add_cgroup_from_text(Unit *u, const char *name, bool overwrite, CGroupBonding **ret) {
1989 char *controller = NULL, *path = NULL;
1990 CGroupBonding *b = NULL;
1991 bool ours = false;
1992 int r;
1993
1994 assert(u);
1995 assert(name);
1996
1997 r = cg_split_spec(name, &controller, &path);
1998 if (r < 0)
1999 return r;
2000
2001 if (!path) {
2002 path = unit_default_cgroup_path(u);
2003 ours = true;
2004 }
2005
2006 if (!controller) {
2007 controller = strdup(SYSTEMD_CGROUP_CONTROLLER);
2008 ours = true;
2009 }
2010
2011 if (!path || !controller) {
2012 free(path);
2013 free(controller);
2014 return log_oom();
2015 }
2016
2017 b = cgroup_bonding_find_list(u->cgroup_bondings, controller);
2018 if (b) {
2019 if (streq(path, b->path)) {
2020 free(path);
2021 free(controller);
2022
2023 if (ret)
2024 *ret = b;
2025 return 0;
2026 }
2027
2028 if (overwrite && !b->essential) {
2029 free(controller);
2030
2031 free(b->path);
2032 b->path = path;
2033
2034 b->ours = ours;
2035 b->realized = false;
2036
2037 if (ret)
2038 *ret = b;
2039
2040 return 1;
2041 }
2042
2043 r = -EEXIST;
2044 b = NULL;
2045 goto fail;
2046 }
2047
2048 b = new0(CGroupBonding, 1);
2049 if (!b) {
2050 r = -ENOMEM;
2051 goto fail;
2052 }
2053
2054 b->controller = controller;
2055 b->path = path;
2056 b->ours = ours;
2057 b->essential = streq(controller, SYSTEMD_CGROUP_CONTROLLER);
2058
2059 r = unit_add_cgroup(u, b);
2060 if (r < 0)
2061 goto fail;
2062
2063 if (ret)
2064 *ret = b;
2065
2066 return 1;
2067
2068 fail:
2069 free(path);
2070 free(controller);
2071 free(b);
2072
2073 return r;
2074 }
2075
2076 static int unit_add_one_default_cgroup(Unit *u, const char *controller) {
2077 CGroupBonding *b = NULL;
2078 int r = -ENOMEM;
2079
2080 assert(u);
2081
2082 if (!controller)
2083 controller = SYSTEMD_CGROUP_CONTROLLER;
2084
2085 if (cgroup_bonding_find_list(u->cgroup_bondings, controller))
2086 return 0;
2087
2088 b = new0(CGroupBonding, 1);
2089 if (!b)
2090 return -ENOMEM;
2091
2092 b->controller = strdup(controller);
2093 if (!b->controller)
2094 goto fail;
2095
2096 b->path = unit_default_cgroup_path(u);
2097 if (!b->path)
2098 goto fail;
2099
2100 b->ours = true;
2101 b->essential = streq(controller, SYSTEMD_CGROUP_CONTROLLER);
2102
2103 r = unit_add_cgroup(u, b);
2104 if (r < 0)
2105 goto fail;
2106
2107 return 0;
2108
2109 fail:
2110 free(b->path);
2111 free(b->controller);
2112 free(b);
2113
2114 return r;
2115 }
2116
2117 int unit_add_default_cgroups(Unit *u) {
2118 CGroupAttribute *a;
2119 char **c;
2120 int r;
2121
2122 assert(u);
2123
2124 /* Adds in the default cgroups, if they weren't specified
2125 * otherwise. */
2126
2127 if (!u->manager->cgroup_hierarchy)
2128 return 0;
2129
2130 r = unit_add_one_default_cgroup(u, NULL);
2131 if (r < 0)
2132 return r;
2133
2134 STRV_FOREACH(c, u->manager->default_controllers)
2135 unit_add_one_default_cgroup(u, *c);
2136
2137 LIST_FOREACH(by_unit, a, u->cgroup_attributes)
2138 unit_add_one_default_cgroup(u, a->controller);
2139
2140 return 0;
2141 }
2142
2143 CGroupBonding* unit_get_default_cgroup(Unit *u) {
2144 assert(u);
2145
2146 return cgroup_bonding_find_list(u->cgroup_bondings, NULL);
2147 }
2148
2149 int unit_add_cgroup_attribute(
2150 Unit *u,
2151 const char *controller,
2152 const char *name,
2153 const char *value,
2154 CGroupAttributeMapCallback map_callback,
2155 CGroupAttribute **ret) {
2156
2157 _cleanup_free_ char *c = NULL;
2158 CGroupAttribute *a;
2159 int r;
2160
2161 assert(u);
2162 assert(name);
2163 assert(value);
2164
2165 if (!controller) {
2166 r = cg_controller_from_attr(name, &c);
2167 if (r < 0)
2168 return -EINVAL;
2169
2170 controller = c;
2171 } else {
2172 if (!filename_is_safe(name))
2173 return -EINVAL;
2174
2175 if (!filename_is_safe(controller))
2176 return -EINVAL;
2177 }
2178
2179 if (!controller || streq(controller, SYSTEMD_CGROUP_CONTROLLER))
2180 return -EINVAL;
2181
2182 a = cgroup_attribute_find_list(u->cgroup_attributes, controller, name);
2183 if (a) {
2184 char *v;
2185
2186 if (streq(value, a->value)) {
2187 if (ret)
2188 *ret = a;
2189
2190 return 0;
2191 }
2192
2193 v = strdup(value);
2194 if (!v)
2195 return -ENOMEM;
2196
2197 free(a->value);
2198 a->value = v;
2199
2200 if (ret)
2201 *ret = a;
2202
2203 return 1;
2204 }
2205
2206 a = new0(CGroupAttribute, 1);
2207 if (!a)
2208 return -ENOMEM;
2209
2210 if (c) {
2211 a->controller = c;
2212 c = NULL;
2213 } else
2214 a->controller = strdup(controller);
2215
2216 a->name = strdup(name);
2217 a->value = strdup(value);
2218
2219 if (!a->controller || !a->name || !a->value) {
2220 free(a->controller);
2221 free(a->name);
2222 free(a->value);
2223 free(a);
2224
2225 return -ENOMEM;
2226 }
2227
2228 a->map_callback = map_callback;
2229 a->unit = u;
2230
2231 LIST_PREPEND(CGroupAttribute, by_unit, u->cgroup_attributes, a);
2232
2233 if (ret)
2234 *ret = a;
2235
2236 return 1;
2237 }
2238
2239 int unit_load_related_unit(Unit *u, const char *type, Unit **_found) {
2240 char *t;
2241 int r;
2242
2243 assert(u);
2244 assert(type);
2245 assert(_found);
2246
2247 if (!(t = unit_name_change_suffix(u->id, type)))
2248 return -ENOMEM;
2249
2250 assert(!unit_has_name(u, t));
2251
2252 r = manager_load_unit(u->manager, t, NULL, NULL, _found);
2253 free(t);
2254
2255 assert(r < 0 || *_found != u);
2256
2257 return r;
2258 }
2259
2260 int unit_get_related_unit(Unit *u, const char *type, Unit **_found) {
2261 Unit *found;
2262 char *t;
2263
2264 assert(u);
2265 assert(type);
2266 assert(_found);
2267
2268 if (!(t = unit_name_change_suffix(u->id, type)))
2269 return -ENOMEM;
2270
2271 assert(!unit_has_name(u, t));
2272
2273 found = manager_get_unit(u->manager, t);
2274 free(t);
2275
2276 if (!found)
2277 return -ENOENT;
2278
2279 *_found = found;
2280 return 0;
2281 }
2282
2283 int unit_watch_bus_name(Unit *u, const char *name) {
2284 assert(u);
2285 assert(name);
2286
2287 /* Watch a specific name on the bus. We only support one unit
2288 * watching each name for now. */
2289
2290 return hashmap_put(u->manager->watch_bus, name, u);
2291 }
2292
2293 void unit_unwatch_bus_name(Unit *u, const char *name) {
2294 assert(u);
2295 assert(name);
2296
2297 hashmap_remove_value(u->manager->watch_bus, name, u);
2298 }
2299
2300 bool unit_can_serialize(Unit *u) {
2301 assert(u);
2302
2303 return UNIT_VTABLE(u)->serialize && UNIT_VTABLE(u)->deserialize_item;
2304 }
2305
2306 int unit_serialize(Unit *u, FILE *f, FDSet *fds, bool serialize_jobs) {
2307 int r;
2308
2309 assert(u);
2310 assert(f);
2311 assert(fds);
2312
2313 if (!unit_can_serialize(u))
2314 return 0;
2315
2316 if ((r = UNIT_VTABLE(u)->serialize(u, f, fds)) < 0)
2317 return r;
2318
2319
2320 if (serialize_jobs) {
2321 if (u->job) {
2322 fprintf(f, "job\n");
2323 job_serialize(u->job, f, fds);
2324 }
2325
2326 if (u->nop_job) {
2327 fprintf(f, "job\n");
2328 job_serialize(u->nop_job, f, fds);
2329 }
2330 }
2331
2332 dual_timestamp_serialize(f, "inactive-exit-timestamp", &u->inactive_exit_timestamp);
2333 dual_timestamp_serialize(f, "active-enter-timestamp", &u->active_enter_timestamp);
2334 dual_timestamp_serialize(f, "active-exit-timestamp", &u->active_exit_timestamp);
2335 dual_timestamp_serialize(f, "inactive-enter-timestamp", &u->inactive_enter_timestamp);
2336 dual_timestamp_serialize(f, "condition-timestamp", &u->condition_timestamp);
2337
2338 if (dual_timestamp_is_set(&u->condition_timestamp))
2339 unit_serialize_item(u, f, "condition-result", yes_no(u->condition_result));
2340
2341 /* End marker */
2342 fputc('\n', f);
2343 return 0;
2344 }
2345
2346 void unit_serialize_item_format(Unit *u, FILE *f, const char *key, const char *format, ...) {
2347 va_list ap;
2348
2349 assert(u);
2350 assert(f);
2351 assert(key);
2352 assert(format);
2353
2354 fputs(key, f);
2355 fputc('=', f);
2356
2357 va_start(ap, format);
2358 vfprintf(f, format, ap);
2359 va_end(ap);
2360
2361 fputc('\n', f);
2362 }
2363
2364 void unit_serialize_item(Unit *u, FILE *f, const char *key, const char *value) {
2365 assert(u);
2366 assert(f);
2367 assert(key);
2368 assert(value);
2369
2370 fprintf(f, "%s=%s\n", key, value);
2371 }
2372
2373 int unit_deserialize(Unit *u, FILE *f, FDSet *fds) {
2374 int r;
2375
2376 assert(u);
2377 assert(f);
2378 assert(fds);
2379
2380 if (!unit_can_serialize(u))
2381 return 0;
2382
2383 for (;;) {
2384 char line[LINE_MAX], *l, *v;
2385 size_t k;
2386
2387 if (!fgets(line, sizeof(line), f)) {
2388 if (feof(f))
2389 return 0;
2390 return -errno;
2391 }
2392
2393 char_array_0(line);
2394 l = strstrip(line);
2395
2396 /* End marker */
2397 if (l[0] == 0)
2398 return 0;
2399
2400 k = strcspn(l, "=");
2401
2402 if (l[k] == '=') {
2403 l[k] = 0;
2404 v = l+k+1;
2405 } else
2406 v = l+k;
2407
2408 if (streq(l, "job")) {
2409 if (v[0] == '\0') {
2410 /* new-style serialized job */
2411 Job *j = job_new_raw(u);
2412 if (!j)
2413 return -ENOMEM;
2414
2415 r = job_deserialize(j, f, fds);
2416 if (r < 0) {
2417 job_free(j);
2418 return r;
2419 }
2420
2421 r = hashmap_put(u->manager->jobs, UINT32_TO_PTR(j->id), j);
2422 if (r < 0) {
2423 job_free(j);
2424 return r;
2425 }
2426
2427 r = job_install_deserialized(j);
2428 if (r < 0) {
2429 hashmap_remove(u->manager->jobs, UINT32_TO_PTR(j->id));
2430 job_free(j);
2431 return r;
2432 }
2433 } else {
2434 /* legacy */
2435 JobType type = job_type_from_string(v);
2436 if (type < 0)
2437 log_debug("Failed to parse job type value %s", v);
2438 else
2439 u->deserialized_job = type;
2440 }
2441 continue;
2442 } else if (streq(l, "inactive-exit-timestamp")) {
2443 dual_timestamp_deserialize(v, &u->inactive_exit_timestamp);
2444 continue;
2445 } else if (streq(l, "active-enter-timestamp")) {
2446 dual_timestamp_deserialize(v, &u->active_enter_timestamp);
2447 continue;
2448 } else if (streq(l, "active-exit-timestamp")) {
2449 dual_timestamp_deserialize(v, &u->active_exit_timestamp);
2450 continue;
2451 } else if (streq(l, "inactive-enter-timestamp")) {
2452 dual_timestamp_deserialize(v, &u->inactive_enter_timestamp);
2453 continue;
2454 } else if (streq(l, "condition-timestamp")) {
2455 dual_timestamp_deserialize(v, &u->condition_timestamp);
2456 continue;
2457 } else if (streq(l, "condition-result")) {
2458 int b;
2459
2460 if ((b = parse_boolean(v)) < 0)
2461 log_debug("Failed to parse condition result value %s", v);
2462 else
2463 u->condition_result = b;
2464
2465 continue;
2466 }
2467
2468 if ((r = UNIT_VTABLE(u)->deserialize_item(u, l, v, fds)) < 0)
2469 return r;
2470 }
2471 }
2472
2473 int unit_add_node_link(Unit *u, const char *what, bool wants) {
2474 Unit *device;
2475 char *e;
2476 int r;
2477
2478 assert(u);
2479
2480 if (!what)
2481 return 0;
2482
2483 /* Adds in links to the device node that this unit is based on */
2484
2485 if (!is_device_path(what))
2486 return 0;
2487
2488 e = unit_name_from_path(what, ".device");
2489 if (!e)
2490 return -ENOMEM;
2491
2492 r = manager_load_unit(u->manager, e, NULL, NULL, &device);
2493 free(e);
2494 if (r < 0)
2495 return r;
2496
2497 r = unit_add_two_dependencies(u, UNIT_AFTER, UNIT_BINDS_TO, device, true);
2498 if (r < 0)
2499 return r;
2500
2501 if (wants) {
2502 r = unit_add_dependency(device, UNIT_WANTS, u, false);
2503 if (r < 0)
2504 return r;
2505 }
2506
2507 return 0;
2508 }
2509
2510 int unit_coldplug(Unit *u) {
2511 int r;
2512
2513 assert(u);
2514
2515 if (UNIT_VTABLE(u)->coldplug)
2516 if ((r = UNIT_VTABLE(u)->coldplug(u)) < 0)
2517 return r;
2518
2519 if (u->job) {
2520 r = job_coldplug(u->job);
2521 if (r < 0)
2522 return r;
2523 } else if (u->deserialized_job >= 0) {
2524 /* legacy */
2525 r = manager_add_job(u->manager, u->deserialized_job, u, JOB_IGNORE_REQUIREMENTS, false, NULL, NULL);
2526 if (r < 0)
2527 return r;
2528
2529 u->deserialized_job = _JOB_TYPE_INVALID;
2530 }
2531
2532 return 0;
2533 }
2534
2535 void unit_status_printf(Unit *u, const char *status, const char *format, ...) {
2536 va_list ap;
2537
2538 assert(u);
2539 assert(format);
2540
2541 if (!manager_get_show_status(u->manager))
2542 return;
2543
2544 if (!manager_is_booting_or_shutting_down(u->manager))
2545 return;
2546
2547 va_start(ap, format);
2548 status_vprintf(status, true, format, ap);
2549 va_end(ap);
2550 }
2551
2552 bool unit_need_daemon_reload(Unit *u) {
2553 struct stat st;
2554
2555 assert(u);
2556
2557 if (u->fragment_path) {
2558 zero(st);
2559 if (stat(u->fragment_path, &st) < 0)
2560 /* What, cannot access this anymore? */
2561 return true;
2562
2563 if (u->fragment_mtime > 0 &&
2564 timespec_load(&st.st_mtim) != u->fragment_mtime)
2565 return true;
2566 }
2567
2568 if (u->source_path) {
2569 zero(st);
2570 if (stat(u->source_path, &st) < 0)
2571 return true;
2572
2573 if (u->source_mtime > 0 &&
2574 timespec_load(&st.st_mtim) != u->source_mtime)
2575 return true;
2576 }
2577
2578 return false;
2579 }
2580
2581 void unit_reset_failed(Unit *u) {
2582 assert(u);
2583
2584 if (UNIT_VTABLE(u)->reset_failed)
2585 UNIT_VTABLE(u)->reset_failed(u);
2586 }
2587
2588 Unit *unit_following(Unit *u) {
2589 assert(u);
2590
2591 if (UNIT_VTABLE(u)->following)
2592 return UNIT_VTABLE(u)->following(u);
2593
2594 return NULL;
2595 }
2596
2597 bool unit_pending_inactive(Unit *u) {
2598 assert(u);
2599
2600 /* Returns true if the unit is inactive or going down */
2601
2602 if (UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(u)))
2603 return true;
2604
2605 if (u->job && u->job->type == JOB_STOP)
2606 return true;
2607
2608 return false;
2609 }
2610
2611 bool unit_pending_active(Unit *u) {
2612 assert(u);
2613
2614 /* Returns true if the unit is active or going up */
2615
2616 if (UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u)))
2617 return true;
2618
2619 if (u->job &&
2620 (u->job->type == JOB_START ||
2621 u->job->type == JOB_RELOAD_OR_START ||
2622 u->job->type == JOB_RESTART))
2623 return true;
2624
2625 return false;
2626 }
2627
2628 int unit_kill(Unit *u, KillWho w, int signo, DBusError *error) {
2629 assert(u);
2630 assert(w >= 0 && w < _KILL_WHO_MAX);
2631 assert(signo > 0);
2632 assert(signo < _NSIG);
2633
2634 if (!UNIT_VTABLE(u)->kill)
2635 return -ENOTSUP;
2636
2637 return UNIT_VTABLE(u)->kill(u, w, signo, error);
2638 }
2639
2640 int unit_following_set(Unit *u, Set **s) {
2641 assert(u);
2642 assert(s);
2643
2644 if (UNIT_VTABLE(u)->following_set)
2645 return UNIT_VTABLE(u)->following_set(u, s);
2646
2647 *s = NULL;
2648 return 0;
2649 }
2650
2651 UnitFileState unit_get_unit_file_state(Unit *u) {
2652 assert(u);
2653
2654 if (u->unit_file_state < 0 && u->fragment_path)
2655 u->unit_file_state = unit_file_get_state(
2656 u->manager->running_as == SYSTEMD_SYSTEM ? UNIT_FILE_SYSTEM : UNIT_FILE_USER,
2657 NULL, path_get_file_name(u->fragment_path));
2658
2659 return u->unit_file_state;
2660 }
2661
2662 Unit* unit_ref_set(UnitRef *ref, Unit *u) {
2663 assert(ref);
2664 assert(u);
2665
2666 if (ref->unit)
2667 unit_ref_unset(ref);
2668
2669 ref->unit = u;
2670 LIST_PREPEND(UnitRef, refs, u->refs, ref);
2671 return u;
2672 }
2673
2674 void unit_ref_unset(UnitRef *ref) {
2675 assert(ref);
2676
2677 if (!ref->unit)
2678 return;
2679
2680 LIST_REMOVE(UnitRef, refs, ref->unit->refs, ref);
2681 ref->unit = NULL;
2682 }
2683
2684 int unit_add_one_mount_link(Unit *u, Mount *m) {
2685 char **i;
2686
2687 assert(u);
2688 assert(m);
2689
2690 if (u->load_state != UNIT_LOADED ||
2691 UNIT(m)->load_state != UNIT_LOADED)
2692 return 0;
2693
2694 STRV_FOREACH(i, u->requires_mounts_for) {
2695
2696 if (UNIT(m) == u)
2697 continue;
2698
2699 if (!path_startswith(*i, m->where))
2700 continue;
2701
2702 return unit_add_two_dependencies(u, UNIT_AFTER, UNIT_REQUIRES, UNIT(m), true);
2703 }
2704
2705 return 0;
2706 }
2707
2708 int unit_add_mount_links(Unit *u) {
2709 Unit *other;
2710 int r;
2711
2712 assert(u);
2713
2714 LIST_FOREACH(units_by_type, other, u->manager->units_by_type[UNIT_MOUNT]) {
2715 r = unit_add_one_mount_link(u, MOUNT(other));
2716 if (r < 0)
2717 return r;
2718 }
2719
2720 return 0;
2721 }
2722
2723 int unit_exec_context_defaults(Unit *u, ExecContext *c) {
2724 unsigned i;
2725 int r;
2726
2727 assert(u);
2728 assert(c);
2729
2730 /* This only copies in the ones that need memory */
2731
2732 for (i = 0; i < RLIMIT_NLIMITS; i++)
2733 if (u->manager->rlimit[i] && !c->rlimit[i]) {
2734 c->rlimit[i] = newdup(struct rlimit, u->manager->rlimit[i], 1);
2735 if (!c->rlimit[i])
2736 return -ENOMEM;
2737 }
2738
2739 if (u->manager->running_as == SYSTEMD_USER &&
2740 !c->working_directory) {
2741
2742 r = get_home_dir(&c->working_directory);
2743 if (r < 0)
2744 return r;
2745 }
2746
2747 return 0;
2748 }
2749
2750 ExecContext *unit_get_exec_context(Unit *u) {
2751 size_t offset;
2752 assert(u);
2753
2754 offset = UNIT_VTABLE(u)->exec_context_offset;
2755 if (offset <= 0)
2756 return NULL;
2757
2758 return (ExecContext*) ((uint8_t*) u + offset);
2759 }
2760
2761 static const char* const unit_active_state_table[_UNIT_ACTIVE_STATE_MAX] = {
2762 [UNIT_ACTIVE] = "active",
2763 [UNIT_RELOADING] = "reloading",
2764 [UNIT_INACTIVE] = "inactive",
2765 [UNIT_FAILED] = "failed",
2766 [UNIT_ACTIVATING] = "activating",
2767 [UNIT_DEACTIVATING] = "deactivating"
2768 };
2769
2770 DEFINE_STRING_TABLE_LOOKUP(unit_active_state, UnitActiveState);
2771
2772 static const char* const unit_dependency_table[_UNIT_DEPENDENCY_MAX] = {
2773 [UNIT_REQUIRES] = "Requires",
2774 [UNIT_REQUIRES_OVERRIDABLE] = "RequiresOverridable",
2775 [UNIT_REQUISITE] = "Requisite",
2776 [UNIT_REQUISITE_OVERRIDABLE] = "RequisiteOverridable",
2777 [UNIT_WANTS] = "Wants",
2778 [UNIT_BINDS_TO] = "BindsTo",
2779 [UNIT_PART_OF] = "PartOf",
2780 [UNIT_REQUIRED_BY] = "RequiredBy",
2781 [UNIT_REQUIRED_BY_OVERRIDABLE] = "RequiredByOverridable",
2782 [UNIT_WANTED_BY] = "WantedBy",
2783 [UNIT_BOUND_BY] = "BoundBy",
2784 [UNIT_CONSISTS_OF] = "ConsistsOf",
2785 [UNIT_CONFLICTS] = "Conflicts",
2786 [UNIT_CONFLICTED_BY] = "ConflictedBy",
2787 [UNIT_BEFORE] = "Before",
2788 [UNIT_AFTER] = "After",
2789 [UNIT_ON_FAILURE] = "OnFailure",
2790 [UNIT_TRIGGERS] = "Triggers",
2791 [UNIT_TRIGGERED_BY] = "TriggeredBy",
2792 [UNIT_PROPAGATES_RELOAD_TO] = "PropagatesReloadTo",
2793 [UNIT_RELOAD_PROPAGATED_FROM] = "ReloadPropagatedFrom",
2794 [UNIT_REFERENCES] = "References",
2795 [UNIT_REFERENCED_BY] = "ReferencedBy",
2796 };
2797
2798 DEFINE_STRING_TABLE_LOOKUP(unit_dependency, UnitDependency);