chiark / gitweb /
sd-bus: allow description to be set for system/user busses (#8594)
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Thu, 29 Mar 2018 14:14:11 +0000 (16:14 +0200)
committerSven Eden <yamakuzure@gmx.net>
Fri, 24 Aug 2018 14:47:08 +0000 (16:47 +0200)
sd_bus_open/sd_bus_open_system/sd_bus_open_user are convenient, but
don't allow the description to be set. After they return, the bus is
is already started, and sd_bus_set_description() fails with -EBUSY.
It would be possible to allow sd_bus_set_description() to update the
description "live", but messages are already emitted from sd_bus_open
functions, so it's better to allow the description to be set in
sd_bus_open/sd_bus_open_system/sd_bus_open_user.

Fixes message like:
Bus n/a: changing state UNSET → OPENING

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

index 8343864bf985f14b2c562984b6ec826700fa80c8..6e88f30d7bbcb00bf6061ee6e5067cb627f2a8f7 100644 (file)
@@ -561,3 +561,10 @@ global:
         sd_bus_get_n_queued_read;
         sd_bus_get_n_queued_write;
 } LIBSYSTEMD_237;
+
+LIBSYSTEMD_239 {
+global:
+        sd_bus_open_with_description;
+        sd_bus_open_user_with_description;
+        sd_bus_open_system_with_description;
+} LIBSYSTEMD_238;
index 5df3af5b412b2e90433711c9ae1fc82956bfa818..c5013f98c293652b4a7e02ba4839b18710ce1e10 100644 (file)
@@ -1223,7 +1223,7 @@ _public_ int sd_bus_start(sd_bus *bus) {
         return bus_send_hello(bus);
 }
 
-_public_ int sd_bus_open(sd_bus **ret) {
+_public_ int sd_bus_open_with_description(sd_bus **ret, const char *description) {
         const char *e;
         sd_bus *b;
         int r;
@@ -1237,21 +1237,21 @@ _public_ int sd_bus_open(sd_bus **ret) {
         e = secure_getenv("DBUS_STARTER_BUS_TYPE");
         if (e) {
                 if (streq(e, "system"))
-                        return sd_bus_open_system(ret);
+                        return sd_bus_open_system_with_description(ret, description);
 #if 0 /// elogind does not support systemd user instances
                 else if (STR_IN_SET(e, "session", "user"))
-                        return sd_bus_open_user(ret);
 #endif // 0
+                        return sd_bus_open_user_with_description(ret, description);
         }
 
         e = secure_getenv("DBUS_STARTER_ADDRESS");
         if (!e) {
 #if 0 /// elogind does not support systemd user instances
                 if (cg_pid_get_owner_uid(0, NULL) >= 0)
-                        return sd_bus_open_user(ret);
+                        return sd_bus_open_user_with_description(ret, description);
                 else
 #endif // 0
-                        return sd_bus_open_system(ret);
+                        return sd_bus_open_system_with_description(ret, description);
         }
 
         r = sd_bus_new(&b);
@@ -1282,6 +1282,10 @@ fail:
         return r;
 }
 
+_public_ int sd_bus_open(sd_bus **ret) {
+        return sd_bus_open_with_description(ret, NULL);
+}
+
 int bus_set_address_system(sd_bus *b) {
         const char *e;
         assert(b);
@@ -1293,7 +1297,7 @@ int bus_set_address_system(sd_bus *b) {
         return sd_bus_set_address(b, DEFAULT_SYSTEM_BUS_ADDRESS);
 }
 
-_public_ int sd_bus_open_system(sd_bus **ret) {
+_public_ int sd_bus_open_system_with_description(sd_bus **ret, const char *description) {
         sd_bus *b;
         int r;
 
@@ -1303,6 +1307,12 @@ _public_ int sd_bus_open_system(sd_bus **ret) {
         if (r < 0)
                 return r;
 
+        if (description) {
+                r = sd_bus_set_description(b, description);
+                if (r < 0)
+                        goto fail;
+        }
+
         r = bus_set_address_system(b);
         if (r < 0)
                 goto fail;
@@ -1328,6 +1338,10 @@ fail:
         return r;
 }
 
+_public_ int sd_bus_open_system(sd_bus **ret) {
+        return sd_bus_open_system_with_description(ret, NULL);
+}
+
 #if 0 /// elogind can not open/use a user bus
 int bus_set_address_user(sd_bus *b) {
         const char *e;
@@ -1356,7 +1370,7 @@ int bus_set_address_user(sd_bus *b) {
 }
 #endif // 0
 
-_public_ int sd_bus_open_user(sd_bus **ret) {
+_public_ int sd_bus_open_user_with_description(sd_bus **ret, const char *description) {
 #if 0 /// elogind does not support user buses
         sd_bus *b;
         int r;
@@ -1367,6 +1381,12 @@ _public_ int sd_bus_open_user(sd_bus **ret) {
         if (r < 0)
                 return r;
 
+        if (description) {
+                r = sd_bus_set_description(b, description);
+                if (r < 0)
+                        goto fail;
+        }
+
         r = bus_set_address_user(b);
         if (r < 0)
                 goto fail;
@@ -1389,6 +1409,10 @@ _public_ int sd_bus_open_user(sd_bus **ret) {
 fail:
         bus_free(b);
         return r;
+}
+
+_public_ int sd_bus_open_user(sd_bus **ret) {
+        return sd_bus_open_user_with_description(ret, NULL);
 #else
         return sd_bus_open_system(ret);
 #endif // 0
index 23c17d73b4df982831dd864419b02a5b7ddc51fe..9a6e862788c0fae48a9b9d2226eed2fc018ce5f4 100644 (file)
@@ -122,8 +122,11 @@ int sd_bus_default_user(sd_bus **ret);
 int sd_bus_default_system(sd_bus **ret);
 
 int sd_bus_open(sd_bus **ret);
+int sd_bus_open_with_description(sd_bus **ret, const char *description);
 int sd_bus_open_user(sd_bus **ret);
+int sd_bus_open_user_with_description(sd_bus **ret, const char *description);
 int sd_bus_open_system(sd_bus **ret);
+int sd_bus_open_system_with_description(sd_bus **ret, const char *description);
 int sd_bus_open_system_remote(sd_bus **ret, const char *host);
 int sd_bus_open_system_machine(sd_bus **ret, const char *machine);