Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
S
systemd
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Labels
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Commits
Open sidebar
steam
systemd
Commits
5b7d4c1c
Commit
5b7d4c1c
authored
Apr 13, 2013
by
Lennart Poettering
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
kdbus: update to newest kdbus API
parent
d3789917
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
113 additions
and
59 deletions
+113
-59
src/libsystemd-bus/bus-control.c
src/libsystemd-bus/bus-control.c
+4
-4
src/libsystemd-bus/bus-internal.h
src/libsystemd-bus/bus-internal.h
+2
-0
src/libsystemd-bus/bus-kernel.c
src/libsystemd-bus/bus-kernel.c
+29
-14
src/libsystemd-bus/kdbus.h
src/libsystemd-bus/kdbus.h
+78
-41
No files found.
src/libsystemd-bus/bus-control.c
View file @
5b7d4c1c
...
...
@@ -64,7 +64,7 @@ int sd_bus_request_name(sd_bus *bus, const char *name, int flags) {
l
=
strlen
(
name
);
n
=
alloca
(
offsetof
(
struct
kdbus_cmd_name
,
name
)
+
l
+
1
);
n
->
size
=
offsetof
(
struct
kdbus_cmd_name
,
name
)
+
l
+
1
;
n
->
flags
=
flags
;
n
->
name_
flags
=
flags
;
n
->
id
=
0
;
memcpy
(
n
->
name
,
name
,
l
+
1
);
...
...
@@ -72,7 +72,7 @@ int sd_bus_request_name(sd_bus *bus, const char *name, int flags) {
if
(
r
<
0
)
return
-
errno
;
return
n
->
flags
;
return
n
->
name_
flags
;
}
else
{
r
=
sd_bus_call_method
(
bus
,
...
...
@@ -115,7 +115,7 @@ int sd_bus_release_name(sd_bus *bus, const char *name) {
l
=
strlen
(
name
);
n
=
alloca
(
offsetof
(
struct
kdbus_cmd_name
,
name
)
+
l
+
1
);
n
->
size
=
offsetof
(
struct
kdbus_cmd_name
,
name
)
+
l
+
1
;
n
->
flags
=
0
;
n
->
name_
flags
=
0
;
n
->
id
=
0
;
memcpy
(
n
->
name
,
name
,
l
+
1
);
...
...
@@ -123,7 +123,7 @@ int sd_bus_release_name(sd_bus *bus, const char *name) {
if
(
r
<
0
)
return
-
errno
;
return
n
->
flags
;
return
n
->
name_
flags
;
}
else
{
r
=
sd_bus_call_method
(
bus
,
...
...
src/libsystemd-bus/bus-internal.h
View file @
5b7d4c1c
...
...
@@ -150,6 +150,8 @@ struct sd_bus {
uint64_t
hello_serial
;
unsigned
iteration_counter
;
uint64_t
bloom_size
;
};
static
inline
void
bus_unrefp
(
sd_bus
**
b
)
{
...
...
src/libsystemd-bus/bus-kernel.c
View file @
5b7d4c1c
...
...
@@ -93,13 +93,14 @@ static void append_bloom(struct kdbus_msg_data **d, const void *p, size_t length
*
d
=
(
struct
kdbus_msg_data
*
)
((
uint8_t
*
)
*
d
+
(
*
d
)
->
size
);
}
static
int
bus_message_setup_kmsg
(
sd_bus_message
*
m
)
{
static
int
bus_message_setup_kmsg
(
sd_bus
*
b
,
sd_bus
_message
*
m
)
{
struct
kdbus_msg_data
*
d
;
bool
well_known
;
uint64_t
unique
;
size_t
sz
,
dl
;
int
r
;
assert
(
b
);
assert
(
m
);
assert
(
m
->
sealed
);
...
...
@@ -120,7 +121,7 @@ static int bus_message_setup_kmsg(sd_bus_message *m) {
/* Add in fixed header, fields header, fields header padding and payload */
sz
+=
4
*
ALIGN8
(
offsetof
(
struct
kdbus_msg_data
,
vec
)
+
sizeof
(
struct
kdbus_vec
));
sz
+=
ALIGN8
(
offsetof
(
struct
kdbus_msg_data
,
data
)
+
5
);
sz
+=
ALIGN8
(
offsetof
(
struct
kdbus_msg_data
,
data
)
+
b
->
bloom_size
);
/* Add in well-known destination header */
if
(
well_known
)
{
...
...
@@ -165,8 +166,14 @@ static int bus_message_setup_kmsg(sd_bus_message *m) {
if
(
m
->
body
)
append_payload_vec
(
&
d
,
m
->
body
,
m
->
header
->
body_size
);
if
(
m
->
kdbus
->
dst_id
==
KDBUS_DST_ID_BROADCAST
)
append_bloom
(
&
d
,
"bloom"
,
5
);
if
(
m
->
kdbus
->
dst_id
==
KDBUS_DST_ID_BROADCAST
)
{
void
*
p
;
/* For now, let's add a mask all bloom filter */
p
=
alloca
(
b
->
bloom_size
);
memset
(
p
,
0xFF
,
b
->
bloom_size
);
append_bloom
(
&
d
,
p
,
b
->
bloom_size
);
}
m
->
kdbus
->
size
=
(
uint8_t
*
)
d
-
(
uint8_t
*
)
m
->
kdbus
;
assert
(
m
->
kdbus
->
size
<=
sz
);
...
...
@@ -189,9 +196,16 @@ int bus_kernel_take_fd(sd_bus *b) {
if
(
r
<
0
)
return
-
errno
;
/* The higher 32bit of both flags fields are considered
* 'incompatible flags'. Refuse them all for now. */
if
(
hello
.
bus_flags
>
0xFFFFFFFFULL
||
hello
.
conn_flags
>
0xFFFFFFFFULL
)
return
-
ENOTSUP
;
if
(
asprintf
(
&
b
->
unique_name
,
":1.%llu"
,
(
unsigned
long
long
)
hello
.
id
)
<
0
)
return
-
ENOMEM
;
b
->
bloom_size
=
hello
.
bloom_size
;
b
->
is_kernel
=
true
;
b
->
bus_client
=
true
;
...
...
@@ -227,7 +241,7 @@ int bus_kernel_write_message(sd_bus *bus, sd_bus_message *m) {
assert
(
m
);
assert
(
bus
->
state
==
BUS_RUNNING
);
r
=
bus_message_setup_kmsg
(
m
);
r
=
bus_message_setup_kmsg
(
bus
,
m
);
if
(
r
<
0
)
return
r
;
...
...
@@ -437,7 +451,7 @@ int bus_kernel_read_message(sd_bus *bus, sd_bus_message **m) {
}
int
bus_kernel_create
(
const
char
*
name
,
char
**
s
)
{
struct
kdbus_cmd_
fname
*
fnam
e
;
struct
kdbus_cmd_
bus_make
*
mak
e
;
size_t
l
;
int
fd
;
char
*
p
;
...
...
@@ -450,17 +464,18 @@ int bus_kernel_create(const char *name, char **s) {
return
-
errno
;
l
=
strlen
(
name
);
fname
=
alloca
(
offsetof
(
struct
kdbus_cmd_fname
,
name
)
+
DECIMAL_STR_MAX
(
uid_t
)
+
1
+
l
+
1
);
sprintf
(
fname
->
name
,
"%lu-%s"
,
(
unsigned
long
)
getuid
(),
name
);
fname
->
size
=
offsetof
(
struct
kdbus_cmd_fname
,
name
)
+
strlen
(
fname
->
name
)
+
1
;
fname
->
kernel_flags
=
KDBUS_CMD_FNAME_ACCESS_WORLD
|
KDBUS_CMD_FNAME_POLICY_OPEN
;
fname
->
user_flags
=
0
;
p
=
strjoin
(
"/dev/kdbus/"
,
fname
->
name
,
"/bus"
,
NULL
);
make
=
alloca
(
offsetof
(
struct
kdbus_cmd_bus_make
,
name
)
+
DECIMAL_STR_MAX
(
uid_t
)
+
1
+
l
+
1
);
sprintf
(
make
->
name
,
"%lu-%s"
,
(
unsigned
long
)
getuid
(),
name
);
make
->
size
=
offsetof
(
struct
kdbus_cmd_bus_make
,
name
)
+
strlen
(
make
->
name
)
+
1
;
make
->
flags
=
KDBUS_ACCESS_WORLD
|
KDBUS_POLICY_OPEN
;
make
->
bus_flags
=
0
;
make
->
bloom_size
=
16
;
p
=
strjoin
(
"/dev/kdbus/"
,
make
->
name
,
"/bus"
,
NULL
);
if
(
!
p
)
return
-
ENOMEM
;
if
(
ioctl
(
fd
,
KDBUS_CMD_BUS_MAKE
,
fnam
e
)
<
0
)
{
if
(
ioctl
(
fd
,
KDBUS_CMD_BUS_MAKE
,
mak
e
)
<
0
)
{
close_nointr_nofail
(
fd
);
free
(
p
);
return
-
errno
;
...
...
src/libsystemd-bus/kdbus.h
View file @
5b7d4c1c
...
...
@@ -48,6 +48,11 @@ struct kdbus_creds {
__u64
starttime
;
};
struct
kdbus_audit
{
__u64
sessionid
;
__u64
loginuid
;
};
#define KDBUS_SRC_ID_KERNEL (0)
#define KDBUS_DST_ID_WELL_KNOWN_NAME (0)
#define KDBUS_MATCH_SRC_ID_ANY (~0ULL)
...
...
@@ -58,25 +63,23 @@ enum {
/* Filled in by userspace */
KDBUS_MSG_NULL
,
/* empty record */
KDBUS_MSG_PAYLOAD
,
/* .data */
KDBUS_MSG_PAYLOAD_VEC
,
/* .data_vec, converted into _PAYLOAD at delivery */
KDBUS_MSG_MMAP
,
/* .data_vec */
KDBUS_MSG_MMAP_DONATE
,
/* .data_vec, unmap the memory from the sender */
KDBUS_MSG_PAYLOAD_VEC
,
/* .data_vec */
KDBUS_MSG_UNIX_FDS
,
/* .data_fds of file descriptors */
KDBUS_MSG_BLOOM
,
/* for broadcasts, carries bloom filter blob */
KDBUS_MSG_DST_NAME
,
/* destination's well-known name */
KDBUS_MSG_BLOOM
,
/* for broadcasts, carries bloom filter blob
in .data
*/
KDBUS_MSG_DST_NAME
,
/* destination's well-known name
, in .str
*/
/* Filled in by kernelspace */
KDBUS_MSG_SRC_NAMES
=
0x200
,
/* NUL separated string list with well-known names of source */
KDBUS_MSG_TIMESTAMP
,
/* .ts_ns of CLOCK_MONOTONIC */
KDBUS_MSG_SRC_CREDS
,
/* .creds */
KDBUS_MSG_SRC_
COMM
,
/* optional
*/
KDBUS_MSG_SRC_T
HREAD_COMM
,
/* optional
*/
KDBUS_MSG_SRC_EXE
,
/* optional */
KDBUS_MSG_SRC_CMDLINE
,
/* optional */
KDBUS_MSG_SRC_CGROUP
,
/* optional,
specified which one
*/
KDBUS_MSG_SRC_CAPS
,
/* caps data blob */
KDBUS_MSG_SRC_SECLABEL
,
/* NUL terminated string */
KDBUS_MSG_SRC_AUDIT
,
/*
array of two uint64_t of audit loginuid + sessiond
*/
KDBUS_MSG_SRC_
PID_COMM
,
/* optional, in .str
*/
KDBUS_MSG_SRC_T
ID_COMM
,
/* optional, in .str
*/
KDBUS_MSG_SRC_EXE
,
/* optional
, in .str
*/
KDBUS_MSG_SRC_CMDLINE
,
/* optional
, in .str (a chain of NUL str)
*/
KDBUS_MSG_SRC_CGROUP
,
/* optional,
in .str
*/
KDBUS_MSG_SRC_CAPS
,
/* caps data blob
, in .data
*/
KDBUS_MSG_SRC_SECLABEL
,
/* NUL terminated string
, in .str
*/
KDBUS_MSG_SRC_AUDIT
,
/*
.audit
*/
/* Special messages from kernel, consisting of one and only one of these data blocks */
KDBUS_MSG_NAME_ADD
=
0x400
,
/* .name_change */
...
...
@@ -106,7 +109,7 @@ struct kdbus_msg_data {
union
{
/* inline data */
__u8
data
[
0
];
char
str
[
0
];
char
str
[
0
];
__u32
data_u32
[
0
];
__u64
data_u64
[
0
];
...
...
@@ -117,6 +120,7 @@ struct kdbus_msg_data {
int
fds
[
0
];
/* int array of file descriptors */
__u64
ts_ns
;
/* timestamp in nanoseconds */
struct
kdbus_creds
creds
;
struct
kdbus_audit
audit
;
struct
kdbus_manager_msg_name_change
name_change
;
struct
kdbus_manager_msg_id_change
id_change
;
};
...
...
@@ -191,24 +195,37 @@ struct kdbus_policy {
struct
kdbus_cmd_policy
{
__u64
size
;
__u8
buffer
[
0
];
/* a series of KDBUS_POLICY_NAME plus one or more KDBUS_POLICY_ACCESS each. */
__u8
buffer
[
0
];
/* a series of KDBUS_POLICY_NAME plus one or
* more KDBUS_POLICY_ACCESS each. */
};
enum
{
KDBUS_CMD_HELLO_STARTER
=
1
,
KDBUS_CMD_HELLO_ACCEPT_FD
=
2
,
KDBUS_CMD_HELLO_ACCEPT_MMAP
=
4
,
KDBUS_CMD_HELLO_STARTER
=
1
<<
0
,
KDBUS_CMD_HELLO_ACCEPT_FD
=
1
<<
1
,
KDBUS_CMD_HELLO_ACCEPT_MMAP
=
1
<<
2
,
/* The following have an effect on directed messages only --
* not for broadcasts */
KDBUS_CMD_HELLO_ATTACH_COMM
=
1
<<
10
,
KDBUS_CMD_HELLO_ATTACH_EXE
=
1
<<
11
,
KDBUS_CMD_HELLO_ATTACH_CMDLINE
=
1
<<
12
,
KDBUS_CMD_HELLO_ATTACH_CGROUP
=
1
<<
13
,
KDBUS_CMD_HELLO_ATTACH_CAPS
=
1
<<
14
,
KDBUS_CMD_HELLO_ATTACH_SECLABEL
=
1
<<
15
,
KDBUS_CMD_HELLO_ATTACH_AUDIT
=
1
<<
16
,
};
/* Flags for kdbus_cmd_bus_make, kdbus_cmd_ep_make and
* kdbus_cmd_ns_make */
enum
{
KDBUS_
CMD_FNAME_
ACCESS_GROUP
=
1
,
KDBUS_
CMD_FNAME_
ACCESS_WORLD
=
2
,
KDBUS_
CMD_FNAME_
POLICY_OPEN
=
4
,
KDBUS_ACCESS_GROUP
=
1
,
KDBUS_ACCESS_WORLD
=
2
,
KDBUS_POLICY_OPEN
=
4
,
};
struct
kdbus_cmd_hello
{
/* userspace → kernel, kernel → userspace */
__u64
kernel
_flags
;
/* userspace specifies its
__u64
conn
_flags
;
/* userspace specifies its
* capabilities and more, kernel
* returns its capabilites and
* more. Kernel might refuse client's
...
...
@@ -233,19 +250,47 @@ struct kdbus_cmd_hello {
* to do negotiation of features of
* the payload that is transfreted. */
__u64
id
;
/* peer id */
__u64
bloom_size
;
/* The bloom filter size chosen by the
* bus owner */
};
struct
kdbus_cmd_
fnam
e
{
struct
kdbus_cmd_
bus_mak
e
{
__u64
size
;
__u64
kernel_flags
;
/* userspace → kernel, kernel → userspace
* When creating a bus/ns/ep feature
* kernel negotiation done the same
* way as for KDBUS_CMD_BUS_MAKE. */
__u64
user_flags
;
/* userspace → kernel
__u64
flags
;
/* userspace → kernel, kernel → userspace
* When creating a bus feature
* kernel negotiation. */
__u64
bus_flags
;
/* userspace → kernel
* When a bus is created this value is
* copied verbatim into the bus
* structure and returned from
* KDBUS_CMD_HELLO, later */
__u64
cgroup_id
;
/* the cgroup hierarchy ID for which
* to attach cgroup membership paths
* to messages. 0 if no cgroup data
* shall be attached. */
__u64
bloom_size
;
/* Size of the bloom filter for this bus. */
char
name
[
0
];
};
struct
kdbus_cmd_ep_make
{
__u64
size
;
__u64
flags
;
/* userspace → kernel, kernel → userspace
* When creating an entry point
* feature kernel negotiation done the
* same way as for
* KDBUS_CMD_BUS_MAKE. Unused for
* now. */
char
name
[
0
];
};
struct
kdbus_cmd_ns_make
{
__u64
size
;
__u64
flags
;
/* userspace → kernel, kernel → userspace
* When creating an entry point
* feature kernel negotiation done the
* same way as for
* KDBUS_CMD_BUS_MAKE. Unused for
* now. */
char
name
[
0
];
};
...
...
@@ -254,7 +299,6 @@ enum {
KDBUS_CMD_NAME_REPLACE_EXISTING
=
1
,
KDBUS_CMD_NAME_QUEUE
=
2
,
KDBUS_CMD_NAME_ALLOW_REPLACEMENT
=
4
,
KDBUS_CMD_NAME_STEAL_MESSAGES
=
8
,
/* kernel → userspace */
KDBUS_CMD_NAME_IN_QUEUE
=
0x200
,
...
...
@@ -262,8 +306,9 @@ enum {
struct
kdbus_cmd_name
{
__u64
size
;
__u64
flags
;
__u64
name_
flags
;
__u64
id
;
/* We allow registration/deregestration of names of other peers */
__u64
conn_flags
;
char
name
[
0
];
};
...
...
@@ -334,14 +379,14 @@ struct kdbus_cmd_monitor {
*/
enum
kdbus_cmd
{
/* kdbus control node commands: require unset state */
KDBUS_CMD_BUS_MAKE
=
_IOWR
(
KDBUS_IOC_MAGIC
,
0x00
,
struct
kdbus_cmd_
fnam
e
),
KDBUS_CMD_NS_MAKE
=
_IOWR
(
KDBUS_IOC_MAGIC
,
0x10
,
struct
kdbus_cmd_
fnam
e
),
KDBUS_CMD_BUS_MAKE
=
_IOWR
(
KDBUS_IOC_MAGIC
,
0x00
,
struct
kdbus_cmd_
bus_mak
e
),
KDBUS_CMD_NS_MAKE
=
_IOWR
(
KDBUS_IOC_MAGIC
,
0x10
,
struct
kdbus_cmd_
ns_mak
e
),
/* kdbus control node commands: require bus owner state */
KDBUS_CMD_BUS_POLICY_SET
=
_IOWR
(
KDBUS_IOC_MAGIC
,
0x20
,
struct
kdbus_cmd_policy
),
/* kdbus ep node commands: require unset state */
KDBUS_CMD_EP_MAKE
=
_IOWR
(
KDBUS_IOC_MAGIC
,
0x30
,
struct
kdbus_cmd_
fnam
e
),
KDBUS_CMD_EP_MAKE
=
_IOWR
(
KDBUS_IOC_MAGIC
,
0x30
,
struct
kdbus_cmd_
ep_mak
e
),
KDBUS_CMD_HELLO
=
_IOWR
(
KDBUS_IOC_MAGIC
,
0x31
,
struct
kdbus_cmd_hello
),
/* kdbus ep node commands: require connected state */
...
...
@@ -361,11 +406,3 @@ enum kdbus_cmd {
KDBUS_CMD_EP_POLICY_SET
=
_IOWR
(
KDBUS_IOC_MAGIC
,
0x70
,
struct
kdbus_cmd_policy
),
};
#endif
/* Think about:
*
* - allow HELLO to change unique names
* - allow HELLO without assigning a unique name at all
* - when receive fails due to too small buffer return real size
* - when receiving maybe allow read-only mmaping into reciving process memory space or so?
*/
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment