]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/libsystemd/sd-bus/bus-internal.h
Merge pull request #7388 from keszybz/doc-tweak
[thirdparty/systemd.git] / src / libsystemd / sd-bus / bus-internal.h
CommitLineData
de1c301e
LP
1#pragma once
2
3/***
4 This file is part of systemd.
5
6 Copyright 2013 Lennart Poettering
7
8 systemd is free software; you can redistribute it and/or modify it
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
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
16 Lesser General Public License for more details.
17
18 You should have received a copy of the GNU Lesser General Public License
19 along with systemd; If not, see <http://www.gnu.org/licenses/>.
20***/
21
45fbe937 22#include <pthread.h>
07630cea 23#include <sys/socket.h>
de1c301e
LP
24
25#include "sd-bus.h"
07630cea 26
de1c301e 27#include "bus-error.h"
bc7fd8cd 28#include "bus-kernel.h"
07630cea 29#include "bus-match.h"
036d61b3 30#include "def.h"
07630cea 31#include "hashmap.h"
07630cea
LP
32#include "list.h"
33#include "prioq.h"
34#include "refcnt.h"
35#include "socket-util.h"
36#include "util.h"
de1c301e
LP
37
38struct reply_callback {
52f3ba91 39 sd_bus_message_handler_t callback;
de1c301e 40 usec_t timeout;
693eb9a2 41 uint64_t cookie;
e3017af9 42 unsigned prioq_idx;
de1c301e
LP
43};
44
45struct filter_callback {
52f3ba91 46 sd_bus_message_handler_t callback;
de1c301e 47
7286037f
LP
48 unsigned last_iteration;
49
de1c301e
LP
50 LIST_FIELDS(struct filter_callback, callbacks);
51};
52
19befb2d
LP
53struct match_callback {
54 sd_bus_message_handler_t callback;
55
19befb2d
LP
56 unsigned last_iteration;
57
58 char *match_string;
59
60 struct bus_match_node *match_node;
61};
62
29ddb38f
LP
63struct node {
64 char *path;
65 struct node *parent;
66 LIST_HEAD(struct node, child);
67 LIST_FIELDS(struct node, siblings);
68
69 LIST_HEAD(struct node_callback, callbacks);
70 LIST_HEAD(struct node_vtable, vtables);
71 LIST_HEAD(struct node_enumerator, enumerators);
19befb2d 72 LIST_HEAD(struct node_object_manager, object_managers);
29ddb38f
LP
73};
74
75struct node_callback {
76 struct node *node;
77
78 bool is_fallback;
52f3ba91 79 sd_bus_message_handler_t callback;
a652755d 80
29ddb38f
LP
81 unsigned last_iteration;
82
83 LIST_FIELDS(struct node_callback, callbacks);
84};
85
86struct node_enumerator {
87 struct node *node;
88
89 sd_bus_node_enumerator_t callback;
29ddb38f
LP
90
91 unsigned last_iteration;
92
93 LIST_FIELDS(struct node_enumerator, enumerators);
94};
95
19befb2d
LP
96struct node_object_manager {
97 struct node *node;
98
99 LIST_FIELDS(struct node_object_manager, object_managers);
100};
101
29ddb38f
LP
102struct node_vtable {
103 struct node *node;
104
105 char *interface;
a652755d 106 bool is_fallback;
29ddb38f 107 const sd_bus_vtable *vtable;
29ddb38f 108 sd_bus_object_find_t find;
7286037f
LP
109
110 unsigned last_iteration;
29ddb38f
LP
111
112 LIST_FIELDS(struct node_vtable, vtables);
113};
114
115struct vtable_member {
116 const char *path;
117 const char *interface;
118 const char *member;
119 struct node_vtable *parent;
120 unsigned last_iteration;
121 const sd_bus_vtable *vtable;
a652755d
LP
122};
123
19befb2d 124typedef enum BusSlotType {
19befb2d
LP
125 BUS_REPLY_CALLBACK,
126 BUS_FILTER_CALLBACK,
127 BUS_MATCH_CALLBACK,
128 BUS_NODE_CALLBACK,
129 BUS_NODE_ENUMERATOR,
130 BUS_NODE_VTABLE,
131 BUS_NODE_OBJECT_MANAGER,
a71fe8b8 132 _BUS_SLOT_INVALID = -1,
19befb2d
LP
133} BusSlotType;
134
135struct sd_bus_slot {
136 unsigned n_ref;
137 sd_bus *bus;
138 void *userdata;
a71fe8b8
LP
139 BusSlotType type:5;
140 bool floating:1;
cc65fe5e 141 bool match_added:1;
9cbfc66c 142 char *description;
19befb2d
LP
143
144 LIST_FIELDS(sd_bus_slot, slots);
145
146 union {
147 struct reply_callback reply_callback;
148 struct filter_callback filter_callback;
149 struct match_callback match_callback;
150 struct node_callback node_callback;
151 struct node_enumerator node_enumerator;
152 struct node_object_manager node_object_manager;
153 struct node_vtable node_vtable;
154 };
155};
156
de1c301e 157enum bus_state {
021a1e78 158 BUS_UNSET,
de1c301e
LP
159 BUS_OPENING,
160 BUS_AUTHENTICATING,
161 BUS_HELLO,
f54514f3 162 BUS_RUNNING,
718db961 163 BUS_CLOSING,
f54514f3 164 BUS_CLOSED
de1c301e
LP
165};
166
f54514f3 167static inline bool BUS_IS_OPEN(enum bus_state state) {
718db961 168 return state > BUS_UNSET && state < BUS_CLOSING;
f54514f3
LP
169}
170
2181a7f5
LP
171enum bus_auth {
172 _BUS_AUTH_INVALID,
173 BUS_AUTH_EXTERNAL,
174 BUS_AUTH_ANONYMOUS
175};
176
de1c301e 177struct sd_bus {
e4ee6e5c
LP
178 /* We use atomic ref counting here since sd_bus_message
179 objects retain references to their originating sd_bus but
180 we want to allow them to be processed in a different
181 thread. We won't provide full thread safety, but only the
182 bare minimum that makes it possible to use sd_bus and
183 sd_bus_message objects independently and on different
184 threads as long as each object is used only once at the
185 same time. */
186 RefCount n_ref;
187
de1c301e 188 enum bus_state state;
e82c9509 189 int input_fd, output_fd;
de1c301e 190 int message_version;
0f437184 191 int message_endian;
021a1e78 192
de1c301e 193 bool can_fds:1;
94bbf1ba 194 bool bus_client:1;
2571ead1 195 bool ucred_valid:1;
2181a7f5
LP
196 bool is_server:1;
197 bool anonymous_auth:1;
15d5af81
LP
198 bool prefer_readv:1;
199 bool prefer_writev:1;
7286037f
LP
200 bool match_callbacks_modified:1;
201 bool filter_callbacks_modified:1;
29ddb38f 202 bool nodes_modified:1;
adacb957 203 bool trusted:1;
758bf0c7 204 bool manual_peer_interface:1;
5972fe95
LP
205 bool is_system:1;
206 bool is_user:1;
c0765ddb 207 bool allow_interactive_authorization:1;
fbb4603d
LP
208 bool exit_on_disconnect:1;
209 bool exited:1;
210 bool exit_triggered:1;
694859b5 211 bool is_local:1;
de1c301e 212
8f155917
LP
213 int use_memfd;
214
de1c301e
LP
215 void *rbuffer;
216 size_t rbuffer_size;
217
218 sd_bus_message **rqueue;
821e0756
LP
219 unsigned rqueue_size;
220 size_t rqueue_allocated;
de1c301e
LP
221
222 sd_bus_message **wqueue;
223 unsigned wqueue_size;
224 size_t windex;
821e0756 225 size_t wqueue_allocated;
de1c301e 226
693eb9a2 227 uint64_t cookie;
de1c301e
LP
228
229 char *unique_name;
219728b3 230 uint64_t unique_id;
de1c301e 231
392d5b37 232 struct bus_match_node match_callbacks;
e3017af9 233 Prioq *reply_callbacks_prioq;
c9fe4af7 234 OrderedHashmap *reply_callbacks;
de1c301e 235 LIST_HEAD(struct filter_callback, filter_callbacks);
29ddb38f
LP
236
237 Hashmap *nodes;
29ddb38f
LP
238 Hashmap *vtable_methods;
239 Hashmap *vtable_properties;
de1c301e 240
3cb46740 241 union sockaddr_union sockaddr;
de1c301e
LP
242 socklen_t sockaddr_size;
243
a7893c6b 244 char *machine;
ee502e0c 245 pid_t nspid;
6629161f 246
98178d39 247 sd_id128_t server_id;
de1c301e
LP
248
249 char *address;
250 unsigned address_index;
251
252 int last_connect_error;
253
2181a7f5
LP
254 enum bus_auth auth;
255 size_t auth_rbegin;
de1c301e
LP
256 struct iovec auth_iovec[3];
257 unsigned auth_index;
2181a7f5 258 char *auth_buffer;
e3017af9 259 usec_t auth_timeout;
2571ead1
LP
260
261 struct ucred ucred;
c4e6556c 262 char *label;
2c93b4ef 263
5b12334d
LP
264 uint64_t creds_mask;
265
2c93b4ef
LP
266 int *fds;
267 unsigned n_fds;
2fd9ae2e
LP
268
269 char *exec_path;
270 char **exec_argv;
9d373862 271
7286037f 272 unsigned iteration_counter;
fd8d62d9 273
45fbe937
LP
274 /* We do locking around the memfd cache, since we want to
275 * allow people to process a sd_bus_message in a different
276 * thread then it was generated on and free it there. Since
277 * adding something to the memfd cache might happen when a
278 * message is released, we hence need to protect this bit with
279 * a mutex. */
280 pthread_mutex_t memfd_cache_mutex;
bc7fd8cd
LP
281 struct memfd_cache memfd_cache[MEMFD_CACHE_MAX];
282 unsigned n_memfd_cache;
d5a2b9a6
LP
283
284 pid_t original_pid;
264ad849
LP
285
286 uint64_t hello_flags;
d21a7bb1 287 uint64_t attach_flags;
c7819669 288
40ca29a1
LP
289 sd_event_source *input_io_event_source;
290 sd_event_source *output_io_event_source;
291 sd_event_source *time_event_source;
abc5fe72 292 sd_event_source *quit_event_source;
40ca29a1 293 sd_event *event;
1e05d493 294 int event_priority;
affff0b6 295
19befb2d
LP
296 sd_bus_message *current_message;
297 sd_bus_slot *current_slot;
caa82984
LP
298 sd_bus_message_handler_t current_handler;
299 void *current_userdata;
76b54375
LP
300
301 sd_bus **default_bus_ptr;
302 pid_t tid;
8a0e0ed9 303
751bc6ac 304 char *cgroup_root;
5972fe95 305
455971c1 306 char *description;
b28ff39f 307
8f8f05a9 308 sd_bus_track *track_queue;
19befb2d
LP
309
310 LIST_HEAD(sd_bus_slot, slots);
232f3677 311 LIST_HEAD(sd_bus_track, tracks);
40ca29a1 312};
e3017af9 313
036d61b3 314/* For method calls we time-out at 25s, like in the D-Bus reference implementation */
e3017af9 315#define BUS_DEFAULT_TIMEOUT ((usec_t) (25 * USEC_PER_SEC))
25220239 316
036d61b3
LP
317/* For the authentication phase we grant 90s, to provide extra room during boot, when RNGs and such are not filled up
318 * with enough entropy yet and might delay the boot */
319#define BUS_AUTH_TIMEOUT ((usec_t) DEFAULT_TIMEOUT_USEC)
320
5ddda46f
LP
321#define BUS_WQUEUE_MAX (192*1024)
322#define BUS_RQUEUE_MAX (192*1024)
25220239
LP
323
324#define BUS_MESSAGE_SIZE_MAX (64*1024*1024)
325#define BUS_AUTH_SIZE_MAX (64*1024)
ac89bf1d 326
ed205a6b
LP
327#define BUS_CONTAINER_DEPTH 128
328
ac89bf1d
LP
329/* Defined by the specification as maximum size of an array in
330 * bytes */
331#define BUS_ARRAY_MAX_SIZE 67108864
332
2c93b4ef
LP
333#define BUS_FDS_MAX 1024
334
2fd9ae2e
LP
335#define BUS_EXEC_ARGV_MAX 256
336
0ce036ce
LP
337bool interface_name_is_valid(const char *p) _pure_;
338bool service_name_is_valid(const char *p) _pure_;
f5d8989c 339char* service_name_startswith(const char *a, const char *b);
0ce036ce
LP
340bool member_name_is_valid(const char *p) _pure_;
341bool object_path_is_valid(const char *p) _pure_;
342char *object_path_startswith(const char *a, const char *b) _pure_;
6693860f 343
0ce036ce
LP
344bool namespace_complex_pattern(const char *pattern, const char *value) _pure_;
345bool path_complex_pattern(const char *pattern, const char *value) _pure_;
392d5b37 346
0ce036ce
LP
347bool namespace_simple_pattern(const char *pattern, const char *value) _pure_;
348bool path_simple_pattern(const char *pattern, const char *value) _pure_;
392d5b37 349
0ce036ce
LP
350int bus_message_type_from_string(const char *s, uint8_t *u) _pure_;
351const char *bus_message_type_to_string(uint8_t u) _pure_;
392d5b37 352
6693860f 353#define error_name_is_valid interface_name_is_valid
20902f3e
LP
354
355int bus_ensure_running(sd_bus *bus);
a7e3212d
LP
356int bus_start_running(sd_bus *bus);
357int bus_next_address(sd_bus *bus);
d5a2b9a6 358
7adc46fc 359int bus_seal_synthetic_message(sd_bus *b, sd_bus_message *m);
777d7a61 360
7adc46fc 361int bus_rqueue_make_room(sd_bus *bus);
7d22c717 362
d5a2b9a6 363bool bus_pid_changed(sd_bus *bus);
92e189e5 364
0f8bd8de
LP
365char *bus_address_escape(const char *v);
366
92e189e5
LP
367#define OBJECT_PATH_FOREACH_PREFIX(prefix, path) \
368 for (char *_slash = ({ strcpy((prefix), (path)); streq((prefix), "/") ? NULL : strrchr((prefix), '/'); }) ; \
369 _slash && !(_slash[(_slash) == (prefix)] = 0); \
370 _slash = streq((prefix), "/") ? NULL : strrchr((prefix), '/'))
8ce2afd6
LP
371
372/* If we are invoking callbacks of a bus object, ensure unreffing the
373 * bus from the callback doesn't destroy the object we are working
374 * on */
375#define BUS_DONT_DESTROY(bus) \
4afd3348 376 _cleanup_(sd_bus_unrefp) _unused_ sd_bus *_dont_destroy_##bus = sd_bus_ref(bus)
09365592
LP
377
378int bus_set_address_system(sd_bus *bus);
379int bus_set_address_user(sd_bus *bus);
380int bus_set_address_system_remote(sd_bus *b, const char *host);
de33fc62 381int bus_set_address_system_machine(sd_bus *b, const char *machine);
19befb2d
LP
382
383int bus_remove_match_by_string(sd_bus *bus, const char *match, sd_bus_message_handler_t callback, void *userdata);
fe3f22d1
DK
384
385int bus_get_root_path(sd_bus *bus);
a095315b
KS
386
387int bus_maybe_reply_error(sd_bus_message *m, int r, sd_bus_error *error);
d4d00020 388
759e02e7
LP
389#define bus_assert_return(expr, r, error) \
390 do { \
34c38d2a 391 if (!assert_log(expr, #expr)) \
759e02e7
LP
392 return sd_bus_error_set_errno(error, r); \
393 } while (false)
a132bef0
ZJS
394
395/**
396 * enum kdbus_attach_flags - flags for metadata attachments
397 * @KDBUS_ATTACH_TIMESTAMP: Timestamp
398 * @KDBUS_ATTACH_CREDS: Credentials
399 * @KDBUS_ATTACH_PIDS: PIDs
400 * @KDBUS_ATTACH_AUXGROUPS: Auxiliary groups
401 * @KDBUS_ATTACH_NAMES: Well-known names
402 * @KDBUS_ATTACH_TID_COMM: The "comm" process identifier of the TID
403 * @KDBUS_ATTACH_PID_COMM: The "comm" process identifier of the PID
404 * @KDBUS_ATTACH_EXE: The path of the executable
405 * @KDBUS_ATTACH_CMDLINE: The process command line
406 * @KDBUS_ATTACH_CGROUP: The croup membership
407 * @KDBUS_ATTACH_CAPS: The process capabilities
408 * @KDBUS_ATTACH_SECLABEL: The security label
409 * @KDBUS_ATTACH_AUDIT: The audit IDs
410 * @KDBUS_ATTACH_CONN_DESCRIPTION: The human-readable connection name
411 * @_KDBUS_ATTACH_ALL: All of the above
412 * @_KDBUS_ATTACH_ANY: Wildcard match to enable any kind of
413 * metatdata.
414 */
415enum kdbus_attach_flags {
416 KDBUS_ATTACH_TIMESTAMP = 1ULL << 0,
417 KDBUS_ATTACH_CREDS = 1ULL << 1,
418 KDBUS_ATTACH_PIDS = 1ULL << 2,
419 KDBUS_ATTACH_AUXGROUPS = 1ULL << 3,
420 KDBUS_ATTACH_NAMES = 1ULL << 4,
421 KDBUS_ATTACH_TID_COMM = 1ULL << 5,
422 KDBUS_ATTACH_PID_COMM = 1ULL << 6,
423 KDBUS_ATTACH_EXE = 1ULL << 7,
424 KDBUS_ATTACH_CMDLINE = 1ULL << 8,
425 KDBUS_ATTACH_CGROUP = 1ULL << 9,
426 KDBUS_ATTACH_CAPS = 1ULL << 10,
427 KDBUS_ATTACH_SECLABEL = 1ULL << 11,
428 KDBUS_ATTACH_AUDIT = 1ULL << 12,
429 KDBUS_ATTACH_CONN_DESCRIPTION = 1ULL << 13,
430 _KDBUS_ATTACH_ALL = (1ULL << 14) - 1,
431 _KDBUS_ATTACH_ANY = ~0ULL
432};
433
434/**
435 * enum kdbus_hello_flags - flags for struct kdbus_cmd_hello
436 * @KDBUS_HELLO_ACCEPT_FD: The connection allows the reception of
437 * any passed file descriptors
438 * @KDBUS_HELLO_ACTIVATOR: Special-purpose connection which registers
439 * a well-know name for a process to be started
440 * when traffic arrives
441 * @KDBUS_HELLO_POLICY_HOLDER: Special-purpose connection which registers
442 * policy entries for a name. The provided name
443 * is not activated and not registered with the
444 * name database, it only allows unprivileged
445 * connections to acquire a name, talk or discover
446 * a service
447 * @KDBUS_HELLO_MONITOR: Special-purpose connection to monitor
448 * bus traffic
449 */
450enum kdbus_hello_flags {
451 KDBUS_HELLO_ACCEPT_FD = 1ULL << 0,
452 KDBUS_HELLO_ACTIVATOR = 1ULL << 1,
453 KDBUS_HELLO_POLICY_HOLDER = 1ULL << 2,
454 KDBUS_HELLO_MONITOR = 1ULL << 3,
455};