From 47c9cf6417a97a8d63c9de846b4840e5d3b08dee Mon Sep 17 00:00:00 2001 From: Otto Moerbeek Date: Fri, 29 Nov 2024 14:49:13 +0100 Subject: [PATCH] Template for Wrapper classes --- pdns/recursordist/rec_control.cc | 1 - pdns/recursordist/settings/cxxsupport.cc | 28 +++++++-------- pdns/recursordist/settings/rust/src/bridge.hh | 35 ++++++++++--------- pdns/recursordist/settings/rust/src/web.rs | 3 ++ pdns/recursordist/ws-recursor.cc | 12 ++++--- 5 files changed, 41 insertions(+), 38 deletions(-) diff --git a/pdns/recursordist/rec_control.cc b/pdns/recursordist/rec_control.cc index a7936cfba5..cda2f939fa 100644 --- a/pdns/recursordist/rec_control.cc +++ b/pdns/recursordist/rec_control.cc @@ -449,4 +449,3 @@ int main(int argc, char** argv) } } #include "rec-web-stubs.hh" - diff --git a/pdns/recursordist/settings/cxxsupport.cc b/pdns/recursordist/settings/cxxsupport.cc index bd5084b6ce..225e645f82 100644 --- a/pdns/recursordist/settings/cxxsupport.cc +++ b/pdns/recursordist/settings/cxxsupport.cc @@ -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 +Wrapper::Wrapper(const M& arg) : + d_ptr(std::make_unique(arg)) { } -NetmaskGroup::~NetmaskGroup() = default; +template +Wrapper::~Wrapper() = default; -ComboAddress::ComboAddress(const ::ComboAddress& arg) : - d_ptr(std::make_unique<::ComboAddress>(arg)) +template +[[nodiscard]] const M& Wrapper::get() const { + return *d_ptr; } -ComboAddress::~ComboAddress() = default; + +template class Wrapper<::NetmaskGroup>; +template class Wrapper<::ComboAddress>; std::unique_ptr comboaddress(::rust::Str str) { return std::make_unique(::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& nmg, const std::unique_ptr& address) { return nmg->get().match(address->get()); diff --git a/pdns/recursordist/settings/rust/src/bridge.hh b/pdns/recursordist/settings/rust/src/bridge.hh index 2d9e04611c..03dca2e89d 100644 --- a/pdns/recursordist/settings/rust/src/bridge.hh +++ b/pdns/recursordist/settings/rust/src/bridge.hh @@ -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 +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 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 comboaddress(::rust::Str str); +std::unique_ptr comboaddress(::rust::Str str); bool matches(const std::unique_ptr& nmg, const std::unique_ptr& address); } diff --git a/pdns/recursordist/settings/rust/src/web.rs b/pdns/recursordist/settings/rust/src/web.rs index c694d3e80d..96dc17ec57 100644 --- a/pdns/recursordist/settings/rust/src/web.rs +++ b/pdns/recursordist/settings/rust/src/web.rs @@ -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; diff --git a/pdns/recursordist/ws-recursor.cc b/pdns/recursordist/ws-recursor.cc index 10698e2b71..7de35f61a9 100644 --- a/pdns/recursordist/ws-recursor.cc +++ b/pdns/recursordist/ws-recursor.cc @@ -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) cons yarl.initialize(&req); socket->setNonBlocking(); - const struct timeval timeout{ - g_networkTimeoutMsec / 1000, static_cast(g_networkTimeoutMsec) % 1000 * 1000}; + const struct timeval timeout + { + g_networkTimeoutMsec / 1000, static_cast(g_networkTimeoutMsec) % 1000 * 1000 + }; std::shared_ptr tlsCtx{nullptr}; if (d_loglevel > WebServer::LogLevel::None) { socket->getRemote(remote); @@ -1036,10 +1038,10 @@ static void rustWrapper(const std::function& 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); -- 2.47.2