chiark / gitweb /
sd-bus: add API to optionally set a sender field on all outgoing messages
authorLennart Poettering <lennart@poettering.net>
Wed, 20 Dec 2017 18:41:06 +0000 (19:41 +0100)
committerSven Eden <yamakuzure@gmx.net>
Wed, 30 May 2018 05:50:01 +0000 (07:50 +0200)
This is useful on direct connections to generate messages with valid
sender fields.

This is particularly useful for services that are accessible both
through direct connections and the broker, as it allows clients to
install matches on the sender service name, and they work the same in
both cases.

src/libelogind/libelogind.sym
src/libelogind/sd-bus/bus-internal.h
src/libelogind/sd-bus/bus-message.c
src/libelogind/sd-bus/sd-bus.c
src/systemd/sd-bus.h

index 44720bcbf3d58224fceb7542784d02c653b5f8d9..2dc592dd0ef1c7a94f0a1e24b02afdb6e81e9681 100644 (file)
@@ -549,4 +549,7 @@ global:
         sd_bus_is_ready;
         sd_bus_set_connected_signal;
         sd_bus_get_connected_signal;
+        sd_bus_set_sender;
+        sd_bus_get_sender;
+        sd_bus_message_set_sender;
 } LIBSYSTEMD_236;
index a2261309118a285966e1af8737e62c3fb88025b0..d43d3dcaca9a56a50f65e39703d023ea5537a154 100644 (file)
@@ -316,6 +316,7 @@ struct sd_bus {
         char *cgroup_root;
 
         char *description;
+        char *patch_sender;
 
         sd_bus_track *track_queue;
 
index 6841ec2ce1aad278ab5cd8b1251c5f4acf3b4ac5..cd4baf26876eab9c802d5ded3f820e7023b17d2f 100644 (file)
@@ -5487,6 +5487,15 @@ _public_ int sd_bus_message_set_destination(sd_bus_message *m, const char *desti
         return message_append_field_string(m, BUS_MESSAGE_HEADER_DESTINATION, SD_BUS_TYPE_STRING, destination, &m->destination);
 }
 
+_public_ int sd_bus_message_set_sender(sd_bus_message *m, const char *sender) {
+        assert_return(m, -EINVAL);
+        assert_return(sender, -EINVAL);
+        assert_return(!m->sealed, -EPERM);
+        assert_return(!m->sender, -EEXIST);
+
+        return message_append_field_string(m, BUS_MESSAGE_HEADER_SENDER, SD_BUS_TYPE_STRING, sender, &m->sender);
+}
+
 #if 0 /// UNNEEDED by elogind
 int bus_message_get_blob(sd_bus_message *m, void **buffer, size_t *sz) {
         size_t total;
index 0ca29b98dce7c9650b45d2cc05edf78eb784fd61..c3facef9b47304dbbc573bbbca166dc12090a9b5 100644 (file)
@@ -159,6 +159,7 @@ static void bus_free(sd_bus *b) {
         free(b->machine);
         free(b->cgroup_root);
         free(b->description);
+        free(b->patch_sender);
 
         free(b->exec_path);
         strv_free(b->exec_argv);
@@ -279,6 +280,7 @@ _public_ int sd_bus_set_exec(sd_bus *bus, const char *path, char *const argv[])
 _public_ int sd_bus_set_bus_client(sd_bus *bus, int b) {
         assert_return(bus, -EINVAL);
         assert_return(bus->state == BUS_UNSET, -EPERM);
+        assert_return(!bus->patch_sender, -EPERM);
         assert_return(!bus_pid_changed(bus), -ECHILD);
 
         bus->bus_client = !!b;
@@ -1552,6 +1554,8 @@ _public_ int sd_bus_get_bus_id(sd_bus *bus, sd_id128_t *id) {
 }
 
 static int bus_seal_message(sd_bus *b, sd_bus_message *m, usec_t timeout) {
+        int r;
+
         assert(b);
         assert(m);
 
@@ -1566,6 +1570,12 @@ static int bus_seal_message(sd_bus *b, sd_bus_message *m, usec_t timeout) {
         if (timeout == 0)
                 timeout = BUS_DEFAULT_TIMEOUT;
 
+        if (!m->sender && b->patch_sender) {
+                r = sd_bus_message_set_sender(m, b->patch_sender);
+                if (r < 0)
+                        return r;
+        }
+
         return sd_bus_message_seal(m, ++b->cookie, timeout);
 }
 
@@ -3986,3 +3996,22 @@ _public_ int sd_bus_get_exit_on_disconnect(sd_bus *bus) {
 
         return bus->exit_on_disconnect;
 }
+
+_public_ int sd_bus_set_sender(sd_bus *bus, const char *sender) {
+        assert_return(bus, -EINVAL);
+        assert_return(!bus->bus_client, -EPERM);
+        assert_return(!sender || service_name_is_valid(sender), -EINVAL);
+
+        return free_and_strdup(&bus->patch_sender, sender);
+}
+
+_public_ int sd_bus_get_sender(sd_bus *bus, const char **ret) {
+        assert_return(bus, -EINVAL);
+        assert_return(ret, -EINVAL);
+
+        if (!bus->patch_sender)
+                return -ENODATA;
+
+        *ret = bus->patch_sender;
+        return 0;
+}
index 5ac08e99e5b2b8148570de206d3fe4917b2b381d..d1527855572d24b80da49596ba5c0e901b8c009d 100644 (file)
@@ -154,6 +154,8 @@ int sd_bus_set_watch_bind(sd_bus *bus, int b);
 int sd_bus_get_watch_bind(sd_bus *bus);
 int sd_bus_set_connected_signal(sd_bus *bus, int b);
 int sd_bus_get_connected_signal(sd_bus *bus);
+int sd_bus_set_sender(sd_bus *bus, const char *sender);
+int sd_bus_get_sender(sd_bus *bus, const char **ret);
 
 int sd_bus_start(sd_bus *bus);
 
@@ -273,6 +275,7 @@ int sd_bus_message_set_auto_start(sd_bus_message *m, int b);
 int sd_bus_message_set_allow_interactive_authorization(sd_bus_message *m, int b);
 
 int sd_bus_message_set_destination(sd_bus_message *m, const char *destination);
+int sd_bus_message_set_sender(sd_bus_message *m, const char *sender);
 int sd_bus_message_set_priority(sd_bus_message *m, int64_t priority);
 
 int sd_bus_message_append(sd_bus_message *m, const char *types, ...);