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