From 16be43684f6d9bbd494b157682f5473460fbf98a Mon Sep 17 00:00:00 2001 From: Kay Sievers Date: Sun, 17 Nov 2013 22:35:58 +0100 Subject: [PATCH] bus: CREDS and NAMES are optional kdbus metadata now --- src/libsystemd-bus/kdbus.h | 5 +++-- src/libsystemd-bus/libsystemd-bus.sym | 2 ++ src/libsystemd-bus/sd-bus.c | 18 ++++++++++++++++++ src/libsystemd-bus/test-bus-kernel.c | 4 ++++ src/systemd/sd-bus.h | 2 ++ 5 files changed, 29 insertions(+), 2 deletions(-) diff --git a/src/libsystemd-bus/kdbus.h b/src/libsystemd-bus/kdbus.h index 60150748616..fadb2f2f0c8 100644 --- a/src/libsystemd-bus/kdbus.h +++ b/src/libsystemd-bus/kdbus.h @@ -237,8 +237,9 @@ enum { KDBUS_HELLO_STARTER = 1 << 0, KDBUS_HELLO_ACCEPT_FD = 1 << 1, - /* The following have an effect on directed messages only -- - * not for broadcasts */ + /* subscription for metadata to attach */ + KDBUS_HELLO_ATTACH_CREDS = 1 << 8, + KDBUS_HELLO_ATTACH_NAMES = 1 << 9, KDBUS_HELLO_ATTACH_COMM = 1 << 10, KDBUS_HELLO_ATTACH_EXE = 1 << 11, KDBUS_HELLO_ATTACH_CMDLINE = 1 << 12, diff --git a/src/libsystemd-bus/libsystemd-bus.sym b/src/libsystemd-bus/libsystemd-bus.sym index f1abf016387..03353f18750 100644 --- a/src/libsystemd-bus/libsystemd-bus.sym +++ b/src/libsystemd-bus/libsystemd-bus.sym @@ -26,6 +26,8 @@ global: sd_bus_set_server; sd_bus_set_anonymous; sd_bus_negotiate_fds; + sd_bus_negotiate_attach_creds; + sd_bus_negotiate_attach_names; sd_bus_negotiate_attach_comm; sd_bus_negotiate_attach_exe; sd_bus_negotiate_attach_cmdline; diff --git a/src/libsystemd-bus/sd-bus.c b/src/libsystemd-bus/sd-bus.c index 95469d8263f..2345c734c3a 100644 --- a/src/libsystemd-bus/sd-bus.c +++ b/src/libsystemd-bus/sd-bus.c @@ -264,6 +264,24 @@ _public_ int sd_bus_negotiate_fds(sd_bus *bus, int b) { return 0; } +_public_ int sd_bus_negotiate_attach_creds(sd_bus *bus, int b) { + assert_return(bus, -EINVAL); + assert_return(bus->state == BUS_UNSET, -EPERM); + assert_return(!bus_pid_changed(bus), -ECHILD); + + SET_FLAG(bus->hello_flags, KDBUS_HELLO_ATTACH_CREDS, b); + return 0; +} + +_public_ int sd_bus_negotiate_attach_names(sd_bus *bus, int b) { + assert_return(bus, -EINVAL); + assert_return(bus->state == BUS_UNSET, -EPERM); + assert_return(!bus_pid_changed(bus), -ECHILD); + + SET_FLAG(bus->hello_flags, KDBUS_HELLO_ATTACH_NAMES, b); + return 0; +} + _public_ int sd_bus_negotiate_attach_comm(sd_bus *bus, int b) { assert_return(bus, -EINVAL); assert_return(bus->state == BUS_UNSET, -EPERM); diff --git a/src/libsystemd-bus/test-bus-kernel.c b/src/libsystemd-bus/test-bus-kernel.c index 511c5478524..05045028b08 100644 --- a/src/libsystemd-bus/test-bus-kernel.c +++ b/src/libsystemd-bus/test-bus-kernel.c @@ -62,6 +62,8 @@ int main(int argc, char *argv[]) { r = sd_bus_set_address(b, address); assert_se(r >= 0); + assert_se(sd_bus_negotiate_attach_creds(a, 1) >= 0); + assert_se(sd_bus_negotiate_attach_names(a, 1) >= 0); assert_se(sd_bus_negotiate_attach_comm(a, 1) >= 0); assert_se(sd_bus_negotiate_attach_exe(a, 1) >= 0); assert_se(sd_bus_negotiate_attach_cmdline(a, 1) >= 0); @@ -70,6 +72,8 @@ int main(int argc, char *argv[]) { assert_se(sd_bus_negotiate_attach_selinux_context(a, 1) >= 0); assert_se(sd_bus_negotiate_attach_audit(a, 1) >= 0); + assert_se(sd_bus_negotiate_attach_creds(b, 1) >= 0); + assert_se(sd_bus_negotiate_attach_names(b, 1) >= 0); assert_se(sd_bus_negotiate_attach_comm(b, 1) >= 0); assert_se(sd_bus_negotiate_attach_exe(b, 1) >= 0); assert_se(sd_bus_negotiate_attach_cmdline(b, 1) >= 0); diff --git a/src/systemd/sd-bus.h b/src/systemd/sd-bus.h index 61f232c79b4..cff4e539d37 100644 --- a/src/systemd/sd-bus.h +++ b/src/systemd/sd-bus.h @@ -73,6 +73,8 @@ int sd_bus_set_bus_client(sd_bus *bus, int b); int sd_bus_set_server(sd_bus *bus, int b, sd_id128_t server_id); int sd_bus_set_anonymous(sd_bus *bus, int b); int sd_bus_negotiate_fds(sd_bus *bus, int b); +int sd_bus_negotiate_attach_creds(sd_bus *bus, int b); +int sd_bus_negotiate_attach_names(sd_bus *bus, int b); int sd_bus_negotiate_attach_comm(sd_bus *bus, int b); int sd_bus_negotiate_attach_exe(sd_bus *bus, int b); int sd_bus_negotiate_attach_cmdline(sd_bus *bus, int b);