]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
Template for Wrapper classes
authorOtto Moerbeek <otto.moerbeek@open-xchange.com>
Fri, 29 Nov 2024 13:49:13 +0000 (14:49 +0100)
committerOtto Moerbeek <otto.moerbeek@open-xchange.com>
Tue, 11 Feb 2025 15:28:22 +0000 (16:28 +0100)
pdns/recursordist/rec_control.cc
pdns/recursordist/settings/cxxsupport.cc
pdns/recursordist/settings/rust/src/bridge.hh
pdns/recursordist/settings/rust/src/web.rs
pdns/recursordist/ws-recursor.cc

index a7936cfba5d1455c65f0fa358a23f6489c5b8a9f..cda2f939fa33d280a97c490ac236a5b0bf736daf 100644 (file)
@@ -449,4 +449,3 @@ int main(int argc, char** argv)
   }
 }
 #include "rec-web-stubs.hh"
-
index bd5084b6cefb11377b9e45c8cc04622c1a15ac82..225e645f828f0f06314b5886b40f757685f324b2 100644 (file)
@@ -1459,34 +1459,30 @@ bool pdns::rust::settings::rec::isValidHostname(::rust::Str str)
 
 namespace pdns::rust::web::rec
 {
-NetmaskGroup::NetmaskGroup(const ::NetmaskGroup& arg) :
-  d_ptr(std::make_unique<::NetmaskGroup>(arg))
+
+template <typename M>
+Wrapper<M>::Wrapper(const M& arg) :
+  d_ptr(std::make_unique<M>(arg))
 {
 }
-NetmaskGroup::~NetmaskGroup() = default;
 
+template <typename M>
+Wrapper<M>::~Wrapper<M>() = default;
 
-ComboAddress::ComboAddress(const ::ComboAddress& arg) :
-  d_ptr(std::make_unique<::ComboAddress>(arg))
+template <typename M>
+[[nodiscard]] const M& Wrapper<M>::get() const
 {
+  return *d_ptr;
 }
-ComboAddress::~ComboAddress() = default;
+
+template class Wrapper<::NetmaskGroup>;
+template class Wrapper<::ComboAddress>;
 
 std::unique_ptr<ComboAddress> comboaddress(::rust::Str str)
 {
   return std::make_unique<ComboAddress>(::ComboAddress(std::string(str)));
 }
 
-[[nodiscard]] const ::NetmaskGroup& NetmaskGroup::get() const
-{
-  return *d_ptr;
-}
-
-[[nodiscard]] const ::ComboAddress& ComboAddress::get() const
-{
-  return *d_ptr;
-}
-  
 bool matches(const std::unique_ptr<NetmaskGroup>& nmg, const std::unique_ptr<ComboAddress>& address)
 {
   return nmg->get().match(address->get());
index 2d9e04611cc73c2e6768c8bea1afb92c484e49f3..03dca2e89d2105ffe34b858d224d4bce7523c314 100644 (file)
@@ -37,28 +37,31 @@ union ComboAddress;
 namespace pdns::rust::web::rec
 {
 using CredentialsHolder = ::CredentialsHolder;
-  //using NetmaskGroup = ::NetmaskGroup;
+// using NetmaskGroup = ::NetmaskGroup;
 struct KeyValue;
 struct Request;
 struct Response;
-class NetmaskGroup
-{
-public:
-  NetmaskGroup(const ::NetmaskGroup& arg);
-  ~NetmaskGroup();
-  [[nodiscard]] const ::NetmaskGroup& get() const;
-private:
-  std::unique_ptr<::NetmaskGroup> d_ptr;
-};
-class ComboAddress
+
+template <typename A>
+class Wrapper
 {
 public:
-  ComboAddress(const ::ComboAddress& arg);
-  ~ComboAddress();
-  [[nodiscard]] const ::ComboAddress& get() const;
+  Wrapper(const A& arg);
+  ~Wrapper(); // out-of-line definition, to keep A opaque
+
+  Wrapper() = delete;
+  Wrapper(const Wrapper&) = delete;
+  Wrapper(Wrapper&&) = delete;
+  Wrapper& operator=(const Wrapper&) = delete;
+  Wrapper& operator=(Wrapper&&) = delete;
+
+  [[nodiscard]] const A& get() const;
+
 private:
-  std::unique_ptr<::ComboAddress> d_ptr;
+  std::unique_ptr<A> d_ptr;
 };
+using NetmaskGroup = Wrapper<::NetmaskGroup>;
+using ComboAddress = Wrapper<::ComboAddress>;
 
 void apiServer(const Request& rustRequest, Response& rustResponse);
 void apiDiscovery(const Request& rustRequest, Response& rustResponse);
@@ -81,6 +84,6 @@ void apiServerSearchData(const Request& rustRequest, Response& rustResponse);
 void apiServerZoneDetailGET(const Request& rustRequest, Response& rustResponse);
 void apiServerZoneDetailPUT(const Request& rustRequest, Response& rustResponse);
 void apiServerZoneDetailDELETE(const Request& rustRequest, Response& rustResponse);
-std::unique_ptr<pdns::rust::web::rec::ComboAddress> comboaddress(::rust::Str str);
+std::unique_ptr<ComboAddress> comboaddress(::rust::Str str);
 bool matches(const std::unique_ptr<NetmaskGroup>& nmg, const std::unique_ptr<ComboAddress>& address);
 }
index c694d3e80dd970c65617016b4f63015ff1f00b76..96dc17ec5709e2f81b22758ef349bb25ae3ea034 100644 (file)
@@ -10,6 +10,9 @@ TODO
   use shared libs (in theory, I did not try). Currently all CXX using Rust cargo's must be compiled
   as one and refer to a single static Rust runtime
 - Ripping out yahttp stuff, providing some basic classees only
+- Some classes (NetmaskGroup, ComboAddress) need a uniqueptr Wrapper to keep them opaque (iputils
+  cannot be included without big headages in bridge.hh at the moment). We could seperate
+  NetmaskGroup, but I expect ComboAddress to not work as it is union.
 */
 
 use std::net::SocketAddr;
index 10698e2b714ec321379ec3d76b8a6fd43be7c1b6..7de35f61a94eb4d78923e8097aa9d5ab629ff113 100644 (file)
@@ -95,7 +95,7 @@ static void apiServerConfigACLGET(const std::string& aclType, HttpRequest* /* re
   auto lock1 = g_initialAllowFrom.lock();
   auto lock2 = g_initialAllowNotifyFrom.lock();
   if (*lock1 && aclType == "allow-from") {
-      entries = (*lock1)->toStringVector();
+    entries = (*lock1)->toStringVector();
   }
   else if (*lock2 && aclType == "allow-notify-from") {
     entries = (*lock2)->toStringVector();
@@ -894,8 +894,10 @@ void AsyncWebServer::serveConnection(const std::shared_ptr<Socket>& socket) cons
     yarl.initialize(&req);
     socket->setNonBlocking();
 
-    const struct timeval timeout{
-      g_networkTimeoutMsec / 1000, static_cast<suseconds_t>(g_networkTimeoutMsec) % 1000 * 1000};
+    const struct timeval timeout
+    {
+      g_networkTimeoutMsec / 1000, static_cast<suseconds_t>(g_networkTimeoutMsec) % 1000 * 1000
+    };
     std::shared_ptr<TLSCtx> tlsCtx{nullptr};
     if (d_loglevel > WebServer::LogLevel::None) {
       socket->getRemote(remote);
@@ -1036,10 +1038,10 @@ static void rustWrapper(const std::function<void(HttpRequest*, HttpResponse*)>&
     response.body = e.response().body;
     response.status = e.response().status;
   }
-  catch (const ApiException & e) {
+  catch (const ApiException& e) {
     response.setErrorResult(e.what(), 422);
   }
-  catch (const JsonException & e) {
+  catch (const JsonException& e) {
     response.setErrorResult(e.what(), 422);
   }
   fromCxxToRust(response, rustResponse);