]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/core/manager.h
journald: one more SYSLOG_IDENTIFIER length fix
[thirdparty/systemd.git] / src / core / manager.h
CommitLineData
03467c88 1/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
60918275
LP
2
3#ifndef foomanagerhfoo
4#define foomanagerhfoo
5
a7334b09
LP
6/***
7 This file is part of systemd.
8
9 Copyright 2010 Lennart Poettering
10
11 systemd is free software; you can redistribute it and/or modify it
5430f7f2
LP
12 under the terms of the GNU Lesser General Public License as published by
13 the Free Software Foundation; either version 2.1 of the License, or
a7334b09
LP
14 (at your option) any later version.
15
16 systemd is distributed in the hope that it will be useful, but
17 WITHOUT ANY WARRANTY; without even the implied warranty of
18 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
5430f7f2 19 Lesser General Public License for more details.
a7334b09 20
5430f7f2 21 You should have received a copy of the GNU Lesser General Public License
a7334b09
LP
22 along with systemd; If not, see <http://www.gnu.org/licenses/>.
23***/
24
60918275
LP
25#include <stdbool.h>
26#include <inttypes.h>
a66d02c3 27#include <stdio.h>
ea430986
LP
28#include <dbus/dbus.h>
29
a16e1123
LP
30#include "fdset.h"
31
4f0f902f 32/* Enforce upper limit how many names we allow */
59d1a833 33#define MANAGER_MAX_NAMES 131072 /* 128K */
4f0f902f 34
60918275 35typedef struct Manager Manager;
acbb0225
LP
36typedef enum WatchType WatchType;
37typedef struct Watch Watch;
38
a16e1123
LP
39typedef enum ManagerExitCode {
40 MANAGER_RUNNING,
41 MANAGER_EXIT,
42 MANAGER_RELOAD,
43 MANAGER_REEXECUTE,
b9080b03
FF
44 MANAGER_REBOOT,
45 MANAGER_POWEROFF,
46 MANAGER_HALT,
47 MANAGER_KEXEC,
664f88a7 48 MANAGER_SWITCH_ROOT,
a16e1123
LP
49 _MANAGER_EXIT_CODE_MAX,
50 _MANAGER_EXIT_CODE_INVALID = -1
51} ManagerExitCode;
52
dfcd764e 53typedef enum ManagerRunningAs {
a3d4e06d 54 MANAGER_SYSTEM,
af2d49f7 55 MANAGER_USER,
dfcd764e
LP
56 _MANAGER_RUNNING_AS_MAX,
57 _MANAGER_RUNNING_AS_INVALID = -1
58} ManagerRunningAs;
59
acbb0225
LP
60enum WatchType {
61 WATCH_INVALID,
ef734fd6 62 WATCH_SIGNAL,
8c47c732 63 WATCH_NOTIFY,
acbb0225 64 WATCH_FD,
faf919f1
LP
65 WATCH_UNIT_TIMER,
66 WATCH_JOB_TIMER,
f94ea366 67 WATCH_MOUNT,
4e434314 68 WATCH_SWAP,
ea430986
LP
69 WATCH_UDEV,
70 WATCH_DBUS_WATCH,
71 WATCH_DBUS_TIMEOUT
acbb0225
LP
72};
73
74struct Watch {
75 int fd;
76 WatchType type;
ea430986 77 union {
ac155bb8 78 struct Unit *unit;
faf919f1 79 struct Job *job;
ea430986
LP
80 DBusWatch *bus_watch;
81 DBusTimeout *bus_timeout;
82 } data;
cabab516
LP
83 bool fd_is_dupped:1;
84 bool socket_accept:1;
acbb0225 85};
60918275 86
87f0e418 87#include "unit.h"
60918275
LP
88#include "job.h"
89#include "hashmap.h"
90#include "list.h"
91#include "set.h"
ea430986 92#include "dbus.h"
84e3543e 93#include "path-lookup.h"
60918275
LP
94
95struct Manager {
87f0e418 96 /* Note that the set of units we know of is allowed to be
35b8ca3a 97 * inconsistent. However the subset of it that is loaded may
87d1515d
LP
98 * not, and the list of jobs may neither. */
99
87f0e418
LP
100 /* Active jobs and units */
101 Hashmap *units; /* name string => Unit object n:1 */
60918275
LP
102 Hashmap *jobs; /* job id => Job object 1:1 */
103
ef734fd6
LP
104 /* To make it easy to iterate through the units of a specific
105 * type we maintain a per type linked list */
ac155bb8 106 LIST_HEAD(Unit, units_by_type[_UNIT_TYPE_MAX]);
ef734fd6 107
7c8fa05c
LP
108 /* To optimize iteration of units that have requires_mounts_for set */
109 LIST_HEAD(Unit, has_requires_mounts_for);
110
87f0e418 111 /* Units that need to be loaded */
ac155bb8 112 LIST_HEAD(Unit, load_queue); /* this is actually more a stack than a queue, but uh. */
60918275 113
034c6ed7
LP
114 /* Jobs that need to be run */
115 LIST_HEAD(Job, run_queue); /* more a stack than a queue, too */
116
c1e1601e
LP
117 /* Units and jobs that have not yet been announced via
118 * D-Bus. When something about a job changes it is added here
119 * if it is not in there yet. This allows easy coalescing of
120 * D-Bus change signals. */
ac155bb8 121 LIST_HEAD(Unit, dbus_unit_queue);
c1e1601e
LP
122 LIST_HEAD(Job, dbus_job_queue);
123
701cc384 124 /* Units to remove */
ac155bb8 125 LIST_HEAD(Unit, cleanup_queue);
23a177ef 126
701cc384 127 /* Units to check when doing GC */
ac155bb8 128 LIST_HEAD(Unit, gc_queue);
701cc384 129
87f0e418 130 Hashmap *watch_pids; /* pid => Unit object n:1 */
9152c765 131
c952c6ec
LP
132 char *notify_socket;
133
8c47c732 134 Watch notify_watch;
9d58f1db
LP
135 Watch signal_watch;
136
9152c765 137 int epoll_fd;
acbb0225 138
9d58f1db 139 unsigned n_snapshots;
ce578209 140
84e3543e 141 LookupPaths lookup_paths;
fe51822e 142 Set *unit_path_cache;
036643a2 143
1137a57c 144 char **environment;
06d4c99a 145 char **default_controllers;
1137a57c 146
e96d6be7
LP
147 usec_t runtime_watchdog;
148 usec_t shutdown_watchdog;
149
e9ddabc2 150 dual_timestamp initrd_timestamp;
63983207 151 dual_timestamp startup_timestamp;
b0c918b9 152 dual_timestamp finish_timestamp;
8d567588 153
5a1e9937 154 char *generator_unit_path;
b2bb3dbe 155
ef734fd6 156 /* Data specific to the device subsystem */
25ac040b 157 struct udev* udev;
f94ea366
LP
158 struct udev_monitor* udev_monitor;
159 Watch udev_watch;
8fe914ec 160 Hashmap *devices_by_sysfs;
ef734fd6
LP
161
162 /* Data specific to the mount subsystem */
163 FILE *proc_self_mountinfo;
164 Watch mount_watch;
ea430986 165
07b0b134
ML
166 /* Data specific to the swap filesystem */
167 FILE *proc_swaps;
e04aad61
LP
168 Hashmap *swaps_by_proc_swaps;
169 bool request_reload;
4e434314 170 Watch swap_watch;
07b0b134 171
ea430986 172 /* Data specific to the D-Bus subsystem */
f278026d 173 DBusConnection *api_bus, *system_bus;
5e8d1c9a
LP
174 DBusServer *private_bus;
175 Set *bus_connections, *bus_connections_for_dispatch;
176
a16e1123
LP
177 DBusMessage *queued_message; /* This is used during reloading:
178 * before the reload we queue the
179 * reply message here, and
180 * afterwards we send it */
7b97f477 181 DBusConnection *queued_message_connection; /* The connection to send the queued message on */
8e274523 182
05e343b7
LP
183 Hashmap *watch_bus; /* D-Bus names => Unit object n:1 */
184 int32_t name_data_slot;
cbd37330 185 int32_t conn_data_slot;
a567261a 186 int32_t subscribed_data_slot;
05e343b7 187
7fab9d01 188 uint32_t current_job_id;
bacbccb7 189 uint32_t default_unit_job_id;
7fab9d01 190
9d58f1db
LP
191 /* Data specific to the Automount subsystem */
192 int dev_autofs_fd;
193
8e274523
LP
194 /* Data specific to the cgroup subsystem */
195 Hashmap *cgroup_bondings; /* path string => CGroupBonding object 1:n */
8e274523 196 char *cgroup_hierarchy;
e537352b 197
701cc384 198 usec_t gc_queue_timestamp;
701cc384
LP
199 int gc_marker;
200 unsigned n_in_gc_queue;
201
35b8ca3a 202 /* Make sure the user cannot accidentally unmount our cgroup
33be102a
LP
203 * file system */
204 int pin_cgroupfs_fd;
205
4927fcae
LP
206 /* Audit fd */
207#ifdef HAVE_AUDIT
208 int audit_fd;
209#endif
210
9d58f1db
LP
211 /* Flags */
212 ManagerRunningAs running_as;
b9080b03 213 ManagerExitCode exit_code:5;
41447faf 214
9d58f1db
LP
215 bool dispatching_load_queue:1;
216 bool dispatching_run_queue:1;
217 bool dispatching_dbus_queue:1;
218
72bc8d00
LP
219 bool taint_usr:1;
220
9e58ff9c 221 bool show_status;
f295f5c0 222 bool confirm_spawn;
07459bb6 223#ifdef HAVE_SYSV_COMPAT
6e98720f 224 bool sysv_console;
07459bb6 225#endif
d3689161 226
0a494f1f
LP
227 ExecOutput default_std_output, default_std_error;
228
a7556052
LP
229 /* non-zero if we are reloading or reexecuting, */
230 int n_reloading;
e409f875
LP
231
232 unsigned n_installed_jobs;
76bf48b7 233 unsigned n_failed_jobs;
f2b68789
LP
234
235 /* Type=idle pipes */
236 int idle_pipe[2];
664f88a7
LP
237
238 char *switch_root;
239 char *switch_root_init;
60918275
LP
240};
241
9e58ff9c 242int manager_new(ManagerRunningAs running_as, Manager **m);
60918275
LP
243void manager_free(Manager *m);
244
a16e1123 245int manager_enumerate(Manager *m);
f50e0a01 246int manager_coldplug(Manager *m);
a16e1123 247int manager_startup(Manager *m, FILE *serialization, FDSet *fds);
f50e0a01 248
60918275 249Job *manager_get_job(Manager *m, uint32_t id);
87f0e418 250Unit *manager_get_unit(Manager *m, const char *name);
60918275 251
86fbf370 252int manager_get_job_from_dbus_path(Manager *m, const char *s, Job **_j);
ea430986 253
398ef8ba
LP
254int manager_load_unit_prepare(Manager *m, const char *name, const char *path, DBusError *e, Unit **_ret);
255int manager_load_unit(Manager *m, const char *name, const char *path, DBusError *e, Unit **_ret);
80fbf05e 256int manager_load_unit_from_dbus_path(Manager *m, const char *s, DBusError *e, Unit **_u);
28247076 257
398ef8ba
LP
258int manager_add_job(Manager *m, JobType type, Unit *unit, JobMode mode, bool force, DBusError *e, Job **_ret);
259int manager_add_job_by_name(Manager *m, JobType type, const char *name, JobMode mode, bool force, DBusError *e, Job **_ret);
60918275 260
87f0e418 261void manager_dump_units(Manager *s, FILE *f, const char *prefix);
cea8e32e 262void manager_dump_jobs(Manager *s, FILE *f, const char *prefix);
a66d02c3 263
7fad411c
LP
264void manager_clear_jobs(Manager *m);
265
c1e1601e
LP
266unsigned manager_dispatch_load_queue(Manager *m);
267unsigned manager_dispatch_run_queue(Manager *m);
268unsigned manager_dispatch_dbus_queue(Manager *m);
f50e0a01 269
06d4c99a 270int manager_set_default_controllers(Manager *m, char **controllers);
b2bb3dbe 271
9152c765 272int manager_loop(Manager *m);
83c60c9f 273
05e343b7
LP
274void manager_dispatch_bus_name_owner_changed(Manager *m, const char *name, const char* old_owner, const char *new_owner);
275void manager_dispatch_bus_query_pid_done(Manager *m, const char *name, pid_t pid);
276
d8d5ab98 277int manager_open_serialization(Manager *m, FILE **_f);
a16e1123
LP
278
279int manager_serialize(Manager *m, FILE *f, FDSet *fds);
280int manager_deserialize(Manager *m, FILE *f, FDSet *fds);
281
282int manager_reload(Manager *m);
283
9e58ff9c
LP
284bool manager_is_booting_or_shutting_down(Manager *m);
285
fdf20a31 286void manager_reset_failed(Manager *m);
5632e374 287
4927fcae 288void manager_send_unit_audit(Manager *m, Unit *u, int type, bool success);
e983b760 289void manager_send_unit_plymouth(Manager *m, Unit *u);
4927fcae 290
8f6df3fa
LP
291bool manager_unit_pending_inactive(Manager *m, const char *name);
292
b0c918b9
LP
293void manager_check_finished(Manager *m);
294
5a1e9937
LP
295void manager_run_generators(Manager *m);
296void manager_undo_generators(Manager *m);
297
4cfa2c99 298void manager_recheck_journal(Manager *m);
f1dd0c3f 299
27d340c7
LP
300void manager_set_show_status(Manager *m, bool b);
301bool manager_get_show_status(Manager *m);
302
05e343b7
LP
303const char *manager_running_as_to_string(ManagerRunningAs i);
304ManagerRunningAs manager_running_as_from_string(const char *s);
305
60918275 306#endif