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