chiark / gitweb /
log: introduce a macro to format message id
[elogind.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_notice("Unit %s entered failed state.", u->id);
1442                         unit_trigger_on_failure(u);
1443                 }
1444         }
1445
1446         /* Some names are special */
1447         if (UNIT_IS_ACTIVE_OR_RELOADING(ns)) {
1448
1449                 if (unit_has_name(u, SPECIAL_DBUS_SERVICE))
1450                         /* The bus just might have become available,
1451                          * hence try to connect to it, if we aren't
1452                          * yet connected. */
1453                         bus_init(u->manager, true);
1454
1455                 if (u->type == UNIT_SERVICE &&
1456                     !UNIT_IS_ACTIVE_OR_RELOADING(os) &&
1457                     u->manager->n_reloading <= 0) {
1458                         /* Write audit record if we have just finished starting up */
1459                         manager_send_unit_audit(u->manager, u, AUDIT_SERVICE_START, true);
1460                         u->in_audit = true;
1461                 }
1462
1463                 if (!UNIT_IS_ACTIVE_OR_RELOADING(os))
1464                         manager_send_unit_plymouth(u->manager, u);
1465
1466         } else {
1467
1468                 /* We don't care about D-Bus here, since we'll get an
1469                  * asynchronous notification for it anyway. */
1470
1471                 if (u->type == UNIT_SERVICE &&
1472                     UNIT_IS_INACTIVE_OR_FAILED(ns) &&
1473                     !UNIT_IS_INACTIVE_OR_FAILED(os) &&
1474                     u->manager->n_reloading <= 0) {
1475
1476                         /* Hmm, if there was no start record written
1477                          * write it now, so that we always have a nice
1478                          * pair */
1479                         if (!u->in_audit) {
1480                                 manager_send_unit_audit(u->manager, u, AUDIT_SERVICE_START, ns == UNIT_INACTIVE);
1481
1482                                 if (ns == UNIT_INACTIVE)
1483                                         manager_send_unit_audit(u->manager, u, AUDIT_SERVICE_STOP, true);
1484                         } else
1485                                 /* Write audit record if we have just finished shutting down */
1486                                 manager_send_unit_audit(u->manager, u, AUDIT_SERVICE_STOP, ns == UNIT_INACTIVE);
1487
1488                         u->in_audit = false;
1489                 }
1490         }
1491
1492         manager_recheck_journal(u->manager);
1493
1494         /* Maybe we finished startup and are now ready for being
1495          * stopped because unneeded? */
1496         unit_check_unneeded(u);
1497
1498         unit_add_to_dbus_queue(u);
1499         unit_add_to_gc_queue(u);
1500 }
1501
1502 int unit_watch_fd(Unit *u, int fd, uint32_t events, Watch *w) {
1503         struct epoll_event ev;
1504
1505         assert(u);
1506         assert(fd >= 0);
1507         assert(w);
1508         assert(w->type == WATCH_INVALID || (w->type == WATCH_FD && w->fd == fd && w->data.unit == u));
1509
1510         zero(ev);
1511         ev.data.ptr = w;
1512         ev.events = events;
1513
1514         if (epoll_ctl(u->manager->epoll_fd,
1515                       w->type == WATCH_INVALID ? EPOLL_CTL_ADD : EPOLL_CTL_MOD,
1516                       fd,
1517                       &ev) < 0)
1518                 return -errno;
1519
1520         w->fd = fd;
1521         w->type = WATCH_FD;
1522         w->data.unit = u;
1523
1524         return 0;
1525 }
1526
1527 void unit_unwatch_fd(Unit *u, Watch *w) {
1528         assert(u);
1529         assert(w);
1530
1531         if (w->type == WATCH_INVALID)
1532                 return;
1533
1534         assert(w->type == WATCH_FD);
1535         assert(w->data.unit == u);
1536         assert_se(epoll_ctl(u->manager->epoll_fd, EPOLL_CTL_DEL, w->fd, NULL) >= 0);
1537
1538         w->fd = -1;
1539         w->type = WATCH_INVALID;
1540         w->data.unit = NULL;
1541 }
1542
1543 int unit_watch_pid(Unit *u, pid_t pid) {
1544         assert(u);
1545         assert(pid >= 1);
1546
1547         /* Watch a specific PID. We only support one unit watching
1548          * each PID for now. */
1549
1550         return hashmap_put(u->manager->watch_pids, LONG_TO_PTR(pid), u);
1551 }
1552
1553 void unit_unwatch_pid(Unit *u, pid_t pid) {
1554         assert(u);
1555         assert(pid >= 1);
1556
1557         hashmap_remove_value(u->manager->watch_pids, LONG_TO_PTR(pid), u);
1558 }
1559
1560 int unit_watch_timer(Unit *u, usec_t delay, Watch *w) {
1561         struct itimerspec its;
1562         int flags, fd;
1563         bool ours;
1564
1565         assert(u);
1566         assert(w);
1567         assert(w->type == WATCH_INVALID || (w->type == WATCH_UNIT_TIMER && w->data.unit == u));
1568
1569         /* This will try to reuse the old timer if there is one */
1570
1571         if (w->type == WATCH_UNIT_TIMER) {
1572                 assert(w->data.unit == u);
1573                 assert(w->fd >= 0);
1574
1575                 ours = false;
1576                 fd = w->fd;
1577         } else if (w->type == WATCH_INVALID) {
1578
1579                 ours = true;
1580                 if ((fd = timerfd_create(CLOCK_MONOTONIC, TFD_NONBLOCK|TFD_CLOEXEC)) < 0)
1581                         return -errno;
1582         } else
1583                 assert_not_reached("Invalid watch type");
1584
1585         zero(its);
1586
1587         if (delay <= 0) {
1588                 /* Set absolute time in the past, but not 0, since we
1589                  * don't want to disarm the timer */
1590                 its.it_value.tv_sec = 0;
1591                 its.it_value.tv_nsec = 1;
1592
1593                 flags = TFD_TIMER_ABSTIME;
1594         } else {
1595                 timespec_store(&its.it_value, delay);
1596                 flags = 0;
1597         }
1598
1599         /* This will also flush the elapse counter */
1600         if (timerfd_settime(fd, flags, &its, NULL) < 0)
1601                 goto fail;
1602
1603         if (w->type == WATCH_INVALID) {
1604                 struct epoll_event ev;
1605
1606                 zero(ev);
1607                 ev.data.ptr = w;
1608                 ev.events = EPOLLIN;
1609
1610                 if (epoll_ctl(u->manager->epoll_fd, EPOLL_CTL_ADD, fd, &ev) < 0)
1611                         goto fail;
1612         }
1613
1614         w->type = WATCH_UNIT_TIMER;
1615         w->fd = fd;
1616         w->data.unit = u;
1617
1618         return 0;
1619
1620 fail:
1621         if (ours)
1622                 close_nointr_nofail(fd);
1623
1624         return -errno;
1625 }
1626
1627 void unit_unwatch_timer(Unit *u, Watch *w) {
1628         assert(u);
1629         assert(w);
1630
1631         if (w->type == WATCH_INVALID)
1632                 return;
1633
1634         assert(w->type == WATCH_UNIT_TIMER);
1635         assert(w->data.unit == u);
1636         assert(w->fd >= 0);
1637
1638         assert_se(epoll_ctl(u->manager->epoll_fd, EPOLL_CTL_DEL, w->fd, NULL) >= 0);
1639         close_nointr_nofail(w->fd);
1640
1641         w->fd = -1;
1642         w->type = WATCH_INVALID;
1643         w->data.unit = NULL;
1644 }
1645
1646 bool unit_job_is_applicable(Unit *u, JobType j) {
1647         assert(u);
1648         assert(j >= 0 && j < _JOB_TYPE_MAX);
1649
1650         switch (j) {
1651
1652         case JOB_VERIFY_ACTIVE:
1653         case JOB_START:
1654         case JOB_STOP:
1655         case JOB_NOP:
1656                 return true;
1657
1658         case JOB_RESTART:
1659         case JOB_TRY_RESTART:
1660                 return unit_can_start(u);
1661
1662         case JOB_RELOAD:
1663                 return unit_can_reload(u);
1664
1665         case JOB_RELOAD_OR_START:
1666                 return unit_can_reload(u) && unit_can_start(u);
1667
1668         default:
1669                 assert_not_reached("Invalid job type");
1670         }
1671 }
1672
1673 int unit_add_dependency(Unit *u, UnitDependency d, Unit *other, bool add_reference) {
1674
1675         static const UnitDependency inverse_table[_UNIT_DEPENDENCY_MAX] = {
1676                 [UNIT_REQUIRES] = UNIT_REQUIRED_BY,
1677                 [UNIT_REQUIRES_OVERRIDABLE] = UNIT_REQUIRED_BY_OVERRIDABLE,
1678                 [UNIT_WANTS] = UNIT_WANTED_BY,
1679                 [UNIT_REQUISITE] = UNIT_REQUIRED_BY,
1680                 [UNIT_REQUISITE_OVERRIDABLE] = UNIT_REQUIRED_BY_OVERRIDABLE,
1681                 [UNIT_BINDS_TO] = UNIT_BOUND_BY,
1682                 [UNIT_PART_OF] = UNIT_CONSISTS_OF,
1683                 [UNIT_REQUIRED_BY] = _UNIT_DEPENDENCY_INVALID,
1684                 [UNIT_REQUIRED_BY_OVERRIDABLE] = _UNIT_DEPENDENCY_INVALID,
1685                 [UNIT_WANTED_BY] = _UNIT_DEPENDENCY_INVALID,
1686                 [UNIT_BOUND_BY] = UNIT_BINDS_TO,
1687                 [UNIT_CONSISTS_OF] = UNIT_PART_OF,
1688                 [UNIT_CONFLICTS] = UNIT_CONFLICTED_BY,
1689                 [UNIT_CONFLICTED_BY] = UNIT_CONFLICTS,
1690                 [UNIT_BEFORE] = UNIT_AFTER,
1691                 [UNIT_AFTER] = UNIT_BEFORE,
1692                 [UNIT_ON_FAILURE] = _UNIT_DEPENDENCY_INVALID,
1693                 [UNIT_REFERENCES] = UNIT_REFERENCED_BY,
1694                 [UNIT_REFERENCED_BY] = UNIT_REFERENCES,
1695                 [UNIT_TRIGGERS] = UNIT_TRIGGERED_BY,
1696                 [UNIT_TRIGGERED_BY] = UNIT_TRIGGERS,
1697                 [UNIT_PROPAGATES_RELOAD_TO] = UNIT_RELOAD_PROPAGATED_FROM,
1698                 [UNIT_RELOAD_PROPAGATED_FROM] = UNIT_PROPAGATES_RELOAD_TO,
1699         };
1700         int r, q = 0, v = 0, w = 0;
1701
1702         assert(u);
1703         assert(d >= 0 && d < _UNIT_DEPENDENCY_MAX);
1704         assert(other);
1705
1706         u = unit_follow_merge(u);
1707         other = unit_follow_merge(other);
1708
1709         /* We won't allow dependencies on ourselves. We will not
1710          * consider them an error however. */
1711         if (u == other)
1712                 return 0;
1713
1714         if ((r = set_ensure_allocated(&u->dependencies[d], trivial_hash_func, trivial_compare_func)) < 0)
1715                 return r;
1716
1717         if (inverse_table[d] != _UNIT_DEPENDENCY_INVALID)
1718                 if ((r = set_ensure_allocated(&other->dependencies[inverse_table[d]], trivial_hash_func, trivial_compare_func)) < 0)
1719                         return r;
1720
1721         if (add_reference)
1722                 if ((r = set_ensure_allocated(&u->dependencies[UNIT_REFERENCES], trivial_hash_func, trivial_compare_func)) < 0 ||
1723                     (r = set_ensure_allocated(&other->dependencies[UNIT_REFERENCED_BY], trivial_hash_func, trivial_compare_func)) < 0)
1724                         return r;
1725
1726         if ((q = set_put(u->dependencies[d], other)) < 0)
1727                 return q;
1728
1729         if (inverse_table[d] != _UNIT_DEPENDENCY_INVALID)
1730                 if ((v = set_put(other->dependencies[inverse_table[d]], u)) < 0) {
1731                         r = v;
1732                         goto fail;
1733                 }
1734
1735         if (add_reference) {
1736                 if ((w = set_put(u->dependencies[UNIT_REFERENCES], other)) < 0) {
1737                         r = w;
1738                         goto fail;
1739                 }
1740
1741                 if ((r = set_put(other->dependencies[UNIT_REFERENCED_BY], u)) < 0)
1742                         goto fail;
1743         }
1744
1745         unit_add_to_dbus_queue(u);
1746         return 0;
1747
1748 fail:
1749         if (q > 0)
1750                 set_remove(u->dependencies[d], other);
1751
1752         if (v > 0)
1753                 set_remove(other->dependencies[inverse_table[d]], u);
1754
1755         if (w > 0)
1756                 set_remove(u->dependencies[UNIT_REFERENCES], other);
1757
1758         return r;
1759 }
1760
1761 int unit_add_two_dependencies(Unit *u, UnitDependency d, UnitDependency e, Unit *other, bool add_reference) {
1762         int r;
1763
1764         assert(u);
1765
1766         if ((r = unit_add_dependency(u, d, other, add_reference)) < 0)
1767                 return r;
1768
1769         if ((r = unit_add_dependency(u, e, other, add_reference)) < 0)
1770                 return r;
1771
1772         return 0;
1773 }
1774
1775 static const char *resolve_template(Unit *u, const char *name, const char*path, char **p) {
1776         char *s;
1777
1778         assert(u);
1779         assert(name || path);
1780
1781         if (!name)
1782                 name = path_get_file_name(path);
1783
1784         if (!unit_name_is_template(name)) {
1785                 *p = NULL;
1786                 return name;
1787         }
1788
1789         if (u->instance)
1790                 s = unit_name_replace_instance(name, u->instance);
1791         else {
1792                 char *i;
1793
1794                 if (!(i = unit_name_to_prefix(u->id)))
1795                         return NULL;
1796
1797                 s = unit_name_replace_instance(name, i);
1798                 free(i);
1799         }
1800
1801         if (!s)
1802                 return NULL;
1803
1804         *p = s;
1805         return s;
1806 }
1807
1808 int unit_add_dependency_by_name(Unit *u, UnitDependency d, const char *name, const char *path, bool add_reference) {
1809         Unit *other;
1810         int r;
1811         char *s;
1812
1813         assert(u);
1814         assert(name || path);
1815
1816         if (!(name = resolve_template(u, name, path, &s)))
1817                 return -ENOMEM;
1818
1819         if ((r = manager_load_unit(u->manager, name, path, NULL, &other)) < 0)
1820                 goto finish;
1821
1822         r = unit_add_dependency(u, d, other, add_reference);
1823
1824 finish:
1825         free(s);
1826         return r;
1827 }
1828
1829 int unit_add_two_dependencies_by_name(Unit *u, UnitDependency d, UnitDependency e, const char *name, const char *path, bool add_reference) {
1830         Unit *other;
1831         int r;
1832         char *s;
1833
1834         assert(u);
1835         assert(name || path);
1836
1837         if (!(name = resolve_template(u, name, path, &s)))
1838                 return -ENOMEM;
1839
1840         if ((r = manager_load_unit(u->manager, name, path, NULL, &other)) < 0)
1841                 goto finish;
1842
1843         r = unit_add_two_dependencies(u, d, e, other, add_reference);
1844
1845 finish:
1846         free(s);
1847         return r;
1848 }
1849
1850 int unit_add_dependency_by_name_inverse(Unit *u, UnitDependency d, const char *name, const char *path, bool add_reference) {
1851         Unit *other;
1852         int r;
1853         char *s;
1854
1855         assert(u);
1856         assert(name || path);
1857
1858         if (!(name = resolve_template(u, name, path, &s)))
1859                 return -ENOMEM;
1860
1861         if ((r = manager_load_unit(u->manager, name, path, NULL, &other)) < 0)
1862                 goto finish;
1863
1864         r = unit_add_dependency(other, d, u, add_reference);
1865
1866 finish:
1867         free(s);
1868         return r;
1869 }
1870
1871 int unit_add_two_dependencies_by_name_inverse(Unit *u, UnitDependency d, UnitDependency e, const char *name, const char *path, bool add_reference) {
1872         Unit *other;
1873         int r;
1874         char *s;
1875
1876         assert(u);
1877         assert(name || path);
1878
1879         if (!(name = resolve_template(u, name, path, &s)))
1880                 return -ENOMEM;
1881
1882         if ((r = manager_load_unit(u->manager, name, path, NULL, &other)) < 0)
1883                 goto finish;
1884
1885         if ((r = unit_add_two_dependencies(other, d, e, u, add_reference)) < 0)
1886                 goto finish;
1887
1888 finish:
1889         free(s);
1890         return r;
1891 }
1892
1893 int set_unit_path(const char *p) {
1894         char *cwd, *c;
1895         int r;
1896
1897         /* This is mostly for debug purposes */
1898
1899         if (path_is_absolute(p)) {
1900                 if (!(c = strdup(p)))
1901                         return -ENOMEM;
1902         } else {
1903                 if (!(cwd = get_current_dir_name()))
1904                         return -errno;
1905
1906                 r = asprintf(&c, "%s/%s", cwd, p);
1907                 free(cwd);
1908
1909                 if (r < 0)
1910                         return -ENOMEM;
1911         }
1912
1913         if (setenv("SYSTEMD_UNIT_PATH", c, 0) < 0) {
1914                 r = -errno;
1915                 free(c);
1916                 return r;
1917         }
1918
1919         return 0;
1920 }
1921
1922 char *unit_dbus_path(Unit *u) {
1923         assert(u);
1924
1925         if (!u->id)
1926                 return NULL;
1927
1928         return unit_dbus_path_from_name(u->id);
1929 }
1930
1931 int unit_add_cgroup(Unit *u, CGroupBonding *b) {
1932         int r;
1933
1934         assert(u);
1935         assert(b);
1936
1937         assert(b->path);
1938
1939         if (!b->controller) {
1940                 if (!(b->controller = strdup(SYSTEMD_CGROUP_CONTROLLER)))
1941                         return -ENOMEM;
1942
1943                 b->ours = true;
1944         }
1945
1946         /* Ensure this hasn't been added yet */
1947         assert(!b->unit);
1948
1949         if (streq(b->controller, SYSTEMD_CGROUP_CONTROLLER)) {
1950                 CGroupBonding *l;
1951
1952                 l = hashmap_get(u->manager->cgroup_bondings, b->path);
1953                 LIST_PREPEND(CGroupBonding, by_path, l, b);
1954
1955                 if ((r = hashmap_replace(u->manager->cgroup_bondings, b->path, l)) < 0) {
1956                         LIST_REMOVE(CGroupBonding, by_path, l, b);
1957                         return r;
1958                 }
1959         }
1960
1961         LIST_PREPEND(CGroupBonding, by_unit, u->cgroup_bondings, b);
1962         b->unit = u;
1963
1964         return 0;
1965 }
1966
1967 char *unit_default_cgroup_path(Unit *u) {
1968         char *p;
1969
1970         assert(u);
1971
1972         if (u->instance) {
1973                 char *t;
1974
1975                 t = unit_name_template(u->id);
1976                 if (!t)
1977                         return NULL;
1978
1979                 p = strjoin(u->manager->cgroup_hierarchy, "/", t, "/", u->instance, NULL);
1980                 free(t);
1981         } else
1982                 p = strjoin(u->manager->cgroup_hierarchy, "/", u->id, NULL);
1983
1984         return p;
1985 }
1986
1987 int unit_add_cgroup_from_text(Unit *u, const char *name) {
1988         char *controller = NULL, *path = NULL;
1989         CGroupBonding *b = NULL;
1990         bool ours = false;
1991         int r;
1992
1993         assert(u);
1994         assert(name);
1995
1996         if ((r = cg_split_spec(name, &controller, &path)) < 0)
1997                 return r;
1998
1999         if (!path) {
2000                 path = unit_default_cgroup_path(u);
2001                 ours = true;
2002         }
2003
2004         if (!controller) {
2005                 controller = strdup(SYSTEMD_CGROUP_CONTROLLER);
2006                 ours = true;
2007         }
2008
2009         if (!path || !controller) {
2010                 free(path);
2011                 free(controller);
2012
2013                 return -ENOMEM;
2014         }
2015
2016         if (cgroup_bonding_find_list(u->cgroup_bondings, controller)) {
2017                 r = -EEXIST;
2018                 goto fail;
2019         }
2020
2021         if (!(b = new0(CGroupBonding, 1))) {
2022                 r = -ENOMEM;
2023                 goto fail;
2024         }
2025
2026         b->controller = controller;
2027         b->path = path;
2028         b->ours = ours;
2029         b->essential = streq(controller, SYSTEMD_CGROUP_CONTROLLER);
2030
2031         if ((r = unit_add_cgroup(u, b)) < 0)
2032                 goto fail;
2033
2034         return 0;
2035
2036 fail:
2037         free(path);
2038         free(controller);
2039         free(b);
2040
2041         return r;
2042 }
2043
2044 static int unit_add_one_default_cgroup(Unit *u, const char *controller) {
2045         CGroupBonding *b = NULL;
2046         int r = -ENOMEM;
2047
2048         assert(u);
2049
2050         if (!controller)
2051                 controller = SYSTEMD_CGROUP_CONTROLLER;
2052
2053         if (cgroup_bonding_find_list(u->cgroup_bondings, controller))
2054                 return 0;
2055
2056         if (!(b = new0(CGroupBonding, 1)))
2057                 return -ENOMEM;
2058
2059         if (!(b->controller = strdup(controller)))
2060                 goto fail;
2061
2062         b->path = unit_default_cgroup_path(u);
2063         if (!b->path)
2064                 goto fail;
2065
2066         b->ours = true;
2067         b->essential = streq(controller, SYSTEMD_CGROUP_CONTROLLER);
2068
2069         if ((r = unit_add_cgroup(u, b)) < 0)
2070                 goto fail;
2071
2072         return 0;
2073
2074 fail:
2075         free(b->path);
2076         free(b->controller);
2077         free(b);
2078
2079         return r;
2080 }
2081
2082 int unit_add_default_cgroups(Unit *u) {
2083         CGroupAttribute *a;
2084         char **c;
2085         int r;
2086
2087         assert(u);
2088
2089         /* Adds in the default cgroups, if they weren't specified
2090          * otherwise. */
2091
2092         if (!u->manager->cgroup_hierarchy)
2093                 return 0;
2094
2095         if ((r = unit_add_one_default_cgroup(u, NULL)) < 0)
2096                 return r;
2097
2098         STRV_FOREACH(c, u->manager->default_controllers)
2099                 unit_add_one_default_cgroup(u, *c);
2100
2101         LIST_FOREACH(by_unit, a, u->cgroup_attributes)
2102                 unit_add_one_default_cgroup(u, a->controller);
2103
2104         return 0;
2105 }
2106
2107 CGroupBonding* unit_get_default_cgroup(Unit *u) {
2108         assert(u);
2109
2110         return cgroup_bonding_find_list(u->cgroup_bondings, SYSTEMD_CGROUP_CONTROLLER);
2111 }
2112
2113 int unit_add_cgroup_attribute(Unit *u, const char *controller, const char *name, const char *value, CGroupAttributeMapCallback map_callback) {
2114         int r;
2115         char *c = NULL;
2116         CGroupAttribute *a;
2117
2118         assert(u);
2119         assert(name);
2120         assert(value);
2121
2122         if (!controller) {
2123                 const char *dot;
2124
2125                 dot = strchr(name, '.');
2126                 if (!dot)
2127                         return -EINVAL;
2128
2129                 c = strndup(name, dot - name);
2130                 if (!c)
2131                         return -ENOMEM;
2132
2133                 controller = c;
2134         }
2135
2136         if (streq(controller, SYSTEMD_CGROUP_CONTROLLER)) {
2137                 r = -EINVAL;
2138                 goto finish;
2139         }
2140
2141         a = new0(CGroupAttribute, 1);
2142         if (!a) {
2143                 r = -ENOMEM;
2144                 goto finish;
2145         }
2146
2147         if (c) {
2148                 a->controller = c;
2149                 c = NULL;
2150         } else
2151                 a->controller = strdup(controller);
2152
2153         a->name = strdup(name);
2154         a->value = strdup(value);
2155
2156         if (!a->controller || !a->name || !a->value) {
2157                 free(a->controller);
2158                 free(a->name);
2159                 free(a->value);
2160                 free(a);
2161
2162                 return -ENOMEM;
2163         }
2164
2165         a->map_callback = map_callback;
2166
2167         LIST_PREPEND(CGroupAttribute, by_unit, u->cgroup_attributes, a);
2168
2169         r = 0;
2170
2171 finish:
2172         free(c);
2173         return r;
2174 }
2175
2176 int unit_load_related_unit(Unit *u, const char *type, Unit **_found) {
2177         char *t;
2178         int r;
2179
2180         assert(u);
2181         assert(type);
2182         assert(_found);
2183
2184         if (!(t = unit_name_change_suffix(u->id, type)))
2185                 return -ENOMEM;
2186
2187         assert(!unit_has_name(u, t));
2188
2189         r = manager_load_unit(u->manager, t, NULL, NULL, _found);
2190         free(t);
2191
2192         assert(r < 0 || *_found != u);
2193
2194         return r;
2195 }
2196
2197 int unit_get_related_unit(Unit *u, const char *type, Unit **_found) {
2198         Unit *found;
2199         char *t;
2200
2201         assert(u);
2202         assert(type);
2203         assert(_found);
2204
2205         if (!(t = unit_name_change_suffix(u->id, type)))
2206                 return -ENOMEM;
2207
2208         assert(!unit_has_name(u, t));
2209
2210         found = manager_get_unit(u->manager, t);
2211         free(t);
2212
2213         if (!found)
2214                 return -ENOENT;
2215
2216         *_found = found;
2217         return 0;
2218 }
2219
2220 int unit_watch_bus_name(Unit *u, const char *name) {
2221         assert(u);
2222         assert(name);
2223
2224         /* Watch a specific name on the bus. We only support one unit
2225          * watching each name for now. */
2226
2227         return hashmap_put(u->manager->watch_bus, name, u);
2228 }
2229
2230 void unit_unwatch_bus_name(Unit *u, const char *name) {
2231         assert(u);
2232         assert(name);
2233
2234         hashmap_remove_value(u->manager->watch_bus, name, u);
2235 }
2236
2237 bool unit_can_serialize(Unit *u) {
2238         assert(u);
2239
2240         return UNIT_VTABLE(u)->serialize && UNIT_VTABLE(u)->deserialize_item;
2241 }
2242
2243 int unit_serialize(Unit *u, FILE *f, FDSet *fds, bool serialize_jobs) {
2244         int r;
2245
2246         assert(u);
2247         assert(f);
2248         assert(fds);
2249
2250         if (!unit_can_serialize(u))
2251                 return 0;
2252
2253         if ((r = UNIT_VTABLE(u)->serialize(u, f, fds)) < 0)
2254                 return r;
2255
2256
2257         if (serialize_jobs) {
2258                 if (u->job) {
2259                         fprintf(f, "job\n");
2260                         job_serialize(u->job, f, fds);
2261                 }
2262
2263                 if (u->nop_job) {
2264                         fprintf(f, "job\n");
2265                         job_serialize(u->nop_job, f, fds);
2266                 }
2267         }
2268
2269         dual_timestamp_serialize(f, "inactive-exit-timestamp", &u->inactive_exit_timestamp);
2270         dual_timestamp_serialize(f, "active-enter-timestamp", &u->active_enter_timestamp);
2271         dual_timestamp_serialize(f, "active-exit-timestamp", &u->active_exit_timestamp);
2272         dual_timestamp_serialize(f, "inactive-enter-timestamp", &u->inactive_enter_timestamp);
2273         dual_timestamp_serialize(f, "condition-timestamp", &u->condition_timestamp);
2274
2275         if (dual_timestamp_is_set(&u->condition_timestamp))
2276                 unit_serialize_item(u, f, "condition-result", yes_no(u->condition_result));
2277
2278         /* End marker */
2279         fputc('\n', f);
2280         return 0;
2281 }
2282
2283 void unit_serialize_item_format(Unit *u, FILE *f, const char *key, const char *format, ...) {
2284         va_list ap;
2285
2286         assert(u);
2287         assert(f);
2288         assert(key);
2289         assert(format);
2290
2291         fputs(key, f);
2292         fputc('=', f);
2293
2294         va_start(ap, format);
2295         vfprintf(f, format, ap);
2296         va_end(ap);
2297
2298         fputc('\n', f);
2299 }
2300
2301 void unit_serialize_item(Unit *u, FILE *f, const char *key, const char *value) {
2302         assert(u);
2303         assert(f);
2304         assert(key);
2305         assert(value);
2306
2307         fprintf(f, "%s=%s\n", key, value);
2308 }
2309
2310 int unit_deserialize(Unit *u, FILE *f, FDSet *fds) {
2311         int r;
2312
2313         assert(u);
2314         assert(f);
2315         assert(fds);
2316
2317         if (!unit_can_serialize(u))
2318                 return 0;
2319
2320         for (;;) {
2321                 char line[LINE_MAX], *l, *v;
2322                 size_t k;
2323
2324                 if (!fgets(line, sizeof(line), f)) {
2325                         if (feof(f))
2326                                 return 0;
2327                         return -errno;
2328                 }
2329
2330                 char_array_0(line);
2331                 l = strstrip(line);
2332
2333                 /* End marker */
2334                 if (l[0] == 0)
2335                         return 0;
2336
2337                 k = strcspn(l, "=");
2338
2339                 if (l[k] == '=') {
2340                         l[k] = 0;
2341                         v = l+k+1;
2342                 } else
2343                         v = l+k;
2344
2345                 if (streq(l, "job")) {
2346                         if (v[0] == '\0') {
2347                                 /* new-style serialized job */
2348                                 Job *j = job_new_raw(u);
2349                                 if (!j)
2350                                         return -ENOMEM;
2351
2352                                 r = job_deserialize(j, f, fds);
2353                                 if (r < 0) {
2354                                         job_free(j);
2355                                         return r;
2356                                 }
2357
2358                                 r = hashmap_put(u->manager->jobs, UINT32_TO_PTR(j->id), j);
2359                                 if (r < 0) {
2360                                         job_free(j);
2361                                         return r;
2362                                 }
2363
2364                                 r = job_install_deserialized(j);
2365                                 if (r < 0) {
2366                                         hashmap_remove(u->manager->jobs, UINT32_TO_PTR(j->id));
2367                                         job_free(j);
2368                                         return r;
2369                                 }
2370                         } else {
2371                                 /* legacy */
2372                                 JobType type = job_type_from_string(v);
2373                                 if (type < 0)
2374                                         log_debug("Failed to parse job type value %s", v);
2375                                 else
2376                                         u->deserialized_job = type;
2377                         }
2378                         continue;
2379                 } else if (streq(l, "inactive-exit-timestamp")) {
2380                         dual_timestamp_deserialize(v, &u->inactive_exit_timestamp);
2381                         continue;
2382                 } else if (streq(l, "active-enter-timestamp")) {
2383                         dual_timestamp_deserialize(v, &u->active_enter_timestamp);
2384                         continue;
2385                 } else if (streq(l, "active-exit-timestamp")) {
2386                         dual_timestamp_deserialize(v, &u->active_exit_timestamp);
2387                         continue;
2388                 } else if (streq(l, "inactive-enter-timestamp")) {
2389                         dual_timestamp_deserialize(v, &u->inactive_enter_timestamp);
2390                         continue;
2391                 } else if (streq(l, "condition-timestamp")) {
2392                         dual_timestamp_deserialize(v, &u->condition_timestamp);
2393                         continue;
2394                 } else if (streq(l, "condition-result")) {
2395                         int b;
2396
2397                         if ((b = parse_boolean(v)) < 0)
2398                                 log_debug("Failed to parse condition result value %s", v);
2399                         else
2400                                 u->condition_result = b;
2401
2402                         continue;
2403                 }
2404
2405                 if ((r = UNIT_VTABLE(u)->deserialize_item(u, l, v, fds)) < 0)
2406                         return r;
2407         }
2408 }
2409
2410 int unit_add_node_link(Unit *u, const char *what, bool wants) {
2411         Unit *device;
2412         char *e;
2413         int r;
2414
2415         assert(u);
2416
2417         if (!what)
2418                 return 0;
2419
2420         /* Adds in links to the device node that this unit is based on */
2421
2422         if (!is_device_path(what))
2423                 return 0;
2424
2425         e = unit_name_from_path(what, ".device");
2426         if (!e)
2427                 return -ENOMEM;
2428
2429         r = manager_load_unit(u->manager, e, NULL, NULL, &device);
2430         free(e);
2431         if (r < 0)
2432                 return r;
2433
2434         r = unit_add_two_dependencies(u, UNIT_AFTER, UNIT_BINDS_TO, device, true);
2435         if (r < 0)
2436                 return r;
2437
2438         if (wants) {
2439                 r = unit_add_dependency(device, UNIT_WANTS, u, false);
2440                 if (r < 0)
2441                         return r;
2442         }
2443
2444         return 0;
2445 }
2446
2447 int unit_coldplug(Unit *u) {
2448         int r;
2449
2450         assert(u);
2451
2452         if (UNIT_VTABLE(u)->coldplug)
2453                 if ((r = UNIT_VTABLE(u)->coldplug(u)) < 0)
2454                         return r;
2455
2456         if (u->job) {
2457                 r = job_coldplug(u->job);
2458                 if (r < 0)
2459                         return r;
2460         } else if (u->deserialized_job >= 0) {
2461                 /* legacy */
2462                 r = manager_add_job(u->manager, u->deserialized_job, u, JOB_IGNORE_REQUIREMENTS, false, NULL, NULL);
2463                 if (r < 0)
2464                         return r;
2465
2466                 u->deserialized_job = _JOB_TYPE_INVALID;
2467         }
2468
2469         return 0;
2470 }
2471
2472 void unit_status_printf(Unit *u, const char *status, const char *format, ...) {
2473         va_list ap;
2474
2475         assert(u);
2476         assert(format);
2477
2478         if (!manager_get_show_status(u->manager))
2479                 return;
2480
2481         if (!manager_is_booting_or_shutting_down(u->manager))
2482                 return;
2483
2484         va_start(ap, format);
2485         status_vprintf(status, true, format, ap);
2486         va_end(ap);
2487 }
2488
2489 bool unit_need_daemon_reload(Unit *u) {
2490         struct stat st;
2491
2492         assert(u);
2493
2494         if (u->fragment_path) {
2495                 zero(st);
2496                 if (stat(u->fragment_path, &st) < 0)
2497                         /* What, cannot access this anymore? */
2498                         return true;
2499
2500                 if (u->fragment_mtime > 0 &&
2501                     timespec_load(&st.st_mtim) != u->fragment_mtime)
2502                         return true;
2503         }
2504
2505         if (u->source_path) {
2506                 zero(st);
2507                 if (stat(u->source_path, &st) < 0)
2508                         return true;
2509
2510                 if (u->source_mtime > 0 &&
2511                     timespec_load(&st.st_mtim) != u->source_mtime)
2512                         return true;
2513         }
2514
2515         return false;
2516 }
2517
2518 void unit_reset_failed(Unit *u) {
2519         assert(u);
2520
2521         if (UNIT_VTABLE(u)->reset_failed)
2522                 UNIT_VTABLE(u)->reset_failed(u);
2523 }
2524
2525 Unit *unit_following(Unit *u) {
2526         assert(u);
2527
2528         if (UNIT_VTABLE(u)->following)
2529                 return UNIT_VTABLE(u)->following(u);
2530
2531         return NULL;
2532 }
2533
2534 bool unit_pending_inactive(Unit *u) {
2535         assert(u);
2536
2537         /* Returns true if the unit is inactive or going down */
2538
2539         if (UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(u)))
2540                 return true;
2541
2542         if (u->job && u->job->type == JOB_STOP)
2543                 return true;
2544
2545         return false;
2546 }
2547
2548 bool unit_pending_active(Unit *u) {
2549         assert(u);
2550
2551         /* Returns true if the unit is active or going up */
2552
2553         if (UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u)))
2554                 return true;
2555
2556         if (u->job &&
2557             (u->job->type == JOB_START ||
2558              u->job->type == JOB_RELOAD_OR_START ||
2559              u->job->type == JOB_RESTART))
2560                 return true;
2561
2562         return false;
2563 }
2564
2565 int unit_kill(Unit *u, KillWho w, int signo, DBusError *error) {
2566         assert(u);
2567         assert(w >= 0 && w < _KILL_WHO_MAX);
2568         assert(signo > 0);
2569         assert(signo < _NSIG);
2570
2571         if (!UNIT_VTABLE(u)->kill)
2572                 return -ENOTSUP;
2573
2574         return UNIT_VTABLE(u)->kill(u, w, signo, error);
2575 }
2576
2577 int unit_following_set(Unit *u, Set **s) {
2578         assert(u);
2579         assert(s);
2580
2581         if (UNIT_VTABLE(u)->following_set)
2582                 return UNIT_VTABLE(u)->following_set(u, s);
2583
2584         *s = NULL;
2585         return 0;
2586 }
2587
2588 UnitFileState unit_get_unit_file_state(Unit *u) {
2589         assert(u);
2590
2591         if (u->unit_file_state < 0 && u->fragment_path)
2592                 u->unit_file_state = unit_file_get_state(
2593                                 u->manager->running_as == SYSTEMD_SYSTEM ? UNIT_FILE_SYSTEM : UNIT_FILE_USER,
2594                                 NULL, path_get_file_name(u->fragment_path));
2595
2596         return u->unit_file_state;
2597 }
2598
2599 Unit* unit_ref_set(UnitRef *ref, Unit *u) {
2600         assert(ref);
2601         assert(u);
2602
2603         if (ref->unit)
2604                 unit_ref_unset(ref);
2605
2606         ref->unit = u;
2607         LIST_PREPEND(UnitRef, refs, u->refs, ref);
2608         return u;
2609 }
2610
2611 void unit_ref_unset(UnitRef *ref) {
2612         assert(ref);
2613
2614         if (!ref->unit)
2615                 return;
2616
2617         LIST_REMOVE(UnitRef, refs, ref->unit->refs, ref);
2618         ref->unit = NULL;
2619 }
2620
2621 int unit_add_one_mount_link(Unit *u, Mount *m) {
2622         char **i;
2623
2624         assert(u);
2625         assert(m);
2626
2627         if (u->load_state != UNIT_LOADED ||
2628             UNIT(m)->load_state != UNIT_LOADED)
2629                 return 0;
2630
2631         STRV_FOREACH(i, u->requires_mounts_for) {
2632
2633                 if (UNIT(m) == u)
2634                         continue;
2635
2636                 if (!path_startswith(*i, m->where))
2637                         continue;
2638
2639                 return unit_add_two_dependencies(u, UNIT_AFTER, UNIT_REQUIRES, UNIT(m), true);
2640         }
2641
2642         return 0;
2643 }
2644
2645 int unit_add_mount_links(Unit *u) {
2646         Unit *other;
2647         int r;
2648
2649         assert(u);
2650
2651         LIST_FOREACH(units_by_type, other, u->manager->units_by_type[UNIT_MOUNT]) {
2652                 r = unit_add_one_mount_link(u, MOUNT(other));
2653                 if (r < 0)
2654                         return r;
2655         }
2656
2657         return 0;
2658 }
2659
2660 int unit_exec_context_defaults(Unit *u, ExecContext *c) {
2661         unsigned i;
2662         int r;
2663
2664         assert(u);
2665         assert(c);
2666
2667         /* This only copies in the ones that need memory */
2668
2669         for (i = 0; i < RLIMIT_NLIMITS; i++)
2670                 if (u->manager->rlimit[i] && !c->rlimit[i]) {
2671                         c->rlimit[i] = newdup(struct rlimit, u->manager->rlimit[i], 1);
2672                         if (!c->rlimit[i])
2673                                 return -ENOMEM;
2674                 }
2675
2676         if (u->manager->running_as == SYSTEMD_USER &&
2677             !c->working_directory) {
2678
2679                 r = get_home_dir(&c->working_directory);
2680                 if (r < 0)
2681                         return r;
2682         }
2683
2684         return 0;
2685 }
2686
2687 ExecContext *unit_get_exec_context(Unit *u) {
2688         size_t offset;
2689         assert(u);
2690
2691         offset = UNIT_VTABLE(u)->exec_context_offset;
2692         if (offset <= 0)
2693                 return NULL;
2694
2695         return (ExecContext*) ((uint8_t*) u + offset);
2696 }
2697
2698 static const char* const unit_active_state_table[_UNIT_ACTIVE_STATE_MAX] = {
2699         [UNIT_ACTIVE] = "active",
2700         [UNIT_RELOADING] = "reloading",
2701         [UNIT_INACTIVE] = "inactive",
2702         [UNIT_FAILED] = "failed",
2703         [UNIT_ACTIVATING] = "activating",
2704         [UNIT_DEACTIVATING] = "deactivating"
2705 };
2706
2707 DEFINE_STRING_TABLE_LOOKUP(unit_active_state, UnitActiveState);
2708
2709 static const char* const unit_dependency_table[_UNIT_DEPENDENCY_MAX] = {
2710         [UNIT_REQUIRES] = "Requires",
2711         [UNIT_REQUIRES_OVERRIDABLE] = "RequiresOverridable",
2712         [UNIT_REQUISITE] = "Requisite",
2713         [UNIT_REQUISITE_OVERRIDABLE] = "RequisiteOverridable",
2714         [UNIT_WANTS] = "Wants",
2715         [UNIT_BINDS_TO] = "BindsTo",
2716         [UNIT_PART_OF] = "PartOf",
2717         [UNIT_REQUIRED_BY] = "RequiredBy",
2718         [UNIT_REQUIRED_BY_OVERRIDABLE] = "RequiredByOverridable",
2719         [UNIT_WANTED_BY] = "WantedBy",
2720         [UNIT_BOUND_BY] = "BoundBy",
2721         [UNIT_CONSISTS_OF] = "ConsistsOf",
2722         [UNIT_CONFLICTS] = "Conflicts",
2723         [UNIT_CONFLICTED_BY] = "ConflictedBy",
2724         [UNIT_BEFORE] = "Before",
2725         [UNIT_AFTER] = "After",
2726         [UNIT_ON_FAILURE] = "OnFailure",
2727         [UNIT_TRIGGERS] = "Triggers",
2728         [UNIT_TRIGGERED_BY] = "TriggeredBy",
2729         [UNIT_PROPAGATES_RELOAD_TO] = "PropagatesReloadTo",
2730         [UNIT_RELOAD_PROPAGATED_FROM] = "ReloadPropagatedFrom",
2731         [UNIT_REFERENCES] = "References",
2732         [UNIT_REFERENCED_BY] = "ReferencedBy",
2733 };
2734
2735 DEFINE_STRING_TABLE_LOOKUP(unit_dependency, UnitDependency);