]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/core/unit.h
nspawn: assume stdout is always writable if it does not support epoll
[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>
bbc9006e 26#include <unistd.h>
87f0e418 27
ac155bb8 28typedef struct Unit Unit;
87f0e418 29typedef struct UnitVTable UnitVTable;
87f0e418
LP
30typedef enum UnitActiveState UnitActiveState;
31typedef enum UnitDependency UnitDependency;
57020a3a 32typedef struct UnitRef UnitRef;
c6918296 33typedef struct UnitStatusMessageFormats UnitStatusMessageFormats;
87f0e418 34
87f0e418
LP
35#include "set.h"
36#include "util.h"
37#include "list.h"
38#include "socket-util.h"
39#include "execute.h"
52661efd 40#include "condition.h"
a4375746 41#include "install.h"
0a9f8ed0 42#include "unit-name.h"
87f0e418 43
87f0e418
LP
44enum UnitActiveState {
45 UNIT_ACTIVE,
032ff4af 46 UNIT_RELOADING,
87f0e418 47 UNIT_INACTIVE,
fdf20a31 48 UNIT_FAILED,
87f0e418
LP
49 UNIT_ACTIVATING,
50 UNIT_DEACTIVATING,
94f04347
LP
51 _UNIT_ACTIVE_STATE_MAX,
52 _UNIT_ACTIVE_STATE_INVALID = -1
87f0e418
LP
53};
54
55static inline bool UNIT_IS_ACTIVE_OR_RELOADING(UnitActiveState t) {
032ff4af 56 return t == UNIT_ACTIVE || t == UNIT_RELOADING;
87f0e418
LP
57}
58
59static inline bool UNIT_IS_ACTIVE_OR_ACTIVATING(UnitActiveState t) {
032ff4af 60 return t == UNIT_ACTIVE || t == UNIT_ACTIVATING || t == UNIT_RELOADING;
87f0e418
LP
61}
62
63static inline bool UNIT_IS_INACTIVE_OR_DEACTIVATING(UnitActiveState t) {
fdf20a31 64 return t == UNIT_INACTIVE || t == UNIT_FAILED || t == UNIT_DEACTIVATING;
6124958c
LP
65}
66
fdf20a31
MM
67static inline bool UNIT_IS_INACTIVE_OR_FAILED(UnitActiveState t) {
68 return t == UNIT_INACTIVE || t == UNIT_FAILED;
87f0e418
LP
69}
70
71enum UnitDependency {
72 /* Positive dependencies */
73 UNIT_REQUIRES,
9e2f7c11 74 UNIT_REQUIRES_OVERRIDABLE,
87f0e418 75 UNIT_REQUISITE,
9e2f7c11
LP
76 UNIT_REQUISITE_OVERRIDABLE,
77 UNIT_WANTS,
7f2cddae 78 UNIT_BINDS_TO,
85e9a101 79 UNIT_PART_OF,
87f0e418
LP
80
81 /* Inverse of the above */
9e2f7c11 82 UNIT_REQUIRED_BY, /* inverse of 'requires' and 'requisite' is 'required_by' */
f14e15f8 83 UNIT_REQUIRED_BY_OVERRIDABLE, /* inverse of 'requires_overridable' and 'requisite_overridable' is 'soft_required_by' */
9e2f7c11 84 UNIT_WANTED_BY, /* inverse of 'wants' */
7f2cddae 85 UNIT_BOUND_BY, /* inverse of 'binds_to' */
85e9a101 86 UNIT_CONSISTS_OF, /* inverse of 'part_of' */
87f0e418
LP
87
88 /* Negative dependencies */
69dd2852
LP
89 UNIT_CONFLICTS, /* inverse of 'conflicts' is 'conflicted_by' */
90 UNIT_CONFLICTED_BY,
87f0e418
LP
91
92 /* Order */
701cc384 93 UNIT_BEFORE, /* inverse of 'before' is 'after' and vice versa */
87f0e418
LP
94 UNIT_AFTER,
95
5de9682c
LP
96 /* On Failure */
97 UNIT_ON_FAILURE,
98
57020a3a
LP
99 /* Triggers (i.e. a socket triggers a service) */
100 UNIT_TRIGGERS,
101 UNIT_TRIGGERED_BY,
102
4dcc1cb4 103 /* Propagate reloads */
7f2cddae
LP
104 UNIT_PROPAGATES_RELOAD_TO,
105 UNIT_RELOAD_PROPAGATED_FROM,
4dcc1cb4 106
701cc384
LP
107 /* Reference information for GC logic */
108 UNIT_REFERENCES, /* Inverse of 'references' is 'referenced_by' */
109 UNIT_REFERENCED_BY,
110
87f0e418
LP
111 _UNIT_DEPENDENCY_MAX,
112 _UNIT_DEPENDENCY_INVALID = -1
113};
114
ef734fd6
LP
115#include "manager.h"
116#include "job.h"
8e274523 117#include "cgroup.h"
ab1f0633 118#include "cgroup-attr.h"
ef734fd6 119
ac155bb8 120struct Unit {
87f0e418 121 Manager *manager;
23a177ef 122
87f0e418
LP
123 UnitType type;
124 UnitLoadState load_state;
23a177ef 125 Unit *merged_into;
87f0e418
LP
126
127 char *id; /* One name is special because we use it for identification. Points to an entry in the names set */
9e2f7c11 128 char *instance;
87f0e418
LP
129
130 Set *names;
131 Set *dependencies[_UNIT_DEPENDENCY_MAX];
132
7c8fa05c
LP
133 char **requires_mounts_for;
134
87f0e418 135 char *description;
49dbfa7b 136 char **documentation;
faf919f1 137
6be1e7d5 138 char *fragment_path; /* if loaded from a config file this is the primary path to it */
1b64d026 139 char *source_path; /* if converted, the source file */
45fb0699 140 usec_t fragment_mtime;
1b64d026 141 usec_t source_mtime;
87f0e418 142
e0209d83 143 /* If there is something to do with this unit, then this is the installed job for it */
87f0e418
LP
144 Job *job;
145
e0209d83
MS
146 /* JOB_NOP jobs are special and can be installed without disturbing the real job. */
147 Job *nop_job;
148
faf919f1
LP
149 usec_t job_timeout;
150
57020a3a
LP
151 /* References to this */
152 LIST_HEAD(UnitRef, refs);
153
52661efd
LP
154 /* Conditions to check */
155 LIST_HEAD(Condition, conditions);
156
90bbc946
LP
157 dual_timestamp condition_timestamp;
158
63983207
LP
159 dual_timestamp inactive_exit_timestamp;
160 dual_timestamp active_enter_timestamp;
161 dual_timestamp active_exit_timestamp;
162 dual_timestamp inactive_enter_timestamp;
87f0e418 163
8e274523
LP
164 /* Counterparts in the cgroup filesystem */
165 CGroupBonding *cgroup_bondings;
ab1f0633 166 CGroupAttribute *cgroup_attributes;
8e274523 167
ef734fd6 168 /* Per type list */
ac155bb8 169 LIST_FIELDS(Unit, units_by_type);
c1e1601e 170
7c8fa05c
LP
171 /* All units which have requires_mounts_for set */
172 LIST_FIELDS(Unit, has_requires_mounts_for);
173
701cc384 174 /* Load queue */
ac155bb8 175 LIST_FIELDS(Unit, load_queue);
701cc384 176
c1e1601e 177 /* D-Bus queue */
ac155bb8 178 LIST_FIELDS(Unit, dbus_queue);
23a177ef
LP
179
180 /* Cleanup queue */
ac155bb8 181 LIST_FIELDS(Unit, cleanup_queue);
9d58f1db 182
701cc384 183 /* GC queue */
ac155bb8 184 LIST_FIELDS(Unit, gc_queue);
701cc384
LP
185
186 /* Used during GC sweeps */
eced69b3 187 unsigned gc_marker;
701cc384 188
7fab9d01 189 /* When deserializing, temporarily store the job type for this
39a18c60
MS
190 * unit here, if there was a job scheduled.
191 * Only for deserializing from a legacy version. New style uses full
192 * serialized jobs. */
7fab9d01
LP
193 int deserialized_job; /* This is actually of type JobType */
194
8821a00f
LP
195 /* Error code when we didn't manage to load the unit (negative) */
196 int load_error;
197
a4375746
LP
198 /* Cached unit file state */
199 UnitFileState unit_file_state;
200
9d58f1db
LP
201 /* Garbage collect us we nobody wants or requires us anymore */
202 bool stop_when_unneeded;
203
35b8ca3a 204 /* Create default dependencies */
a40eb732
LP
205 bool default_dependencies;
206
b5e9dba8
LP
207 /* Refuse manual starting, allow starting only indirectly via dependency. */
208 bool refuse_manual_start;
209
210 /* Don't allow the user to stop this unit manually, allow stopping only indirectly via dependency. */
211 bool refuse_manual_stop;
212
2528a7a6
LP
213 /* Allow isolation requests */
214 bool allow_isolate;
215
222ae6a8
LP
216 /* Isolate OnFailure unit */
217 bool on_failure_isolate;
218
c8f4d764
LP
219 /* Ignore this unit when isolating */
220 bool ignore_on_isolate;
221
7a6000a6
LP
222 /* Ignore this unit when snapshotting */
223 bool ignore_on_snapshot;
224
49f43d5f 225 /* Did the last condition check succeed? */
90bbc946
LP
226 bool condition_result;
227
9d58f1db
LP
228 bool in_load_queue:1;
229 bool in_dbus_queue:1;
230 bool in_cleanup_queue:1;
701cc384
LP
231 bool in_gc_queue:1;
232
9d58f1db 233 bool sent_dbus_new_signal:1;
6c073082
LP
234
235 bool no_gc:1;
cd6d0a45
LP
236
237 bool in_audit:1;
87f0e418
LP
238};
239
57020a3a
LP
240struct UnitRef {
241 /* Keeps tracks of references to a unit. This is useful so
242 * that we can merge two units if necessary and correct all
243 * references to them */
244
245 Unit* unit;
246 LIST_FIELDS(UnitRef, refs);
247};
248
c6918296
MS
249struct UnitStatusMessageFormats {
250 const char *starting_stopping[2];
251 const char *finished_start_job[_JOB_RESULT_MAX];
252 const char *finished_stop_job[_JOB_RESULT_MAX];
253};
254
87f0e418
LP
255#include "service.h"
256#include "timer.h"
257#include "socket.h"
258#include "target.h"
259#include "device.h"
260#include "mount.h"
261#include "automount.h"
262#include "snapshot.h"
07b0b134 263#include "swap.h"
01f78473 264#include "path.h"
87f0e418 265
87f0e418 266struct UnitVTable {
7d17cfbc
MS
267 /* How much memory does an object of this unit type need */
268 size_t object_size;
269
3ef63c31
LP
270 /* If greater than 0, the offset into the object where
271 * ExecContext is found, if the unit type has that */
272 size_t exec_context_offset;
273
71645aca
LP
274 /* The name of the section with the exec settings of ExecContext */
275 const char *exec_section;
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
c5315881 296 /* If a lot of units got created via enumerate(), this is
e537352b 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
c74f17d9 306 int (*kill)(Unit *u, KillWho w, int signo, DBusError *error);
8a0867d6 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
01e10de3
LP
317 /* Try to match up fds with what we need for this unit */
318 int (*distribute_fds)(Unit *u, FDSet *fds);
319
87f0e418
LP
320 /* Boils down the more complex internal state of this unit to
321 * a simpler one that the engine can understand */
322 UnitActiveState (*active_state)(Unit *u);
323
10a94420
LP
324 /* Returns the substate specific to this unit type as
325 * string. This is purely information so that we can give the
35b8ca3a 326 * user a more fine grained explanation in which actual state a
10a94420
LP
327 * unit is in. */
328 const char* (*sub_state_to_string)(Unit *u);
329
701cc384
LP
330 /* Return true when there is reason to keep this entry around
331 * even nothing references it and it isn't active in any
332 * way */
333 bool (*check_gc)(Unit *u);
334
335 /* Return true when this unit is suitable for snapshotting */
336 bool (*check_snapshot)(Unit *u);
337
acbb0225 338 void (*fd_event)(Unit *u, int fd, uint32_t events, Watch *w);
87f0e418 339 void (*sigchld_event)(Unit *u, pid_t pid, int code, int status);
acbb0225 340 void (*timer_event)(Unit *u, uint64_t n_elapsed, Watch *w);
7824bbeb 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
8742514c
LP
368 /* Called whenever CLOCK_REALTIME made a jump */
369 void (*time_change)(Unit *u);
370
f50e0a01
LP
371 /* This is called for each unit type and should be used to
372 * enumerate existing devices and load them. However,
373 * everything that is loaded here should still stay in
374 * inactive state. It is the job of the coldplug() call above
375 * to put the units into the initial state. */
7824bbeb 376 int (*enumerate)(Manager *m);
f50e0a01
LP
377
378 /* Type specific cleanups. */
7824bbeb 379 void (*shutdown)(Manager *m);
9d58f1db 380
c4e2ceae 381 /* When sending out PropertiesChanged signal, which properties
96d4ce01 382 * shall be invalidated? This is a NUL separated list of
c4e2ceae
LP
383 * strings, to minimize relocations a little. */
384 const char *bus_invalidating_properties;
385
386 /* The interface name */
387 const char *bus_interface;
388
c6918296
MS
389 UnitStatusMessageFormats status_message_formats;
390
9d58f1db
LP
391 /* Can units of this type have multiple names? */
392 bool no_alias:1;
393
9d58f1db
LP
394 /* Instances make no sense for this type */
395 bool no_instances:1;
396
701cc384
LP
397 /* Exclude from automatic gc */
398 bool no_gc:1;
87f0e418
LP
399};
400
401extern const UnitVTable * const unit_vtable[_UNIT_TYPE_MAX];
402
ac155bb8 403#define UNIT_VTABLE(u) unit_vtable[(u)->type]
87f0e418
LP
404
405/* For casting a unit into the various unit types */
406#define DEFINE_CAST(UPPERCASE, MixedCase) \
407 static inline MixedCase* UPPERCASE(Unit *u) { \
ac155bb8 408 if (_unlikely_(!u || u->type != UNIT_##UPPERCASE)) \
87f0e418
LP
409 return NULL; \
410 \
411 return (MixedCase*) u; \
412 }
413
414/* For casting the various unit types into a unit */
ac155bb8 415#define UNIT(u) (&(u)->meta)
87f0e418
LP
416
417DEFINE_CAST(SOCKET, Socket);
418DEFINE_CAST(TIMER, Timer);
419DEFINE_CAST(SERVICE, Service);
420DEFINE_CAST(TARGET, Target);
421DEFINE_CAST(DEVICE, Device);
422DEFINE_CAST(MOUNT, Mount);
423DEFINE_CAST(AUTOMOUNT, Automount);
424DEFINE_CAST(SNAPSHOT, Snapshot);
07b0b134 425DEFINE_CAST(SWAP, Swap);
01f78473 426DEFINE_CAST(PATH, Path);
87f0e418 427
7d17cfbc 428Unit *unit_new(Manager *m, size_t size);
87f0e418
LP
429void unit_free(Unit *u);
430
431int unit_add_name(Unit *u, const char *name);
9e2f7c11 432
701cc384 433int unit_add_dependency(Unit *u, UnitDependency d, Unit *other, bool add_reference);
2c966c03
LP
434int unit_add_two_dependencies(Unit *u, UnitDependency d, UnitDependency e, Unit *other, bool add_reference);
435
701cc384 436int unit_add_dependency_by_name(Unit *u, UnitDependency d, const char *name, const char *filename, bool add_reference);
2c966c03
LP
437int unit_add_two_dependencies_by_name(Unit *u, UnitDependency d, UnitDependency e, const char *name, const char *path, bool add_reference);
438
701cc384 439int unit_add_dependency_by_name_inverse(Unit *u, UnitDependency d, const char *name, const char *filename, bool add_reference);
2c966c03 440int unit_add_two_dependencies_by_name_inverse(Unit *u, UnitDependency d, UnitDependency e, const char *name, const char *path, bool add_reference);
0ae97ec1 441
23a177ef
LP
442int unit_add_exec_dependencies(Unit *u, ExecContext *c);
443
8e274523 444int unit_add_cgroup(Unit *u, CGroupBonding *b);
246aa6dd 445int unit_add_cgroup_from_text(Unit *u, const char *name, bool overwrite, CGroupBonding **ret);
d686d8a9 446int unit_add_default_cgroups(Unit *u);
8e274523 447CGroupBonding* unit_get_default_cgroup(Unit *u);
246aa6dd 448int unit_add_cgroup_attribute(Unit *u, const char *controller, const char *name, const char *value, CGroupAttributeMapCallback map_callback, CGroupAttribute **ret);
8e274523 449
0ae97ec1 450int unit_choose_id(Unit *u, const char *name);
f50e0a01 451int unit_set_description(Unit *u, const char *description);
87f0e418 452
701cc384
LP
453bool unit_check_gc(Unit *u);
454
87f0e418 455void unit_add_to_load_queue(Unit *u);
c1e1601e 456void unit_add_to_dbus_queue(Unit *u);
23a177ef 457void unit_add_to_cleanup_queue(Unit *u);
701cc384 458void unit_add_to_gc_queue(Unit *u);
87f0e418
LP
459
460int unit_merge(Unit *u, Unit *other);
23a177ef
LP
461int unit_merge_by_name(Unit *u, const char *other);
462
463Unit *unit_follow_merge(Unit *u);
87f0e418 464
e537352b
LP
465int unit_load_fragment_and_dropin(Unit *u);
466int unit_load_fragment_and_dropin_optional(Unit *u);
87f0e418
LP
467int unit_load(Unit *unit);
468
87f0e418
LP
469const char *unit_description(Unit *u);
470
f278026d
LP
471bool unit_has_name(Unit *u, const char *name);
472
87f0e418
LP
473UnitActiveState unit_active_state(Unit *u);
474
10a94420
LP
475const char* unit_sub_state_to_string(Unit *u);
476
87f0e418
LP
477void unit_dump(Unit *u, FILE *f, const char *prefix);
478
479bool unit_can_reload(Unit *u);
480bool unit_can_start(Unit *u);
2528a7a6 481bool unit_can_isolate(Unit *u);
87f0e418
LP
482
483int unit_start(Unit *u);
484int unit_stop(Unit *u);
485int unit_reload(Unit *u);
486
c74f17d9 487int unit_kill(Unit *u, KillWho w, int signo, DBusError *error);
8a0867d6 488
e2f3b44c 489void unit_notify(Unit *u, UnitActiveState os, UnitActiveState ns, bool reload_success);
87f0e418 490
acbb0225
LP
491int unit_watch_fd(Unit *u, int fd, uint32_t events, Watch *w);
492void unit_unwatch_fd(Unit *u, Watch *w);
87f0e418
LP
493
494int unit_watch_pid(Unit *u, pid_t pid);
495void unit_unwatch_pid(Unit *u, pid_t pid);
496
36697dc0 497int unit_watch_timer(Unit *u, clockid_t, bool relative, usec_t usec, Watch *w);
acbb0225 498void unit_unwatch_timer(Unit *u, Watch *w);
87f0e418 499
05e343b7
LP
500int unit_watch_bus_name(Unit *u, const char *name);
501void unit_unwatch_bus_name(Unit *u, const char *name);
502
87f0e418
LP
503bool unit_job_is_applicable(Unit *u, JobType j);
504
0301abf4
LP
505int set_unit_path(const char *p);
506
50159e6a
LP
507char *unit_dbus_path(Unit *u);
508
f6ff8c29 509int unit_load_related_unit(Unit *u, const char *type, Unit **_found);
a16e1123 510int unit_get_related_unit(Unit *u, const char *type, Unit **_found);
f6ff8c29 511
a16e1123 512bool unit_can_serialize(Unit *u);
6b78f9b4 513int unit_serialize(Unit *u, FILE *f, FDSet *fds, bool serialize_jobs);
93a46b0b 514void unit_serialize_item_format(Unit *u, FILE *f, const char *key, const char *value, ...) _printf_attr_(4,5);
a16e1123
LP
515void unit_serialize_item(Unit *u, FILE *f, const char *key, const char *value);
516int unit_deserialize(Unit *u, FILE *f, FDSet *fds);
517
6e2ef85b
LP
518int unit_add_node_link(Unit *u, const char *what, bool wants);
519
cca098b0
LP
520int unit_coldplug(Unit *u);
521
5831e9b7 522void unit_status_printf(Unit *u, const char *status, const char *format, ...);
9e58ff9c 523
45fb0699
LP
524bool unit_need_daemon_reload(Unit *u);
525
fdf20a31 526void unit_reset_failed(Unit *u);
5632e374 527
a7f241db
LP
528Unit *unit_following(Unit *u);
529
18ffdfda 530bool unit_pending_inactive(Unit *u);
f976f3f6 531bool unit_pending_active(Unit *u);
18ffdfda 532
bba34eed
LP
533int unit_add_default_target_dependency(Unit *u, Unit *target);
534
41f9172f
LP
535char *unit_default_cgroup_path(Unit *u);
536
6210e7fc
LP
537int unit_following_set(Unit *u, Set **s);
538
c0daa706
LP
539void unit_trigger_on_failure(Unit *u);
540
90bbc946
LP
541bool unit_condition_test(Unit *u);
542
a4375746
LP
543UnitFileState unit_get_unit_file_state(Unit *u);
544
57020a3a
LP
545Unit* unit_ref_set(UnitRef *ref, Unit *u);
546void unit_ref_unset(UnitRef *ref);
547
548#define UNIT_DEREF(ref) ((ref).unit)
549
7c8fa05c
LP
550int unit_add_one_mount_link(Unit *u, Mount *m);
551int unit_add_mount_links(Unit *u);
552
cba6e062 553int unit_exec_context_defaults(Unit *u, ExecContext *c);
e06c73cc 554
3ef63c31
LP
555ExecContext *unit_get_exec_context(Unit *u);
556
71645aca
LP
557int unit_write_drop_in(Unit *u, bool runtime, const char *name, const char *data);
558int unit_remove_drop_in(Unit *u, bool runtime, const char *name);
559
94f04347
LP
560const char *unit_active_state_to_string(UnitActiveState i);
561UnitActiveState unit_active_state_from_string(const char *s);
562
563const char *unit_dependency_to_string(UnitDependency i);
564UnitDependency unit_dependency_from_string(const char *s);
fdf9f9bb 565
bbc9006e 566#define log_full_unit(level, unit, ...) log_meta_object(level, __FILE__, __LINE__, __func__, getpid() == 1 ? "UNIT=" : "USER_UNIT=", unit, __VA_ARGS__)
fdf9f9bb
ZJS
567#define log_debug_unit(unit, ...) log_full_unit(LOG_DEBUG, unit, __VA_ARGS__)
568#define log_info_unit(unit, ...) log_full_unit(LOG_INFO, unit, __VA_ARGS__)
569#define log_notice_unit(unit, ...) log_full_unit(LOG_NOTICE, unit, __VA_ARGS__)
570#define log_warning_unit(unit, ...) log_full_unit(LOG_WARNING, unit, __VA_ARGS__)
571#define log_error_unit(unit, ...) log_full_unit(LOG_ERR, unit, __VA_ARGS__)
bbc9006e
MT
572
573#define log_struct_unit(level, unit, ...) log_struct(level, getpid() == 1 ? "UNIT=%s" : "USER_UNIT=%s", unit, __VA_ARGS__)