diff --git a/include/sdbus-c++/IConnection.h b/include/sdbus-c++/IConnection.h index 27701db..f4973c1 100644 --- a/include/sdbus-c++/IConnection.h +++ b/include/sdbus-c++/IConnection.h @@ -243,6 +243,15 @@ namespace sdbus { */ std::unique_ptr createSessionBusConnection(const std::string& name); + /*! + * @brief Creates/opens D-Bus system connection on a remote host using ssh + * + * @param[in] host Name of the host to connect + * @return Connection instance + * + * @throws sdbus::Error in case of failure + */ + std::unique_ptr createRemoteSystemBusConnection(const std::string& host); } #endif /* SDBUS_CXX_ICONNECTION_H_ */ diff --git a/src/Connection.cpp b/src/Connection.cpp index 91ca4f9..d7cde68 100644 --- a/src/Connection.cpp +++ b/src/Connection.cpp @@ -64,6 +64,21 @@ Connection::Connection(Connection::BusType type, std::unique_ptr&& inter loopExitFd_ = createProcessingLoopExitDescriptor(); } +Connection::Connection(const std::string& host, std::unique_ptr &&interface) + : iface_(std::move(interface)) + , busType_(BusType::eRemoteSystem) + , host_(host) +{ + assert(iface_ != nullptr); + + auto bus = openBus(busType_); + bus_.reset(bus); + + finishHandshake(bus); + + loopExitFd_ = createProcessingLoopExitDescriptor(); +} + Connection::~Connection() { leaveProcessingLoop(); @@ -294,6 +309,8 @@ sd_bus* Connection::openBus(Connection::BusType type) r = iface_->sd_bus_open_system(&bus); else if (type == BusType::eSession) r = iface_->sd_bus_open_user(&bus); + else if (type == BusType::eRemoteSystem) + r = iface_->sd_bus_open_system_remote(&bus, host_.c_str()); else assert(false); @@ -449,4 +466,12 @@ std::unique_ptr createSessionBusConnection(const std::string return conn; } +std::unique_ptr createRemoteSystemBusConnection(const std::string& host) +{ + auto interface = std::make_unique(); + assert(interface != nullptr); + return std::make_unique( host + , std::move(interface)); +} + } diff --git a/src/Connection.h b/src/Connection.h index ff50e98..9d2a7e3 100644 --- a/src/Connection.h +++ b/src/Connection.h @@ -46,10 +46,12 @@ namespace sdbus { namespace internal { enum class BusType { eSystem, - eSession + eSession, + eRemoteSystem, }; Connection(BusType type, std::unique_ptr&& interface); + Connection(const std::string& host, std::unique_ptr&& interface); ~Connection() override; void requestName(const std::string& name) override; @@ -122,6 +124,7 @@ namespace sdbus { namespace internal { std::thread asyncLoopThread_; int loopExitFd_{-1}; + std::string host_; }; }} diff --git a/src/ISdBus.h b/src/ISdBus.h index d2f5a9b..5a42772 100644 --- a/src/ISdBus.h +++ b/src/ISdBus.h @@ -67,6 +67,7 @@ namespace sdbus { namespace internal { virtual int sd_bus_open_user(sd_bus **ret) = 0; virtual int sd_bus_open_system(sd_bus **ret) = 0; + 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_add_object_vtable(sd_bus *bus, sd_bus_slot **slot, const char *path, const char *interface, const sd_bus_vtable *vtable, void *userdata) = 0; diff --git a/src/SdBus.cpp b/src/SdBus.cpp index 7944fcb..6fed9f9 100644 --- a/src/SdBus.cpp +++ b/src/SdBus.cpp @@ -164,6 +164,11 @@ int SdBus::sd_bus_open_system(sd_bus **ret) return ::sd_bus_open_system(ret); } +int SdBus::sd_bus_open_system_remote(sd_bus **ret, const char *host) +{ + return ::sd_bus_open_system_remote(ret, host); +} + int SdBus::sd_bus_request_name(sd_bus *bus, const char *name, uint64_t flags) { std::unique_lock lock(sdbusMutex_); diff --git a/src/SdBus.h b/src/SdBus.h index 38adf15..d862128 100644 --- a/src/SdBus.h +++ b/src/SdBus.h @@ -59,6 +59,7 @@ public: virtual int sd_bus_open_user(sd_bus **ret) override; virtual int sd_bus_open_system(sd_bus **ret) override; + 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_add_object_vtable(sd_bus *bus, sd_bus_slot **slot, const char *path, const char *interface, const sd_bus_vtable *vtable, void *userdata) override;