mirror of
https://github.com/systemd/systemd-stable.git
synced 2025-01-12 09:17:44 +03:00
bus: update kdbus monitoring interface
This commit is contained in:
parent
d9de321f78
commit
b6c631f378
@ -1219,18 +1219,37 @@ int bus_kernel_create_namespace(const char *name, char **s) {
|
||||
return fd;
|
||||
}
|
||||
|
||||
int bus_kernel_monitor(sd_bus *bus) {
|
||||
struct kdbus_cmd_monitor cmd_monitor;
|
||||
int r;
|
||||
int bus_kernel_create_monitor(const char *bus) {
|
||||
struct kdbus_cmd_hello *hello;
|
||||
char *p;
|
||||
int fd;
|
||||
|
||||
assert(bus);
|
||||
|
||||
cmd_monitor.id = 0;
|
||||
cmd_monitor.flags = KDBUS_MONITOR_ENABLE;
|
||||
p = alloca(sizeof("/dev/kdbus/") - 1 + DECIMAL_STR_MAX(uid_t) + 1 + strlen(bus) + sizeof("/bus"));
|
||||
sprintf(p, "/dev/kdbus/%lu-%s/bus", (unsigned long) getuid(), bus);
|
||||
|
||||
r = ioctl(bus->input_fd, KDBUS_CMD_MONITOR, &cmd_monitor);
|
||||
if (r < 0)
|
||||
fd = open(p, O_RDWR|O_NOCTTY|O_CLOEXEC);
|
||||
if (fd < 0)
|
||||
return -errno;
|
||||
|
||||
return 1;
|
||||
hello = alloca0(sizeof(struct kdbus_cmd_hello));
|
||||
hello->size = sizeof(struct kdbus_cmd_hello);
|
||||
hello->conn_flags = KDBUS_HELLO_ACTIVATOR;
|
||||
hello->pool_size = KDBUS_POOL_SIZE;
|
||||
|
||||
if (ioctl(fd, KDBUS_CMD_HELLO, hello) < 0) {
|
||||
close_nointr_nofail(fd);
|
||||
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) {
|
||||
close_nointr_nofail(fd);
|
||||
return -ENOTSUP;
|
||||
}
|
||||
|
||||
return fd;
|
||||
}
|
||||
|
@ -63,6 +63,7 @@ int bus_kernel_read_message(sd_bus *bus);
|
||||
int bus_kernel_create_bus(const char *name, char **s);
|
||||
int bus_kernel_create_namespace(const char *name, char **s);
|
||||
int bus_kernel_create_starter(const char *bus, const char *name);
|
||||
int bus_kernel_create_monitor(const char *bus);
|
||||
|
||||
int bus_kernel_pop_memfd(sd_bus *bus, void **address, size_t *size);
|
||||
void bus_kernel_push_memfd(sd_bus *bus, int fd, void *address, size_t size);
|
||||
@ -73,5 +74,3 @@ int bus_kernel_parse_unique_name(const char *s, uint64_t *id);
|
||||
|
||||
int kdbus_translate_request_name_flags(uint64_t sd_bus_flags, uint64_t *kdbus_flags);
|
||||
int kdbus_translate_attach_flags(uint64_t sd_bus_flags, uint64_t *kdbus_flags);
|
||||
|
||||
int bus_kernel_monitor(sd_bus *bus);
|
||||
|
@ -414,14 +414,18 @@ struct kdbus_cmd_policy {
|
||||
|
||||
/**
|
||||
* enum kdbus_hello_flags - flags for struct kdbus_cmd_hello
|
||||
* @KDBUS_HELLO_ACTIVATOR: The connection registers a name for activation
|
||||
* by well-know name
|
||||
* @KDBUS_HELLO_ACCEPT_FD: The connection allows the receiving of
|
||||
* any passed file descriptors
|
||||
* @KDBUS_HELLO_ACTIVATOR: Special-purpose connection which registers
|
||||
* a well-know name for a process to be started
|
||||
* when traffic arrives
|
||||
* @KDBUS_HELLO_MONITOR: Special-purpose connection to monitor
|
||||
* bus traffic
|
||||
*/
|
||||
enum kdbus_hello_flags {
|
||||
KDBUS_HELLO_ACTIVATOR = 1 << 0,
|
||||
KDBUS_HELLO_ACCEPT_FD = 1 << 1,
|
||||
KDBUS_HELLO_ACCEPT_FD = 1 << 0,
|
||||
KDBUS_HELLO_ACTIVATOR = 1 << 1,
|
||||
KDBUS_HELLO_MONITOR = 1 << 2,
|
||||
};
|
||||
|
||||
/**
|
||||
@ -698,27 +702,6 @@ struct kdbus_cmd_match {
|
||||
struct kdbus_item items[0];
|
||||
};
|
||||
|
||||
/**
|
||||
* enum kdbus_monitor_flags - flags for monitoring
|
||||
* @KDBUS_MONITOR_ENABLE: Enable monitoring
|
||||
*/
|
||||
enum kdbus_monitor_flags {
|
||||
KDBUS_MONITOR_ENABLE = 1 << 0,
|
||||
};
|
||||
|
||||
/**
|
||||
* struct kdbus_cmd_monitor - struct to enable or disable eavesdropping
|
||||
* @id: Privileged users may enable or disable the monitor feature
|
||||
* on behalf of other peers
|
||||
* @flags: Use KDBUS_MONITOR_ENABLE to enable eavesdropping
|
||||
*
|
||||
* This structure is used with the KDBUS_CMD_MONITOR ioctl.
|
||||
*/
|
||||
struct kdbus_cmd_monitor {
|
||||
__u64 id;
|
||||
__u64 flags;
|
||||
};
|
||||
|
||||
/**
|
||||
* enum kdbus_ioctl_type - Ioctl API
|
||||
* @KDBUS_CMD_BUS_MAKE: After opening the "control" device node, this
|
||||
@ -756,9 +739,6 @@ struct kdbus_cmd_monitor {
|
||||
* @KDBUS_CMD_MATCH_ADD: Install a match which broadcast messages should
|
||||
* be delivered to the connection.
|
||||
* @KDBUS_CMD_MATCH_REMOVE: Remove a current match for broadcast messages.
|
||||
* @KDBUS_CMD_MONITOR: Monitor the bus and receive all transmitted
|
||||
* messages. Privileges are required for this
|
||||
* operation.
|
||||
* @KDBUS_CMD_EP_POLICY_SET: Set the policy of an endpoint. It is used to
|
||||
* restrict the access for endpoints created with
|
||||
* KDBUS_CMD_EP_MAKE.
|
||||
@ -808,7 +788,6 @@ enum kdbus_ioctl_type {
|
||||
|
||||
KDBUS_CMD_MATCH_ADD = _IOW (KDBUS_IOC_MAGIC, 0x70, struct kdbus_cmd_match),
|
||||
KDBUS_CMD_MATCH_REMOVE = _IOW (KDBUS_IOC_MAGIC, 0x71, struct kdbus_cmd_match),
|
||||
KDBUS_CMD_MONITOR = _IOW (KDBUS_IOC_MAGIC, 0x72, struct kdbus_cmd_monitor),
|
||||
|
||||
KDBUS_CMD_EP_POLICY_SET = _IOW (KDBUS_IOC_MAGIC, 0x80, struct kdbus_cmd_policy),
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user