]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/core/unit.h
swap: don't add too many deps for swap files form /proc/swap
[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 30typedef enum UnitActiveState UnitActiveState;
57020a3a 31typedef struct UnitRef UnitRef;
c6918296 32typedef struct UnitStatusMessageFormats UnitStatusMessageFormats;
87f0e418 33
718db961 34#include "sd-event.h"
87f0e418
LP
35#include "set.h"
36#include "util.h"
37#include "list.h"
38#include "socket-util.h"
39#include "execute.h"
4ad49000 40#include "cgroup.h"
52661efd 41#include "condition.h"
a4375746 42#include "install.h"
0a9f8ed0 43#include "unit-name.h"
f189ab18 44#include "failure-action.h"
87f0e418 45
87f0e418
LP
46enum UnitActiveState {
47 UNIT_ACTIVE,
032ff4af 48 UNIT_RELOADING,
87f0e418 49 UNIT_INACTIVE,
fdf20a31 50 UNIT_FAILED,
87f0e418
LP
51 UNIT_ACTIVATING,
52 UNIT_DEACTIVATING,
94f04347
LP
53 _UNIT_ACTIVE_STATE_MAX,
54 _UNIT_ACTIVE_STATE_INVALID = -1
87f0e418
LP
55};
56
57static inline bool UNIT_IS_ACTIVE_OR_RELOADING(UnitActiveState t) {
032ff4af 58 return t == UNIT_ACTIVE || t == UNIT_RELOADING;
87f0e418
LP
59}
60
61static inline bool UNIT_IS_ACTIVE_OR_ACTIVATING(UnitActiveState t) {
032ff4af 62 return t == UNIT_ACTIVE || t == UNIT_ACTIVATING || t == UNIT_RELOADING;
87f0e418
LP
63}
64
65static inline bool UNIT_IS_INACTIVE_OR_DEACTIVATING(UnitActiveState t) {
fdf20a31 66 return t == UNIT_INACTIVE || t == UNIT_FAILED || t == UNIT_DEACTIVATING;
6124958c
LP
67}
68
fdf20a31
MM
69static inline bool UNIT_IS_INACTIVE_OR_FAILED(UnitActiveState t) {
70 return t == UNIT_INACTIVE || t == UNIT_FAILED;
87f0e418
LP
71}
72
ef734fd6
LP
73#include "manager.h"
74#include "job.h"
75
a016b922
LP
76struct UnitRef {
77 /* Keeps tracks of references to a unit. This is useful so
78 * that we can merge two units if necessary and correct all
79 * references to them */
80
81 Unit* unit;
82 LIST_FIELDS(UnitRef, refs);
83};
84
ac155bb8 85struct Unit {
87f0e418 86 Manager *manager;
23a177ef 87
87f0e418
LP
88 UnitType type;
89 UnitLoadState load_state;
23a177ef 90 Unit *merged_into;
87f0e418
LP
91
92 char *id; /* One name is special because we use it for identification. Points to an entry in the names set */
9e2f7c11 93 char *instance;
87f0e418
LP
94
95 Set *names;
96 Set *dependencies[_UNIT_DEPENDENCY_MAX];
97
7c8fa05c
LP
98 char **requires_mounts_for;
99
87f0e418 100 char *description;
49dbfa7b 101 char **documentation;
faf919f1 102
6be1e7d5 103 char *fragment_path; /* if loaded from a config file this is the primary path to it */
1b64d026 104 char *source_path; /* if converted, the source file */
ae7a7182 105 char **dropin_paths;
45fb0699 106 usec_t fragment_mtime;
1b64d026 107 usec_t source_mtime;
ae7a7182 108 usec_t dropin_mtime;
87f0e418 109
e0209d83 110 /* If there is something to do with this unit, then this is the installed job for it */
87f0e418
LP
111 Job *job;
112
e0209d83
MS
113 /* JOB_NOP jobs are special and can be installed without disturbing the real job. */
114 Job *nop_job;
115
f189ab18 116 /* Job timeout and action to take */
faf919f1 117 usec_t job_timeout;
f189ab18
LP
118 FailureAction job_timeout_action;
119 char *job_timeout_reboot_arg;
faf919f1 120
57020a3a
LP
121 /* References to this */
122 LIST_HEAD(UnitRef, refs);
123
52661efd
LP
124 /* Conditions to check */
125 LIST_HEAD(Condition, conditions);
126
90bbc946
LP
127 dual_timestamp condition_timestamp;
128
63983207
LP
129 dual_timestamp inactive_exit_timestamp;
130 dual_timestamp active_enter_timestamp;
131 dual_timestamp active_exit_timestamp;
132 dual_timestamp inactive_enter_timestamp;
87f0e418 133
a016b922
LP
134 UnitRef slice;
135
ef734fd6 136 /* Per type list */
ac155bb8 137 LIST_FIELDS(Unit, units_by_type);
c1e1601e 138
7c8fa05c
LP
139 /* All units which have requires_mounts_for set */
140 LIST_FIELDS(Unit, has_requires_mounts_for);
141
701cc384 142 /* Load queue */
ac155bb8 143 LIST_FIELDS(Unit, load_queue);
701cc384 144
c1e1601e 145 /* D-Bus queue */
ac155bb8 146 LIST_FIELDS(Unit, dbus_queue);
23a177ef
LP
147
148 /* Cleanup queue */
ac155bb8 149 LIST_FIELDS(Unit, cleanup_queue);
9d58f1db 150
701cc384 151 /* GC queue */
ac155bb8 152 LIST_FIELDS(Unit, gc_queue);
701cc384 153
4ad49000
LP
154 /* CGroup realize members queue */
155 LIST_FIELDS(Unit, cgroup_queue);
156
a911bb9a
LP
157 /* PIDs we keep an eye on. Note that a unit might have many
158 * more, but these are the ones we care enough about to
159 * process SIGCHLD for */
160 Set *pids;
161
701cc384 162 /* Used during GC sweeps */
eced69b3 163 unsigned gc_marker;
701cc384 164
7fab9d01 165 /* When deserializing, temporarily store the job type for this
39a18c60
MS
166 * unit here, if there was a job scheduled.
167 * Only for deserializing from a legacy version. New style uses full
168 * serialized jobs. */
7fab9d01
LP
169 int deserialized_job; /* This is actually of type JobType */
170
8821a00f
LP
171 /* Error code when we didn't manage to load the unit (negative) */
172 int load_error;
173
a4375746
LP
174 /* Cached unit file state */
175 UnitFileState unit_file_state;
176
7c52a17b
ZJS
177 /* Counterparts in the cgroup filesystem */
178 char *cgroup_path;
179 CGroupControllerMask cgroup_realized_mask;
180 CGroupControllerMask cgroup_subtree_mask;
181 CGroupControllerMask cgroup_members_mask;
182
183 /* How to start OnFailure units */
184 JobMode on_failure_job_mode;
185
9d58f1db
LP
186 /* Garbage collect us we nobody wants or requires us anymore */
187 bool stop_when_unneeded;
188
35b8ca3a 189 /* Create default dependencies */
a40eb732
LP
190 bool default_dependencies;
191
b5e9dba8
LP
192 /* Refuse manual starting, allow starting only indirectly via dependency. */
193 bool refuse_manual_start;
194
195 /* Don't allow the user to stop this unit manually, allow stopping only indirectly via dependency. */
196 bool refuse_manual_stop;
197
2528a7a6
LP
198 /* Allow isolation requests */
199 bool allow_isolate;
200
c8f4d764
LP
201 /* Ignore this unit when isolating */
202 bool ignore_on_isolate;
203
7a6000a6
LP
204 /* Ignore this unit when snapshotting */
205 bool ignore_on_snapshot;
206
49f43d5f 207 /* Did the last condition check succeed? */
90bbc946
LP
208 bool condition_result;
209
c2756a68
LP
210 /* Is this a transient unit? */
211 bool transient;
212
9d58f1db
LP
213 bool in_load_queue:1;
214 bool in_dbus_queue:1;
215 bool in_cleanup_queue:1;
701cc384 216 bool in_gc_queue:1;
4ad49000 217 bool in_cgroup_queue:1;
701cc384 218
9d58f1db 219 bool sent_dbus_new_signal:1;
6c073082
LP
220
221 bool no_gc:1;
cd6d0a45
LP
222
223 bool in_audit:1;
a57f7e2c
LP
224
225 bool cgroup_realized:1;
bc432dc7
LP
226 bool cgroup_members_mask_valid:1;
227 bool cgroup_subtree_mask_valid:1;
87f0e418
LP
228};
229
c6918296
MS
230struct UnitStatusMessageFormats {
231 const char *starting_stopping[2];
232 const char *finished_start_job[_JOB_RESULT_MAX];
233 const char *finished_stop_job[_JOB_RESULT_MAX];
234};
235
8e2af478
LP
236typedef enum UnitSetPropertiesMode {
237 UNIT_CHECK = 0,
238 UNIT_RUNTIME = 1,
239 UNIT_PERSISTENT = 2,
240} UnitSetPropertiesMode;
241
87f0e418 242#include "service.h"
87f0e418 243#include "socket.h"
e821075a 244#include "busname.h"
87f0e418 245#include "target.h"
e821075a 246#include "snapshot.h"
87f0e418
LP
247#include "device.h"
248#include "mount.h"
249#include "automount.h"
07b0b134 250#include "swap.h"
e821075a 251#include "timer.h"
01f78473 252#include "path.h"
a016b922 253#include "slice.h"
6c12b52e 254#include "scope.h"
87f0e418 255
87f0e418 256struct UnitVTable {
7d17cfbc
MS
257 /* How much memory does an object of this unit type need */
258 size_t object_size;
259
3ef63c31
LP
260 /* If greater than 0, the offset into the object where
261 * ExecContext is found, if the unit type has that */
262 size_t exec_context_offset;
263
4ad49000
LP
264 /* If greater than 0, the offset into the object where
265 * CGroupContext is found, if the unit type has that */
266 size_t cgroup_context_offset;
267
718db961
LP
268 /* If greater than 0, the offset into the object where
269 * KillContext is found, if the unit type has that */
270 size_t kill_context_offset;
271
613b411c
LP
272 /* If greater than 0, the offset into the object where the
273 * pointer to ExecRuntime is found, if the unit type has
274 * that */
275 size_t exec_runtime_offset;
276
4ad49000
LP
277 /* The name of the configuration file section with the private settings of this unit*/
278 const char *private_section;
71645aca 279
f975e971
LP
280 /* Config file sections this unit type understands, separated
281 * by NUL chars */
282 const char *sections;
283
e537352b 284 /* This should reset all type-specific variables. This should
a16e1123
LP
285 * not allocate memory, and is called with zero-initialized
286 * data. It should hence only initialize variables that need
287 * to be set != 0. */
e537352b
LP
288 void (*init)(Unit *u);
289
a16e1123
LP
290 /* This should free all type-specific variables. It should be
291 * idempotent. */
292 void (*done)(Unit *u);
293
e537352b
LP
294 /* Actually load data from disk. This may fail, and should set
295 * load_state to UNIT_LOADED, UNIT_MERGED or leave it at
296 * UNIT_STUB if no configuration could be found. */
297 int (*load)(Unit *u);
298
c5315881 299 /* If a lot of units got created via enumerate(), this is
e537352b 300 * where to actually set the state and call unit_notify(). */
f50e0a01 301 int (*coldplug)(Unit *u);
87f0e418
LP
302
303 void (*dump)(Unit *u, FILE *f, const char *prefix);
304
305 int (*start)(Unit *u);
306 int (*stop)(Unit *u);
307 int (*reload)(Unit *u);
308
718db961 309 int (*kill)(Unit *u, KillWho w, int signo, sd_bus_error *error);
8a0867d6 310
87f0e418
LP
311 bool (*can_reload)(Unit *u);
312
a16e1123
LP
313 /* Write all data that cannot be restored from other sources
314 * away using unit_serialize_item() */
315 int (*serialize)(Unit *u, FILE *f, FDSet *fds);
316
317 /* Restore one item from the serialization */
318 int (*deserialize_item)(Unit *u, const char *key, const char *data, FDSet *fds);
319
01e10de3
LP
320 /* Try to match up fds with what we need for this unit */
321 int (*distribute_fds)(Unit *u, FDSet *fds);
322
87f0e418
LP
323 /* Boils down the more complex internal state of this unit to
324 * a simpler one that the engine can understand */
325 UnitActiveState (*active_state)(Unit *u);
326
10a94420
LP
327 /* Returns the substate specific to this unit type as
328 * string. This is purely information so that we can give the
35b8ca3a 329 * user a more fine grained explanation in which actual state a
10a94420
LP
330 * unit is in. */
331 const char* (*sub_state_to_string)(Unit *u);
332
701cc384
LP
333 /* Return true when there is reason to keep this entry around
334 * even nothing references it and it isn't active in any
335 * way */
336 bool (*check_gc)(Unit *u);
337
338 /* Return true when this unit is suitable for snapshotting */
339 bool (*check_snapshot)(Unit *u);
340
718db961 341 /* Invoked on every child that died */
87f0e418 342 void (*sigchld_event)(Unit *u, pid_t pid, int code, int status);
7824bbeb 343
fdf20a31
MM
344 /* Reset failed state if we are in failed state */
345 void (*reset_failed)(Unit *u);
5632e374 346
05e343b7
LP
347 /* Called whenever any of the cgroups this unit watches for
348 * ran empty */
4ad49000 349 void (*notify_cgroup_empty)(Unit *u);
8e274523 350
8c47c732 351 /* Called whenever a process of this unit sends us a message */
c952c6ec 352 void (*notify_message)(Unit *u, pid_t pid, char **tags);
8c47c732 353
3ecaa09b 354 /* Called whenever a name this Unit registered for comes or
05e343b7
LP
355 * goes away. */
356 void (*bus_name_owner_change)(Unit *u, const char *name, const char *old_owner, const char *new_owner);
357
8e2af478 358 /* Called for each property that is being set */
718db961 359 int (*bus_set_property)(Unit *u, const char *name, sd_bus_message *message, UnitSetPropertiesMode mode, sd_bus_error *error);
8e2af478
LP
360
361 /* Called after at least one property got changed to apply the necessary change */
362 int (*bus_commit_properties)(Unit *u);
363
a7f241db
LP
364 /* Return the unit this unit is following */
365 Unit *(*following)(Unit *u);
366
6210e7fc
LP
367 /* Return the set of units that are following each other */
368 int (*following_set)(Unit *u, Set **s);
369
3ecaa09b
LP
370 /* Invoked each time a unit this unit is triggering changes
371 * state or gains/loses a job */
372 void (*trigger_notify)(Unit *u, Unit *trigger);
373
8742514c
LP
374 /* Called whenever CLOCK_REALTIME made a jump */
375 void (*time_change)(Unit *u);
376
68db7a3b
ZJS
377 int (*get_timeout)(Unit *u, uint64_t *timeout);
378
f50e0a01
LP
379 /* This is called for each unit type and should be used to
380 * enumerate existing devices and load them. However,
381 * everything that is loaded here should still stay in
382 * inactive state. It is the job of the coldplug() call above
383 * to put the units into the initial state. */
7824bbeb 384 int (*enumerate)(Manager *m);
f50e0a01
LP
385
386 /* Type specific cleanups. */
7824bbeb 387 void (*shutdown)(Manager *m);
9d58f1db 388
c4e2ceae
LP
389 /* The interface name */
390 const char *bus_interface;
391
718db961
LP
392 /* The bus vtable */
393 const sd_bus_vtable *bus_vtable;
394
718db961 395 /* The strings to print in status messages */
c6918296
MS
396 UnitStatusMessageFormats status_message_formats;
397
9d58f1db
LP
398 /* Can units of this type have multiple names? */
399 bool no_alias:1;
400
9d58f1db
LP
401 /* Instances make no sense for this type */
402 bool no_instances:1;
403
701cc384
LP
404 /* Exclude from automatic gc */
405 bool no_gc:1;
c2756a68
LP
406
407 /* True if transient units of this type are OK */
408 bool can_transient:1;
87f0e418
LP
409};
410
411extern const UnitVTable * const unit_vtable[_UNIT_TYPE_MAX];
412
ac155bb8 413#define UNIT_VTABLE(u) unit_vtable[(u)->type]
87f0e418
LP
414
415/* For casting a unit into the various unit types */
416#define DEFINE_CAST(UPPERCASE, MixedCase) \
417 static inline MixedCase* UPPERCASE(Unit *u) { \
ac155bb8 418 if (_unlikely_(!u || u->type != UNIT_##UPPERCASE)) \
87f0e418
LP
419 return NULL; \
420 \
421 return (MixedCase*) u; \
422 }
423
424/* For casting the various unit types into a unit */
ac155bb8 425#define UNIT(u) (&(u)->meta)
87f0e418 426
3ecaa09b
LP
427#define UNIT_TRIGGER(u) ((Unit*) set_first((u)->dependencies[UNIT_TRIGGERS]))
428
87f0e418 429DEFINE_CAST(SERVICE, Service);
e821075a
LP
430DEFINE_CAST(SOCKET, Socket);
431DEFINE_CAST(BUSNAME, BusName);
87f0e418 432DEFINE_CAST(TARGET, Target);
e821075a 433DEFINE_CAST(SNAPSHOT, Snapshot);
87f0e418
LP
434DEFINE_CAST(DEVICE, Device);
435DEFINE_CAST(MOUNT, Mount);
436DEFINE_CAST(AUTOMOUNT, Automount);
07b0b134 437DEFINE_CAST(SWAP, Swap);
e821075a 438DEFINE_CAST(TIMER, Timer);
01f78473 439DEFINE_CAST(PATH, Path);
a016b922 440DEFINE_CAST(SLICE, Slice);
6c12b52e 441DEFINE_CAST(SCOPE, Scope);
87f0e418 442
7d17cfbc 443Unit *unit_new(Manager *m, size_t size);
87f0e418
LP
444void unit_free(Unit *u);
445
446int unit_add_name(Unit *u, const char *name);
9e2f7c11 447
701cc384 448int unit_add_dependency(Unit *u, UnitDependency d, Unit *other, bool add_reference);
2c966c03
LP
449int unit_add_two_dependencies(Unit *u, UnitDependency d, UnitDependency e, Unit *other, bool add_reference);
450
701cc384 451int unit_add_dependency_by_name(Unit *u, UnitDependency d, const char *name, const char *filename, bool add_reference);
2c966c03
LP
452int unit_add_two_dependencies_by_name(Unit *u, UnitDependency d, UnitDependency e, const char *name, const char *path, bool add_reference);
453
701cc384 454int unit_add_dependency_by_name_inverse(Unit *u, UnitDependency d, const char *name, const char *filename, bool add_reference);
2c966c03 455int unit_add_two_dependencies_by_name_inverse(Unit *u, UnitDependency d, UnitDependency e, const char *name, const char *path, bool add_reference);
0ae97ec1 456
23a177ef
LP
457int unit_add_exec_dependencies(Unit *u, ExecContext *c);
458
0ae97ec1 459int unit_choose_id(Unit *u, const char *name);
f50e0a01 460int unit_set_description(Unit *u, const char *description);
87f0e418 461
701cc384
LP
462bool unit_check_gc(Unit *u);
463
87f0e418 464void unit_add_to_load_queue(Unit *u);
c1e1601e 465void unit_add_to_dbus_queue(Unit *u);
23a177ef 466void unit_add_to_cleanup_queue(Unit *u);
701cc384 467void unit_add_to_gc_queue(Unit *u);
87f0e418
LP
468
469int unit_merge(Unit *u, Unit *other);
23a177ef
LP
470int unit_merge_by_name(Unit *u, const char *other);
471
44a6b1b6 472Unit *unit_follow_merge(Unit *u) _pure_;
87f0e418 473
e537352b
LP
474int unit_load_fragment_and_dropin(Unit *u);
475int unit_load_fragment_and_dropin_optional(Unit *u);
87f0e418
LP
476int unit_load(Unit *unit);
477
598459ce 478int unit_add_default_slice(Unit *u, CGroupContext *c);
a016b922 479
44a6b1b6 480const char *unit_description(Unit *u) _pure_;
87f0e418 481
f278026d
LP
482bool unit_has_name(Unit *u, const char *name);
483
87f0e418
LP
484UnitActiveState unit_active_state(Unit *u);
485
10a94420
LP
486const char* unit_sub_state_to_string(Unit *u);
487
87f0e418
LP
488void unit_dump(Unit *u, FILE *f, const char *prefix);
489
44a6b1b6
ZJS
490bool unit_can_reload(Unit *u) _pure_;
491bool unit_can_start(Unit *u) _pure_;
492bool unit_can_isolate(Unit *u) _pure_;
87f0e418
LP
493
494int unit_start(Unit *u);
495int unit_stop(Unit *u);
496int unit_reload(Unit *u);
497
718db961
LP
498int unit_kill(Unit *u, KillWho w, int signo, sd_bus_error *error);
499int unit_kill_common(Unit *u, KillWho who, int signo, pid_t main_pid, pid_t control_pid, sd_bus_error *error);
8a0867d6 500
e2f3b44c 501void unit_notify(Unit *u, UnitActiveState os, UnitActiveState ns, bool reload_success);
87f0e418 502
87f0e418
LP
503int unit_watch_pid(Unit *u, pid_t pid);
504void unit_unwatch_pid(Unit *u, pid_t pid);
a911bb9a
LP
505int unit_watch_all_pids(Unit *u);
506void unit_unwatch_all_pids(Unit *u);
507
508void unit_tidy_watch_pids(Unit *u, pid_t except1, pid_t except2);
87f0e418 509
05e343b7
LP
510int unit_watch_bus_name(Unit *u, const char *name);
511void unit_unwatch_bus_name(Unit *u, const char *name);
512
87f0e418
LP
513bool unit_job_is_applicable(Unit *u, JobType j);
514
0301abf4
LP
515int set_unit_path(const char *p);
516
50159e6a
LP
517char *unit_dbus_path(Unit *u);
518
f6ff8c29
LP
519int unit_load_related_unit(Unit *u, const char *type, Unit **_found);
520
44a6b1b6 521bool unit_can_serialize(Unit *u) _pure_;
6b78f9b4 522int unit_serialize(Unit *u, FILE *f, FDSet *fds, bool serialize_jobs);
44b601bc 523void unit_serialize_item_format(Unit *u, FILE *f, const char *key, const char *value, ...) _printf_(4,5);
a16e1123
LP
524void unit_serialize_item(Unit *u, FILE *f, const char *key, const char *value);
525int unit_deserialize(Unit *u, FILE *f, FDSet *fds);
526
6e2ef85b
LP
527int unit_add_node_link(Unit *u, const char *what, bool wants);
528
cca098b0
LP
529int unit_coldplug(Unit *u);
530
44b601bc 531void unit_status_printf(Unit *u, const char *status, const char *unit_status_msg_format) _printf_(3, 0);
9e58ff9c 532
45fb0699
LP
533bool unit_need_daemon_reload(Unit *u);
534
fdf20a31 535void unit_reset_failed(Unit *u);
5632e374 536
a7f241db 537Unit *unit_following(Unit *u);
eeaedb7c 538int unit_following_set(Unit *u, Set **s);
a7f241db 539
9444b1f2
LP
540const char *unit_slice_name(Unit *u);
541
44a6b1b6
ZJS
542bool unit_stop_pending(Unit *u) _pure_;
543bool unit_inactive_or_pending(Unit *u) _pure_;
31afa0a4 544bool unit_active_or_pending(Unit *u);
18ffdfda 545
bba34eed
LP
546int unit_add_default_target_dependency(Unit *u, Unit *target);
547
41f9172f
LP
548char *unit_default_cgroup_path(Unit *u);
549
3ecaa09b
LP
550void unit_start_on_failure(Unit *u);
551void unit_trigger_notify(Unit *u);
c0daa706 552
a4375746
LP
553UnitFileState unit_get_unit_file_state(Unit *u);
554
57020a3a
LP
555Unit* unit_ref_set(UnitRef *ref, Unit *u);
556void unit_ref_unset(UnitRef *ref);
557
558#define UNIT_DEREF(ref) ((ref).unit)
9444b1f2 559#define UNIT_ISSET(ref) (!!(ref).unit)
57020a3a 560
598459ce 561int unit_patch_contexts(Unit *u);
e06c73cc 562
44a6b1b6 563ExecContext *unit_get_exec_context(Unit *u) _pure_;
718db961 564KillContext *unit_get_kill_context(Unit *u) _pure_;
4ad49000 565CGroupContext *unit_get_cgroup_context(Unit *u) _pure_;
598459ce 566
613b411c
LP
567ExecRuntime *unit_get_exec_runtime(Unit *u) _pure_;
568
569int unit_setup_exec_runtime(Unit *u);
3ef63c31 570
8e2af478 571int unit_write_drop_in(Unit *u, UnitSetPropertiesMode mode, const char *name, const char *data);
44b601bc 572int unit_write_drop_in_format(Unit *u, UnitSetPropertiesMode mode, const char *name, const char *format, ...) _printf_(4,5);
b9ec9359
LP
573
574int unit_write_drop_in_private(Unit *u, UnitSetPropertiesMode mode, const char *name, const char *data);
44b601bc 575int unit_write_drop_in_private_format(Unit *u, UnitSetPropertiesMode mode, const char *name, const char *format, ...) _printf_(4,5);
b9ec9359 576
8e2af478 577int unit_remove_drop_in(Unit *u, UnitSetPropertiesMode mode, const char *name);
71645aca 578
cd2086fe
LP
579int unit_kill_context(Unit *u, KillContext *c, bool sigkill, pid_t main_pid, pid_t control_pid, bool main_pid_alien);
580
c2756a68
LP
581int unit_make_transient(Unit *u);
582
a57f7e2c
LP
583int unit_require_mounts_for(Unit *u, const char *path);
584
44a6b1b6
ZJS
585const char *unit_active_state_to_string(UnitActiveState i) _const_;
586UnitActiveState unit_active_state_from_string(const char *s) _pure_;
94f04347 587
e8e581bf
ZJS
588/* Macros which append UNIT= or USER_UNIT= to the message */
589
bbc9006e 590#define log_full_unit(level, unit, ...) log_meta_object(level, __FILE__, __LINE__, __func__, getpid() == 1 ? "UNIT=" : "USER_UNIT=", unit, __VA_ARGS__)
fdf9f9bb
ZJS
591#define log_debug_unit(unit, ...) log_full_unit(LOG_DEBUG, unit, __VA_ARGS__)
592#define log_info_unit(unit, ...) log_full_unit(LOG_INFO, unit, __VA_ARGS__)
593#define log_notice_unit(unit, ...) log_full_unit(LOG_NOTICE, unit, __VA_ARGS__)
594#define log_warning_unit(unit, ...) log_full_unit(LOG_WARNING, unit, __VA_ARGS__)
595#define log_error_unit(unit, ...) log_full_unit(LOG_ERR, unit, __VA_ARGS__)
bbc9006e
MT
596
597#define log_struct_unit(level, unit, ...) log_struct(level, getpid() == 1 ? "UNIT=%s" : "USER_UNIT=%s", unit, __VA_ARGS__)