From 2ad43d5ff82afd086ad0a6ca1055dca32c828596 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Thu, 29 Mar 2018 16:14:11 +0200 Subject: [PATCH] sd-bus: allow description to be set for system/user busses (#8594) MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 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 | 7 +++++++ src/libelogind/sd-bus/sd-bus.c | 38 +++++++++++++++++++++++++++------- src/systemd/sd-bus.h | 3 +++ 3 files changed, 41 insertions(+), 7 deletions(-) diff --git a/src/libelogind/libelogind.sym b/src/libelogind/libelogind.sym index 8343864bf..6e88f30d7 100644 --- a/src/libelogind/libelogind.sym +++ b/src/libelogind/libelogind.sym @@ -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; diff --git a/src/libelogind/sd-bus/sd-bus.c b/src/libelogind/sd-bus/sd-bus.c index 5df3af5b4..c5013f98c 100644 --- a/src/libelogind/sd-bus/sd-bus.c +++ b/src/libelogind/sd-bus/sd-bus.c @@ -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 diff --git a/src/systemd/sd-bus.h b/src/systemd/sd-bus.h index 23c17d73b..9a6e86278 100644 --- a/src/systemd/sd-bus.h +++ b/src/systemd/sd-bus.h @@ -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); -- 2.30.2