diff --git a/include/sdbus-c++/IConnection.h b/include/sdbus-c++/IConnection.h index f4973c1..0fdb717 100644 --- a/include/sdbus-c++/IConnection.h +++ b/include/sdbus-c++/IConnection.h @@ -74,6 +74,13 @@ namespace sdbus { */ virtual void releaseName(const std::string& name) = 0; + /*! + * @brief Retrieve the unique name of a connection. E.g. ":1.xx" + * + * @throws sdbus::Error in case of failure + */ + virtual std::string getUniqueName() = 0; + /*! * @brief Enters the D-Bus processing loop * diff --git a/src/Connection.cpp b/src/Connection.cpp index e88e201..025245b 100644 --- a/src/Connection.cpp +++ b/src/Connection.cpp @@ -76,6 +76,14 @@ void Connection::releaseName(const std::string& name) SDBUS_THROW_ERROR_IF(r < 0, "Failed to release bus name", -r); } +std::string Connection::getUniqueName() +{ + const char* unique = nullptr; + auto r = iface_->sd_bus_get_unique_name(bus_.get(), &unique); + SDBUS_THROW_ERROR_IF(r < 0 || unique == nullptr, "Failed to get unique bus name", -r); + return unique; +} + void Connection::enterProcessingLoop() { while (true) diff --git a/src/Connection.h b/src/Connection.h index cecacd4..1b9bf24 100644 --- a/src/Connection.h +++ b/src/Connection.h @@ -57,6 +57,7 @@ namespace sdbus { namespace internal { void requestName(const std::string& name) override; void releaseName(const std::string& name) override; + std::string getUniqueName() override; void enterProcessingLoop() override; void enterProcessingLoopAsync() override; void leaveProcessingLoop() override; diff --git a/src/ISdBus.h b/src/ISdBus.h index 5a42772..7246b4f 100644 --- a/src/ISdBus.h +++ b/src/ISdBus.h @@ -70,6 +70,7 @@ namespace sdbus { namespace internal { virtual int sd_bus_open_system_remote(sd_bus **ret, const char* host) = 0; virtual int sd_bus_request_name(sd_bus *bus, const char *name, uint64_t flags) = 0; virtual int sd_bus_release_name(sd_bus *bus, const char *name) = 0; + virtual int sd_bus_get_unique_name(sd_bus *bus, const char **name) = 0; virtual int sd_bus_add_object_vtable(sd_bus *bus, sd_bus_slot **slot, const char *path, const char *interface, const sd_bus_vtable *vtable, void *userdata) = 0; virtual int sd_bus_add_object_manager(sd_bus *bus, sd_bus_slot **slot, const char *path) = 0; virtual int sd_bus_add_match(sd_bus *bus, sd_bus_slot **slot, const char *match, sd_bus_message_handler_t callback, void *userdata) = 0; diff --git a/src/SdBus.cpp b/src/SdBus.cpp index 6fed9f9..a2f97b5 100644 --- a/src/SdBus.cpp +++ b/src/SdBus.cpp @@ -183,6 +183,12 @@ int SdBus::sd_bus_release_name(sd_bus *bus, const char *name) return ::sd_bus_release_name(bus, name); } +int SdBus::sd_bus_get_unique_name(sd_bus *bus, const char **name) +{ + std::unique_lock lock(sdbusMutex_); + return ::sd_bus_get_unique_name(bus, name); +} + int SdBus::sd_bus_add_object_vtable(sd_bus *bus, sd_bus_slot **slot, const char *path, const char *interface, const sd_bus_vtable *vtable, void *userdata) { std::unique_lock lock(sdbusMutex_); diff --git a/src/SdBus.h b/src/SdBus.h index d862128..3ab28c2 100644 --- a/src/SdBus.h +++ b/src/SdBus.h @@ -62,6 +62,7 @@ public: virtual int sd_bus_open_system_remote(sd_bus **ret, const char* hsot) override; virtual int sd_bus_request_name(sd_bus *bus, const char *name, uint64_t flags) override; virtual int sd_bus_release_name(sd_bus *bus, const char *name) override; + virtual int sd_bus_get_unique_name(sd_bus *bus, const char **name) override; virtual int sd_bus_add_object_vtable(sd_bus *bus, sd_bus_slot **slot, const char *path, const char *interface, const sd_bus_vtable *vtable, void *userdata) override; virtual int sd_bus_add_object_manager(sd_bus *bus, sd_bus_slot **slot, const char *path) override; virtual int sd_bus_add_match(sd_bus *bus, sd_bus_slot **slot, const char *match, sd_bus_message_handler_t callback, void *userdata) override;