]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/core/unit.h
core: generate nice error messages for auxiliary transient units, too
[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;
57020a3a 30typedef struct UnitRef UnitRef;
c6918296 31typedef struct UnitStatusMessageFormats UnitStatusMessageFormats;
87f0e418 32
87f0e418 33#include "list.h"
134e56dc 34#include "condition.h"
a4375746 35#include "install.h"
0a9f8ed0 36#include "unit-name.h"
f189ab18 37#include "failure-action.h"
87f0e418 38
db2cb23b
UTL
39typedef enum KillOperation {
40 KILL_TERMINATE,
41 KILL_KILL,
42 KILL_ABORT,
4940c0b0
LP
43 _KILL_OPERATION_MAX,
44 _KILL_OPERATION_INVALID = -1
db2cb23b
UTL
45} KillOperation;
46
87f0e418 47static inline bool UNIT_IS_ACTIVE_OR_RELOADING(UnitActiveState t) {
032ff4af 48 return t == UNIT_ACTIVE || t == UNIT_RELOADING;
87f0e418
LP
49}
50
51static inline bool UNIT_IS_ACTIVE_OR_ACTIVATING(UnitActiveState t) {
032ff4af 52 return t == UNIT_ACTIVE || t == UNIT_ACTIVATING || t == UNIT_RELOADING;
87f0e418
LP
53}
54
55static inline bool UNIT_IS_INACTIVE_OR_DEACTIVATING(UnitActiveState t) {
fdf20a31 56 return t == UNIT_INACTIVE || t == UNIT_FAILED || t == UNIT_DEACTIVATING;
6124958c
LP
57}
58
fdf20a31
MM
59static inline bool UNIT_IS_INACTIVE_OR_FAILED(UnitActiveState t) {
60 return t == UNIT_INACTIVE || t == UNIT_FAILED;
87f0e418
LP
61}
62
ef734fd6
LP
63#include "job.h"
64
a016b922
LP
65struct UnitRef {
66 /* Keeps tracks of references to a unit. This is useful so
67 * that we can merge two units if necessary and correct all
68 * references to them */
69
70 Unit* unit;
71 LIST_FIELDS(UnitRef, refs);
72};
73
ac155bb8 74struct Unit {
87f0e418 75 Manager *manager;
23a177ef 76
87f0e418
LP
77 UnitType type;
78 UnitLoadState load_state;
23a177ef 79 Unit *merged_into;
87f0e418
LP
80
81 char *id; /* One name is special because we use it for identification. Points to an entry in the names set */
9e2f7c11 82 char *instance;
87f0e418
LP
83
84 Set *names;
85 Set *dependencies[_UNIT_DEPENDENCY_MAX];
86
7c8fa05c
LP
87 char **requires_mounts_for;
88
87f0e418 89 char *description;
49dbfa7b 90 char **documentation;
faf919f1 91
6be1e7d5 92 char *fragment_path; /* if loaded from a config file this is the primary path to it */
1b64d026 93 char *source_path; /* if converted, the source file */
ae7a7182 94 char **dropin_paths;
f78f265f 95
45fb0699 96 usec_t fragment_mtime;
1b64d026 97 usec_t source_mtime;
ae7a7182 98 usec_t dropin_mtime;
87f0e418 99
e0209d83 100 /* If there is something to do with this unit, then this is the installed job for it */
87f0e418
LP
101 Job *job;
102
e0209d83
MS
103 /* JOB_NOP jobs are special and can be installed without disturbing the real job. */
104 Job *nop_job;
105
bbc29086
DM
106 /* The slot used for watching NameOwnerChanged signals */
107 sd_bus_slot *match_bus_slot;
108
f189ab18 109 /* Job timeout and action to take */
faf919f1 110 usec_t job_timeout;
f189ab18
LP
111 FailureAction job_timeout_action;
112 char *job_timeout_reboot_arg;
faf919f1 113
57020a3a
LP
114 /* References to this */
115 LIST_HEAD(UnitRef, refs);
116
52661efd
LP
117 /* Conditions to check */
118 LIST_HEAD(Condition, conditions);
59fccdc5 119 LIST_HEAD(Condition, asserts);
52661efd 120
90bbc946 121 dual_timestamp condition_timestamp;
59fccdc5 122 dual_timestamp assert_timestamp;
90bbc946 123
63983207
LP
124 dual_timestamp inactive_exit_timestamp;
125 dual_timestamp active_enter_timestamp;
126 dual_timestamp active_exit_timestamp;
127 dual_timestamp inactive_enter_timestamp;
87f0e418 128
a016b922
LP
129 UnitRef slice;
130
ef734fd6 131 /* Per type list */
ac155bb8 132 LIST_FIELDS(Unit, units_by_type);
c1e1601e 133
7c8fa05c
LP
134 /* All units which have requires_mounts_for set */
135 LIST_FIELDS(Unit, has_requires_mounts_for);
136
701cc384 137 /* Load queue */
ac155bb8 138 LIST_FIELDS(Unit, load_queue);
701cc384 139
c1e1601e 140 /* D-Bus queue */
ac155bb8 141 LIST_FIELDS(Unit, dbus_queue);
23a177ef
LP
142
143 /* Cleanup queue */
ac155bb8 144 LIST_FIELDS(Unit, cleanup_queue);
9d58f1db 145
701cc384 146 /* GC queue */
ac155bb8 147 LIST_FIELDS(Unit, gc_queue);
701cc384 148
4ad49000
LP
149 /* CGroup realize members queue */
150 LIST_FIELDS(Unit, cgroup_queue);
151
32ee7d33
DM
152 /* Units with the same CGroup netclass */
153 LIST_FIELDS(Unit, cgroup_netclass);
154
a911bb9a
LP
155 /* PIDs we keep an eye on. Note that a unit might have many
156 * more, but these are the ones we care enough about to
157 * process SIGCHLD for */
158 Set *pids;
159
701cc384 160 /* Used during GC sweeps */
eced69b3 161 unsigned gc_marker;
701cc384 162
8821a00f
LP
163 /* Error code when we didn't manage to load the unit (negative) */
164 int load_error;
165
67bfdc97
LP
166 /* Make sure we never enter endless loops with the check unneeded logic, or the BindsTo= logic */
167 RateLimit auto_stop_ratelimit;
bea355da 168
d2dc52db 169 /* Cached unit file state and preset */
a4375746 170 UnitFileState unit_file_state;
d2dc52db 171 int unit_file_preset;
a4375746 172
5ad096b3
LP
173 /* Where the cpuacct.usage cgroup counter was at the time the unit was started */
174 nsec_t cpuacct_usage_base;
175
7c52a17b
ZJS
176 /* Counterparts in the cgroup filesystem */
177 char *cgroup_path;
efdb0237
LP
178 CGroupMask cgroup_realized_mask;
179 CGroupMask cgroup_subtree_mask;
180 CGroupMask cgroup_members_mask;
181 int cgroup_inotify_wd;
7c52a17b 182
32ee7d33
DM
183 uint32_t cgroup_netclass_id;
184
7c52a17b
ZJS
185 /* How to start OnFailure units */
186 JobMode on_failure_job_mode;
187
9d58f1db
LP
188 /* Garbage collect us we nobody wants or requires us anymore */
189 bool stop_when_unneeded;
190
35b8ca3a 191 /* Create default dependencies */
a40eb732
LP
192 bool default_dependencies;
193
b5e9dba8
LP
194 /* Refuse manual starting, allow starting only indirectly via dependency. */
195 bool refuse_manual_start;
196
197 /* Don't allow the user to stop this unit manually, allow stopping only indirectly via dependency. */
198 bool refuse_manual_stop;
199
2528a7a6
LP
200 /* Allow isolation requests */
201 bool allow_isolate;
202
c8f4d764
LP
203 /* Ignore this unit when isolating */
204 bool ignore_on_isolate;
205
49f43d5f 206 /* Did the last condition check succeed? */
90bbc946 207 bool condition_result;
59fccdc5 208 bool assert_result;
90bbc946 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;
f78f265f
LP
228
229 /* Did we already invoke unit_coldplug() for this unit? */
f8a30ce5 230 bool coldplugged:1;
87f0e418
LP
231};
232
c6918296
MS
233struct UnitStatusMessageFormats {
234 const char *starting_stopping[2];
235 const char *finished_start_job[_JOB_RESULT_MAX];
236 const char *finished_stop_job[_JOB_RESULT_MAX];
237};
238
8e2af478
LP
239typedef enum UnitSetPropertiesMode {
240 UNIT_CHECK = 0,
241 UNIT_RUNTIME = 1,
242 UNIT_PERSISTENT = 2,
243} UnitSetPropertiesMode;
244
87f0e418 245#include "socket.h"
e821075a 246#include "busname.h"
87f0e418
LP
247#include "target.h"
248#include "device.h"
87f0e418 249#include "automount.h"
07b0b134 250#include "swap.h"
e821075a 251#include "timer.h"
a016b922 252#include "slice.h"
c1ff5570 253#include "path.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
ee33e53a 277 /* The name of the configuration file section with the private settings of this unit */
4ad49000 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
be847e82
LP
300 * where to actually set the state and call unit_notify(). */
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 320 /* Try to match up fds with what we need for this unit */
9ff1a6f1 321 void (*distribute_fds)(Unit *u, FDSet *fds);
01e10de3 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
a354329f
LP
338 /* When the unit is not running and no job for it queued we
339 * shall release its runtime resources */
340 void (*release_resources)(Unit *u);
341
718db961 342 /* Invoked on every child that died */
87f0e418 343 void (*sigchld_event)(Unit *u, pid_t pid, int code, int status);
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 */
4ad49000 350 void (*notify_cgroup_empty)(Unit *u);
8e274523 351
8c47c732 352 /* Called whenever a process of this unit sends us a message */
a354329f 353 void (*notify_message)(Unit *u, pid_t pid, char **tags, FDSet *fds);
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
8e2af478 359 /* Called for each property that is being set */
718db961 360 int (*bus_set_property)(Unit *u, const char *name, sd_bus_message *message, UnitSetPropertiesMode mode, sd_bus_error *error);
8e2af478
LP
361
362 /* Called after at least one property got changed to apply the necessary change */
363 int (*bus_commit_properties)(Unit *u);
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
68db7a3b
ZJS
378 int (*get_timeout)(Unit *u, uint64_t *timeout);
379
f50e0a01
LP
380 /* This is called for each unit type and should be used to
381 * enumerate existing devices and load them. However,
382 * everything that is loaded here should still stay in
383 * inactive state. It is the job of the coldplug() call above
384 * to put the units into the initial state. */
ba64af90 385 void (*enumerate)(Manager *m);
f50e0a01
LP
386
387 /* Type specific cleanups. */
7824bbeb 388 void (*shutdown)(Manager *m);
9d58f1db 389
0faacd47
LP
390 /* If this function is set and return false all jobs for units
391 * of this type will immediately fail. */
1c2e9646 392 bool (*supported)(void);
0faacd47 393
718db961
LP
394 /* The bus vtable */
395 const sd_bus_vtable *bus_vtable;
396
718db961 397 /* The strings to print in status messages */
c6918296
MS
398 UnitStatusMessageFormats status_message_formats;
399
9d58f1db
LP
400 /* Can units of this type have multiple names? */
401 bool no_alias:1;
402
9d58f1db
LP
403 /* Instances make no sense for this type */
404 bool no_instances:1;
405
c2756a68
LP
406 /* True if transient units of this type are OK */
407 bool can_transient:1;
87f0e418
LP
408};
409
410extern const UnitVTable * const unit_vtable[_UNIT_TYPE_MAX];
411
ac155bb8 412#define UNIT_VTABLE(u) unit_vtable[(u)->type]
87f0e418
LP
413
414/* For casting a unit into the various unit types */
415#define DEFINE_CAST(UPPERCASE, MixedCase) \
416 static inline MixedCase* UPPERCASE(Unit *u) { \
ac155bb8 417 if (_unlikely_(!u || u->type != UNIT_##UPPERCASE)) \
87f0e418
LP
418 return NULL; \
419 \
420 return (MixedCase*) u; \
421 }
422
423/* For casting the various unit types into a unit */
ac155bb8 424#define UNIT(u) (&(u)->meta)
87f0e418 425
35b7ff80
LP
426#define UNIT_HAS_EXEC_CONTEXT(u) (UNIT_VTABLE(u)->exec_context_offset > 0)
427#define UNIT_HAS_CGROUP_CONTEXT(u) (UNIT_VTABLE(u)->cgroup_context_offset > 0)
428#define UNIT_HAS_KILL_CONTEXT(u) (UNIT_VTABLE(u)->kill_context_offset > 0)
429
3ecaa09b
LP
430#define UNIT_TRIGGER(u) ((Unit*) set_first((u)->dependencies[UNIT_TRIGGERS]))
431
87f0e418 432DEFINE_CAST(SERVICE, Service);
e821075a
LP
433DEFINE_CAST(SOCKET, Socket);
434DEFINE_CAST(BUSNAME, BusName);
87f0e418
LP
435DEFINE_CAST(TARGET, Target);
436DEFINE_CAST(DEVICE, Device);
437DEFINE_CAST(MOUNT, Mount);
438DEFINE_CAST(AUTOMOUNT, Automount);
07b0b134 439DEFINE_CAST(SWAP, Swap);
e821075a 440DEFINE_CAST(TIMER, Timer);
01f78473 441DEFINE_CAST(PATH, Path);
a016b922 442DEFINE_CAST(SLICE, Slice);
6c12b52e 443DEFINE_CAST(SCOPE, Scope);
87f0e418 444
7d17cfbc 445Unit *unit_new(Manager *m, size_t size);
87f0e418
LP
446void unit_free(Unit *u);
447
448int unit_add_name(Unit *u, const char *name);
9e2f7c11 449
701cc384 450int unit_add_dependency(Unit *u, UnitDependency d, Unit *other, bool add_reference);
2c966c03
LP
451int unit_add_two_dependencies(Unit *u, UnitDependency d, UnitDependency e, Unit *other, bool add_reference);
452
701cc384 453int unit_add_dependency_by_name(Unit *u, UnitDependency d, const char *name, const char *filename, bool add_reference);
2c966c03
LP
454int unit_add_two_dependencies_by_name(Unit *u, UnitDependency d, UnitDependency e, const char *name, const char *path, bool add_reference);
455
23a177ef
LP
456int unit_add_exec_dependencies(Unit *u, ExecContext *c);
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
d79200e2
LP
477int unit_set_slice(Unit *u, Unit *slice);
478int unit_set_default_slice(Unit *u);
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
505void unit_unwatch_all_pids(Unit *u);
506
507void unit_tidy_watch_pids(Unit *u, pid_t except1, pid_t except2);
87f0e418 508
9806e87d 509int unit_install_bus_match(Unit *u, sd_bus *bus, const char *name);
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_;
a34ceba6 522
6b78f9b4 523int unit_serialize(Unit *u, FILE *f, FDSet *fds, bool serialize_jobs);
a16e1123
LP
524int unit_deserialize(Unit *u, FILE *f, FDSet *fds);
525
a34ceba6
LP
526int unit_serialize_item(Unit *u, FILE *f, const char *key, const char *value);
527int unit_serialize_item_escaped(Unit *u, FILE *f, const char *key, const char *value);
528int unit_serialize_item_fd(Unit *u, FILE *f, FDSet *fds, const char *key, int fd);
529void unit_serialize_item_format(Unit *u, FILE *f, const char *key, const char *value, ...) _printf_(4,5);
530
6e2ef85b
LP
531int unit_add_node_link(Unit *u, const char *what, bool wants);
532
be847e82 533int unit_coldplug(Unit *u);
cca098b0 534
44b601bc 535void unit_status_printf(Unit *u, const char *status, const char *unit_status_msg_format) _printf_(3, 0);
d1a34ae9 536void unit_status_emit_starting_stopping_reloading(Unit *u, JobType t);
9e58ff9c 537
45fb0699
LP
538bool unit_need_daemon_reload(Unit *u);
539
fdf20a31 540void unit_reset_failed(Unit *u);
5632e374 541
a7f241db 542Unit *unit_following(Unit *u);
eeaedb7c 543int unit_following_set(Unit *u, Set **s);
a7f241db 544
9444b1f2
LP
545const char *unit_slice_name(Unit *u);
546
44a6b1b6
ZJS
547bool unit_stop_pending(Unit *u) _pure_;
548bool unit_inactive_or_pending(Unit *u) _pure_;
31afa0a4 549bool unit_active_or_pending(Unit *u);
18ffdfda 550
bba34eed
LP
551int unit_add_default_target_dependency(Unit *u, Unit *target);
552
3ecaa09b
LP
553void unit_start_on_failure(Unit *u);
554void unit_trigger_notify(Unit *u);
c0daa706 555
a4375746 556UnitFileState unit_get_unit_file_state(Unit *u);
d2dc52db 557int unit_get_unit_file_preset(Unit *u);
a4375746 558
57020a3a
LP
559Unit* unit_ref_set(UnitRef *ref, Unit *u);
560void unit_ref_unset(UnitRef *ref);
561
562#define UNIT_DEREF(ref) ((ref).unit)
9444b1f2 563#define UNIT_ISSET(ref) (!!(ref).unit)
57020a3a 564
598459ce 565int unit_patch_contexts(Unit *u);
e06c73cc 566
44a6b1b6 567ExecContext *unit_get_exec_context(Unit *u) _pure_;
718db961 568KillContext *unit_get_kill_context(Unit *u) _pure_;
4ad49000 569CGroupContext *unit_get_cgroup_context(Unit *u) _pure_;
598459ce 570
613b411c
LP
571ExecRuntime *unit_get_exec_runtime(Unit *u) _pure_;
572
573int unit_setup_exec_runtime(Unit *u);
3ef63c31 574
8e2af478 575int unit_write_drop_in(Unit *u, UnitSetPropertiesMode mode, const char *name, const char *data);
44b601bc 576int unit_write_drop_in_format(Unit *u, UnitSetPropertiesMode mode, const char *name, const char *format, ...) _printf_(4,5);
b9ec9359
LP
577
578int unit_write_drop_in_private(Unit *u, UnitSetPropertiesMode mode, const char *name, const char *data);
44b601bc 579int unit_write_drop_in_private_format(Unit *u, UnitSetPropertiesMode mode, const char *name, const char *format, ...) _printf_(4,5);
b9ec9359 580
db2cb23b 581int unit_kill_context(Unit *u, KillContext *c, KillOperation k, pid_t main_pid, pid_t control_pid, bool main_pid_alien);
cd2086fe 582
c2756a68
LP
583int unit_make_transient(Unit *u);
584
a57f7e2c
LP
585int unit_require_mounts_for(Unit *u, const char *path);
586
1c2e9646
LP
587bool unit_type_supported(UnitType t);
588
589static inline bool unit_supported(Unit *u) {
590 return unit_type_supported(u->type);
591}
592
8b4305c7
LP
593void unit_warn_if_dir_nonempty(Unit *u, const char* where);
594int unit_fail_if_symlink(Unit *u, const char* where);
595
e8e581bf
ZJS
596/* Macros which append UNIT= or USER_UNIT= to the message */
597
f2341e0a
LP
598#define log_unit_full(unit, level, error, ...) \
599 ({ \
600 Unit *_u = (unit); \
601 _u ? log_object_internal(level, error, __FILE__, __LINE__, __func__, _u->manager->unit_log_field, _u->id, ##__VA_ARGS__) : \
602 log_internal(level, error, __FILE__, __LINE__, __func__, ##__VA_ARGS__); \
603 })
604
605#define log_unit_debug(unit, ...) log_unit_full(unit, LOG_DEBUG, 0, ##__VA_ARGS__)
606#define log_unit_info(unit, ...) log_unit_full(unit, LOG_INFO, 0, ##__VA_ARGS__)
607#define log_unit_notice(unit, ...) log_unit_full(unit, LOG_NOTICE, 0, ##__VA_ARGS__)
608#define log_unit_warning(unit, ...) log_unit_full(unit, LOG_WARNING, 0, ##__VA_ARGS__)
609#define log_unit_error(unit, ...) log_unit_full(unit, LOG_ERR, 0, ##__VA_ARGS__)
610
611#define log_unit_debug_errno(unit, error, ...) log_unit_full(unit, LOG_DEBUG, error, ##__VA_ARGS__)
612#define log_unit_info_errno(unit, error, ...) log_unit_full(unit, LOG_INFO, error, ##__VA_ARGS__)
613#define log_unit_notice_errno(unit, error, ...) log_unit_full(unit, LOG_NOTICE, error, ##__VA_ARGS__)
614#define log_unit_warning_errno(unit, error, ...) log_unit_full(unit, LOG_WARNING, error, ##__VA_ARGS__)
615#define log_unit_error_errno(unit, error, ...) log_unit_full(unit, LOG_ERR, error, ##__VA_ARGS__)
616
617#define LOG_UNIT_MESSAGE(unit, fmt, ...) "MESSAGE=%s: " fmt, (unit)->id, ##__VA_ARGS__
618#define LOG_UNIT_ID(unit) (unit)->manager->unit_log_format_string, (unit)->id