]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/core/unit.h
log: make sure generators never log into the journal to avoid activation deadlocks
[thirdparty/systemd.git] / src / core / unit.h
CommitLineData
03467c88 1/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
87f0e418
LP
2
3#ifndef foounithfoo
4#define foounithfoo
5
a7334b09
LP
6/***
7 This file is part of systemd.
8
9 Copyright 2010 Lennart Poettering
10
11 systemd is free software; you can redistribute it and/or modify it
5430f7f2
LP
12 under the terms of the GNU Lesser General Public License as published by
13 the Free Software Foundation; either version 2.1 of the License, or
a7334b09
LP
14 (at your option) any later version.
15
16 systemd is distributed in the hope that it will be useful, but
17 WITHOUT ANY WARRANTY; without even the implied warranty of
18 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
5430f7f2 19 Lesser General Public License for more details.
a7334b09 20
5430f7f2 21 You should have received a copy of the GNU Lesser General Public License
a7334b09
LP
22 along with systemd; If not, see <http://www.gnu.org/licenses/>.
23***/
24
87f0e418
LP
25#include <stdbool.h>
26#include <stdlib.h>
27
ac155bb8 28typedef struct Unit Unit;
87f0e418
LP
29typedef struct UnitVTable UnitVTable;
30typedef enum UnitType UnitType;
31typedef enum UnitLoadState UnitLoadState;
32typedef enum UnitActiveState UnitActiveState;
33typedef enum UnitDependency UnitDependency;
57020a3a 34typedef struct UnitRef UnitRef;
c6918296 35typedef struct UnitStatusMessageFormats UnitStatusMessageFormats;
87f0e418 36
87f0e418
LP
37#include "set.h"
38#include "util.h"
39#include "list.h"
40#include "socket-util.h"
41#include "execute.h"
52661efd 42#include "condition.h"
a4375746 43#include "install.h"
87f0e418 44
87f0e418
LP
45enum UnitType {
46 UNIT_SERVICE = 0,
87f0e418
LP
47 UNIT_SOCKET,
48 UNIT_TARGET,
49 UNIT_DEVICE,
50 UNIT_MOUNT,
51 UNIT_AUTOMOUNT,
52 UNIT_SNAPSHOT,
41447faf 53 UNIT_TIMER,
07b0b134 54 UNIT_SWAP,
01f78473 55 UNIT_PATH,
87f0e418 56 _UNIT_TYPE_MAX,
50159e6a 57 _UNIT_TYPE_INVALID = -1
87f0e418
LP
58};
59
60enum UnitLoadState {
61 UNIT_STUB,
62 UNIT_LOADED,
fdf20a31 63 UNIT_ERROR,
23a177ef 64 UNIT_MERGED,
6daf4f90 65 UNIT_MASKED,
94f04347
LP
66 _UNIT_LOAD_STATE_MAX,
67 _UNIT_LOAD_STATE_INVALID = -1
87f0e418
LP
68};
69
70enum UnitActiveState {
71 UNIT_ACTIVE,
032ff4af 72 UNIT_RELOADING,
87f0e418 73 UNIT_INACTIVE,
fdf20a31 74 UNIT_FAILED,
87f0e418
LP
75 UNIT_ACTIVATING,
76 UNIT_DEACTIVATING,
94f04347
LP
77 _UNIT_ACTIVE_STATE_MAX,
78 _UNIT_ACTIVE_STATE_INVALID = -1
87f0e418
LP
79};
80
81static inline bool UNIT_IS_ACTIVE_OR_RELOADING(UnitActiveState t) {
032ff4af 82 return t == UNIT_ACTIVE || t == UNIT_RELOADING;
87f0e418
LP
83}
84
85static inline bool UNIT_IS_ACTIVE_OR_ACTIVATING(UnitActiveState t) {
032ff4af 86 return t == UNIT_ACTIVE || t == UNIT_ACTIVATING || t == UNIT_RELOADING;
87f0e418
LP
87}
88
89static inline bool UNIT_IS_INACTIVE_OR_DEACTIVATING(UnitActiveState t) {
fdf20a31 90 return t == UNIT_INACTIVE || t == UNIT_FAILED || t == UNIT_DEACTIVATING;
6124958c
LP
91}
92
fdf20a31
MM
93static inline bool UNIT_IS_INACTIVE_OR_FAILED(UnitActiveState t) {
94 return t == UNIT_INACTIVE || t == UNIT_FAILED;
87f0e418
LP
95}
96
97enum UnitDependency {
98 /* Positive dependencies */
99 UNIT_REQUIRES,
9e2f7c11 100 UNIT_REQUIRES_OVERRIDABLE,
87f0e418 101 UNIT_REQUISITE,
9e2f7c11
LP
102 UNIT_REQUISITE_OVERRIDABLE,
103 UNIT_WANTS,
b81884e7 104 UNIT_BIND_TO,
87f0e418
LP
105
106 /* Inverse of the above */
9e2f7c11 107 UNIT_REQUIRED_BY, /* inverse of 'requires' and 'requisite' is 'required_by' */
f14e15f8 108 UNIT_REQUIRED_BY_OVERRIDABLE, /* inverse of 'requires_overridable' and 'requisite_overridable' is 'soft_required_by' */
9e2f7c11 109 UNIT_WANTED_BY, /* inverse of 'wants' */
b81884e7 110 UNIT_BOUND_BY, /* inverse of 'bind_to' */
87f0e418
LP
111
112 /* Negative dependencies */
69dd2852
LP
113 UNIT_CONFLICTS, /* inverse of 'conflicts' is 'conflicted_by' */
114 UNIT_CONFLICTED_BY,
87f0e418
LP
115
116 /* Order */
701cc384 117 UNIT_BEFORE, /* inverse of 'before' is 'after' and vice versa */
87f0e418
LP
118 UNIT_AFTER,
119
5de9682c
LP
120 /* On Failure */
121 UNIT_ON_FAILURE,
122
57020a3a
LP
123 /* Triggers (i.e. a socket triggers a service) */
124 UNIT_TRIGGERS,
125 UNIT_TRIGGERED_BY,
126
4dcc1cb4
LP
127 /* Propagate reloads */
128 UNIT_PROPAGATE_RELOAD_TO,
129 UNIT_PROPAGATE_RELOAD_FROM,
130
701cc384
LP
131 /* Reference information for GC logic */
132 UNIT_REFERENCES, /* Inverse of 'references' is 'referenced_by' */
133 UNIT_REFERENCED_BY,
134
87f0e418
LP
135 _UNIT_DEPENDENCY_MAX,
136 _UNIT_DEPENDENCY_INVALID = -1
137};
138
ef734fd6
LP
139#include "manager.h"
140#include "job.h"
8e274523 141#include "cgroup.h"
ab1f0633 142#include "cgroup-attr.h"
ef734fd6 143
ac155bb8 144struct Unit {
87f0e418 145 Manager *manager;
23a177ef 146
87f0e418
LP
147 UnitType type;
148 UnitLoadState load_state;
23a177ef 149 Unit *merged_into;
87f0e418
LP
150
151 char *id; /* One name is special because we use it for identification. Points to an entry in the names set */
9e2f7c11 152 char *instance;
87f0e418
LP
153
154 Set *names;
155 Set *dependencies[_UNIT_DEPENDENCY_MAX];
156
7c8fa05c
LP
157 char **requires_mounts_for;
158
87f0e418 159 char *description;
49dbfa7b 160 char **documentation;
faf919f1 161
6be1e7d5 162 char *fragment_path; /* if loaded from a config file this is the primary path to it */
45fb0699 163 usec_t fragment_mtime;
87f0e418 164
e0209d83 165 /* If there is something to do with this unit, then this is the installed job for it */
87f0e418
LP
166 Job *job;
167
e0209d83
MS
168 /* JOB_NOP jobs are special and can be installed without disturbing the real job. */
169 Job *nop_job;
170
faf919f1
LP
171 usec_t job_timeout;
172
57020a3a
LP
173 /* References to this */
174 LIST_HEAD(UnitRef, refs);
175
52661efd
LP
176 /* Conditions to check */
177 LIST_HEAD(Condition, conditions);
178
90bbc946
LP
179 dual_timestamp condition_timestamp;
180
63983207
LP
181 dual_timestamp inactive_exit_timestamp;
182 dual_timestamp active_enter_timestamp;
183 dual_timestamp active_exit_timestamp;
184 dual_timestamp inactive_enter_timestamp;
87f0e418 185
8e274523
LP
186 /* Counterparts in the cgroup filesystem */
187 CGroupBonding *cgroup_bondings;
ab1f0633 188 CGroupAttribute *cgroup_attributes;
8e274523 189
ef734fd6 190 /* Per type list */
ac155bb8 191 LIST_FIELDS(Unit, units_by_type);
c1e1601e 192
7c8fa05c
LP
193 /* All units which have requires_mounts_for set */
194 LIST_FIELDS(Unit, has_requires_mounts_for);
195
701cc384 196 /* Load queue */
ac155bb8 197 LIST_FIELDS(Unit, load_queue);
701cc384 198
c1e1601e 199 /* D-Bus queue */
ac155bb8 200 LIST_FIELDS(Unit, dbus_queue);
23a177ef
LP
201
202 /* Cleanup queue */
ac155bb8 203 LIST_FIELDS(Unit, cleanup_queue);
9d58f1db 204
701cc384 205 /* GC queue */
ac155bb8 206 LIST_FIELDS(Unit, gc_queue);
701cc384
LP
207
208 /* Used during GC sweeps */
eced69b3 209 unsigned gc_marker;
701cc384 210
7fab9d01 211 /* When deserializing, temporarily store the job type for this
39a18c60
MS
212 * unit here, if there was a job scheduled.
213 * Only for deserializing from a legacy version. New style uses full
214 * serialized jobs. */
7fab9d01
LP
215 int deserialized_job; /* This is actually of type JobType */
216
8821a00f
LP
217 /* Error code when we didn't manage to load the unit (negative) */
218 int load_error;
219
a4375746
LP
220 /* Cached unit file state */
221 UnitFileState unit_file_state;
222
9d58f1db
LP
223 /* Garbage collect us we nobody wants or requires us anymore */
224 bool stop_when_unneeded;
225
35b8ca3a 226 /* Create default dependencies */
a40eb732
LP
227 bool default_dependencies;
228
b5e9dba8
LP
229 /* Refuse manual starting, allow starting only indirectly via dependency. */
230 bool refuse_manual_start;
231
232 /* Don't allow the user to stop this unit manually, allow stopping only indirectly via dependency. */
233 bool refuse_manual_stop;
234
2528a7a6
LP
235 /* Allow isolation requests */
236 bool allow_isolate;
237
222ae6a8
LP
238 /* Isolate OnFailure unit */
239 bool on_failure_isolate;
240
c8f4d764
LP
241 /* Ignore this unit when isolating */
242 bool ignore_on_isolate;
243
7a6000a6
LP
244 /* Ignore this unit when snapshotting */
245 bool ignore_on_snapshot;
246
90bbc946
LP
247 /* Did the last condition check suceed? */
248 bool condition_result;
249
9d58f1db
LP
250 bool in_load_queue:1;
251 bool in_dbus_queue:1;
252 bool in_cleanup_queue:1;
701cc384
LP
253 bool in_gc_queue:1;
254
9d58f1db 255 bool sent_dbus_new_signal:1;
6c073082
LP
256
257 bool no_gc:1;
cd6d0a45
LP
258
259 bool in_audit:1;
87f0e418
LP
260};
261
57020a3a
LP
262struct UnitRef {
263 /* Keeps tracks of references to a unit. This is useful so
264 * that we can merge two units if necessary and correct all
265 * references to them */
266
267 Unit* unit;
268 LIST_FIELDS(UnitRef, refs);
269};
270
c6918296
MS
271struct UnitStatusMessageFormats {
272 const char *starting_stopping[2];
273 const char *finished_start_job[_JOB_RESULT_MAX];
274 const char *finished_stop_job[_JOB_RESULT_MAX];
275};
276
87f0e418
LP
277#include "service.h"
278#include "timer.h"
279#include "socket.h"
280#include "target.h"
281#include "device.h"
282#include "mount.h"
283#include "automount.h"
284#include "snapshot.h"
07b0b134 285#include "swap.h"
01f78473 286#include "path.h"
87f0e418 287
87f0e418
LP
288struct UnitVTable {
289 const char *suffix;
290
7d17cfbc
MS
291 /* How much memory does an object of this unit type need */
292 size_t object_size;
293
f975e971
LP
294 /* Config file sections this unit type understands, separated
295 * by NUL chars */
296 const char *sections;
297
e537352b 298 /* This should reset all type-specific variables. This should
a16e1123
LP
299 * not allocate memory, and is called with zero-initialized
300 * data. It should hence only initialize variables that need
301 * to be set != 0. */
e537352b
LP
302 void (*init)(Unit *u);
303
a16e1123
LP
304 /* This should free all type-specific variables. It should be
305 * idempotent. */
306 void (*done)(Unit *u);
307
e537352b
LP
308 /* Actually load data from disk. This may fail, and should set
309 * load_state to UNIT_LOADED, UNIT_MERGED or leave it at
310 * UNIT_STUB if no configuration could be found. */
311 int (*load)(Unit *u);
312
e537352b
LP
313 /* If a a lot of units got created via enumerate(), this is
314 * where to actually set the state and call unit_notify(). */
f50e0a01 315 int (*coldplug)(Unit *u);
87f0e418
LP
316
317 void (*dump)(Unit *u, FILE *f, const char *prefix);
318
319 int (*start)(Unit *u);
320 int (*stop)(Unit *u);
321 int (*reload)(Unit *u);
322
8a0867d6
LP
323 int (*kill)(Unit *u, KillWho w, KillMode m, int signo, DBusError *error);
324
87f0e418
LP
325 bool (*can_reload)(Unit *u);
326
a16e1123
LP
327 /* Write all data that cannot be restored from other sources
328 * away using unit_serialize_item() */
329 int (*serialize)(Unit *u, FILE *f, FDSet *fds);
330
331 /* Restore one item from the serialization */
332 int (*deserialize_item)(Unit *u, const char *key, const char *data, FDSet *fds);
333
87f0e418
LP
334 /* Boils down the more complex internal state of this unit to
335 * a simpler one that the engine can understand */
336 UnitActiveState (*active_state)(Unit *u);
337
10a94420
LP
338 /* Returns the substate specific to this unit type as
339 * string. This is purely information so that we can give the
35b8ca3a 340 * user a more fine grained explanation in which actual state a
10a94420
LP
341 * unit is in. */
342 const char* (*sub_state_to_string)(Unit *u);
343
701cc384
LP
344 /* Return true when there is reason to keep this entry around
345 * even nothing references it and it isn't active in any
346 * way */
347 bool (*check_gc)(Unit *u);
348
349 /* Return true when this unit is suitable for snapshotting */
350 bool (*check_snapshot)(Unit *u);
351
acbb0225 352 void (*fd_event)(Unit *u, int fd, uint32_t events, Watch *w);
87f0e418 353 void (*sigchld_event)(Unit *u, pid_t pid, int code, int status);
acbb0225 354 void (*timer_event)(Unit *u, uint64_t n_elapsed, Watch *w);
7824bbeb 355
5f4b19f4
LP
356 /* Check whether unit needs a daemon reload */
357 bool (*need_daemon_reload)(Unit *u);
358
fdf20a31
MM
359 /* Reset failed state if we are in failed state */
360 void (*reset_failed)(Unit *u);
5632e374 361
05e343b7
LP
362 /* Called whenever any of the cgroups this unit watches for
363 * ran empty */
8e274523
LP
364 void (*cgroup_notify_empty)(Unit *u);
365
8c47c732 366 /* Called whenever a process of this unit sends us a message */
c952c6ec 367 void (*notify_message)(Unit *u, pid_t pid, char **tags);
8c47c732 368
05e343b7
LP
369 /* Called whenever a name thus Unit registered for comes or
370 * goes away. */
371 void (*bus_name_owner_change)(Unit *u, const char *name, const char *old_owner, const char *new_owner);
372
373 /* Called whenever a bus PID lookup finishes */
374 void (*bus_query_pid_done)(Unit *u, const char *name, pid_t pid);
375
4139c1b2 376 /* Called for each message received on the bus */
5e8d1c9a 377 DBusHandlerResult (*bus_message_handler)(Unit *u, DBusConnection *c, DBusMessage *message);
4139c1b2 378
a7f241db
LP
379 /* Return the unit this unit is following */
380 Unit *(*following)(Unit *u);
381
6210e7fc
LP
382 /* Return the set of units that are following each other */
383 int (*following_set)(Unit *u, Set **s);
384
f50e0a01
LP
385 /* This is called for each unit type and should be used to
386 * enumerate existing devices and load them. However,
387 * everything that is loaded here should still stay in
388 * inactive state. It is the job of the coldplug() call above
389 * to put the units into the initial state. */
7824bbeb 390 int (*enumerate)(Manager *m);
f50e0a01
LP
391
392 /* Type specific cleanups. */
7824bbeb 393 void (*shutdown)(Manager *m);
9d58f1db 394
c4e2ceae 395 /* When sending out PropertiesChanged signal, which properties
96d4ce01 396 * shall be invalidated? This is a NUL separated list of
c4e2ceae
LP
397 * strings, to minimize relocations a little. */
398 const char *bus_invalidating_properties;
399
400 /* The interface name */
401 const char *bus_interface;
402
c6918296
MS
403 UnitStatusMessageFormats status_message_formats;
404
9d58f1db
LP
405 /* Can units of this type have multiple names? */
406 bool no_alias:1;
407
9d58f1db
LP
408 /* Instances make no sense for this type */
409 bool no_instances:1;
410
701cc384
LP
411 /* Exclude from automatic gc */
412 bool no_gc:1;
87f0e418
LP
413};
414
415extern const UnitVTable * const unit_vtable[_UNIT_TYPE_MAX];
416
ac155bb8 417#define UNIT_VTABLE(u) unit_vtable[(u)->type]
87f0e418
LP
418
419/* For casting a unit into the various unit types */
420#define DEFINE_CAST(UPPERCASE, MixedCase) \
421 static inline MixedCase* UPPERCASE(Unit *u) { \
ac155bb8 422 if (_unlikely_(!u || u->type != UNIT_##UPPERCASE)) \
87f0e418
LP
423 return NULL; \
424 \
425 return (MixedCase*) u; \
426 }
427
428/* For casting the various unit types into a unit */
ac155bb8 429#define UNIT(u) (&(u)->meta)
87f0e418
LP
430
431DEFINE_CAST(SOCKET, Socket);
432DEFINE_CAST(TIMER, Timer);
433DEFINE_CAST(SERVICE, Service);
434DEFINE_CAST(TARGET, Target);
435DEFINE_CAST(DEVICE, Device);
436DEFINE_CAST(MOUNT, Mount);
437DEFINE_CAST(AUTOMOUNT, Automount);
438DEFINE_CAST(SNAPSHOT, Snapshot);
07b0b134 439DEFINE_CAST(SWAP, Swap);
01f78473 440DEFINE_CAST(PATH, Path);
87f0e418 441
7d17cfbc 442Unit *unit_new(Manager *m, size_t size);
87f0e418
LP
443void unit_free(Unit *u);
444
445int unit_add_name(Unit *u, const char *name);
9e2f7c11 446
701cc384 447int unit_add_dependency(Unit *u, UnitDependency d, Unit *other, bool add_reference);
2c966c03
LP
448int unit_add_two_dependencies(Unit *u, UnitDependency d, UnitDependency e, Unit *other, bool add_reference);
449
701cc384 450int unit_add_dependency_by_name(Unit *u, UnitDependency d, const char *name, const char *filename, bool add_reference);
2c966c03
LP
451int unit_add_two_dependencies_by_name(Unit *u, UnitDependency d, UnitDependency e, const char *name, const char *path, bool add_reference);
452
701cc384 453int unit_add_dependency_by_name_inverse(Unit *u, UnitDependency d, const char *name, const char *filename, bool add_reference);
2c966c03 454int unit_add_two_dependencies_by_name_inverse(Unit *u, UnitDependency d, UnitDependency e, const char *name, const char *path, bool add_reference);
0ae97ec1 455
23a177ef
LP
456int unit_add_exec_dependencies(Unit *u, ExecContext *c);
457
8e274523
LP
458int unit_add_cgroup(Unit *u, CGroupBonding *b);
459int unit_add_cgroup_from_text(Unit *u, const char *name);
d686d8a9 460int unit_add_default_cgroups(Unit *u);
8e274523 461CGroupBonding* unit_get_default_cgroup(Unit *u);
ab1f0633 462int unit_add_cgroup_attribute(Unit *u, const char *controller, const char *name, const char *value, CGroupAttributeMapCallback map_callback);
8e274523 463
0ae97ec1 464int unit_choose_id(Unit *u, const char *name);
f50e0a01 465int unit_set_description(Unit *u, const char *description);
87f0e418 466
701cc384
LP
467bool unit_check_gc(Unit *u);
468
87f0e418 469void unit_add_to_load_queue(Unit *u);
c1e1601e 470void unit_add_to_dbus_queue(Unit *u);
23a177ef 471void unit_add_to_cleanup_queue(Unit *u);
701cc384 472void unit_add_to_gc_queue(Unit *u);
87f0e418
LP
473
474int unit_merge(Unit *u, Unit *other);
23a177ef
LP
475int unit_merge_by_name(Unit *u, const char *other);
476
477Unit *unit_follow_merge(Unit *u);
87f0e418 478
e537352b
LP
479int unit_load_fragment_and_dropin(Unit *u);
480int unit_load_fragment_and_dropin_optional(Unit *u);
87f0e418
LP
481int unit_load(Unit *unit);
482
87f0e418
LP
483const char *unit_description(Unit *u);
484
f278026d
LP
485bool unit_has_name(Unit *u, const char *name);
486
87f0e418
LP
487UnitActiveState unit_active_state(Unit *u);
488
10a94420
LP
489const char* unit_sub_state_to_string(Unit *u);
490
87f0e418
LP
491void unit_dump(Unit *u, FILE *f, const char *prefix);
492
493bool unit_can_reload(Unit *u);
494bool unit_can_start(Unit *u);
2528a7a6 495bool unit_can_isolate(Unit *u);
87f0e418
LP
496
497int unit_start(Unit *u);
498int unit_stop(Unit *u);
499int unit_reload(Unit *u);
500
8a0867d6
LP
501int unit_kill(Unit *u, KillWho w, KillMode m, int signo, DBusError *error);
502
e2f3b44c 503void unit_notify(Unit *u, UnitActiveState os, UnitActiveState ns, bool reload_success);
87f0e418 504
acbb0225
LP
505int unit_watch_fd(Unit *u, int fd, uint32_t events, Watch *w);
506void unit_unwatch_fd(Unit *u, Watch *w);
87f0e418
LP
507
508int unit_watch_pid(Unit *u, pid_t pid);
509void unit_unwatch_pid(Unit *u, pid_t pid);
510
acbb0225
LP
511int unit_watch_timer(Unit *u, usec_t delay, Watch *w);
512void unit_unwatch_timer(Unit *u, Watch *w);
87f0e418 513
05e343b7
LP
514int unit_watch_bus_name(Unit *u, const char *name);
515void unit_unwatch_bus_name(Unit *u, const char *name);
516
87f0e418
LP
517bool unit_job_is_applicable(Unit *u, JobType j);
518
0301abf4
LP
519int set_unit_path(const char *p);
520
50159e6a
LP
521char *unit_dbus_path(Unit *u);
522
f6ff8c29 523int unit_load_related_unit(Unit *u, const char *type, Unit **_found);
a16e1123 524int unit_get_related_unit(Unit *u, const char *type, Unit **_found);
f6ff8c29 525
9e2f7c11
LP
526char *unit_name_printf(Unit *u, const char* text);
527char *unit_full_printf(Unit *u, const char *text);
528char **unit_full_printf_strv(Unit *u, char **l);
529
a16e1123
LP
530bool unit_can_serialize(Unit *u);
531int unit_serialize(Unit *u, FILE *f, FDSet *fds);
93a46b0b 532void unit_serialize_item_format(Unit *u, FILE *f, const char *key, const char *value, ...) _printf_attr_(4,5);
a16e1123
LP
533void unit_serialize_item(Unit *u, FILE *f, const char *key, const char *value);
534int unit_deserialize(Unit *u, FILE *f, FDSet *fds);
535
6e2ef85b
LP
536int unit_add_node_link(Unit *u, const char *what, bool wants);
537
cca098b0
LP
538int unit_coldplug(Unit *u);
539
5831e9b7 540void unit_status_printf(Unit *u, const char *status, const char *format, ...);
9e58ff9c 541
45fb0699
LP
542bool unit_need_daemon_reload(Unit *u);
543
fdf20a31 544void unit_reset_failed(Unit *u);
5632e374 545
a7f241db
LP
546Unit *unit_following(Unit *u);
547
18ffdfda 548bool unit_pending_inactive(Unit *u);
f976f3f6 549bool unit_pending_active(Unit *u);
18ffdfda 550
bba34eed
LP
551int unit_add_default_target_dependency(Unit *u, Unit *target);
552
6210e7fc
LP
553int unit_following_set(Unit *u, Set **s);
554
71fad675 555UnitType unit_name_to_type(const char *n);
b9c0d441 556bool unit_name_is_valid(const char *n, bool template_ok);
71fad675 557
c0daa706
LP
558void unit_trigger_on_failure(Unit *u);
559
90bbc946
LP
560bool unit_condition_test(Unit *u);
561
a4375746
LP
562UnitFileState unit_get_unit_file_state(Unit *u);
563
57020a3a
LP
564Unit* unit_ref_set(UnitRef *ref, Unit *u);
565void unit_ref_unset(UnitRef *ref);
566
567#define UNIT_DEREF(ref) ((ref).unit)
568
7c8fa05c
LP
569int unit_add_one_mount_link(Unit *u, Mount *m);
570int unit_add_mount_links(Unit *u);
571
94f04347
LP
572const char *unit_load_state_to_string(UnitLoadState i);
573UnitLoadState unit_load_state_from_string(const char *s);
574
575const char *unit_active_state_to_string(UnitActiveState i);
576UnitActiveState unit_active_state_from_string(const char *s);
577
578const char *unit_dependency_to_string(UnitDependency i);
579UnitDependency unit_dependency_from_string(const char *s);
580
87f0e418 581#endif