]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/core/unit.h
core: serialize/deserialize IP accounting across daemon reload/reexec
[thirdparty/systemd.git] / src / core / unit.h
CommitLineData
c2f1db8f 1#pragma once
87f0e418 2
a7334b09
LP
3/***
4 This file is part of systemd.
5
6 Copyright 2010 Lennart Poettering
7
8 systemd is free software; you can redistribute it and/or modify it
5430f7f2
LP
9 under the terms of the GNU Lesser General Public License as published by
10 the Free Software Foundation; either version 2.1 of the License, or
a7334b09
LP
11 (at your option) any later version.
12
13 systemd is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
5430f7f2 16 Lesser General Public License for more details.
a7334b09 17
5430f7f2 18 You should have received a copy of the GNU Lesser General Public License
a7334b09
LP
19 along with systemd; If not, see <http://www.gnu.org/licenses/>.
20***/
21
87f0e418
LP
22#include <stdbool.h>
23#include <stdlib.h>
bbc9006e 24#include <unistd.h>
87f0e418 25
ac155bb8 26typedef struct Unit Unit;
87f0e418 27typedef struct UnitVTable UnitVTable;
57020a3a 28typedef struct UnitRef UnitRef;
c6918296 29typedef struct UnitStatusMessageFormats UnitStatusMessageFormats;
87f0e418 30
6a48d82f 31#include "bpf-program.h"
134e56dc 32#include "condition.h"
87a47f99 33#include "emergency-action.h"
a4375746 34#include "install.h"
71d35b6b 35#include "list.h"
0a9f8ed0 36#include "unit-name.h"
6b659ed8 37#include "cgroup.h"
87f0e418 38
db2cb23b
UTL
39typedef enum KillOperation {
40 KILL_TERMINATE,
1d98fef1 41 KILL_TERMINATE_AND_LOG,
db2cb23b
UTL
42 KILL_KILL,
43 KILL_ABORT,
4940c0b0
LP
44 _KILL_OPERATION_MAX,
45 _KILL_OPERATION_INVALID = -1
db2cb23b
UTL
46} KillOperation;
47
87f0e418 48static inline bool UNIT_IS_ACTIVE_OR_RELOADING(UnitActiveState t) {
032ff4af 49 return t == UNIT_ACTIVE || t == UNIT_RELOADING;
87f0e418
LP
50}
51
52static inline bool UNIT_IS_ACTIVE_OR_ACTIVATING(UnitActiveState t) {
032ff4af 53 return t == UNIT_ACTIVE || t == UNIT_ACTIVATING || t == UNIT_RELOADING;
87f0e418
LP
54}
55
56static inline bool UNIT_IS_INACTIVE_OR_DEACTIVATING(UnitActiveState t) {
fdf20a31 57 return t == UNIT_INACTIVE || t == UNIT_FAILED || t == UNIT_DEACTIVATING;
6124958c
LP
58}
59
fdf20a31
MM
60static inline bool UNIT_IS_INACTIVE_OR_FAILED(UnitActiveState t) {
61 return t == UNIT_INACTIVE || t == UNIT_FAILED;
87f0e418
LP
62}
63
ef734fd6
LP
64#include "job.h"
65
a016b922
LP
66struct UnitRef {
67 /* Keeps tracks of references to a unit. This is useful so
68 * that we can merge two units if necessary and correct all
69 * references to them */
70
71 Unit* unit;
72 LIST_FIELDS(UnitRef, refs);
73};
74
906c06f6
DM
75typedef enum UnitCGroupBPFState {
76 UNIT_CGROUP_BPF_OFF = 0,
77 UNIT_CGROUP_BPF_ON = 1,
78 UNIT_CGROUP_BPF_INVALIDATED = -1,
79} UnitCGroupBPFState;
80
ac155bb8 81struct Unit {
87f0e418 82 Manager *manager;
23a177ef 83
87f0e418
LP
84 UnitType type;
85 UnitLoadState load_state;
23a177ef 86 Unit *merged_into;
87f0e418
LP
87
88 char *id; /* One name is special because we use it for identification. Points to an entry in the names set */
9e2f7c11 89 char *instance;
87f0e418
LP
90
91 Set *names;
92 Set *dependencies[_UNIT_DEPENDENCY_MAX];
93
7c8fa05c
LP
94 char **requires_mounts_for;
95
87f0e418 96 char *description;
49dbfa7b 97 char **documentation;
faf919f1 98
6be1e7d5 99 char *fragment_path; /* if loaded from a config file this is the primary path to it */
1b64d026 100 char *source_path; /* if converted, the source file */
ae7a7182 101 char **dropin_paths;
f78f265f 102
45fb0699 103 usec_t fragment_mtime;
1b64d026 104 usec_t source_mtime;
ae7a7182 105 usec_t dropin_mtime;
87f0e418 106
4f4afc88
LP
107 /* If this is a transient unit we are currently writing, this is where we are writing it to */
108 FILE *transient_file;
109
e0209d83 110 /* If there is something to do with this unit, then this is the installed job for it */
87f0e418
LP
111 Job *job;
112
e0209d83
MS
113 /* JOB_NOP jobs are special and can be installed without disturbing the real job. */
114 Job *nop_job;
115
bbc29086
DM
116 /* The slot used for watching NameOwnerChanged signals */
117 sd_bus_slot *match_bus_slot;
118
05a98afd
LP
119 /* References to this unit from clients */
120 sd_bus_track *bus_track;
121 char **deserialized_refs;
122
f189ab18 123 /* Job timeout and action to take */
faf919f1 124 usec_t job_timeout;
a2df3ea4 125 usec_t job_running_timeout;
87a47f99 126 EmergencyAction job_timeout_action;
f189ab18 127 char *job_timeout_reboot_arg;
faf919f1 128
57020a3a
LP
129 /* References to this */
130 LIST_HEAD(UnitRef, refs);
131
52661efd
LP
132 /* Conditions to check */
133 LIST_HEAD(Condition, conditions);
59fccdc5 134 LIST_HEAD(Condition, asserts);
52661efd 135
90bbc946 136 dual_timestamp condition_timestamp;
59fccdc5 137 dual_timestamp assert_timestamp;
90bbc946 138
a483fb59
LP
139 /* Updated whenever the low-level state changes */
140 dual_timestamp state_change_timestamp;
141
142 /* Updated whenever the (high-level) active state enters or leaves the active or inactive states */
63983207
LP
143 dual_timestamp inactive_exit_timestamp;
144 dual_timestamp active_enter_timestamp;
145 dual_timestamp active_exit_timestamp;
146 dual_timestamp inactive_enter_timestamp;
87f0e418 147
a016b922
LP
148 UnitRef slice;
149
ef734fd6 150 /* Per type list */
ac155bb8 151 LIST_FIELDS(Unit, units_by_type);
c1e1601e 152
7c8fa05c
LP
153 /* All units which have requires_mounts_for set */
154 LIST_FIELDS(Unit, has_requires_mounts_for);
155
701cc384 156 /* Load queue */
ac155bb8 157 LIST_FIELDS(Unit, load_queue);
701cc384 158
c1e1601e 159 /* D-Bus queue */
ac155bb8 160 LIST_FIELDS(Unit, dbus_queue);
23a177ef
LP
161
162 /* Cleanup queue */
ac155bb8 163 LIST_FIELDS(Unit, cleanup_queue);
9d58f1db 164
701cc384 165 /* GC queue */
ac155bb8 166 LIST_FIELDS(Unit, gc_queue);
701cc384 167
4ad49000
LP
168 /* CGroup realize members queue */
169 LIST_FIELDS(Unit, cgroup_queue);
170
32ee7d33
DM
171 /* Units with the same CGroup netclass */
172 LIST_FIELDS(Unit, cgroup_netclass);
173
a911bb9a
LP
174 /* PIDs we keep an eye on. Note that a unit might have many
175 * more, but these are the ones we care enough about to
176 * process SIGCHLD for */
177 Set *pids;
178
36f20ae3
KW
179 /* Used in sigchld event invocation to avoid repeat events being invoked */
180 uint64_t sigchldgen;
181
701cc384 182 /* Used during GC sweeps */
eced69b3 183 unsigned gc_marker;
701cc384 184
8821a00f
LP
185 /* Error code when we didn't manage to load the unit (negative) */
186 int load_error;
187
6bf0f408
LP
188 /* Put a ratelimit on unit starting */
189 RateLimit start_limit;
87a47f99 190 EmergencyAction start_limit_action;
6bf0f408
LP
191 char *reboot_arg;
192
67bfdc97
LP
193 /* Make sure we never enter endless loops with the check unneeded logic, or the BindsTo= logic */
194 RateLimit auto_stop_ratelimit;
bea355da 195
00d9ef85
LP
196 /* Reference to a specific UID/GID */
197 uid_t ref_uid;
198 gid_t ref_gid;
199
d2dc52db 200 /* Cached unit file state and preset */
a4375746 201 UnitFileState unit_file_state;
d2dc52db 202 int unit_file_preset;
a4375746 203
66ebf6c0
TH
204 /* Where the cpu.stat or cpuacct.usage was at the time the unit was started */
205 nsec_t cpu_usage_base;
fe700f46 206 nsec_t cpu_usage_last; /* the most recently read value */
5ad096b3 207
7c52a17b
ZJS
208 /* Counterparts in the cgroup filesystem */
209 char *cgroup_path;
efdb0237 210 CGroupMask cgroup_realized_mask;
ccf78df1 211 CGroupMask cgroup_enabled_mask;
efdb0237
LP
212 CGroupMask cgroup_subtree_mask;
213 CGroupMask cgroup_members_mask;
214 int cgroup_inotify_wd;
7c52a17b 215
6a48d82f
DM
216 /* IP BPF Firewalling/accounting */
217 int ip_accounting_ingress_map_fd;
218 int ip_accounting_egress_map_fd;
219
220 int ipv4_allow_map_fd;
221 int ipv6_allow_map_fd;
222 int ipv4_deny_map_fd;
223 int ipv6_deny_map_fd;
224
225 BPFProgram *ip_bpf_ingress;
226 BPFProgram *ip_bpf_egress;
227
6b659ed8
LP
228 uint64_t ip_accounting_extra[_CGROUP_IP_ACCOUNTING_METRIC_MAX];
229
7c52a17b
ZJS
230 /* How to start OnFailure units */
231 JobMode on_failure_job_mode;
232
4b58153d
LP
233 /* The current invocation ID */
234 sd_id128_t invocation_id;
235 char invocation_id_string[SD_ID128_STRING_MAX]; /* useful when logging */
236
9d58f1db
LP
237 /* Garbage collect us we nobody wants or requires us anymore */
238 bool stop_when_unneeded;
239
35b8ca3a 240 /* Create default dependencies */
a40eb732
LP
241 bool default_dependencies;
242
b5e9dba8
LP
243 /* Refuse manual starting, allow starting only indirectly via dependency. */
244 bool refuse_manual_start;
245
246 /* Don't allow the user to stop this unit manually, allow stopping only indirectly via dependency. */
247 bool refuse_manual_stop;
248
2528a7a6
LP
249 /* Allow isolation requests */
250 bool allow_isolate;
251
c8f4d764
LP
252 /* Ignore this unit when isolating */
253 bool ignore_on_isolate;
254
49f43d5f 255 /* Did the last condition check succeed? */
90bbc946 256 bool condition_result;
59fccdc5 257 bool assert_result;
90bbc946 258
c2756a68
LP
259 /* Is this a transient unit? */
260 bool transient;
261
f5869324
LP
262 /* Is this a unit that is always running and cannot be stopped? */
263 bool perpetual;
264
9d58f1db
LP
265 bool in_load_queue:1;
266 bool in_dbus_queue:1;
267 bool in_cleanup_queue:1;
701cc384 268 bool in_gc_queue:1;
4ad49000 269 bool in_cgroup_queue:1;
701cc384 270
9d58f1db 271 bool sent_dbus_new_signal:1;
6c073082 272
cd6d0a45 273 bool in_audit:1;
a57f7e2c
LP
274
275 bool cgroup_realized:1;
bc432dc7
LP
276 bool cgroup_members_mask_valid:1;
277 bool cgroup_subtree_mask_valid:1;
f78f265f 278
906c06f6
DM
279 UnitCGroupBPFState cgroup_bpf_state:2;
280
6bf0f408
LP
281 bool start_limit_hit:1;
282
f78f265f 283 /* Did we already invoke unit_coldplug() for this unit? */
f8a30ce5 284 bool coldplugged:1;
05a98afd
LP
285
286 /* For transient units: whether to add a bus track reference after creating the unit */
287 bool bus_track_add:1;
87f0e418
LP
288};
289
c6918296
MS
290struct UnitStatusMessageFormats {
291 const char *starting_stopping[2];
292 const char *finished_start_job[_JOB_RESULT_MAX];
293 const char *finished_stop_job[_JOB_RESULT_MAX];
294};
295
8e2af478
LP
296typedef enum UnitSetPropertiesMode {
297 UNIT_CHECK = 0,
298 UNIT_RUNTIME = 1,
299 UNIT_PERSISTENT = 2,
300} UnitSetPropertiesMode;
301
71d35b6b 302#include "automount.h"
87f0e418 303#include "device.h"
c1ff5570 304#include "path.h"
6c12b52e 305#include "scope.h"
71d35b6b
TA
306#include "slice.h"
307#include "socket.h"
308#include "swap.h"
309#include "target.h"
310#include "timer.h"
87f0e418 311
87f0e418 312struct UnitVTable {
7d17cfbc
MS
313 /* How much memory does an object of this unit type need */
314 size_t object_size;
315
3ef63c31
LP
316 /* If greater than 0, the offset into the object where
317 * ExecContext is found, if the unit type has that */
318 size_t exec_context_offset;
319
4ad49000
LP
320 /* If greater than 0, the offset into the object where
321 * CGroupContext is found, if the unit type has that */
322 size_t cgroup_context_offset;
323
718db961
LP
324 /* If greater than 0, the offset into the object where
325 * KillContext is found, if the unit type has that */
326 size_t kill_context_offset;
327
613b411c
LP
328 /* If greater than 0, the offset into the object where the
329 * pointer to ExecRuntime is found, if the unit type has
330 * that */
331 size_t exec_runtime_offset;
332
29206d46
LP
333 /* If greater than 0, the offset into the object where the pointer to DynamicCreds is found, if the unit type
334 * has that. */
335 size_t dynamic_creds_offset;
336
ee33e53a 337 /* The name of the configuration file section with the private settings of this unit */
4ad49000 338 const char *private_section;
71645aca 339
f975e971
LP
340 /* Config file sections this unit type understands, separated
341 * by NUL chars */
342 const char *sections;
343
e537352b 344 /* This should reset all type-specific variables. This should
a16e1123
LP
345 * not allocate memory, and is called with zero-initialized
346 * data. It should hence only initialize variables that need
347 * to be set != 0. */
e537352b
LP
348 void (*init)(Unit *u);
349
a16e1123
LP
350 /* This should free all type-specific variables. It should be
351 * idempotent. */
352 void (*done)(Unit *u);
353
e537352b
LP
354 /* Actually load data from disk. This may fail, and should set
355 * load_state to UNIT_LOADED, UNIT_MERGED or leave it at
356 * UNIT_STUB if no configuration could be found. */
357 int (*load)(Unit *u);
358
c5315881 359 /* If a lot of units got created via enumerate(), this is
be847e82
LP
360 * where to actually set the state and call unit_notify(). */
361 int (*coldplug)(Unit *u);
87f0e418
LP
362
363 void (*dump)(Unit *u, FILE *f, const char *prefix);
364
365 int (*start)(Unit *u);
366 int (*stop)(Unit *u);
367 int (*reload)(Unit *u);
368
718db961 369 int (*kill)(Unit *u, KillWho w, int signo, sd_bus_error *error);
8a0867d6 370
87f0e418
LP
371 bool (*can_reload)(Unit *u);
372
a16e1123
LP
373 /* Write all data that cannot be restored from other sources
374 * away using unit_serialize_item() */
375 int (*serialize)(Unit *u, FILE *f, FDSet *fds);
376
377 /* Restore one item from the serialization */
378 int (*deserialize_item)(Unit *u, const char *key, const char *data, FDSet *fds);
379
01e10de3 380 /* Try to match up fds with what we need for this unit */
9ff1a6f1 381 void (*distribute_fds)(Unit *u, FDSet *fds);
01e10de3 382
87f0e418
LP
383 /* Boils down the more complex internal state of this unit to
384 * a simpler one that the engine can understand */
385 UnitActiveState (*active_state)(Unit *u);
386
10a94420
LP
387 /* Returns the substate specific to this unit type as
388 * string. This is purely information so that we can give the
35b8ca3a 389 * user a more fine grained explanation in which actual state a
10a94420
LP
390 * unit is in. */
391 const char* (*sub_state_to_string)(Unit *u);
392
701cc384
LP
393 /* Return true when there is reason to keep this entry around
394 * even nothing references it and it isn't active in any
395 * way */
396 bool (*check_gc)(Unit *u);
397
a354329f
LP
398 /* When the unit is not running and no job for it queued we
399 * shall release its runtime resources */
f0bfbfac 400 void (*release_resources)(Unit *u, bool inactive);
a354329f 401
718db961 402 /* Invoked on every child that died */
87f0e418 403 void (*sigchld_event)(Unit *u, pid_t pid, int code, int status);
7824bbeb 404
fdf20a31
MM
405 /* Reset failed state if we are in failed state */
406 void (*reset_failed)(Unit *u);
5632e374 407
05e343b7
LP
408 /* Called whenever any of the cgroups this unit watches for
409 * ran empty */
4ad49000 410 void (*notify_cgroup_empty)(Unit *u);
8e274523 411
8c47c732 412 /* Called whenever a process of this unit sends us a message */
a354329f 413 void (*notify_message)(Unit *u, pid_t pid, char **tags, FDSet *fds);
8c47c732 414
00d9ef85 415 /* Called whenever a name this Unit registered for comes or goes away. */
05e343b7
LP
416 void (*bus_name_owner_change)(Unit *u, const char *name, const char *old_owner, const char *new_owner);
417
8e2af478 418 /* Called for each property that is being set */
718db961 419 int (*bus_set_property)(Unit *u, const char *name, sd_bus_message *message, UnitSetPropertiesMode mode, sd_bus_error *error);
8e2af478
LP
420
421 /* Called after at least one property got changed to apply the necessary change */
422 int (*bus_commit_properties)(Unit *u);
423
a7f241db
LP
424 /* Return the unit this unit is following */
425 Unit *(*following)(Unit *u);
426
6210e7fc
LP
427 /* Return the set of units that are following each other */
428 int (*following_set)(Unit *u, Set **s);
429
3ecaa09b
LP
430 /* Invoked each time a unit this unit is triggering changes
431 * state or gains/loses a job */
432 void (*trigger_notify)(Unit *u, Unit *trigger);
433
8742514c
LP
434 /* Called whenever CLOCK_REALTIME made a jump */
435 void (*time_change)(Unit *u);
436
7a7821c8
LP
437 /* Returns the next timeout of a unit */
438 int (*get_timeout)(Unit *u, usec_t *timeout);
68db7a3b 439
291d565a
LP
440 /* Returns the main PID if there is any defined, or 0. */
441 pid_t (*main_pid)(Unit *u);
442
443 /* Returns the main PID if there is any defined, or 0. */
444 pid_t (*control_pid)(Unit *u);
445
f50e0a01
LP
446 /* This is called for each unit type and should be used to
447 * enumerate existing devices and load them. However,
448 * everything that is loaded here should still stay in
449 * inactive state. It is the job of the coldplug() call above
450 * to put the units into the initial state. */
ba64af90 451 void (*enumerate)(Manager *m);
f50e0a01
LP
452
453 /* Type specific cleanups. */
7824bbeb 454 void (*shutdown)(Manager *m);
9d58f1db 455
0faacd47
LP
456 /* If this function is set and return false all jobs for units
457 * of this type will immediately fail. */
1c2e9646 458 bool (*supported)(void);
0faacd47 459
718db961
LP
460 /* The bus vtable */
461 const sd_bus_vtable *bus_vtable;
462
718db961 463 /* The strings to print in status messages */
c6918296
MS
464 UnitStatusMessageFormats status_message_formats;
465
c2756a68
LP
466 /* True if transient units of this type are OK */
467 bool can_transient:1;
c5a97ed1
LP
468
469 /* True if queued jobs of this type should be GC'ed if no other job needs them anymore */
470 bool gc_jobs:1;
87f0e418
LP
471};
472
473extern const UnitVTable * const unit_vtable[_UNIT_TYPE_MAX];
474
ac155bb8 475#define UNIT_VTABLE(u) unit_vtable[(u)->type]
87f0e418
LP
476
477/* For casting a unit into the various unit types */
478#define DEFINE_CAST(UPPERCASE, MixedCase) \
479 static inline MixedCase* UPPERCASE(Unit *u) { \
ac155bb8 480 if (_unlikely_(!u || u->type != UNIT_##UPPERCASE)) \
87f0e418
LP
481 return NULL; \
482 \
483 return (MixedCase*) u; \
484 }
485
486/* For casting the various unit types into a unit */
ac155bb8 487#define UNIT(u) (&(u)->meta)
87f0e418 488
35b7ff80
LP
489#define UNIT_HAS_EXEC_CONTEXT(u) (UNIT_VTABLE(u)->exec_context_offset > 0)
490#define UNIT_HAS_CGROUP_CONTEXT(u) (UNIT_VTABLE(u)->cgroup_context_offset > 0)
491#define UNIT_HAS_KILL_CONTEXT(u) (UNIT_VTABLE(u)->kill_context_offset > 0)
492
3ecaa09b
LP
493#define UNIT_TRIGGER(u) ((Unit*) set_first((u)->dependencies[UNIT_TRIGGERS]))
494
87f0e418 495DEFINE_CAST(SERVICE, Service);
e821075a 496DEFINE_CAST(SOCKET, Socket);
87f0e418
LP
497DEFINE_CAST(TARGET, Target);
498DEFINE_CAST(DEVICE, Device);
499DEFINE_CAST(MOUNT, Mount);
500DEFINE_CAST(AUTOMOUNT, Automount);
07b0b134 501DEFINE_CAST(SWAP, Swap);
e821075a 502DEFINE_CAST(TIMER, Timer);
01f78473 503DEFINE_CAST(PATH, Path);
a016b922 504DEFINE_CAST(SLICE, Slice);
6c12b52e 505DEFINE_CAST(SCOPE, Scope);
87f0e418 506
7d17cfbc 507Unit *unit_new(Manager *m, size_t size);
87f0e418
LP
508void unit_free(Unit *u);
509
a581e45a 510int unit_new_for_name(Manager *m, size_t size, const char *name, Unit **ret);
87f0e418 511int unit_add_name(Unit *u, const char *name);
9e2f7c11 512
701cc384 513int unit_add_dependency(Unit *u, UnitDependency d, Unit *other, bool add_reference);
2c966c03
LP
514int unit_add_two_dependencies(Unit *u, UnitDependency d, UnitDependency e, Unit *other, bool add_reference);
515
701cc384 516int unit_add_dependency_by_name(Unit *u, UnitDependency d, const char *name, const char *filename, bool add_reference);
2c966c03
LP
517int unit_add_two_dependencies_by_name(Unit *u, UnitDependency d, UnitDependency e, const char *name, const char *path, bool add_reference);
518
23a177ef
LP
519int unit_add_exec_dependencies(Unit *u, ExecContext *c);
520
0ae97ec1 521int unit_choose_id(Unit *u, const char *name);
f50e0a01 522int unit_set_description(Unit *u, const char *description);
87f0e418 523
701cc384
LP
524bool unit_check_gc(Unit *u);
525
87f0e418 526void unit_add_to_load_queue(Unit *u);
c1e1601e 527void unit_add_to_dbus_queue(Unit *u);
23a177ef 528void unit_add_to_cleanup_queue(Unit *u);
701cc384 529void unit_add_to_gc_queue(Unit *u);
87f0e418
LP
530
531int unit_merge(Unit *u, Unit *other);
23a177ef
LP
532int unit_merge_by_name(Unit *u, const char *other);
533
44a6b1b6 534Unit *unit_follow_merge(Unit *u) _pure_;
87f0e418 535
e537352b
LP
536int unit_load_fragment_and_dropin(Unit *u);
537int unit_load_fragment_and_dropin_optional(Unit *u);
87f0e418
LP
538int unit_load(Unit *unit);
539
d79200e2
LP
540int unit_set_slice(Unit *u, Unit *slice);
541int unit_set_default_slice(Unit *u);
a016b922 542
44a6b1b6 543const char *unit_description(Unit *u) _pure_;
87f0e418 544
f278026d
LP
545bool unit_has_name(Unit *u, const char *name);
546
87f0e418
LP
547UnitActiveState unit_active_state(Unit *u);
548
10a94420
LP
549const char* unit_sub_state_to_string(Unit *u);
550
87f0e418
LP
551void unit_dump(Unit *u, FILE *f, const char *prefix);
552
44a6b1b6
ZJS
553bool unit_can_reload(Unit *u) _pure_;
554bool unit_can_start(Unit *u) _pure_;
f5869324 555bool unit_can_stop(Unit *u) _pure_;
44a6b1b6 556bool unit_can_isolate(Unit *u) _pure_;
87f0e418
LP
557
558int unit_start(Unit *u);
559int unit_stop(Unit *u);
560int unit_reload(Unit *u);
561
718db961
LP
562int unit_kill(Unit *u, KillWho w, int signo, sd_bus_error *error);
563int unit_kill_common(Unit *u, KillWho who, int signo, pid_t main_pid, pid_t control_pid, sd_bus_error *error);
8a0867d6 564
e2f3b44c 565void unit_notify(Unit *u, UnitActiveState os, UnitActiveState ns, bool reload_success);
87f0e418 566
87f0e418
LP
567int unit_watch_pid(Unit *u, pid_t pid);
568void unit_unwatch_pid(Unit *u, pid_t pid);
a911bb9a
LP
569void unit_unwatch_all_pids(Unit *u);
570
571void unit_tidy_watch_pids(Unit *u, pid_t except1, pid_t except2);
87f0e418 572
9806e87d 573int unit_install_bus_match(Unit *u, sd_bus *bus, const char *name);
05e343b7
LP
574int unit_watch_bus_name(Unit *u, const char *name);
575void unit_unwatch_bus_name(Unit *u, const char *name);
576
87f0e418
LP
577bool unit_job_is_applicable(Unit *u, JobType j);
578
0301abf4
LP
579int set_unit_path(const char *p);
580
50159e6a 581char *unit_dbus_path(Unit *u);
4b58153d 582char *unit_dbus_path_invocation_id(Unit *u);
50159e6a 583
f6ff8c29
LP
584int unit_load_related_unit(Unit *u, const char *type, Unit **_found);
585
44a6b1b6 586bool unit_can_serialize(Unit *u) _pure_;
a34ceba6 587
6b78f9b4 588int unit_serialize(Unit *u, FILE *f, FDSet *fds, bool serialize_jobs);
a16e1123 589int unit_deserialize(Unit *u, FILE *f, FDSet *fds);
07429866 590void unit_deserialize_skip(FILE *f);
a16e1123 591
a34ceba6
LP
592int unit_serialize_item(Unit *u, FILE *f, const char *key, const char *value);
593int unit_serialize_item_escaped(Unit *u, FILE *f, const char *key, const char *value);
594int unit_serialize_item_fd(Unit *u, FILE *f, FDSet *fds, const char *key, int fd);
595void unit_serialize_item_format(Unit *u, FILE *f, const char *key, const char *value, ...) _printf_(4,5);
596
9d06297e 597int unit_add_node_link(Unit *u, const char *what, bool wants, UnitDependency d);
6e2ef85b 598
be847e82 599int unit_coldplug(Unit *u);
cca098b0 600
44b601bc 601void unit_status_printf(Unit *u, const char *status, const char *unit_status_msg_format) _printf_(3, 0);
d1a34ae9 602void unit_status_emit_starting_stopping_reloading(Unit *u, JobType t);
9e58ff9c 603
45fb0699
LP
604bool unit_need_daemon_reload(Unit *u);
605
fdf20a31 606void unit_reset_failed(Unit *u);
5632e374 607
a7f241db 608Unit *unit_following(Unit *u);
eeaedb7c 609int unit_following_set(Unit *u, Set **s);
a7f241db 610
9444b1f2
LP
611const char *unit_slice_name(Unit *u);
612
44a6b1b6
ZJS
613bool unit_stop_pending(Unit *u) _pure_;
614bool unit_inactive_or_pending(Unit *u) _pure_;
31afa0a4 615bool unit_active_or_pending(Unit *u);
18ffdfda 616
bba34eed
LP
617int unit_add_default_target_dependency(Unit *u, Unit *target);
618
3ecaa09b
LP
619void unit_start_on_failure(Unit *u);
620void unit_trigger_notify(Unit *u);
c0daa706 621
a4375746 622UnitFileState unit_get_unit_file_state(Unit *u);
d2dc52db 623int unit_get_unit_file_preset(Unit *u);
a4375746 624
57020a3a
LP
625Unit* unit_ref_set(UnitRef *ref, Unit *u);
626void unit_ref_unset(UnitRef *ref);
627
628#define UNIT_DEREF(ref) ((ref).unit)
9444b1f2 629#define UNIT_ISSET(ref) (!!(ref).unit)
57020a3a 630
598459ce 631int unit_patch_contexts(Unit *u);
e06c73cc 632
44a6b1b6 633ExecContext *unit_get_exec_context(Unit *u) _pure_;
718db961 634KillContext *unit_get_kill_context(Unit *u) _pure_;
4ad49000 635CGroupContext *unit_get_cgroup_context(Unit *u) _pure_;
598459ce 636
613b411c
LP
637ExecRuntime *unit_get_exec_runtime(Unit *u) _pure_;
638
639int unit_setup_exec_runtime(Unit *u);
29206d46 640int unit_setup_dynamic_creds(Unit *u);
3ef63c31 641
8e2af478 642int unit_write_drop_in(Unit *u, UnitSetPropertiesMode mode, const char *name, const char *data);
44b601bc 643int unit_write_drop_in_format(Unit *u, UnitSetPropertiesMode mode, const char *name, const char *format, ...) _printf_(4,5);
b9ec9359
LP
644
645int unit_write_drop_in_private(Unit *u, UnitSetPropertiesMode mode, const char *name, const char *data);
44b601bc 646int unit_write_drop_in_private_format(Unit *u, UnitSetPropertiesMode mode, const char *name, const char *format, ...) _printf_(4,5);
b9ec9359 647
db2cb23b 648int unit_kill_context(Unit *u, KillContext *c, KillOperation k, pid_t main_pid, pid_t control_pid, bool main_pid_alien);
cd2086fe 649
c2756a68
LP
650int unit_make_transient(Unit *u);
651
a57f7e2c
LP
652int unit_require_mounts_for(Unit *u, const char *path);
653
1c2e9646
LP
654bool unit_type_supported(UnitType t);
655
0f13f3bd
LP
656bool unit_is_pristine(Unit *u);
657
291d565a
LP
658pid_t unit_control_pid(Unit *u);
659pid_t unit_main_pid(Unit *u);
660
1c2e9646
LP
661static inline bool unit_supported(Unit *u) {
662 return unit_type_supported(u->type);
663}
664
8b4305c7
LP
665void unit_warn_if_dir_nonempty(Unit *u, const char* where);
666int unit_fail_if_symlink(Unit *u, const char* where);
667
07299350
LP
668int unit_start_limit_test(Unit *u);
669
00d9ef85
LP
670void unit_unref_uid(Unit *u, bool destroy_now);
671int unit_ref_uid(Unit *u, uid_t uid, bool clean_ipc);
672
673void unit_unref_gid(Unit *u, bool destroy_now);
674int unit_ref_gid(Unit *u, gid_t gid, bool clean_ipc);
675
676int unit_ref_uid_gid(Unit *u, uid_t uid, gid_t gid);
677void unit_unref_uid_gid(Unit *u, bool destroy_now);
678
679void unit_notify_user_lookup(Unit *u, uid_t uid, gid_t gid);
680
4b58153d
LP
681int unit_set_invocation_id(Unit *u, sd_id128_t id);
682int unit_acquire_invocation_id(Unit *u);
683
c891efaf
FB
684bool unit_shall_confirm_spawn(Unit *u);
685
f0d47797
LP
686void unit_set_exec_params(Unit *s, ExecParameters *p);
687
a79279c7
LP
688int unit_fork_helper_process(Unit *u, pid_t *ret);
689
e8e581bf
ZJS
690/* Macros which append UNIT= or USER_UNIT= to the message */
691
f2341e0a
LP
692#define log_unit_full(unit, level, error, ...) \
693 ({ \
8dec4a9d 694 const Unit *_u = (unit); \
4b58153d 695 _u ? log_object_internal(level, error, __FILE__, __LINE__, __func__, _u->manager->unit_log_field, _u->id, _u->manager->invocation_log_field, _u->invocation_id_string, ##__VA_ARGS__) : \
f2341e0a
LP
696 log_internal(level, error, __FILE__, __LINE__, __func__, ##__VA_ARGS__); \
697 })
698
699#define log_unit_debug(unit, ...) log_unit_full(unit, LOG_DEBUG, 0, ##__VA_ARGS__)
700#define log_unit_info(unit, ...) log_unit_full(unit, LOG_INFO, 0, ##__VA_ARGS__)
701#define log_unit_notice(unit, ...) log_unit_full(unit, LOG_NOTICE, 0, ##__VA_ARGS__)
702#define log_unit_warning(unit, ...) log_unit_full(unit, LOG_WARNING, 0, ##__VA_ARGS__)
703#define log_unit_error(unit, ...) log_unit_full(unit, LOG_ERR, 0, ##__VA_ARGS__)
704
705#define log_unit_debug_errno(unit, error, ...) log_unit_full(unit, LOG_DEBUG, error, ##__VA_ARGS__)
706#define log_unit_info_errno(unit, error, ...) log_unit_full(unit, LOG_INFO, error, ##__VA_ARGS__)
707#define log_unit_notice_errno(unit, error, ...) log_unit_full(unit, LOG_NOTICE, error, ##__VA_ARGS__)
708#define log_unit_warning_errno(unit, error, ...) log_unit_full(unit, LOG_WARNING, error, ##__VA_ARGS__)
709#define log_unit_error_errno(unit, error, ...) log_unit_full(unit, LOG_ERR, error, ##__VA_ARGS__)
710
711#define LOG_UNIT_MESSAGE(unit, fmt, ...) "MESSAGE=%s: " fmt, (unit)->id, ##__VA_ARGS__
712#define LOG_UNIT_ID(unit) (unit)->manager->unit_log_format_string, (unit)->id