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