From b6c631f378b4e5a9b68ef34f103b2ece21a9e9fa Mon Sep 17 00:00:00 2001 From: Kay Sievers Date: Sun, 15 Dec 2013 16:56:28 +0100 Subject: [PATCH] bus: update kdbus monitoring interface --- src/libsystemd-bus/bus-kernel.c | 35 ++++++++++++++++++++++++------- src/libsystemd-bus/bus-kernel.h | 3 +-- src/libsystemd-bus/kdbus.h | 37 +++++++-------------------------- 3 files changed, 36 insertions(+), 39 deletions(-) diff --git a/src/libsystemd-bus/bus-kernel.c b/src/libsystemd-bus/bus-kernel.c index 650e6b965..0e4730823 100644 --- a/src/libsystemd-bus/bus-kernel.c +++ b/src/libsystemd-bus/bus-kernel.c @@ -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; } diff --git a/src/libsystemd-bus/bus-kernel.h b/src/libsystemd-bus/bus-kernel.h index c5d469c98..8c7eacc6d 100644 --- a/src/libsystemd-bus/bus-kernel.h +++ b/src/libsystemd-bus/bus-kernel.h @@ -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); diff --git a/src/libsystemd-bus/kdbus.h b/src/libsystemd-bus/kdbus.h index dcd29359f..1ab72518a 100644 --- a/src/libsystemd-bus/kdbus.h +++ b/src/libsystemd-bus/kdbus.h @@ -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), -- 2.30.2