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