]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/core/manager.h
relicense to LGPLv2.1 (with exceptions)
[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,
a16e1123
LP
48 _MANAGER_EXIT_CODE_MAX,
49 _MANAGER_EXIT_CODE_INVALID = -1
50} ManagerExitCode;
51
dfcd764e 52typedef enum ManagerRunningAs {
a3d4e06d 53 MANAGER_SYSTEM,
af2d49f7 54 MANAGER_USER,
dfcd764e
LP
55 _MANAGER_RUNNING_AS_MAX,
56 _MANAGER_RUNNING_AS_INVALID = -1
57} ManagerRunningAs;
58
acbb0225
LP
59enum WatchType {
60 WATCH_INVALID,
ef734fd6 61 WATCH_SIGNAL,
8c47c732 62 WATCH_NOTIFY,
acbb0225 63 WATCH_FD,
faf919f1
LP
64 WATCH_UNIT_TIMER,
65 WATCH_JOB_TIMER,
f94ea366 66 WATCH_MOUNT,
4e434314 67 WATCH_SWAP,
ea430986
LP
68 WATCH_UDEV,
69 WATCH_DBUS_WATCH,
70 WATCH_DBUS_TIMEOUT
acbb0225
LP
71};
72
73struct Watch {
74 int fd;
75 WatchType type;
ea430986 76 union {
ac155bb8 77 struct Unit *unit;
faf919f1 78 struct Job *job;
ea430986
LP
79 DBusWatch *bus_watch;
80 DBusTimeout *bus_timeout;
81 } data;
cabab516
LP
82 bool fd_is_dupped:1;
83 bool socket_accept:1;
acbb0225 84};
60918275 85
87f0e418 86#include "unit.h"
60918275
LP
87#include "job.h"
88#include "hashmap.h"
89#include "list.h"
90#include "set.h"
ea430986 91#include "dbus.h"
84e3543e 92#include "path-lookup.h"
60918275
LP
93
94struct Manager {
87f0e418 95 /* Note that the set of units we know of is allowed to be
35b8ca3a 96 * inconsistent. However the subset of it that is loaded may
87d1515d
LP
97 * not, and the list of jobs may neither. */
98
87f0e418
LP
99 /* Active jobs and units */
100 Hashmap *units; /* name string => Unit object n:1 */
60918275
LP
101 Hashmap *jobs; /* job id => Job object 1:1 */
102
ef734fd6
LP
103 /* To make it easy to iterate through the units of a specific
104 * type we maintain a per type linked list */
ac155bb8 105 LIST_HEAD(Unit, units_by_type[_UNIT_TYPE_MAX]);
ef734fd6 106
87f0e418 107 /* Units that need to be loaded */
ac155bb8 108 LIST_HEAD(Unit, load_queue); /* this is actually more a stack than a queue, but uh. */
60918275 109
034c6ed7
LP
110 /* Jobs that need to be run */
111 LIST_HEAD(Job, run_queue); /* more a stack than a queue, too */
112
c1e1601e
LP
113 /* Units and jobs that have not yet been announced via
114 * D-Bus. When something about a job changes it is added here
115 * if it is not in there yet. This allows easy coalescing of
116 * D-Bus change signals. */
ac155bb8 117 LIST_HEAD(Unit, dbus_unit_queue);
c1e1601e
LP
118 LIST_HEAD(Job, dbus_job_queue);
119
701cc384 120 /* Units to remove */
ac155bb8 121 LIST_HEAD(Unit, cleanup_queue);
23a177ef 122
701cc384 123 /* Units to check when doing GC */
ac155bb8 124 LIST_HEAD(Unit, gc_queue);
701cc384 125
e5b5ae50 126 /* Jobs to be added */
87f0e418 127 Hashmap *transaction_jobs; /* Unit object => Job object list 1:1 */
e5b5ae50 128 JobDependency *transaction_anchor;
223dabab 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 bool mount_auto;
173a8d04 227 bool swap_auto;
d3689161 228
0a494f1f
LP
229 ExecOutput default_std_output, default_std_error;
230
a7556052
LP
231 /* non-zero if we are reloading or reexecuting, */
232 int n_reloading;
e409f875
LP
233
234 unsigned n_installed_jobs;
76bf48b7 235 unsigned n_failed_jobs;
60918275
LP
236};
237
9e58ff9c 238int manager_new(ManagerRunningAs running_as, Manager **m);
60918275
LP
239void manager_free(Manager *m);
240
a16e1123 241int manager_enumerate(Manager *m);
f50e0a01 242int manager_coldplug(Manager *m);
a16e1123 243int manager_startup(Manager *m, FILE *serialization, FDSet *fds);
f50e0a01 244
60918275 245Job *manager_get_job(Manager *m, uint32_t id);
87f0e418 246Unit *manager_get_unit(Manager *m, const char *name);
60918275 247
ea430986 248int manager_get_unit_from_dbus_path(Manager *m, const char *s, Unit **_u);
86fbf370 249int manager_get_job_from_dbus_path(Manager *m, const char *s, Job **_j);
ea430986 250
398ef8ba
LP
251int manager_load_unit_prepare(Manager *m, const char *name, const char *path, DBusError *e, Unit **_ret);
252int manager_load_unit(Manager *m, const char *name, const char *path, DBusError *e, Unit **_ret);
28247076 253
398ef8ba
LP
254int manager_add_job(Manager *m, JobType type, Unit *unit, JobMode mode, bool force, DBusError *e, Job **_ret);
255int manager_add_job_by_name(Manager *m, JobType type, const char *name, JobMode mode, bool force, DBusError *e, Job **_ret);
60918275 256
87f0e418 257void manager_dump_units(Manager *s, FILE *f, const char *prefix);
cea8e32e 258void manager_dump_jobs(Manager *s, FILE *f, const char *prefix);
a66d02c3 259
23a177ef 260void manager_transaction_unlink_job(Manager *m, Job *j, bool delete_dependencies);
e5b5ae50 261
7fad411c
LP
262void manager_clear_jobs(Manager *m);
263
c1e1601e
LP
264unsigned manager_dispatch_load_queue(Manager *m);
265unsigned manager_dispatch_run_queue(Manager *m);
266unsigned manager_dispatch_dbus_queue(Manager *m);
f50e0a01 267
06d4c99a 268int manager_set_default_controllers(Manager *m, char **controllers);
b2bb3dbe 269
9152c765 270int manager_loop(Manager *m);
83c60c9f 271
05e343b7
LP
272void manager_dispatch_bus_name_owner_changed(Manager *m, const char *name, const char* old_owner, const char *new_owner);
273void manager_dispatch_bus_query_pid_done(Manager *m, const char *name, pid_t pid);
274
d8d5ab98 275int manager_open_serialization(Manager *m, FILE **_f);
a16e1123
LP
276
277int manager_serialize(Manager *m, FILE *f, FDSet *fds);
278int manager_deserialize(Manager *m, FILE *f, FDSet *fds);
279
280int manager_reload(Manager *m);
281
9e58ff9c
LP
282bool manager_is_booting_or_shutting_down(Manager *m);
283
fdf20a31 284void manager_reset_failed(Manager *m);
5632e374 285
4927fcae 286void manager_send_unit_audit(Manager *m, Unit *u, int type, bool success);
e983b760 287void manager_send_unit_plymouth(Manager *m, Unit *u);
4927fcae 288
8f6df3fa
LP
289bool manager_unit_pending_inactive(Manager *m, const char *name);
290
b0c918b9
LP
291void manager_check_finished(Manager *m);
292
5a1e9937
LP
293void manager_run_generators(Manager *m);
294void manager_undo_generators(Manager *m);
295
4cfa2c99 296void manager_recheck_journal(Manager *m);
f1dd0c3f 297
27d340c7
LP
298void manager_set_show_status(Manager *m, bool b);
299bool manager_get_show_status(Manager *m);
300
05e343b7
LP
301const char *manager_running_as_to_string(ManagerRunningAs i);
302ManagerRunningAs manager_running_as_from_string(const char *s);
303
60918275 304#endif