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