chiark / gitweb /
b362fd3b41957385e7e106f2a10bc98e45bc7bce
[elogind.git] / src / unit.c
1 /*-*- Mode: C; c-basic-offset: 8 -*-*/
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 General Public License as published by
10   the Free Software Foundation; either version 2 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   General Public License for more details.
17
18   You should have received a copy of the GNU 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
31 #include "set.h"
32 #include "unit.h"
33 #include "macro.h"
34 #include "strv.h"
35 #include "load-fragment.h"
36 #include "load-dropin.h"
37 #include "log.h"
38 #include "unit-name.h"
39 #include "specifier.h"
40 #include "dbus-unit.h"
41 #include "special.h"
42 #include "cgroup-util.h"
43
44 const UnitVTable * const unit_vtable[_UNIT_TYPE_MAX] = {
45         [UNIT_SERVICE] = &service_vtable,
46         [UNIT_TIMER] = &timer_vtable,
47         [UNIT_SOCKET] = &socket_vtable,
48         [UNIT_TARGET] = &target_vtable,
49         [UNIT_DEVICE] = &device_vtable,
50         [UNIT_MOUNT] = &mount_vtable,
51         [UNIT_AUTOMOUNT] = &automount_vtable,
52         [UNIT_SNAPSHOT] = &snapshot_vtable,
53         [UNIT_SWAP] = &swap_vtable,
54         [UNIT_PATH] = &path_vtable
55 };
56
57 Unit *unit_new(Manager *m) {
58         Unit *u;
59
60         assert(m);
61
62         if (!(u = new0(Unit, 1)))
63                 return NULL;
64
65         if (!(u->meta.names = set_new(string_hash_func, string_compare_func))) {
66                 free(u);
67                 return NULL;
68         }
69
70         u->meta.manager = m;
71         u->meta.type = _UNIT_TYPE_INVALID;
72         u->meta.deserialized_job = _JOB_TYPE_INVALID;
73         u->meta.default_dependencies = true;
74
75         return u;
76 }
77
78 bool unit_has_name(Unit *u, const char *name) {
79         assert(u);
80         assert(name);
81
82         return !!set_get(u->meta.names, (char*) name);
83 }
84
85 int unit_add_name(Unit *u, const char *text) {
86         UnitType t;
87         char *s = NULL, *i = NULL;
88         int r;
89
90         assert(u);
91         assert(text);
92
93         if (unit_name_is_template(text)) {
94                 if (!u->meta.instance)
95                         return -EINVAL;
96
97                 s = unit_name_replace_instance(text, u->meta.instance);
98         } else
99                 s = strdup(text);
100
101         if (!s)
102                 return -ENOMEM;
103
104         if (!unit_name_is_valid(s)) {
105                 r = -EINVAL;
106                 goto fail;
107         }
108
109         assert_se((t = unit_name_to_type(s)) >= 0);
110
111         if (u->meta.type != _UNIT_TYPE_INVALID && t != u->meta.type) {
112                 r = -EINVAL;
113                 goto fail;
114         }
115
116         if ((r = unit_name_to_instance(s, &i)) < 0)
117                 goto fail;
118
119         if (i && unit_vtable[t]->no_instances)
120                 goto fail;
121
122         if (u->meta.type != _UNIT_TYPE_INVALID && !streq_ptr(u->meta.instance, i)) {
123                 r = -EINVAL;
124                 goto fail;
125         }
126
127         if (unit_vtable[t]->no_alias &&
128             !set_isempty(u->meta.names) &&
129             !set_get(u->meta.names, s)) {
130                 r = -EEXIST;
131                 goto fail;
132         }
133
134         if (hashmap_size(u->meta.manager->units) >= MANAGER_MAX_NAMES) {
135                 r = -E2BIG;
136                 goto fail;
137         }
138
139         if ((r = set_put(u->meta.names, s)) < 0) {
140                 if (r == -EEXIST)
141                         r = 0;
142                 goto fail;
143         }
144
145         if ((r = hashmap_put(u->meta.manager->units, s, u)) < 0) {
146                 set_remove(u->meta.names, s);
147                 goto fail;
148         }
149
150         if (u->meta.type == _UNIT_TYPE_INVALID) {
151
152                 u->meta.type = t;
153                 u->meta.id = s;
154                 u->meta.instance = i;
155
156                 LIST_PREPEND(Meta, units_per_type, u->meta.manager->units_per_type[t], &u->meta);
157
158                 if (UNIT_VTABLE(u)->init)
159                         UNIT_VTABLE(u)->init(u);
160         } else
161                 free(i);
162
163         unit_add_to_dbus_queue(u);
164         return 0;
165
166 fail:
167         free(s);
168         free(i);
169
170         return r;
171 }
172
173 int unit_choose_id(Unit *u, const char *name) {
174         char *s, *t = NULL;
175
176         assert(u);
177         assert(name);
178
179         if (unit_name_is_template(name)) {
180
181                 if (!u->meta.instance)
182                         return -EINVAL;
183
184                 if (!(t = unit_name_replace_instance(name, u->meta.instance)))
185                         return -ENOMEM;
186
187                 name = t;
188         }
189
190         /* Selects one of the names of this unit as the id */
191         s = set_get(u->meta.names, (char*) name);
192         free(t);
193
194         if (!s)
195                 return -ENOENT;
196
197         u->meta.id = s;
198         unit_add_to_dbus_queue(u);
199
200         return 0;
201 }
202
203 int unit_set_description(Unit *u, const char *description) {
204         char *s;
205
206         assert(u);
207
208         if (!(s = strdup(description)))
209                 return -ENOMEM;
210
211         free(u->meta.description);
212         u->meta.description = s;
213
214         unit_add_to_dbus_queue(u);
215         return 0;
216 }
217
218 bool unit_check_gc(Unit *u) {
219         assert(u);
220
221         if (u->meta.load_state == UNIT_STUB)
222                 return true;
223
224         if (UNIT_VTABLE(u)->no_gc)
225                 return true;
226
227         if (u->meta.job)
228                 return true;
229
230         if (unit_active_state(u) != UNIT_INACTIVE)
231                 return true;
232
233         if (UNIT_VTABLE(u)->check_gc)
234                 if (UNIT_VTABLE(u)->check_gc(u))
235                         return true;
236
237         return false;
238 }
239
240 void unit_add_to_load_queue(Unit *u) {
241         assert(u);
242         assert(u->meta.type != _UNIT_TYPE_INVALID);
243
244         if (u->meta.load_state != UNIT_STUB || u->meta.in_load_queue)
245                 return;
246
247         LIST_PREPEND(Meta, load_queue, u->meta.manager->load_queue, &u->meta);
248         u->meta.in_load_queue = true;
249 }
250
251 void unit_add_to_cleanup_queue(Unit *u) {
252         assert(u);
253
254         if (u->meta.in_cleanup_queue)
255                 return;
256
257         LIST_PREPEND(Meta, cleanup_queue, u->meta.manager->cleanup_queue, &u->meta);
258         u->meta.in_cleanup_queue = true;
259 }
260
261 void unit_add_to_gc_queue(Unit *u) {
262         assert(u);
263
264         if (u->meta.in_gc_queue || u->meta.in_cleanup_queue)
265                 return;
266
267         if (unit_check_gc(u))
268                 return;
269
270         LIST_PREPEND(Meta, gc_queue, u->meta.manager->gc_queue, &u->meta);
271         u->meta.in_gc_queue = true;
272
273         u->meta.manager->n_in_gc_queue ++;
274
275         if (u->meta.manager->gc_queue_timestamp <= 0)
276                 u->meta.manager->gc_queue_timestamp = now(CLOCK_MONOTONIC);
277 }
278
279 void unit_add_to_dbus_queue(Unit *u) {
280         assert(u);
281         assert(u->meta.type != _UNIT_TYPE_INVALID);
282
283         if (u->meta.load_state == UNIT_STUB || u->meta.in_dbus_queue)
284                 return;
285
286         /* Shortcut things if nobody cares */
287         if (!bus_has_subscriber(u->meta.manager)) {
288                 u->meta.sent_dbus_new_signal = true;
289                 return;
290         }
291
292         LIST_PREPEND(Meta, dbus_queue, u->meta.manager->dbus_unit_queue, &u->meta);
293         u->meta.in_dbus_queue = true;
294 }
295
296 static void bidi_set_free(Unit *u, Set *s) {
297         Iterator i;
298         Unit *other;
299
300         assert(u);
301
302         /* Frees the set and makes sure we are dropped from the
303          * inverse pointers */
304
305         SET_FOREACH(other, s, i) {
306                 UnitDependency d;
307
308                 for (d = 0; d < _UNIT_DEPENDENCY_MAX; d++)
309                         set_remove(other->meta.dependencies[d], u);
310
311                 unit_add_to_gc_queue(other);
312         }
313
314         set_free(s);
315 }
316
317 void unit_free(Unit *u) {
318         UnitDependency d;
319         Iterator i;
320         char *t;
321
322         assert(u);
323
324         bus_unit_send_removed_signal(u);
325
326         if (u->meta.load_state != UNIT_STUB)
327                 if (UNIT_VTABLE(u)->done)
328                         UNIT_VTABLE(u)->done(u);
329
330         SET_FOREACH(t, u->meta.names, i)
331                 hashmap_remove_value(u->meta.manager->units, t, u);
332
333         if (u->meta.job)
334                 job_free(u->meta.job);
335
336         for (d = 0; d < _UNIT_DEPENDENCY_MAX; d++)
337                 bidi_set_free(u, u->meta.dependencies[d]);
338
339         if (u->meta.type != _UNIT_TYPE_INVALID)
340                 LIST_REMOVE(Meta, units_per_type, u->meta.manager->units_per_type[u->meta.type], &u->meta);
341
342         if (u->meta.in_load_queue)
343                 LIST_REMOVE(Meta, load_queue, u->meta.manager->load_queue, &u->meta);
344
345         if (u->meta.in_dbus_queue)
346                 LIST_REMOVE(Meta, dbus_queue, u->meta.manager->dbus_unit_queue, &u->meta);
347
348         if (u->meta.in_cleanup_queue)
349                 LIST_REMOVE(Meta, cleanup_queue, u->meta.manager->cleanup_queue, &u->meta);
350
351         if (u->meta.in_gc_queue) {
352                 LIST_REMOVE(Meta, gc_queue, u->meta.manager->gc_queue, &u->meta);
353                 u->meta.manager->n_in_gc_queue--;
354         }
355
356         cgroup_bonding_free_list(u->meta.cgroup_bondings);
357
358         free(u->meta.description);
359         free(u->meta.fragment_path);
360
361         set_free_free(u->meta.names);
362
363         free(u->meta.instance);
364
365         free(u);
366 }
367
368 UnitActiveState unit_active_state(Unit *u) {
369         assert(u);
370
371         if (u->meta.load_state == UNIT_MERGED)
372                 return unit_active_state(unit_follow_merge(u));
373
374         /* After a reload it might happen that a unit is not correctly
375          * loaded but still has a process around. That's why we won't
376          * shortcut failed loading to UNIT_INACTIVE_MAINTENANCE. */
377
378         return UNIT_VTABLE(u)->active_state(u);
379 }
380
381 const char* unit_sub_state_to_string(Unit *u) {
382         assert(u);
383
384         return UNIT_VTABLE(u)->sub_state_to_string(u);
385 }
386
387 static void complete_move(Set **s, Set **other) {
388         assert(s);
389         assert(other);
390
391         if (!*other)
392                 return;
393
394         if (*s)
395                 set_move(*s, *other);
396         else {
397                 *s = *other;
398                 *other = NULL;
399         }
400 }
401
402 static void merge_names(Unit *u, Unit *other) {
403         char *t;
404         Iterator i;
405
406         assert(u);
407         assert(other);
408
409         complete_move(&u->meta.names, &other->meta.names);
410
411         set_free_free(other->meta.names);
412         other->meta.names = NULL;
413         other->meta.id = NULL;
414
415         SET_FOREACH(t, u->meta.names, i)
416                 assert_se(hashmap_replace(u->meta.manager->units, t, u) == 0);
417 }
418
419 static void merge_dependencies(Unit *u, Unit *other, UnitDependency d) {
420         Iterator i;
421         Unit *back;
422         int r;
423
424         assert(u);
425         assert(other);
426         assert(d < _UNIT_DEPENDENCY_MAX);
427
428         SET_FOREACH(back, other->meta.dependencies[d], i) {
429                 UnitDependency k;
430
431                 for (k = 0; k < _UNIT_DEPENDENCY_MAX; k++)
432                         if ((r = set_remove_and_put(back->meta.dependencies[k], other, u)) < 0) {
433
434                                 if (r == -EEXIST)
435                                         set_remove(back->meta.dependencies[k], other);
436                                 else
437                                         assert(r == -ENOENT);
438                         }
439         }
440
441         complete_move(&u->meta.dependencies[d], &other->meta.dependencies[d]);
442
443         set_free(other->meta.dependencies[d]);
444         other->meta.dependencies[d] = NULL;
445 }
446
447 int unit_merge(Unit *u, Unit *other) {
448         UnitDependency d;
449
450         assert(u);
451         assert(other);
452         assert(u->meta.manager == other->meta.manager);
453         assert(u->meta.type != _UNIT_TYPE_INVALID);
454
455         other = unit_follow_merge(other);
456
457         if (other == u)
458                 return 0;
459
460         if (u->meta.type != other->meta.type)
461                 return -EINVAL;
462
463         if (!streq_ptr(u->meta.instance, other->meta.instance))
464                 return -EINVAL;
465
466         if (other->meta.load_state != UNIT_STUB &&
467             other->meta.load_state != UNIT_FAILED)
468                 return -EEXIST;
469
470         if (other->meta.job)
471                 return -EEXIST;
472
473         if (!UNIT_IS_INACTIVE_OR_MAINTENANCE(unit_active_state(other)))
474                 return -EEXIST;
475
476         /* Merge names */
477         merge_names(u, other);
478
479         /* Merge dependencies */
480         for (d = 0; d < _UNIT_DEPENDENCY_MAX; d++)
481                 merge_dependencies(u, other, d);
482
483         other->meta.load_state = UNIT_MERGED;
484         other->meta.merged_into = u;
485
486         /* If there is still some data attached to the other node, we
487          * don't need it anymore, and can free it. */
488         if (other->meta.load_state != UNIT_STUB)
489                 if (UNIT_VTABLE(other)->done)
490                         UNIT_VTABLE(other)->done(other);
491
492         unit_add_to_dbus_queue(u);
493         unit_add_to_cleanup_queue(other);
494
495         return 0;
496 }
497
498 int unit_merge_by_name(Unit *u, const char *name) {
499         Unit *other;
500         int r;
501         char *s = NULL;
502
503         assert(u);
504         assert(name);
505
506         if (unit_name_is_template(name)) {
507                 if (!u->meta.instance)
508                         return -EINVAL;
509
510                 if (!(s = unit_name_replace_instance(name, u->meta.instance)))
511                         return -ENOMEM;
512
513                 name = s;
514         }
515
516         if (!(other = manager_get_unit(u->meta.manager, name)))
517                 r = unit_add_name(u, name);
518         else
519                 r = unit_merge(u, other);
520
521         free(s);
522         return r;
523 }
524
525 Unit* unit_follow_merge(Unit *u) {
526         assert(u);
527
528         while (u->meta.load_state == UNIT_MERGED)
529                 assert_se(u = u->meta.merged_into);
530
531         return u;
532 }
533
534 int unit_add_exec_dependencies(Unit *u, ExecContext *c) {
535         int r;
536
537         assert(u);
538         assert(c);
539
540         if (c->std_output != EXEC_OUTPUT_KMSG &&
541             c->std_output != EXEC_OUTPUT_SYSLOG &&
542             c->std_error != EXEC_OUTPUT_KMSG &&
543             c->std_error != EXEC_OUTPUT_SYSLOG)
544                 return 0;
545
546         /* If syslog or kernel logging is requested, make sure our own
547          * logging daemon is run first. */
548
549         if ((r = unit_add_dependency_by_name(u, UNIT_AFTER, SPECIAL_LOGGER_SOCKET, NULL, true)) < 0)
550                 return r;
551
552         if (u->meta.manager->running_as == MANAGER_SYSTEM)
553                 if ((r = unit_add_dependency_by_name(u, UNIT_REQUIRES, SPECIAL_LOGGER_SOCKET, NULL, true)) < 0)
554                         return r;
555
556         return 0;
557 }
558
559 const char *unit_description(Unit *u) {
560         assert(u);
561
562         if (u->meta.description)
563                 return u->meta.description;
564
565         return u->meta.id;
566 }
567
568 void unit_dump(Unit *u, FILE *f, const char *prefix) {
569         char *t;
570         UnitDependency d;
571         Iterator i;
572         char *p2;
573         const char *prefix2;
574         CGroupBonding *b;
575         char
576                 timestamp1[FORMAT_TIMESTAMP_MAX],
577                 timestamp2[FORMAT_TIMESTAMP_MAX],
578                 timestamp3[FORMAT_TIMESTAMP_MAX],
579                 timestamp4[FORMAT_TIMESTAMP_MAX];
580
581         assert(u);
582         assert(u->meta.type >= 0);
583
584         if (!prefix)
585                 prefix = "";
586         p2 = strappend(prefix, "\t");
587         prefix2 = p2 ? p2 : prefix;
588
589         fprintf(f,
590                 "%s-> Unit %s:\n"
591                 "%s\tDescription: %s\n"
592                 "%s\tInstance: %s\n"
593                 "%s\tUnit Load State: %s\n"
594                 "%s\tUnit Active State: %s\n"
595                 "%s\tInactive Exit Timestamp: %s\n"
596                 "%s\tActive Enter Timestamp: %s\n"
597                 "%s\tActive Exit Timestamp: %s\n"
598                 "%s\tInactive Enter Timestamp: %s\n"
599                 "%s\tGC Check Good: %s\n",
600                 prefix, u->meta.id,
601                 prefix, unit_description(u),
602                 prefix, strna(u->meta.instance),
603                 prefix, unit_load_state_to_string(u->meta.load_state),
604                 prefix, unit_active_state_to_string(unit_active_state(u)),
605                 prefix, strna(format_timestamp(timestamp1, sizeof(timestamp1), u->meta.inactive_exit_timestamp.realtime)),
606                 prefix, strna(format_timestamp(timestamp2, sizeof(timestamp2), u->meta.active_enter_timestamp.realtime)),
607                 prefix, strna(format_timestamp(timestamp3, sizeof(timestamp3), u->meta.active_exit_timestamp.realtime)),
608                 prefix, strna(format_timestamp(timestamp4, sizeof(timestamp4), u->meta.inactive_enter_timestamp.realtime)),
609                 prefix, yes_no(unit_check_gc(u)));
610
611         SET_FOREACH(t, u->meta.names, i)
612                 fprintf(f, "%s\tName: %s\n", prefix, t);
613
614         if (u->meta.fragment_path)
615                 fprintf(f, "%s\tFragment Path: %s\n", prefix, u->meta.fragment_path);
616
617         for (d = 0; d < _UNIT_DEPENDENCY_MAX; d++) {
618                 Unit *other;
619
620                 SET_FOREACH(other, u->meta.dependencies[d], i)
621                         fprintf(f, "%s\t%s: %s\n", prefix, unit_dependency_to_string(d), other->meta.id);
622         }
623
624         if (u->meta.load_state == UNIT_LOADED) {
625                 fprintf(f,
626                         "%s\tRecursive Stop: %s\n"
627                         "%s\tStopWhenUnneeded: %s\n"
628                         "%s\tOnlyByDependency: %s\n"
629                         "%s\tDefaultDependencies: %s\n",
630                         prefix, yes_no(u->meta.recursive_stop),
631                         prefix, yes_no(u->meta.stop_when_unneeded),
632                         prefix, yes_no(u->meta.only_by_dependency),
633                         prefix, yes_no(u->meta.default_dependencies));
634
635                 LIST_FOREACH(by_unit, b, u->meta.cgroup_bondings)
636                         fprintf(f, "%s\tControlGroup: %s:%s\n",
637                                 prefix, b->controller, b->path);
638
639                 if (UNIT_VTABLE(u)->dump)
640                         UNIT_VTABLE(u)->dump(u, f, prefix2);
641
642         } else if (u->meta.load_state == UNIT_MERGED)
643                 fprintf(f,
644                         "%s\tMerged into: %s\n",
645                         prefix, u->meta.merged_into->meta.id);
646
647         if (u->meta.job)
648                 job_dump(u->meta.job, f, prefix2);
649
650         free(p2);
651 }
652
653 /* Common implementation for multiple backends */
654 int unit_load_fragment_and_dropin(Unit *u) {
655         int r;
656
657         assert(u);
658
659         /* Load a .service file */
660         if ((r = unit_load_fragment(u)) < 0)
661                 return r;
662
663         if (u->meta.load_state == UNIT_STUB)
664                 return -ENOENT;
665
666         /* Load drop-in directory data */
667         if ((r = unit_load_dropin(unit_follow_merge(u))) < 0)
668                 return r;
669
670         return 0;
671 }
672
673 /* Common implementation for multiple backends */
674 int unit_load_fragment_and_dropin_optional(Unit *u) {
675         int r;
676
677         assert(u);
678
679         /* Same as unit_load_fragment_and_dropin(), but whether
680          * something can be loaded or not doesn't matter. */
681
682         /* Load a .service file */
683         if ((r = unit_load_fragment(u)) < 0)
684                 return r;
685
686         if (u->meta.load_state == UNIT_STUB)
687                 u->meta.load_state = UNIT_LOADED;
688
689         /* Load drop-in directory data */
690         if ((r = unit_load_dropin(unit_follow_merge(u))) < 0)
691                 return r;
692
693         return 0;
694 }
695
696 /* Common implementation for multiple backends */
697 int unit_load_nop(Unit *u) {
698         assert(u);
699
700         if (u->meta.load_state == UNIT_STUB)
701                 u->meta.load_state = UNIT_LOADED;
702
703         return 0;
704 }
705
706 int unit_load(Unit *u) {
707         int r;
708
709         assert(u);
710
711         if (u->meta.in_load_queue) {
712                 LIST_REMOVE(Meta, load_queue, u->meta.manager->load_queue, &u->meta);
713                 u->meta.in_load_queue = false;
714         }
715
716         if (u->meta.type == _UNIT_TYPE_INVALID)
717                 return -EINVAL;
718
719         if (u->meta.load_state != UNIT_STUB)
720                 return 0;
721
722         if (UNIT_VTABLE(u)->load)
723                 if ((r = UNIT_VTABLE(u)->load(u)) < 0)
724                         goto fail;
725
726         if (u->meta.load_state == UNIT_STUB) {
727                 r = -ENOENT;
728                 goto fail;
729         }
730
731         assert((u->meta.load_state != UNIT_MERGED) == !u->meta.merged_into);
732
733         unit_add_to_dbus_queue(unit_follow_merge(u));
734         unit_add_to_gc_queue(u);
735
736         return 0;
737
738 fail:
739         u->meta.load_state = UNIT_FAILED;
740         unit_add_to_dbus_queue(u);
741
742         log_notice("Failed to load configuration for %s: %s", u->meta.id, strerror(-r));
743
744         return r;
745 }
746
747 /* Errors:
748  *         -EBADR:     This unit type does not support starting.
749  *         -EALREADY:  Unit is already started.
750  *         -EAGAIN:    An operation is already in progress. Retry later.
751  *         -ECANCELED: Too many requests for now.
752  */
753 int unit_start(Unit *u) {
754         UnitActiveState state;
755
756         assert(u);
757
758         if (u->meta.load_state != UNIT_LOADED)
759                 return -EINVAL;
760
761         /* If this is already (being) started, then this will
762          * succeed. Note that this will even succeed if this unit is
763          * not startable by the user. This is relied on to detect when
764          * we need to wait for units and when waiting is finished. */
765         state = unit_active_state(u);
766         if (UNIT_IS_ACTIVE_OR_RELOADING(state))
767                 return -EALREADY;
768
769         /* If it is stopped, but we cannot start it, then fail */
770         if (!UNIT_VTABLE(u)->start)
771                 return -EBADR;
772
773         /* We don't suppress calls to ->start() here when we are
774          * already starting, to allow this request to be used as a
775          * "hurry up" call, for example when the unit is in some "auto
776          * restart" state where it waits for a holdoff timer to elapse
777          * before it will start again. */
778
779         unit_add_to_dbus_queue(u);
780
781         unit_status_printf(u, "Starting %s...\n", unit_description(u));
782
783         return UNIT_VTABLE(u)->start(u);
784 }
785
786 bool unit_can_start(Unit *u) {
787         assert(u);
788
789         return !!UNIT_VTABLE(u)->start;
790 }
791
792 /* Errors:
793  *         -EBADR:    This unit type does not support stopping.
794  *         -EALREADY: Unit is already stopped.
795  *         -EAGAIN:   An operation is already in progress. Retry later.
796  */
797 int unit_stop(Unit *u) {
798         UnitActiveState state;
799
800         assert(u);
801
802         state = unit_active_state(u);
803         if (UNIT_IS_INACTIVE_OR_MAINTENANCE(state))
804                 return -EALREADY;
805
806         if (!UNIT_VTABLE(u)->stop)
807                 return -EBADR;
808
809         unit_add_to_dbus_queue(u);
810
811         unit_status_printf(u, "Stopping %s...\n", unit_description(u));
812
813         return UNIT_VTABLE(u)->stop(u);
814 }
815
816 /* Errors:
817  *         -EBADR:    This unit type does not support reloading.
818  *         -ENOEXEC:  Unit is not started.
819  *         -EAGAIN:   An operation is already in progress. Retry later.
820  */
821 int unit_reload(Unit *u) {
822         UnitActiveState state;
823
824         assert(u);
825
826         if (u->meta.load_state != UNIT_LOADED)
827                 return -EINVAL;
828
829         if (!unit_can_reload(u))
830                 return -EBADR;
831
832         state = unit_active_state(u);
833         if (unit_active_state(u) == UNIT_RELOADING)
834                 return -EALREADY;
835
836         if (unit_active_state(u) != UNIT_ACTIVE)
837                 return -ENOEXEC;
838
839         unit_add_to_dbus_queue(u);
840         return UNIT_VTABLE(u)->reload(u);
841 }
842
843 bool unit_can_reload(Unit *u) {
844         assert(u);
845
846         if (!UNIT_VTABLE(u)->reload)
847                 return false;
848
849         if (!UNIT_VTABLE(u)->can_reload)
850                 return true;
851
852         return UNIT_VTABLE(u)->can_reload(u);
853 }
854
855 static void unit_check_uneeded(Unit *u) {
856         Iterator i;
857         Unit *other;
858
859         assert(u);
860
861         /* If this service shall be shut down when unneeded then do
862          * so. */
863
864         if (!u->meta.stop_when_unneeded)
865                 return;
866
867         if (!UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u)))
868                 return;
869
870         SET_FOREACH(other, u->meta.dependencies[UNIT_REQUIRED_BY], i)
871                 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
872                         return;
873
874         SET_FOREACH(other, u->meta.dependencies[UNIT_REQUIRED_BY_OVERRIDABLE], i)
875                 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
876                         return;
877
878         SET_FOREACH(other, u->meta.dependencies[UNIT_WANTED_BY], i)
879                 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
880                         return;
881
882         log_info("Service %s is not needed anymore. Stopping.", u->meta.id);
883
884         /* Ok, nobody needs us anymore. Sniff. Then let's commit suicide */
885         manager_add_job(u->meta.manager, JOB_STOP, u, JOB_FAIL, true, NULL, NULL);
886 }
887
888 static void retroactively_start_dependencies(Unit *u) {
889         Iterator i;
890         Unit *other;
891
892         assert(u);
893         assert(UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u)));
894
895         SET_FOREACH(other, u->meta.dependencies[UNIT_REQUIRES], i)
896                 if (!UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other)))
897                         manager_add_job(u->meta.manager, JOB_START, other, JOB_REPLACE, true, NULL, NULL);
898
899         SET_FOREACH(other, u->meta.dependencies[UNIT_REQUIRES_OVERRIDABLE], i)
900                 if (!UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other)))
901                         manager_add_job(u->meta.manager, JOB_START, other, JOB_FAIL, false, NULL, NULL);
902
903         SET_FOREACH(other, u->meta.dependencies[UNIT_REQUISITE], i)
904                 if (!UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other)))
905                         manager_add_job(u->meta.manager, JOB_START, other, JOB_REPLACE, true, NULL, NULL);
906
907         SET_FOREACH(other, u->meta.dependencies[UNIT_WANTS], i)
908                 if (!UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other)))
909                         manager_add_job(u->meta.manager, JOB_START, other, JOB_FAIL, false, NULL, NULL);
910
911         SET_FOREACH(other, u->meta.dependencies[UNIT_CONFLICTS], i)
912                 if (!UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other)))
913                         manager_add_job(u->meta.manager, JOB_STOP, other, JOB_REPLACE, true, NULL, NULL);
914 }
915
916 static void retroactively_stop_dependencies(Unit *u) {
917         Iterator i;
918         Unit *other;
919
920         assert(u);
921         assert(UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(u)));
922
923         if (u->meta.recursive_stop) {
924                 /* Pull down units need us recursively if enabled */
925                 SET_FOREACH(other, u->meta.dependencies[UNIT_REQUIRED_BY], i)
926                         if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
927                                 manager_add_job(u->meta.manager, JOB_STOP, other, JOB_REPLACE, true, NULL, NULL);
928         }
929
930         /* Garbage collect services that might not be needed anymore, if enabled */
931         SET_FOREACH(other, u->meta.dependencies[UNIT_REQUIRES], i)
932                 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
933                         unit_check_uneeded(other);
934         SET_FOREACH(other, u->meta.dependencies[UNIT_REQUIRES_OVERRIDABLE], i)
935                 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
936                         unit_check_uneeded(other);
937         SET_FOREACH(other, u->meta.dependencies[UNIT_WANTS], i)
938                 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
939                         unit_check_uneeded(other);
940         SET_FOREACH(other, u->meta.dependencies[UNIT_REQUISITE], i)
941                 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
942                         unit_check_uneeded(other);
943         SET_FOREACH(other, u->meta.dependencies[UNIT_REQUISITE_OVERRIDABLE], i)
944                 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
945                         unit_check_uneeded(other);
946 }
947
948 void unit_notify(Unit *u, UnitActiveState os, UnitActiveState ns) {
949         dual_timestamp ts;
950
951         assert(u);
952         assert(os < _UNIT_ACTIVE_STATE_MAX);
953         assert(ns < _UNIT_ACTIVE_STATE_MAX);
954
955         /* Note that this is called for all low-level state changes,
956          * even if they might map to the same high-level
957          * UnitActiveState! That means that ns == os is OK an expected
958          * behaviour here. For example: if a mount point is remounted
959          * this function will be called too and the utmp code below
960          * relies on that! */
961
962         dual_timestamp_get(&ts);
963
964         if (UNIT_IS_INACTIVE_OR_MAINTENANCE(os) && !UNIT_IS_INACTIVE_OR_MAINTENANCE(ns))
965                 u->meta.inactive_exit_timestamp = ts;
966         else if (!UNIT_IS_INACTIVE_OR_MAINTENANCE(os) && UNIT_IS_INACTIVE_OR_MAINTENANCE(ns))
967                 u->meta.inactive_enter_timestamp = ts;
968
969         if (!UNIT_IS_ACTIVE_OR_RELOADING(os) && UNIT_IS_ACTIVE_OR_RELOADING(ns))
970                 u->meta.active_enter_timestamp = ts;
971         else if (UNIT_IS_ACTIVE_OR_RELOADING(os) && !UNIT_IS_ACTIVE_OR_RELOADING(ns))
972                 u->meta.active_exit_timestamp = ts;
973
974         if (ns != os && ns == UNIT_MAINTENANCE)
975                 log_notice("Unit %s entered maintenance state.", u->meta.id);
976
977         if (UNIT_IS_INACTIVE_OR_MAINTENANCE(ns))
978                 cgroup_bonding_trim_list(u->meta.cgroup_bondings, true);
979
980         timer_unit_notify(u, ns);
981         path_unit_notify(u, ns);
982
983         if (u->meta.job) {
984                 bool unexpected = false;
985
986                 if (u->meta.job->state == JOB_WAITING)
987
988                         /* So we reached a different state for this
989                          * job. Let's see if we can run it now if it
990                          * failed previously due to EAGAIN. */
991                         job_add_to_run_queue(u->meta.job);
992
993
994                 /* Let's check whether this state change constitutes a
995                  * finished job, or maybe cotradicts a running job and
996                  * hence needs to invalidate jobs. */
997
998                 switch (u->meta.job->type) {
999
1000                 case JOB_START:
1001                 case JOB_VERIFY_ACTIVE:
1002
1003                         if (UNIT_IS_ACTIVE_OR_RELOADING(ns))
1004                                 job_finish_and_invalidate(u->meta.job, true);
1005                         else if (u->meta.job->state == JOB_RUNNING && ns != UNIT_ACTIVATING) {
1006                                 unexpected = true;
1007                                 job_finish_and_invalidate(u->meta.job, false);
1008                         }
1009
1010                         break;
1011
1012                 case JOB_RELOAD:
1013                 case JOB_RELOAD_OR_START:
1014
1015                         if (u->meta.job->state == JOB_RUNNING) {
1016                                 if (ns == UNIT_ACTIVE)
1017                                         job_finish_and_invalidate(u->meta.job, true);
1018                                 else if (ns != UNIT_ACTIVATING && ns != UNIT_RELOADING) {
1019                                         unexpected = true;
1020                                         job_finish_and_invalidate(u->meta.job, false);
1021                                 }
1022                         }
1023
1024                         break;
1025
1026                 case JOB_STOP:
1027                 case JOB_RESTART:
1028                 case JOB_TRY_RESTART:
1029
1030                         if (ns == UNIT_INACTIVE || ns == UNIT_MAINTENANCE)
1031                                 job_finish_and_invalidate(u->meta.job, true);
1032                         else if (u->meta.job->state == JOB_RUNNING && ns != UNIT_DEACTIVATING) {
1033                                 unexpected = true;
1034                                 job_finish_and_invalidate(u->meta.job, false);
1035                         }
1036
1037                         break;
1038
1039                 default:
1040                         assert_not_reached("Job type unknown");
1041                 }
1042
1043                 /* If this state change happened without being
1044                  * requested by a job, then let's retroactively start
1045                  * or stop dependencies */
1046
1047                 if (unexpected) {
1048                         if (UNIT_IS_INACTIVE_OR_DEACTIVATING(os) && UNIT_IS_ACTIVE_OR_ACTIVATING(ns))
1049                                 retroactively_start_dependencies(u);
1050                         else if (UNIT_IS_ACTIVE_OR_ACTIVATING(os) && UNIT_IS_INACTIVE_OR_DEACTIVATING(ns))
1051                                 retroactively_stop_dependencies(u);
1052                 }
1053         }
1054
1055         /* Some names are special */
1056         if (UNIT_IS_ACTIVE_OR_RELOADING(ns)) {
1057                 if (unit_has_name(u, SPECIAL_DBUS_SERVICE)) {
1058                         /* The bus just might have become available,
1059                          * hence try to connect to it, if we aren't
1060                          * yet connected. */
1061                         bus_init(u->meta.manager);
1062                 }
1063
1064                 if (unit_has_name(u, SPECIAL_SYSLOG_SERVICE))
1065                         /* The syslog daemon just might have become
1066                          * available, hence try to connect to it, if
1067                          * we aren't yet connected. */
1068                         log_open();
1069
1070                 if (u->meta.type == UNIT_MOUNT)
1071                         /* Another directory became available, let's
1072                          * check if that is enough to write our utmp
1073                          * entry. */
1074                         manager_write_utmp_reboot(u->meta.manager);
1075
1076                 if (u->meta.type == UNIT_TARGET)
1077                         /* A target got activated, maybe this is a runlevel? */
1078                         manager_write_utmp_runlevel(u->meta.manager, u);
1079
1080         } else if (!UNIT_IS_ACTIVE_OR_RELOADING(ns)) {
1081
1082                 if (unit_has_name(u, SPECIAL_SYSLOG_SERVICE))
1083                         /* The syslog daemon might just have
1084                          * terminated, hence try to disconnect from
1085                          * it. */
1086                         log_close_syslog();
1087
1088                 /* We don't care about D-Bus here, since we'll get an
1089                  * asynchronous notification for it anyway. */
1090         }
1091
1092         /* Maybe we finished startup and are now ready for being
1093          * stopped because unneeded? */
1094         unit_check_uneeded(u);
1095
1096         unit_add_to_dbus_queue(u);
1097         unit_add_to_gc_queue(u);
1098 }
1099
1100 int unit_watch_fd(Unit *u, int fd, uint32_t events, Watch *w) {
1101         struct epoll_event ev;
1102
1103         assert(u);
1104         assert(fd >= 0);
1105         assert(w);
1106         assert(w->type == WATCH_INVALID || (w->type == WATCH_FD && w->fd == fd && w->data.unit == u));
1107
1108         zero(ev);
1109         ev.data.ptr = w;
1110         ev.events = events;
1111
1112         if (epoll_ctl(u->meta.manager->epoll_fd,
1113                       w->type == WATCH_INVALID ? EPOLL_CTL_ADD : EPOLL_CTL_MOD,
1114                       fd,
1115                       &ev) < 0)
1116                 return -errno;
1117
1118         w->fd = fd;
1119         w->type = WATCH_FD;
1120         w->data.unit = u;
1121
1122         return 0;
1123 }
1124
1125 void unit_unwatch_fd(Unit *u, Watch *w) {
1126         assert(u);
1127         assert(w);
1128
1129         if (w->type == WATCH_INVALID)
1130                 return;
1131
1132         assert(w->type == WATCH_FD);
1133         assert(w->data.unit == u);
1134         assert_se(epoll_ctl(u->meta.manager->epoll_fd, EPOLL_CTL_DEL, w->fd, NULL) >= 0);
1135
1136         w->fd = -1;
1137         w->type = WATCH_INVALID;
1138         w->data.unit = NULL;
1139 }
1140
1141 int unit_watch_pid(Unit *u, pid_t pid) {
1142         assert(u);
1143         assert(pid >= 1);
1144
1145         /* Watch a specific PID. We only support one unit watching
1146          * each PID for now. */
1147
1148         return hashmap_put(u->meta.manager->watch_pids, LONG_TO_PTR(pid), u);
1149 }
1150
1151 void unit_unwatch_pid(Unit *u, pid_t pid) {
1152         assert(u);
1153         assert(pid >= 1);
1154
1155         hashmap_remove_value(u->meta.manager->watch_pids, LONG_TO_PTR(pid), u);
1156 }
1157
1158 int unit_watch_timer(Unit *u, usec_t delay, Watch *w) {
1159         struct itimerspec its;
1160         int flags, fd;
1161         bool ours;
1162
1163         assert(u);
1164         assert(w);
1165         assert(w->type == WATCH_INVALID || (w->type == WATCH_TIMER && w->data.unit == u));
1166
1167         /* This will try to reuse the old timer if there is one */
1168
1169         if (w->type == WATCH_TIMER) {
1170                 ours = false;
1171                 fd = w->fd;
1172         } else {
1173                 ours = true;
1174                 if ((fd = timerfd_create(CLOCK_MONOTONIC, TFD_NONBLOCK|TFD_CLOEXEC)) < 0)
1175                         return -errno;
1176         }
1177
1178         zero(its);
1179
1180         if (delay <= 0) {
1181                 /* Set absolute time in the past, but not 0, since we
1182                  * don't want to disarm the timer */
1183                 its.it_value.tv_sec = 0;
1184                 its.it_value.tv_nsec = 1;
1185
1186                 flags = TFD_TIMER_ABSTIME;
1187         } else {
1188                 timespec_store(&its.it_value, delay);
1189                 flags = 0;
1190         }
1191
1192         /* This will also flush the elapse counter */
1193         if (timerfd_settime(fd, flags, &its, NULL) < 0)
1194                 goto fail;
1195
1196         if (w->type == WATCH_INVALID) {
1197                 struct epoll_event ev;
1198
1199                 zero(ev);
1200                 ev.data.ptr = w;
1201                 ev.events = EPOLLIN;
1202
1203                 if (epoll_ctl(u->meta.manager->epoll_fd, EPOLL_CTL_ADD, fd, &ev) < 0)
1204                         goto fail;
1205         }
1206
1207         w->fd = fd;
1208         w->type = WATCH_TIMER;
1209         w->data.unit = u;
1210
1211         return 0;
1212
1213 fail:
1214         if (ours)
1215                 close_nointr_nofail(fd);
1216
1217         return -errno;
1218 }
1219
1220 void unit_unwatch_timer(Unit *u, Watch *w) {
1221         assert(u);
1222         assert(w);
1223
1224         if (w->type == WATCH_INVALID)
1225                 return;
1226
1227         assert(w->type == WATCH_TIMER && w->data.unit == u);
1228
1229         assert_se(epoll_ctl(u->meta.manager->epoll_fd, EPOLL_CTL_DEL, w->fd, NULL) >= 0);
1230         close_nointr_nofail(w->fd);
1231
1232         w->fd = -1;
1233         w->type = WATCH_INVALID;
1234         w->data.unit = NULL;
1235 }
1236
1237 bool unit_job_is_applicable(Unit *u, JobType j) {
1238         assert(u);
1239         assert(j >= 0 && j < _JOB_TYPE_MAX);
1240
1241         switch (j) {
1242
1243         case JOB_VERIFY_ACTIVE:
1244         case JOB_START:
1245                 return true;
1246
1247         case JOB_STOP:
1248         case JOB_RESTART:
1249         case JOB_TRY_RESTART:
1250                 return unit_can_start(u);
1251
1252         case JOB_RELOAD:
1253                 return unit_can_reload(u);
1254
1255         case JOB_RELOAD_OR_START:
1256                 return unit_can_reload(u) && unit_can_start(u);
1257
1258         default:
1259                 assert_not_reached("Invalid job type");
1260         }
1261 }
1262
1263 int unit_add_dependency(Unit *u, UnitDependency d, Unit *other, bool add_reference) {
1264
1265         static const UnitDependency inverse_table[_UNIT_DEPENDENCY_MAX] = {
1266                 [UNIT_REQUIRES] = UNIT_REQUIRED_BY,
1267                 [UNIT_REQUIRES_OVERRIDABLE] = UNIT_REQUIRED_BY_OVERRIDABLE,
1268                 [UNIT_WANTS] = UNIT_WANTED_BY,
1269                 [UNIT_REQUISITE] = UNIT_REQUIRED_BY,
1270                 [UNIT_REQUISITE_OVERRIDABLE] = UNIT_REQUIRED_BY_OVERRIDABLE,
1271                 [UNIT_REQUIRED_BY] = _UNIT_DEPENDENCY_INVALID,
1272                 [UNIT_REQUIRED_BY_OVERRIDABLE] = _UNIT_DEPENDENCY_INVALID,
1273                 [UNIT_WANTED_BY] = _UNIT_DEPENDENCY_INVALID,
1274                 [UNIT_CONFLICTS] = UNIT_CONFLICTS,
1275                 [UNIT_BEFORE] = UNIT_AFTER,
1276                 [UNIT_AFTER] = UNIT_BEFORE,
1277                 [UNIT_REFERENCES] = UNIT_REFERENCED_BY,
1278                 [UNIT_REFERENCED_BY] = UNIT_REFERENCES
1279         };
1280         int r, q = 0, v = 0, w = 0;
1281
1282         assert(u);
1283         assert(d >= 0 && d < _UNIT_DEPENDENCY_MAX);
1284         assert(inverse_table[d] != _UNIT_DEPENDENCY_INVALID);
1285         assert(other);
1286
1287         /* We won't allow dependencies on ourselves. We will not
1288          * consider them an error however. */
1289         if (u == other)
1290                 return 0;
1291
1292         if (UNIT_VTABLE(u)->no_requires &&
1293             (d == UNIT_REQUIRES ||
1294              d == UNIT_REQUIRES_OVERRIDABLE ||
1295              d == UNIT_REQUISITE ||
1296              d == UNIT_REQUISITE_OVERRIDABLE)) {
1297                     return -EINVAL;
1298         }
1299
1300         if ((r = set_ensure_allocated(&u->meta.dependencies[d], trivial_hash_func, trivial_compare_func)) < 0 ||
1301             (r = set_ensure_allocated(&other->meta.dependencies[inverse_table[d]], trivial_hash_func, trivial_compare_func)) < 0)
1302                 return r;
1303
1304         if (add_reference)
1305                 if ((r = set_ensure_allocated(&u->meta.dependencies[UNIT_REFERENCES], trivial_hash_func, trivial_compare_func)) < 0 ||
1306                     (r = set_ensure_allocated(&other->meta.dependencies[UNIT_REFERENCED_BY], trivial_hash_func, trivial_compare_func)) < 0)
1307                         return r;
1308
1309         if ((q = set_put(u->meta.dependencies[d], other)) < 0)
1310                 return q;
1311
1312         if ((v = set_put(other->meta.dependencies[inverse_table[d]], u)) < 0) {
1313                 r = v;
1314                 goto fail;
1315         }
1316
1317         if (add_reference) {
1318                 if ((w = set_put(u->meta.dependencies[UNIT_REFERENCES], other)) < 0) {
1319                         r = w;
1320                         goto fail;
1321                 }
1322
1323                 if ((r = set_put(other->meta.dependencies[UNIT_REFERENCED_BY], u)) < 0)
1324                         goto fail;
1325         }
1326
1327         unit_add_to_dbus_queue(u);
1328         return 0;
1329
1330 fail:
1331         if (q > 0)
1332                 set_remove(u->meta.dependencies[d], other);
1333
1334         if (v > 0)
1335                 set_remove(other->meta.dependencies[inverse_table[d]], u);
1336
1337         if (w > 0)
1338                 set_remove(u->meta.dependencies[UNIT_REFERENCES], other);
1339
1340         return r;
1341 }
1342
1343 int unit_add_two_dependencies(Unit *u, UnitDependency d, UnitDependency e, Unit *other, bool add_reference) {
1344         int r;
1345
1346         assert(u);
1347
1348         if ((r = unit_add_dependency(u, d, other, add_reference)) < 0)
1349                 return r;
1350
1351         if ((r = unit_add_dependency(u, e, other, add_reference)) < 0)
1352                 return r;
1353
1354         return 0;
1355 }
1356
1357 static const char *resolve_template(Unit *u, const char *name, const char*path, char **p) {
1358         char *s;
1359
1360         assert(u);
1361         assert(name || path);
1362
1363         if (!name)
1364                 name = file_name_from_path(path);
1365
1366         if (!unit_name_is_template(name)) {
1367                 *p = NULL;
1368                 return name;
1369         }
1370
1371         if (u->meta.instance)
1372                 s = unit_name_replace_instance(name, u->meta.instance);
1373         else {
1374                 char *i;
1375
1376                 if (!(i = unit_name_to_prefix(u->meta.id)))
1377                         return NULL;
1378
1379                 s = unit_name_replace_instance(name, i);
1380                 free(i);
1381         }
1382
1383         if (!s)
1384                 return NULL;
1385
1386         *p = s;
1387         return s;
1388 }
1389
1390 int unit_add_dependency_by_name(Unit *u, UnitDependency d, const char *name, const char *path, bool add_reference) {
1391         Unit *other;
1392         int r;
1393         char *s;
1394
1395         assert(u);
1396         assert(name || path);
1397
1398         if (!(name = resolve_template(u, name, path, &s)))
1399                 return -ENOMEM;
1400
1401         if ((r = manager_load_unit(u->meta.manager, name, path, NULL, &other)) < 0)
1402                 goto finish;
1403
1404         r = unit_add_dependency(u, d, other, add_reference);
1405
1406 finish:
1407         free(s);
1408         return r;
1409 }
1410
1411 int unit_add_two_dependencies_by_name(Unit *u, UnitDependency d, UnitDependency e, const char *name, const char *path, bool add_reference) {
1412         Unit *other;
1413         int r;
1414         char *s;
1415
1416         assert(u);
1417         assert(name || path);
1418
1419         if (!(name = resolve_template(u, name, path, &s)))
1420                 return -ENOMEM;
1421
1422         if ((r = manager_load_unit(u->meta.manager, name, path, NULL, &other)) < 0)
1423                 goto finish;
1424
1425         r = unit_add_two_dependencies(u, d, e, other, add_reference);
1426
1427 finish:
1428         free(s);
1429         return r;
1430 }
1431
1432 int unit_add_dependency_by_name_inverse(Unit *u, UnitDependency d, const char *name, const char *path, bool add_reference) {
1433         Unit *other;
1434         int r;
1435         char *s;
1436
1437         assert(u);
1438         assert(name || path);
1439
1440         if (!(name = resolve_template(u, name, path, &s)))
1441                 return -ENOMEM;
1442
1443         if ((r = manager_load_unit(u->meta.manager, name, path, NULL, &other)) < 0)
1444                 goto finish;
1445
1446         r = unit_add_dependency(other, d, u, add_reference);
1447
1448 finish:
1449         free(s);
1450         return r;
1451 }
1452
1453 int unit_add_two_dependencies_by_name_inverse(Unit *u, UnitDependency d, UnitDependency e, const char *name, const char *path, bool add_reference) {
1454         Unit *other;
1455         int r;
1456         char *s;
1457
1458         assert(u);
1459         assert(name || path);
1460
1461         if (!(name = resolve_template(u, name, path, &s)))
1462                 return -ENOMEM;
1463
1464         if ((r = manager_load_unit(u->meta.manager, name, path, NULL, &other)) < 0)
1465                 goto finish;
1466
1467         if ((r = unit_add_two_dependencies(other, d, e, u, add_reference)) < 0)
1468                 goto finish;
1469
1470 finish:
1471         free(s);
1472         return r;
1473 }
1474
1475 int set_unit_path(const char *p) {
1476         char *cwd, *c;
1477         int r;
1478
1479         /* This is mostly for debug purposes */
1480
1481         if (path_is_absolute(p)) {
1482                 if (!(c = strdup(p)))
1483                         return -ENOMEM;
1484         } else {
1485                 if (!(cwd = get_current_dir_name()))
1486                         return -errno;
1487
1488                 r = asprintf(&c, "%s/%s", cwd, p);
1489                 free(cwd);
1490
1491                 if (r < 0)
1492                         return -ENOMEM;
1493         }
1494
1495         if (setenv("SYSTEMD_UNIT_PATH", c, 0) < 0) {
1496                 r = -errno;
1497                 free(c);
1498                 return r;
1499         }
1500
1501         return 0;
1502 }
1503
1504 char *unit_dbus_path(Unit *u) {
1505         char *p, *e;
1506
1507         assert(u);
1508
1509         if (!(e = bus_path_escape(u->meta.id)))
1510                 return NULL;
1511
1512         if (asprintf(&p, "/org/freedesktop/systemd1/unit/%s", e) < 0) {
1513                 free(e);
1514                 return NULL;
1515         }
1516
1517         free(e);
1518         return p;
1519 }
1520
1521 int unit_add_cgroup(Unit *u, CGroupBonding *b) {
1522         CGroupBonding *l;
1523         int r;
1524
1525         assert(u);
1526         assert(b);
1527         assert(b->path);
1528
1529         /* Ensure this hasn't been added yet */
1530         assert(!b->unit);
1531
1532         l = hashmap_get(u->meta.manager->cgroup_bondings, b->path);
1533         LIST_PREPEND(CGroupBonding, by_path, l, b);
1534
1535         if ((r = hashmap_replace(u->meta.manager->cgroup_bondings, b->path, l)) < 0) {
1536                 LIST_REMOVE(CGroupBonding, by_path, l, b);
1537                 return r;
1538         }
1539
1540         LIST_PREPEND(CGroupBonding, by_unit, u->meta.cgroup_bondings, b);
1541         b->unit = u;
1542
1543         return 0;
1544 }
1545
1546 static char *default_cgroup_path(Unit *u) {
1547         char *p;
1548         int r;
1549
1550         assert(u);
1551
1552         if (u->meta.instance) {
1553                 char *t;
1554
1555                 if (!(t = unit_name_template(u->meta.id)))
1556                         return NULL;
1557
1558                 r = asprintf(&p, "%s/%s/%s", u->meta.manager->cgroup_hierarchy, t, u->meta.instance);
1559                 free(t);
1560         } else
1561                 r = asprintf(&p, "%s/%s", u->meta.manager->cgroup_hierarchy, u->meta.id);
1562
1563         return r < 0 ? NULL : p;
1564 }
1565
1566 int unit_add_cgroup_from_text(Unit *u, const char *name) {
1567         size_t n;
1568         char *controller = NULL, *path = NULL;
1569         CGroupBonding *b = NULL;
1570         int r;
1571
1572         assert(u);
1573         assert(name);
1574
1575         /* Detect controller name */
1576         n = strcspn(name, ":");
1577
1578         if (name[n] == 0 ||
1579             (name[n] == ':' && name[n+1] == 0)) {
1580
1581                 /* Only controller name, no path? */
1582
1583                 if (!(path = default_cgroup_path(u)))
1584                         return -ENOMEM;
1585
1586         } else {
1587                 const char *p;
1588
1589                 /* Controller name, and path. */
1590                 p = name+n+1;
1591
1592                 if (!path_is_absolute(p))
1593                         return -EINVAL;
1594
1595                 if (!(path = strdup(p)))
1596                         return -ENOMEM;
1597         }
1598
1599         if (n > 0)
1600                 controller = strndup(name, n);
1601         else
1602                 controller = strdup(SYSTEMD_CGROUP_CONTROLLER);
1603
1604         if (!controller) {
1605                 r = -ENOMEM;
1606                 goto fail;
1607         }
1608
1609         if (cgroup_bonding_find_list(u->meta.cgroup_bondings, controller)) {
1610                 r = -EEXIST;
1611                 goto fail;
1612         }
1613
1614         if (!(b = new0(CGroupBonding, 1))) {
1615                 r = -ENOMEM;
1616                 goto fail;
1617         }
1618
1619         b->controller = controller;
1620         b->path = path;
1621         b->only_us = false;
1622         b->clean_up = false;
1623
1624         if ((r = unit_add_cgroup(u, b)) < 0)
1625                 goto fail;
1626
1627         return 0;
1628
1629 fail:
1630         free(path);
1631         free(controller);
1632         free(b);
1633
1634         return r;
1635 }
1636
1637 int unit_add_default_cgroup(Unit *u) {
1638         CGroupBonding *b;
1639         int r = -ENOMEM;
1640
1641         assert(u);
1642
1643         /* Adds in the default cgroup data, if it wasn't specified yet */
1644
1645         if (unit_get_default_cgroup(u))
1646                 return 0;
1647
1648         if (!(b = new0(CGroupBonding, 1)))
1649                 return -ENOMEM;
1650
1651         if (!(b->controller = strdup(SYSTEMD_CGROUP_CONTROLLER)))
1652                 goto fail;
1653
1654         if (!(b->path = default_cgroup_path(u)))
1655                 goto fail;
1656
1657         b->clean_up = true;
1658         b->only_us = true;
1659
1660         if ((r = unit_add_cgroup(u, b)) < 0)
1661                 goto fail;
1662
1663         return 0;
1664
1665 fail:
1666         free(b->path);
1667         free(b->controller);
1668         free(b);
1669
1670         return r;
1671 }
1672
1673 CGroupBonding* unit_get_default_cgroup(Unit *u) {
1674         assert(u);
1675
1676         return cgroup_bonding_find_list(u->meta.cgroup_bondings, SYSTEMD_CGROUP_CONTROLLER);
1677 }
1678
1679 int unit_load_related_unit(Unit *u, const char *type, Unit **_found) {
1680         char *t;
1681         int r;
1682
1683         assert(u);
1684         assert(type);
1685         assert(_found);
1686
1687         if (!(t = unit_name_change_suffix(u->meta.id, type)))
1688                 return -ENOMEM;
1689
1690         assert(!unit_has_name(u, t));
1691
1692         r = manager_load_unit(u->meta.manager, t, NULL, NULL, _found);
1693         free(t);
1694
1695         assert(r < 0 || *_found != u);
1696
1697         return r;
1698 }
1699
1700 int unit_get_related_unit(Unit *u, const char *type, Unit **_found) {
1701         Unit *found;
1702         char *t;
1703
1704         assert(u);
1705         assert(type);
1706         assert(_found);
1707
1708         if (!(t = unit_name_change_suffix(u->meta.id, type)))
1709                 return -ENOMEM;
1710
1711         assert(!unit_has_name(u, t));
1712
1713         found = manager_get_unit(u->meta.manager, t);
1714         free(t);
1715
1716         if (!found)
1717                 return -ENOENT;
1718
1719         *_found = found;
1720         return 0;
1721 }
1722
1723 static char *specifier_prefix_and_instance(char specifier, void *data, void *userdata) {
1724         Unit *u = userdata;
1725         assert(u);
1726
1727         return unit_name_to_prefix_and_instance(u->meta.id);
1728 }
1729
1730 static char *specifier_prefix(char specifier, void *data, void *userdata) {
1731         Unit *u = userdata;
1732         assert(u);
1733
1734         return unit_name_to_prefix(u->meta.id);
1735 }
1736
1737 static char *specifier_prefix_unescaped(char specifier, void *data, void *userdata) {
1738         Unit *u = userdata;
1739         char *p, *r;
1740
1741         assert(u);
1742
1743         if (!(p = unit_name_to_prefix(u->meta.id)))
1744                 return NULL;
1745
1746         r = unit_name_unescape(p);
1747         free(p);
1748
1749         return r;
1750 }
1751
1752 static char *specifier_instance_unescaped(char specifier, void *data, void *userdata) {
1753         Unit *u = userdata;
1754         assert(u);
1755
1756         if (u->meta.instance)
1757                 return unit_name_unescape(u->meta.instance);
1758
1759         return strdup("");
1760 }
1761
1762 char *unit_name_printf(Unit *u, const char* format) {
1763
1764         /*
1765          * This will use the passed string as format string and
1766          * replace the following specifiers:
1767          *
1768          * %n: the full id of the unit                 (foo@bar.waldo)
1769          * %N: the id of the unit without the suffix   (foo@bar)
1770          * %p: the prefix                              (foo)
1771          * %i: the instance                            (bar)
1772          */
1773
1774         const Specifier table[] = {
1775                 { 'n', specifier_string,              u->meta.id },
1776                 { 'N', specifier_prefix_and_instance, NULL },
1777                 { 'p', specifier_prefix,              NULL },
1778                 { 'i', specifier_string,              u->meta.instance },
1779                 { 0, NULL, NULL }
1780         };
1781
1782         assert(u);
1783         assert(format);
1784
1785         return specifier_printf(format, table, u);
1786 }
1787
1788 char *unit_full_printf(Unit *u, const char *format) {
1789
1790         /* This is similar to unit_name_printf() but also supports
1791          * unescaping */
1792
1793         const Specifier table[] = {
1794                 { 'n', specifier_string,              u->meta.id },
1795                 { 'N', specifier_prefix_and_instance, NULL },
1796                 { 'p', specifier_prefix,              NULL },
1797                 { 'P', specifier_prefix_unescaped,    NULL },
1798                 { 'i', specifier_string,              u->meta.instance },
1799                 { 'I', specifier_instance_unescaped,  NULL },
1800                 { 0, NULL, NULL }
1801         };
1802
1803         assert(u);
1804         assert(format);
1805
1806         return specifier_printf(format, table, u);
1807 }
1808
1809 char **unit_full_printf_strv(Unit *u, char **l) {
1810         size_t n;
1811         char **r, **i, **j;
1812
1813         /* Applies unit_full_printf to every entry in l */
1814
1815         assert(u);
1816
1817         n = strv_length(l);
1818         if (!(r = new(char*, n+1)))
1819                 return NULL;
1820
1821         for (i = l, j = r; *i; i++, j++)
1822                 if (!(*j = unit_full_printf(u, *i)))
1823                         goto fail;
1824
1825         *j = NULL;
1826         return r;
1827
1828 fail:
1829         j--;
1830         while (j >= r)
1831                 free(*j);
1832
1833         free(r);
1834
1835         return NULL;
1836 }
1837
1838 int unit_watch_bus_name(Unit *u, const char *name) {
1839         assert(u);
1840         assert(name);
1841
1842         /* Watch a specific name on the bus. We only support one unit
1843          * watching each name for now. */
1844
1845         return hashmap_put(u->meta.manager->watch_bus, name, u);
1846 }
1847
1848 void unit_unwatch_bus_name(Unit *u, const char *name) {
1849         assert(u);
1850         assert(name);
1851
1852         hashmap_remove_value(u->meta.manager->watch_bus, name, u);
1853 }
1854
1855 bool unit_can_serialize(Unit *u) {
1856         assert(u);
1857
1858         return UNIT_VTABLE(u)->serialize && UNIT_VTABLE(u)->deserialize_item;
1859 }
1860
1861 int unit_serialize(Unit *u, FILE *f, FDSet *fds) {
1862         int r;
1863
1864         assert(u);
1865         assert(f);
1866         assert(fds);
1867
1868         if (!unit_can_serialize(u))
1869                 return 0;
1870
1871         if ((r = UNIT_VTABLE(u)->serialize(u, f, fds)) < 0)
1872                 return r;
1873
1874         if (u->meta.job)
1875                 unit_serialize_item(u, f, "job", job_type_to_string(u->meta.job->type));
1876
1877         /* End marker */
1878         fputc('\n', f);
1879         return 0;
1880 }
1881
1882 void unit_serialize_item_format(Unit *u, FILE *f, const char *key, const char *format, ...) {
1883         va_list ap;
1884
1885         assert(u);
1886         assert(f);
1887         assert(key);
1888         assert(format);
1889
1890         fputs(key, f);
1891         fputc('=', f);
1892
1893         va_start(ap, format);
1894         vfprintf(f, format, ap);
1895         va_end(ap);
1896
1897         fputc('\n', f);
1898 }
1899
1900 void unit_serialize_item(Unit *u, FILE *f, const char *key, const char *value) {
1901         assert(u);
1902         assert(f);
1903         assert(key);
1904         assert(value);
1905
1906         fprintf(f, "%s=%s\n", key, value);
1907 }
1908
1909 int unit_deserialize(Unit *u, FILE *f, FDSet *fds) {
1910         int r;
1911
1912         assert(u);
1913         assert(f);
1914         assert(fds);
1915
1916         if (!unit_can_serialize(u))
1917                 return 0;
1918
1919         for (;;) {
1920                 char line[1024], *l, *v;
1921                 size_t k;
1922
1923                 if (!fgets(line, sizeof(line), f)) {
1924                         if (feof(f))
1925                                 return 0;
1926                         return -errno;
1927                 }
1928
1929                 l = strstrip(line);
1930
1931                 /* End marker */
1932                 if (l[0] == 0)
1933                         return 0;
1934
1935                 k = strcspn(l, "=");
1936
1937                 if (l[k] == '=') {
1938                         l[k] = 0;
1939                         v = l+k+1;
1940                 } else
1941                         v = l+k;
1942
1943                 if (streq(l, "job")) {
1944                         JobType type;
1945
1946                         if ((type = job_type_from_string(v)) < 0)
1947                                 log_debug("Failed to parse job type value %s", v);
1948                         else
1949                                 u->meta.deserialized_job = type;
1950
1951                         continue;
1952                 }
1953
1954                 if ((r = UNIT_VTABLE(u)->deserialize_item(u, l, v, fds)) < 0)
1955                         return r;
1956         }
1957 }
1958
1959 int unit_add_node_link(Unit *u, const char *what, bool wants) {
1960         Unit *device;
1961         char *e;
1962         int r;
1963
1964         assert(u);
1965
1966         if (!what)
1967                 return 0;
1968
1969         /* Adds in links to the device node that this unit is based on */
1970
1971         if (!is_device_path(what))
1972                 return 0;
1973
1974         if (!(e = unit_name_build_escape(what+1, NULL, ".device")))
1975                 return -ENOMEM;
1976
1977         r = manager_load_unit(u->meta.manager, e, NULL, NULL, &device);
1978         free(e);
1979
1980         if (r < 0)
1981                 return r;
1982
1983         if ((r = unit_add_two_dependencies(u, UNIT_AFTER, UNIT_REQUIRES, device, true)) < 0)
1984                 return r;
1985
1986         if (wants)
1987                 if ((r = unit_add_dependency(device, UNIT_WANTS, u, false)) < 0)
1988                         return r;
1989
1990         return 0;
1991 }
1992
1993 int unit_coldplug(Unit *u) {
1994         int r;
1995
1996         assert(u);
1997
1998         if (UNIT_VTABLE(u)->coldplug)
1999                 if ((r = UNIT_VTABLE(u)->coldplug(u)) < 0)
2000                         return r;
2001
2002         if (u->meta.deserialized_job >= 0) {
2003                 if ((r = manager_add_job(u->meta.manager, u->meta.deserialized_job, u, JOB_FAIL, false, NULL, NULL)) < 0)
2004                         return r;
2005
2006                 u->meta.deserialized_job = _JOB_TYPE_INVALID;
2007         }
2008
2009         return 0;
2010 }
2011
2012 void unit_status_printf(Unit *u, const char *format, ...) {
2013         va_list ap;
2014
2015         assert(u);
2016         assert(format);
2017
2018         if (!UNIT_VTABLE(u)->show_status)
2019                 return;
2020
2021         if (u->meta.manager->running_as != MANAGER_SYSTEM)
2022                 return;
2023
2024         if (!u->meta.manager->show_status)
2025                 return;
2026
2027         if (!manager_is_booting_or_shutting_down(u->meta.manager))
2028                 return;
2029
2030         va_start(ap, format);
2031         status_vprintf(format, ap);
2032         va_end(ap);
2033 }
2034
2035 static const char* const unit_type_table[_UNIT_TYPE_MAX] = {
2036         [UNIT_SERVICE] = "service",
2037         [UNIT_TIMER] = "timer",
2038         [UNIT_SOCKET] = "socket",
2039         [UNIT_TARGET] = "target",
2040         [UNIT_DEVICE] = "device",
2041         [UNIT_MOUNT] = "mount",
2042         [UNIT_AUTOMOUNT] = "automount",
2043         [UNIT_SNAPSHOT] = "snapshot",
2044         [UNIT_SWAP] = "swap"
2045 };
2046
2047 DEFINE_STRING_TABLE_LOOKUP(unit_type, UnitType);
2048
2049 static const char* const unit_load_state_table[_UNIT_LOAD_STATE_MAX] = {
2050         [UNIT_STUB] = "stub",
2051         [UNIT_LOADED] = "loaded",
2052         [UNIT_FAILED] = "failed",
2053         [UNIT_MERGED] = "merged"
2054 };
2055
2056 DEFINE_STRING_TABLE_LOOKUP(unit_load_state, UnitLoadState);
2057
2058 static const char* const unit_active_state_table[_UNIT_ACTIVE_STATE_MAX] = {
2059         [UNIT_ACTIVE] = "active",
2060         [UNIT_RELOADING] = "reloading",
2061         [UNIT_INACTIVE] = "inactive",
2062         [UNIT_MAINTENANCE] = "maintenance",
2063         [UNIT_ACTIVATING] = "activating",
2064         [UNIT_DEACTIVATING] = "deactivating"
2065 };
2066
2067 DEFINE_STRING_TABLE_LOOKUP(unit_active_state, UnitActiveState);
2068
2069 static const char* const unit_dependency_table[_UNIT_DEPENDENCY_MAX] = {
2070         [UNIT_REQUIRES] = "Requires",
2071         [UNIT_REQUIRES_OVERRIDABLE] = "RequiresOverridable",
2072         [UNIT_WANTS] = "Wants",
2073         [UNIT_REQUISITE] = "Requisite",
2074         [UNIT_REQUISITE_OVERRIDABLE] = "RequisiteOverridable",
2075         [UNIT_REQUIRED_BY] = "RequiredBy",
2076         [UNIT_REQUIRED_BY_OVERRIDABLE] = "RequiredByOverridable",
2077         [UNIT_WANTED_BY] = "WantedBy",
2078         [UNIT_CONFLICTS] = "Conflicts",
2079         [UNIT_BEFORE] = "Before",
2080         [UNIT_AFTER] = "After",
2081         [UNIT_REFERENCES] = "References",
2082         [UNIT_REFERENCED_BY] = "ReferencedBy"
2083 };
2084
2085 DEFINE_STRING_TABLE_LOOKUP(unit_dependency, UnitDependency);
2086
2087 static const char* const kill_mode_table[_KILL_MODE_MAX] = {
2088         [KILL_CONTROL_GROUP] = "control-group",
2089         [KILL_PROCESS_GROUP] = "process-group",
2090         [KILL_PROCESS] = "process",
2091         [KILL_NONE] = "none"
2092 };
2093
2094 DEFINE_STRING_TABLE_LOOKUP(kill_mode, KillMode);