]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/core/unit.h
Add __attribute__((const, pure, format)) in various places
[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"
26d04f86 43#include "cgroup-semantics.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"
8e274523 118#include "cgroup.h"
ab1f0633 119#include "cgroup-attr.h"
ef734fd6 120
ac155bb8 121struct Unit {
87f0e418 122 Manager *manager;
23a177ef 123
87f0e418
LP
124 UnitType type;
125 UnitLoadState load_state;
23a177ef 126 Unit *merged_into;
87f0e418
LP
127
128 char *id; /* One name is special because we use it for identification. Points to an entry in the names set */
9e2f7c11 129 char *instance;
87f0e418
LP
130
131 Set *names;
132 Set *dependencies[_UNIT_DEPENDENCY_MAX];
133
7c8fa05c
LP
134 char **requires_mounts_for;
135
87f0e418 136 char *description;
49dbfa7b 137 char **documentation;
faf919f1 138
6be1e7d5 139 char *fragment_path; /* if loaded from a config file this is the primary path to it */
1b64d026 140 char *source_path; /* if converted, the source file */
ae7a7182 141 char **dropin_paths;
45fb0699 142 usec_t fragment_mtime;
1b64d026 143 usec_t source_mtime;
ae7a7182 144 usec_t dropin_mtime;
87f0e418 145
e0209d83 146 /* If there is something to do with this unit, then this is the installed job for it */
87f0e418
LP
147 Job *job;
148
e0209d83
MS
149 /* JOB_NOP jobs are special and can be installed without disturbing the real job. */
150 Job *nop_job;
151
faf919f1
LP
152 usec_t job_timeout;
153
57020a3a
LP
154 /* References to this */
155 LIST_HEAD(UnitRef, refs);
156
52661efd
LP
157 /* Conditions to check */
158 LIST_HEAD(Condition, conditions);
159
90bbc946
LP
160 dual_timestamp condition_timestamp;
161
63983207
LP
162 dual_timestamp inactive_exit_timestamp;
163 dual_timestamp active_enter_timestamp;
164 dual_timestamp active_exit_timestamp;
165 dual_timestamp inactive_enter_timestamp;
87f0e418 166
8e274523
LP
167 /* Counterparts in the cgroup filesystem */
168 CGroupBonding *cgroup_bondings;
ab1f0633 169 CGroupAttribute *cgroup_attributes;
8e274523 170
ef734fd6 171 /* Per type list */
ac155bb8 172 LIST_FIELDS(Unit, units_by_type);
c1e1601e 173
7c8fa05c
LP
174 /* All units which have requires_mounts_for set */
175 LIST_FIELDS(Unit, has_requires_mounts_for);
176
701cc384 177 /* Load queue */
ac155bb8 178 LIST_FIELDS(Unit, load_queue);
701cc384 179
c1e1601e 180 /* D-Bus queue */
ac155bb8 181 LIST_FIELDS(Unit, dbus_queue);
23a177ef
LP
182
183 /* Cleanup queue */
ac155bb8 184 LIST_FIELDS(Unit, cleanup_queue);
9d58f1db 185
701cc384 186 /* GC queue */
ac155bb8 187 LIST_FIELDS(Unit, gc_queue);
701cc384
LP
188
189 /* Used during GC sweeps */
eced69b3 190 unsigned gc_marker;
701cc384 191
7fab9d01 192 /* When deserializing, temporarily store the job type for this
39a18c60
MS
193 * unit here, if there was a job scheduled.
194 * Only for deserializing from a legacy version. New style uses full
195 * serialized jobs. */
7fab9d01
LP
196 int deserialized_job; /* This is actually of type JobType */
197
8821a00f
LP
198 /* Error code when we didn't manage to load the unit (negative) */
199 int load_error;
200
a4375746
LP
201 /* Cached unit file state */
202 UnitFileState unit_file_state;
203
9d58f1db
LP
204 /* Garbage collect us we nobody wants or requires us anymore */
205 bool stop_when_unneeded;
206
35b8ca3a 207 /* Create default dependencies */
a40eb732
LP
208 bool default_dependencies;
209
b5e9dba8
LP
210 /* Refuse manual starting, allow starting only indirectly via dependency. */
211 bool refuse_manual_start;
212
213 /* Don't allow the user to stop this unit manually, allow stopping only indirectly via dependency. */
214 bool refuse_manual_stop;
215
2528a7a6
LP
216 /* Allow isolation requests */
217 bool allow_isolate;
218
222ae6a8
LP
219 /* Isolate OnFailure unit */
220 bool on_failure_isolate;
221
c8f4d764
LP
222 /* Ignore this unit when isolating */
223 bool ignore_on_isolate;
224
7a6000a6
LP
225 /* Ignore this unit when snapshotting */
226 bool ignore_on_snapshot;
227
49f43d5f 228 /* Did the last condition check succeed? */
90bbc946
LP
229 bool condition_result;
230
9d58f1db
LP
231 bool in_load_queue:1;
232 bool in_dbus_queue:1;
233 bool in_cleanup_queue:1;
701cc384
LP
234 bool in_gc_queue:1;
235
9d58f1db 236 bool sent_dbus_new_signal:1;
6c073082
LP
237
238 bool no_gc:1;
cd6d0a45
LP
239
240 bool in_audit:1;
87f0e418
LP
241};
242
57020a3a
LP
243struct UnitRef {
244 /* Keeps tracks of references to a unit. This is useful so
245 * that we can merge two units if necessary and correct all
246 * references to them */
247
248 Unit* unit;
249 LIST_FIELDS(UnitRef, refs);
250};
251
c6918296
MS
252struct UnitStatusMessageFormats {
253 const char *starting_stopping[2];
254 const char *finished_start_job[_JOB_RESULT_MAX];
255 const char *finished_stop_job[_JOB_RESULT_MAX];
256};
257
87f0e418
LP
258#include "service.h"
259#include "timer.h"
260#include "socket.h"
261#include "target.h"
262#include "device.h"
263#include "mount.h"
264#include "automount.h"
265#include "snapshot.h"
07b0b134 266#include "swap.h"
01f78473 267#include "path.h"
87f0e418 268
87f0e418 269struct UnitVTable {
7d17cfbc
MS
270 /* How much memory does an object of this unit type need */
271 size_t object_size;
272
3ef63c31
LP
273 /* If greater than 0, the offset into the object where
274 * ExecContext is found, if the unit type has that */
275 size_t exec_context_offset;
276
71645aca
LP
277 /* The name of the section with the exec settings of ExecContext */
278 const char *exec_section;
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
c74f17d9 309 int (*kill)(Unit *u, KillWho w, int signo, DBusError *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
acbb0225 341 void (*fd_event)(Unit *u, int fd, uint32_t events, Watch *w);
87f0e418 342 void (*sigchld_event)(Unit *u, pid_t pid, int code, int status);
acbb0225 343 void (*timer_event)(Unit *u, uint64_t n_elapsed, Watch *w);
7824bbeb 344
fdf20a31
MM
345 /* Reset failed state if we are in failed state */
346 void (*reset_failed)(Unit *u);
5632e374 347
05e343b7
LP
348 /* Called whenever any of the cgroups this unit watches for
349 * ran empty */
8e274523
LP
350 void (*cgroup_notify_empty)(Unit *u);
351
8c47c732 352 /* Called whenever a process of this unit sends us a message */
c952c6ec 353 void (*notify_message)(Unit *u, pid_t pid, char **tags);
8c47c732 354
3ecaa09b 355 /* Called whenever a name this Unit registered for comes or
05e343b7
LP
356 * goes away. */
357 void (*bus_name_owner_change)(Unit *u, const char *name, const char *old_owner, const char *new_owner);
358
359 /* Called whenever a bus PID lookup finishes */
360 void (*bus_query_pid_done)(Unit *u, const char *name, pid_t pid);
361
4139c1b2 362 /* Called for each message received on the bus */
5e8d1c9a 363 DBusHandlerResult (*bus_message_handler)(Unit *u, DBusConnection *c, DBusMessage *message);
4139c1b2 364
a7f241db
LP
365 /* Return the unit this unit is following */
366 Unit *(*following)(Unit *u);
367
6210e7fc
LP
368 /* Return the set of units that are following each other */
369 int (*following_set)(Unit *u, Set **s);
370
3ecaa09b
LP
371 /* Invoked each time a unit this unit is triggering changes
372 * state or gains/loses a job */
373 void (*trigger_notify)(Unit *u, Unit *trigger);
374
8742514c
LP
375 /* Called whenever CLOCK_REALTIME made a jump */
376 void (*time_change)(Unit *u);
377
f50e0a01
LP
378 /* This is called for each unit type and should be used to
379 * enumerate existing devices and load them. However,
380 * everything that is loaded here should still stay in
381 * inactive state. It is the job of the coldplug() call above
382 * to put the units into the initial state. */
7824bbeb 383 int (*enumerate)(Manager *m);
f50e0a01
LP
384
385 /* Type specific cleanups. */
7824bbeb 386 void (*shutdown)(Manager *m);
9d58f1db 387
c4e2ceae 388 /* When sending out PropertiesChanged signal, which properties
96d4ce01 389 * shall be invalidated? This is a NUL separated list of
c4e2ceae
LP
390 * strings, to minimize relocations a little. */
391 const char *bus_invalidating_properties;
392
393 /* The interface name */
394 const char *bus_interface;
395
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;
87f0e418
LP
406};
407
408extern const UnitVTable * const unit_vtable[_UNIT_TYPE_MAX];
409
ac155bb8 410#define UNIT_VTABLE(u) unit_vtable[(u)->type]
87f0e418
LP
411
412/* For casting a unit into the various unit types */
413#define DEFINE_CAST(UPPERCASE, MixedCase) \
414 static inline MixedCase* UPPERCASE(Unit *u) { \
ac155bb8 415 if (_unlikely_(!u || u->type != UNIT_##UPPERCASE)) \
87f0e418
LP
416 return NULL; \
417 \
418 return (MixedCase*) u; \
419 }
420
421/* For casting the various unit types into a unit */
ac155bb8 422#define UNIT(u) (&(u)->meta)
87f0e418 423
3ecaa09b
LP
424#define UNIT_TRIGGER(u) ((Unit*) set_first((u)->dependencies[UNIT_TRIGGERS]))
425
87f0e418
LP
426DEFINE_CAST(SOCKET, Socket);
427DEFINE_CAST(TIMER, Timer);
428DEFINE_CAST(SERVICE, Service);
429DEFINE_CAST(TARGET, Target);
430DEFINE_CAST(DEVICE, Device);
431DEFINE_CAST(MOUNT, Mount);
432DEFINE_CAST(AUTOMOUNT, Automount);
433DEFINE_CAST(SNAPSHOT, Snapshot);
07b0b134 434DEFINE_CAST(SWAP, Swap);
01f78473 435DEFINE_CAST(PATH, Path);
87f0e418 436
7d17cfbc 437Unit *unit_new(Manager *m, size_t size);
87f0e418
LP
438void unit_free(Unit *u);
439
440int unit_add_name(Unit *u, const char *name);
9e2f7c11 441
701cc384 442int unit_add_dependency(Unit *u, UnitDependency d, Unit *other, bool add_reference);
2c966c03
LP
443int unit_add_two_dependencies(Unit *u, UnitDependency d, UnitDependency e, Unit *other, bool add_reference);
444
701cc384 445int unit_add_dependency_by_name(Unit *u, UnitDependency d, const char *name, const char *filename, bool add_reference);
2c966c03
LP
446int unit_add_two_dependencies_by_name(Unit *u, UnitDependency d, UnitDependency e, const char *name, const char *path, bool add_reference);
447
701cc384 448int unit_add_dependency_by_name_inverse(Unit *u, UnitDependency d, const char *name, const char *filename, bool add_reference);
2c966c03 449int unit_add_two_dependencies_by_name_inverse(Unit *u, UnitDependency d, UnitDependency e, const char *name, const char *path, bool add_reference);
0ae97ec1 450
23a177ef
LP
451int unit_add_exec_dependencies(Unit *u, ExecContext *c);
452
246aa6dd 453int unit_add_cgroup_from_text(Unit *u, const char *name, bool overwrite, CGroupBonding **ret);
d686d8a9 454int unit_add_default_cgroups(Unit *u);
8e274523 455CGroupBonding* unit_get_default_cgroup(Unit *u);
26d04f86 456int unit_add_cgroup_attribute(Unit *u, const CGroupSemantics *semantics, const char *controller, const char *name, const char *value, CGroupAttribute **ret);
8e274523 457
0ae97ec1 458int unit_choose_id(Unit *u, const char *name);
f50e0a01 459int unit_set_description(Unit *u, const char *description);
87f0e418 460
701cc384
LP
461bool unit_check_gc(Unit *u);
462
87f0e418 463void unit_add_to_load_queue(Unit *u);
c1e1601e 464void unit_add_to_dbus_queue(Unit *u);
23a177ef 465void unit_add_to_cleanup_queue(Unit *u);
701cc384 466void unit_add_to_gc_queue(Unit *u);
87f0e418
LP
467
468int unit_merge(Unit *u, Unit *other);
23a177ef
LP
469int unit_merge_by_name(Unit *u, const char *other);
470
44a6b1b6 471Unit *unit_follow_merge(Unit *u) _pure_;
87f0e418 472
e537352b
LP
473int unit_load_fragment_and_dropin(Unit *u);
474int unit_load_fragment_and_dropin_optional(Unit *u);
87f0e418
LP
475int unit_load(Unit *unit);
476
44a6b1b6 477const char *unit_description(Unit *u) _pure_;
87f0e418 478
f278026d
LP
479bool unit_has_name(Unit *u, const char *name);
480
87f0e418
LP
481UnitActiveState unit_active_state(Unit *u);
482
10a94420
LP
483const char* unit_sub_state_to_string(Unit *u);
484
87f0e418
LP
485void unit_dump(Unit *u, FILE *f, const char *prefix);
486
44a6b1b6
ZJS
487bool unit_can_reload(Unit *u) _pure_;
488bool unit_can_start(Unit *u) _pure_;
489bool unit_can_isolate(Unit *u) _pure_;
87f0e418
LP
490
491int unit_start(Unit *u);
492int unit_stop(Unit *u);
493int unit_reload(Unit *u);
494
c74f17d9 495int unit_kill(Unit *u, KillWho w, int signo, DBusError *error);
814cc562 496int unit_kill_common(Unit *u, KillWho who, int signo, pid_t main_pid, pid_t control_pid, DBusError *error);
8a0867d6 497
e2f3b44c 498void unit_notify(Unit *u, UnitActiveState os, UnitActiveState ns, bool reload_success);
87f0e418 499
acbb0225
LP
500int unit_watch_fd(Unit *u, int fd, uint32_t events, Watch *w);
501void unit_unwatch_fd(Unit *u, Watch *w);
87f0e418
LP
502
503int unit_watch_pid(Unit *u, pid_t pid);
504void unit_unwatch_pid(Unit *u, pid_t pid);
505
36697dc0 506int unit_watch_timer(Unit *u, clockid_t, bool relative, usec_t usec, Watch *w);
acbb0225 507void unit_unwatch_timer(Unit *u, Watch *w);
87f0e418 508
05e343b7
LP
509int unit_watch_bus_name(Unit *u, const char *name);
510void unit_unwatch_bus_name(Unit *u, const char *name);
511
87f0e418
LP
512bool unit_job_is_applicable(Unit *u, JobType j);
513
0301abf4
LP
514int set_unit_path(const char *p);
515
50159e6a
LP
516char *unit_dbus_path(Unit *u);
517
f6ff8c29 518int unit_load_related_unit(Unit *u, const char *type, Unit **_found);
a16e1123 519int unit_get_related_unit(Unit *u, const char *type, Unit **_found);
f6ff8c29 520
44a6b1b6 521bool unit_can_serialize(Unit *u) _pure_;
6b78f9b4 522int unit_serialize(Unit *u, FILE *f, FDSet *fds, bool serialize_jobs);
93a46b0b 523void unit_serialize_item_format(Unit *u, FILE *f, const char *key, const char *value, ...) _printf_attr_(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
b1e2b33c 531void unit_status_printf(Unit *u, const char *status, const char *unit_status_msg_format) _printf_attr_(3, 0);
9e58ff9c 532
45fb0699
LP
533bool unit_need_daemon_reload(Unit *u);
534
fdf20a31 535void unit_reset_failed(Unit *u);
5632e374 536
a7f241db
LP
537Unit *unit_following(Unit *u);
538
44a6b1b6
ZJS
539bool unit_stop_pending(Unit *u) _pure_;
540bool unit_inactive_or_pending(Unit *u) _pure_;
31afa0a4 541bool unit_active_or_pending(Unit *u);
18ffdfda 542
bba34eed
LP
543int unit_add_default_target_dependency(Unit *u, Unit *target);
544
41f9172f
LP
545char *unit_default_cgroup_path(Unit *u);
546
6210e7fc
LP
547int unit_following_set(Unit *u, Set **s);
548
3ecaa09b
LP
549void unit_start_on_failure(Unit *u);
550void unit_trigger_notify(Unit *u);
c0daa706 551
90bbc946
LP
552bool unit_condition_test(Unit *u);
553
a4375746
LP
554UnitFileState unit_get_unit_file_state(Unit *u);
555
57020a3a
LP
556Unit* unit_ref_set(UnitRef *ref, Unit *u);
557void unit_ref_unset(UnitRef *ref);
558
559#define UNIT_DEREF(ref) ((ref).unit)
560
7c8fa05c
LP
561int unit_add_one_mount_link(Unit *u, Mount *m);
562int unit_add_mount_links(Unit *u);
563
cba6e062 564int unit_exec_context_defaults(Unit *u, ExecContext *c);
e06c73cc 565
44a6b1b6 566ExecContext *unit_get_exec_context(Unit *u) _pure_;
3ef63c31 567
71645aca
LP
568int unit_write_drop_in(Unit *u, bool runtime, const char *name, const char *data);
569int unit_remove_drop_in(Unit *u, bool runtime, const char *name);
570
cd2086fe
LP
571int unit_kill_context(Unit *u, KillContext *c, bool sigkill, pid_t main_pid, pid_t control_pid, bool main_pid_alien);
572
44a6b1b6
ZJS
573const char *unit_active_state_to_string(UnitActiveState i) _const_;
574UnitActiveState unit_active_state_from_string(const char *s) _pure_;
94f04347 575
44a6b1b6
ZJS
576const char *unit_dependency_to_string(UnitDependency i) _const_;
577UnitDependency unit_dependency_from_string(const char *s) _pure_;
fdf9f9bb 578
e8e581bf
ZJS
579/* Macros which append UNIT= or USER_UNIT= to the message */
580
bbc9006e 581#define log_full_unit(level, unit, ...) log_meta_object(level, __FILE__, __LINE__, __func__, getpid() == 1 ? "UNIT=" : "USER_UNIT=", unit, __VA_ARGS__)
fdf9f9bb
ZJS
582#define log_debug_unit(unit, ...) log_full_unit(LOG_DEBUG, unit, __VA_ARGS__)
583#define log_info_unit(unit, ...) log_full_unit(LOG_INFO, unit, __VA_ARGS__)
584#define log_notice_unit(unit, ...) log_full_unit(LOG_NOTICE, unit, __VA_ARGS__)
585#define log_warning_unit(unit, ...) log_full_unit(LOG_WARNING, unit, __VA_ARGS__)
586#define log_error_unit(unit, ...) log_full_unit(LOG_ERR, unit, __VA_ARGS__)
bbc9006e
MT
587
588#define log_struct_unit(level, unit, ...) log_struct(level, getpid() == 1 ? "UNIT=%s" : "USER_UNIT=%s", unit, __VA_ARGS__)