chiark / gitweb /
441bfab9e7b35d69be153093d9f0c031c53bdec6
[elogind.git] / src / libsystemd-bus / kdbus.h
1 /*
2  * Copyright (C) 2013 Kay Sievers
3  * Copyright (C) 2013 Greg Kroah-Hartman <gregkh@linuxfoundation.org>
4  * Copyright (C) 2013 Linux Foundation
5  *
6  * kdbus is free software; you can redistribute it and/or modify it under
7  * the terms of the GNU Lesser General Public License as published by the
8  * Free Software Foundation; either version 2.1 of the License, or (at
9  * your option) any later version.
10  */
11
12 #ifndef _KDBUS_H_
13 #define _KDBUS_H_
14
15 #ifndef __KERNEL__
16 #include <sys/ioctl.h>
17 #include <sys/types.h>
18 #include <linux/types.h>
19 #endif
20
21 #define KDBUS_IOC_MAGIC                 0x95
22
23 /* Message sent from kernel to userspace, when the owner or starter of
24  * a well-known name changes */
25 struct kdbus_manager_msg_name_change {
26         __u64 old_id;
27         __u64 new_id;
28         __u64 flags;            /* 0 or (possibly?) KDBUS_CMD_NAME_IN_QUEUE */
29         char name[0];
30 };
31
32 struct kdbus_manager_msg_id_change {
33         __u64 id;
34         __u64 flags; /* The kernel flags field from KDBUS_CMD_HELLO */
35 };
36
37 struct kdbus_creds {
38         __u64 uid;
39         __u64 gid;
40         __u64 pid;
41         __u64 tid;
42
43         /* The starttime of the process PID. This is useful to detect
44         PID overruns from the client side. i.e. if you use the PID to
45         look something up in /proc/$PID/ you can afterwards check the
46         starttime field of it to ensure you didn't run into a PID
47         ovretun. */
48         __u64 starttime;
49 };
50
51 struct kdbus_audit {
52         __u64 sessionid;
53         __u64 loginuid;
54 };
55
56 struct kdbus_timestamp {
57         __u64 monotonic_ns;
58         __u64 realtime_ns;
59 };
60
61 #define KDBUS_SRC_ID_KERNEL             (0)
62 #define KDBUS_DST_ID_WELL_KNOWN_NAME    (0)
63 #define KDBUS_MATCH_SRC_ID_ANY          (~0ULL)
64 #define KDBUS_DST_ID_BROADCAST          (~0ULL)
65
66 /* Message Data Types */
67 enum {
68         /* Filled in by userspace */
69         KDBUS_MSG_NULL,                 /* empty record */
70         KDBUS_MSG_PAYLOAD,              /* .data */
71         KDBUS_MSG_PAYLOAD_VEC,          /* .data_vec */
72         KDBUS_MSG_UNIX_FDS,             /* .data_fds of file descriptors */
73         KDBUS_MSG_BLOOM,                /* for broadcasts, carries bloom filter blob in .data */
74         KDBUS_MSG_DST_NAME,             /* destination's well-known name, in .str */
75
76         /* Filled in by kernelspace */
77         KDBUS_MSG_SRC_NAMES     = 0x200,/* NUL separated string list with well-known names of source */
78         KDBUS_MSG_TIMESTAMP,            /* .timestamp */
79         KDBUS_MSG_SRC_CREDS,            /* .creds */
80         KDBUS_MSG_SRC_PID_COMM,         /* optional, in .str */
81         KDBUS_MSG_SRC_TID_COMM,         /* optional, in .str */
82         KDBUS_MSG_SRC_EXE,              /* optional, in .str */
83         KDBUS_MSG_SRC_CMDLINE,          /* optional, in .str (a chain of NUL str) */
84         KDBUS_MSG_SRC_CGROUP,           /* optional, in .str */
85         KDBUS_MSG_SRC_CAPS,             /* caps data blob, in .data */
86         KDBUS_MSG_SRC_SECLABEL,         /* NUL terminated string, in .str */
87         KDBUS_MSG_SRC_AUDIT,            /* .audit */
88
89         /* Special messages from kernel, consisting of one and only one of these data blocks */
90         KDBUS_MSG_NAME_ADD      = 0x400,/* .name_change */
91         KDBUS_MSG_NAME_REMOVE,          /* .name_change */
92         KDBUS_MSG_NAME_CHANGE,          /* .name_change */
93         KDBUS_MSG_ID_ADD,               /* .id_change */
94         KDBUS_MSG_ID_REMOVE,            /* .id_change */
95         KDBUS_MSG_ID_CHANGE,            /* .id_change */
96         KDBUS_MSG_REPLY_TIMEOUT,        /* empty, but .reply_cookie in .kdbus_msg is filled in */
97         KDBUS_MSG_REPLY_DEAD,           /* dito */
98 };
99
100 struct kdbus_vec {
101         __u64 address;
102         __u64 size;
103 };
104
105 /**
106  * struct  kdbus_msg_data - chain of data blocks
107  *
108  * size: overall data record size
109  * type: kdbus_msg_data_type of data
110  */
111 struct kdbus_msg_data {
112         __u64 size;
113         __u64 type;
114         union {
115                 /* inline data */
116                 __u8 data[0];
117                 char str[0];
118
119                 /* data vector */
120                 struct kdbus_vec vec;
121
122                 /* specific fields */
123                 int fds[0];                             /* int array of file descriptors */
124                 struct kdbus_creds creds;
125                 struct kdbus_audit audit;
126                 struct kdbus_timestamp timestamp;
127                 struct kdbus_manager_msg_name_change name_change;
128                 struct kdbus_manager_msg_id_change id_change;
129         };
130 };
131
132 enum {
133         KDBUS_MSG_FLAGS_EXPECT_REPLY    = 1,
134         KDBUS_MSG_FLAGS_NO_AUTO_START   = 2, /* possibly? */
135 };
136
137 enum {
138         KDBUS_PAYLOAD_NONE      = 0,
139         KDBUS_PAYLOAD_DBUS1     = 0x4442757356657231ULL, /* 'DBusVer1' */
140         KDBUS_PAYLOAD_GVARIANT  = 0x4756617269616e74ULL, /* 'GVariant' */
141 };
142
143 /**
144  * struct kdbus_msg
145  *
146  * set by userspace:
147  * dst_id: destination id
148  * flags: KDBUS_MSG_FLAGS_*
149  * data_size: overall message size
150  * data: data records
151  *
152  * set by kernel:
153  * src_id: who sent the message
154  */
155 struct kdbus_msg {
156         __u64 size;
157         __u64 flags;
158         __u64 dst_id;           /* connection, 0 == name in data, ~0 broadcast */
159         __u64 src_id;           /* connection, 0 == kernel */
160         __u64 payload_type;     /* 'DBusVer1', 'GVariant', ... */
161         __u64 cookie;           /* userspace-supplied cookie */
162         union {
163                 __u64 cookie_reply;     /* cookie we reply to */
164                 __u64 timeout_ns;       /* timespan to wait for reply */
165         };
166         struct kdbus_msg_data data[0];
167 };
168
169 enum {
170         KDBUS_POLICY_NAME,
171         KDBUS_POLICY_ACCESS,
172 };
173
174 enum {
175         KDBUS_POLICY_USER,
176         KDBUS_POLICY_GROUP,
177         KDBUS_POLICY_WORLD,
178 };
179
180 enum {
181         KDBUS_POLICY_RECV       = 4,
182         KDBUS_POLICY_SEND       = 2,
183         KDBUS_POLICY_OWN        = 1,
184 };
185
186 struct kdbus_policy {
187         __u64 size;
188         __u64 type; /* NAME or ACCESS */
189         union {
190                 char name[0];
191                 struct {
192                         __u32 type;     /* USER, GROUP, WORLD */
193                         __u32 bits;     /* RECV, SEND, OWN */
194                         __u64 id;       /* uid, gid, 0 */
195                 } access;
196         };
197 };
198
199 struct kdbus_cmd_policy {
200         __u64 size;
201         __u8 buffer[0]; /* a series of KDBUS_POLICY_NAME plus one or
202                          * more KDBUS_POLICY_ACCESS each. */
203 };
204
205 enum {
206         KDBUS_CMD_HELLO_STARTER         =  1 <<  0,
207         KDBUS_CMD_HELLO_ACCEPT_FD       =  1 <<  1,
208         KDBUS_CMD_HELLO_ACCEPT_MMAP     =  1 <<  2,
209
210         /* The following have an effect on directed messages only --
211          * not for broadcasts */
212         KDBUS_CMD_HELLO_ATTACH_COMM     =  1 << 10,
213         KDBUS_CMD_HELLO_ATTACH_EXE      =  1 << 11,
214         KDBUS_CMD_HELLO_ATTACH_CMDLINE  =  1 << 12,
215         KDBUS_CMD_HELLO_ATTACH_CGROUP   =  1 << 13,
216         KDBUS_CMD_HELLO_ATTACH_CAPS     =  1 << 14,
217         KDBUS_CMD_HELLO_ATTACH_SECLABEL =  1 << 15,
218         KDBUS_CMD_HELLO_ATTACH_AUDIT    =  1 << 16,
219 };
220
221 /* Flags for kdbus_cmd_bus_make, kdbus_cmd_ep_make and
222  * kdbus_cmd_ns_make */
223 enum {
224         KDBUS_ACCESS_GROUP      =  1,
225         KDBUS_ACCESS_WORLD      =  2,
226         KDBUS_POLICY_OPEN       =  4,
227 };
228
229 struct kdbus_cmd_hello {
230         /* userspace → kernel, kernel → userspace */
231         __u64 conn_flags;       /* userspace specifies its
232                                  * capabilities and more, kernel
233                                  * returns its capabilites and
234                                  * more. Kernel might refuse client's
235                                  * capabilities by returning an error
236                                  * from KDBUS_CMD_HELLO */
237
238         /* userspace → kernel */
239         __u64 pid;              /* To allow translator services which
240                                  * connect to the bus on behalf of
241                                  * somebody else, allow specifiying
242                                  * the PID of the client to connect on
243                                  * behalf on. Normal clients should
244                                  * pass this as 0 (i.e. to do things
245                                  * under their own PID). Priviliged
246                                  * clients can pass != 0, to operate
247                                  * on behalf of somebody else. */
248
249         /* kernel → userspace */
250         __u64 bus_flags;        /* this is .flags copied verbatim from
251                                  * from original KDBUS_CMD_BUS_MAKE
252                                  * ioctl. It's intended to be useful
253                                  * to do negotiation of features of
254                                  * the payload that is transfreted. */
255         __u64 id;               /* peer id */
256         __u64 bloom_size;       /* The bloom filter size chosen by the
257                                  * bus owner */
258 };
259
260 struct kdbus_cmd_bus_make {
261         __u64 size;
262         __u64 flags;            /* userspace → kernel, kernel → userspace
263                                  * When creating a bus feature
264                                  * kernel negotiation. */
265         __u64 bus_flags;        /* userspace → kernel
266                                  * When a bus is created this value is
267                                  * copied verbatim into the bus
268                                  * structure and returned from
269                                  * KDBUS_CMD_HELLO, later */
270         __u64 cgroup_id;        /* the cgroup hierarchy ID for which
271                                  * to attach cgroup membership paths
272                                  * to messages. 0 if no cgroup data
273                                  * shall be attached. */
274         __u64 bloom_size;       /* Size of the bloom filter for this bus. */
275         char name[0];
276 };
277
278 struct kdbus_cmd_ep_make {
279         __u64 size;
280         __u64 flags;            /* userspace → kernel, kernel → userspace
281                                  * When creating an entry point
282                                  * feature kernel negotiation done the
283                                  * same way as for
284                                  * KDBUS_CMD_BUS_MAKE. Unused for
285                                  * now. */
286         char name[0];
287 };
288
289 struct kdbus_cmd_ns_make {
290         __u64 size;
291         __u64 flags;            /* userspace → kernel, kernel → userspace
292                                  * When creating an entry point
293                                  * feature kernel negotiation done the
294                                  * same way as for
295                                  * KDBUS_CMD_BUS_MAKE. Unused for
296                                  * now. */
297         char name[0];
298 };
299
300 enum {
301         /* userspace → kernel */
302         KDBUS_CMD_NAME_REPLACE_EXISTING         =  1,
303         KDBUS_CMD_NAME_QUEUE                    =  2,
304         KDBUS_CMD_NAME_ALLOW_REPLACEMENT        =  4,
305
306         /* kernel → userspace */
307         KDBUS_CMD_NAME_IN_QUEUE = 0x200,
308 };
309
310 struct kdbus_cmd_name {
311         __u64 size;
312         __u64 name_flags;
313         __u64 id;               /* We allow registration/deregestration of names of other peers */
314         __u64 conn_flags;
315         char name[0];
316 };
317
318 struct kdbus_cmd_names {
319         __u64 size;
320         struct kdbus_cmd_name names[0];
321 };
322
323 enum {
324         KDBUS_CMD_NAME_INFO_ITEM_NAME,
325         KDBUS_CMD_NAME_INFO_ITEM_SECLABEL,
326         KDBUS_CMD_NAME_INFO_ITEM_AUDIT,
327 };
328
329 struct kdbus_cmd_name_info_item {
330         __u64 size;
331         __u64 type;
332         __u8 data[0];
333 };
334
335 struct kdbus_cmd_name_info {
336         __u64 size;                     /* overall size of info */
337         __u64 flags;
338         __u64 id;                       /* either ID, or 0 and _ITEM_NAME follows */
339         struct kdbus_creds creds;
340         struct kdbus_cmd_name_info_item item[0]; /* list of item records */
341 };
342
343 enum {
344         KDBUS_CMD_MATCH_BLOOM,          /* Matches a mask blob against KDBUS_MSG_BLOOM */
345         KDBUS_CMD_MATCH_SRC_NAME,       /* Matches a name string against KDBUS_MSG_SRC_NAMES */
346         KDBUS_CMD_MATCH_NAME_ADD,       /* Matches a name string against KDBUS_MSG_NAME_ADD */
347         KDBUS_CMD_MATCH_NAME_REMOVE,    /* Matches a name string against KDBUS_MSG_NAME_REMOVE */
348         KDBUS_CMD_MATCH_NAME_CHANGE,    /* Matches a name string against KDBUS_MSG_NAME_CHANGE */
349         KDBUS_CMD_MATCH_ID_ADD,         /* Matches an ID against KDBUS_MSG_ID_ADD */
350         KDBUS_CMD_MATCH_ID_REMOVE,      /* Matches an ID against KDBUS_MSG_ID_REMOVE */
351         KDBUS_CMD_MATCH_ID_CHANGE,      /* Matches an ID against KDBUS_MSG_ID_CHANGE */
352 };
353
354 struct kdbus_cmd_match_item {
355         __u64 size;
356         __u64 type;
357         __u8 data[0];
358 };
359
360 struct kdbus_cmd_match {
361         __u64 size;
362         __u64 id;       /* We allow registration/deregestration of matches for other peers */
363         __u64 cookie;   /* userspace supplied cookie; when removing; kernel deletes everything with same cookie */
364         __u64 src_id;   /* ~0: any. other: exact unique match */
365         struct kdbus_cmd_match_item items[0];
366 };
367
368 struct kdbus_cmd_monitor {
369         __u64 id;               /* We allow setting the monitor flag of other peers */
370         int enabled;            /* A boolean to enable/disable monitoring */
371 };
372
373 /* FD states:
374  * control nodes: unset
375  *   bus owner  (via KDBUS_CMD_BUS_MAKE)
376  *   ns owner   (via KDBUS_CMD_NS_MAKE)
377  *
378  * ep nodes: unset
379  *   connected  (via KDBUS_CMD_HELLO)
380  *   starter    (via KDBUS_CMD_HELLO with KDBUS_CMD_HELLO_STARTER)
381  *   ep owner   (via KDBUS_CMD_EP_MAKE)
382  */
383 enum kdbus_cmd {
384         /* kdbus control node commands: require unset state */
385         KDBUS_CMD_BUS_MAKE =            _IOWR(KDBUS_IOC_MAGIC, 0x00, struct kdbus_cmd_bus_make),
386         KDBUS_CMD_NS_MAKE =             _IOWR(KDBUS_IOC_MAGIC, 0x10, struct kdbus_cmd_ns_make),
387
388         /* kdbus control node commands: require bus owner state */
389         KDBUS_CMD_BUS_POLICY_SET =      _IOWR(KDBUS_IOC_MAGIC, 0x20, struct kdbus_cmd_policy),
390
391         /* kdbus ep node commands: require unset state */
392         KDBUS_CMD_EP_MAKE =             _IOWR(KDBUS_IOC_MAGIC, 0x30, struct kdbus_cmd_ep_make),
393         KDBUS_CMD_HELLO =               _IOWR(KDBUS_IOC_MAGIC, 0x31, struct kdbus_cmd_hello),
394
395         /* kdbus ep node commands: require connected state */
396         KDBUS_CMD_MSG_SEND =            _IOWR(KDBUS_IOC_MAGIC, 0x40, struct kdbus_msg),
397         KDBUS_CMD_MSG_RECV =            _IOWR(KDBUS_IOC_MAGIC, 0x41, struct kdbus_msg),
398
399         KDBUS_CMD_NAME_ACQUIRE =        _IOWR(KDBUS_IOC_MAGIC, 0x50, struct kdbus_cmd_name),
400         KDBUS_CMD_NAME_RELEASE =        _IOWR(KDBUS_IOC_MAGIC, 0x51, struct kdbus_cmd_name),
401         KDBUS_CMD_NAME_LIST =           _IOWR(KDBUS_IOC_MAGIC, 0x52, struct kdbus_cmd_names),
402         KDBUS_CMD_NAME_QUERY =          _IOWR(KDBUS_IOC_MAGIC, 0x53, struct kdbus_cmd_name_info),
403
404         KDBUS_CMD_MATCH_ADD =           _IOWR(KDBUS_IOC_MAGIC, 0x60, struct kdbus_cmd_match),
405         KDBUS_CMD_MATCH_REMOVE =        _IOWR(KDBUS_IOC_MAGIC, 0x61, struct kdbus_cmd_match),
406         KDBUS_CMD_MONITOR =             _IOWR(KDBUS_IOC_MAGIC, 0x62, struct kdbus_cmd_monitor),
407
408         /* kdbus ep node commands: require ep owner state */
409         KDBUS_CMD_EP_POLICY_SET =       _IOWR(KDBUS_IOC_MAGIC, 0x70, struct kdbus_cmd_policy),
410 };
411 #endif