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