[systemd-commits] src/libsystemd-bus

Kay Sievers kay at kemper.freedesktop.org
Sun Dec 15 08:20:19 PST 2013


 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(-)

New commits:
commit b6c631f378b4e5a9b68ef34f103b2ece21a9e9fa
Author: Kay Sievers <kay at vrfy.org>
Date:   Sun Dec 15 16:56:28 2013 +0100

    bus: update kdbus monitoring interface

diff --git a/src/libsystemd-bus/bus-kernel.c b/src/libsystemd-bus/bus-kernel.c
index 650e6b9..0e47308 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 c5d469c..8c7eacc 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 dcd2935..1ab7251 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,
 };
 
 /**
@@ -699,27 +703,6 @@ struct kdbus_cmd_match {
 };
 
 /**
- * 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
  * 				command creates a new bus with the specified
@@ -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),
 



More information about the systemd-commits mailing list