From 1ce44098b09528bd42655bef1f81941cc22f013f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Adrien=20B=C3=A9raud?= <adrien.beraud@savoirfairelinux.com>
Date: Tue, 21 May 2019 11:04:19 -0400
Subject: [PATCH] dhtrunner: add pluggable transport

---
 include/opendht/dhtrunner.h |  3 +++
 src/dhtrunner.cpp           | 21 +++++++++++++++------
 2 files changed, 18 insertions(+), 6 deletions(-)

diff --git a/include/opendht/dhtrunner.h b/include/opendht/dhtrunner.h
index 97d57823..95e0bfa2 100644
--- a/include/opendht/dhtrunner.h
+++ b/include/opendht/dhtrunner.h
@@ -66,6 +66,7 @@ public:
 
     struct Context {
         std::unique_ptr<Logger> logger {};
+        std::unique_ptr<net::DatagramSocket> sock;
         std::shared_ptr<PeerDiscovery> peerDiscovery {};
         StatusCallback statusChangedCallback {};
         CertificateStoreQuery certificateStore {};
@@ -400,6 +401,8 @@ public:
      */
     void run(const char* ip4, const char* ip6, const char* service, const Config& config, Context&& context = {});
 
+    void run(const Config& config, Context&& context);
+
     void setOnStatusChanged(StatusCallback&& cb) {
         statusCb = std::move(cb);
     }
diff --git a/src/dhtrunner.cpp b/src/dhtrunner.cpp
index 5fbd45e4..7465a156 100644
--- a/src/dhtrunner.cpp
+++ b/src/dhtrunner.cpp
@@ -77,7 +77,7 @@ DhtRunner::~DhtRunner()
 }
 
 void
-DhtRunner::run(in_port_t port, const DhtRunner::Config& config, Context&& context)
+DhtRunner::run(in_port_t port, const Config& config, Context&& context)
 {
     SockAddr sin4;
     sin4.setFamily(AF_INET);
@@ -89,7 +89,7 @@ DhtRunner::run(in_port_t port, const DhtRunner::Config& config, Context&& contex
 }
 
 void
-DhtRunner::run(const char* ip4, const char* ip6, const char* service, const DhtRunner::Config& config, Context&& context)
+DhtRunner::run(const char* ip4, const char* ip6, const char* service, const Config& config, Context&& context)
 {
     auto res4 = SockAddr::resolve(ip4, service);
     auto res6 = SockAddr::resolve(ip6, service);
@@ -98,13 +98,22 @@ DhtRunner::run(const char* ip4, const char* ip6, const char* service, const DhtR
 }
 
 void
-DhtRunner::run(const SockAddr& local4, const SockAddr& local6, const DhtRunner::Config& config, Context&& context)
+DhtRunner::run(const SockAddr& local4, const SockAddr& local6, const Config& config, Context&& context)
+{
+    if (not running) {
+        if (not context.sock)
+            context.sock.reset(new net::UdpSocket(local4, local6));
+        run(config, std::move(context));
+    }
+}
+
+void
+DhtRunner::run(const Config& config, Context&& context)
 {
     if (running)
         return;
 
-    auto sock = std::unique_ptr<net::UdpSocket>(new net::UdpSocket(local4, local6));
-    sock->setOnReceive([&] (std::unique_ptr<net::ReceivedPacket>&& pkt) {
+    context.sock->setOnReceive([&] (std::unique_ptr<net::ReceivedPacket>&& pkt) {
         {
             std::lock_guard<std::mutex> lck(sock_mtx);
             if (rcv.size() >= RX_QUEUE_MAX_SIZE) {
@@ -116,7 +125,7 @@ DhtRunner::run(const SockAddr& local4, const SockAddr& local6, const DhtRunner::
         cv.notify_all();
     });
 
-    auto dht = std::unique_ptr<DhtInterface>(new Dht(std::move(sock), SecureDht::getConfig(config.dht_config)));
+    auto dht = std::unique_ptr<DhtInterface>(new Dht(std::move(context.sock), SecureDht::getConfig(config.dht_config)));
     dht_ = std::unique_ptr<SecureDht>(new SecureDht(std::move(dht), config.dht_config));
 
 #ifdef OPENDHT_PROXY_CLIENT
-- 
GitLab