From: Charles-Henri Bruyand Date: Fri, 3 Dec 2021 15:29:14 +0000 (+0100) Subject: dnsdist: improve dnsdist_ffi_dnsresponse_t FFI integration X-Git-Tag: auth-4.7.0-alpha1~123^2~2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=28c0a58e7d15727fe5f7bf8196e1f84d29ba0483;p=thirdparty%2Fpdns.git dnsdist: improve dnsdist_ffi_dnsresponse_t FFI integration --- diff --git a/pdns/dnsdist-lua-actions.cc b/pdns/dnsdist-lua-actions.cc index ec1450d698..e1f6039e26 100644 --- a/pdns/dnsdist-lua-actions.cc +++ b/pdns/dnsdist-lua-actions.cc @@ -650,7 +650,7 @@ thread_local std::map LuaFFIPer class LuaFFIResponseAction: public DNSResponseAction { public: - typedef std::function func_t; + typedef std::function func_t; LuaFFIResponseAction(const LuaFFIResponseAction::func_t& func): d_func(func) { @@ -658,18 +658,13 @@ public: DNSResponseAction::Action operator()(DNSResponse* dr, std::string* ruleresult) const override { - DNSQuestion* dq = dynamic_cast(dr); - if (dq == nullptr) { - return DNSResponseAction::Action::ServFail; - } - - dnsdist_ffi_dnsquestion_t dqffi(dq); + dnsdist_ffi_dnsresponse_t drffi(dr); try { auto lock = g_lua.lock(); - auto ret = d_func(&dqffi); + auto ret = d_func(&drffi); if (ruleresult) { - if (dqffi.result) { - *ruleresult = *dqffi.result; + if (drffi.result) { + *ruleresult = *drffi.result; } else { // default to empty string @@ -696,7 +691,7 @@ private: class LuaFFIPerThreadResponseAction: public DNSResponseAction { public: - typedef std::function func_t; + typedef std::function func_t; LuaFFIPerThreadResponseAction(const std::string& code): d_functionCode(code), d_functionID(s_functionsCounter++) { @@ -704,11 +699,6 @@ public: DNSResponseAction::Action operator()(DNSResponse* dr, std::string* ruleresult) const override { - DNSQuestion* dq = dynamic_cast(dr); - if (dq == nullptr) { - return DNSResponseAction::Action::ServFail; - } - try { auto& state = t_perThreadStates[d_functionID]; if (!state.d_initialized) { @@ -724,11 +714,11 @@ public: return DNSResponseAction::Action::None; } - dnsdist_ffi_dnsquestion_t dqffi(dq); - auto ret = state.d_func(&dqffi); + dnsdist_ffi_dnsresponse_t drffi(dr); + auto ret = state.d_func(&drffi); if (ruleresult) { - if (dqffi.result) { - *ruleresult = *dqffi.result; + if (drffi.result) { + *ruleresult = *drffi.result; } else { // default to empty string diff --git a/pdns/dnsdist-lua.hh b/pdns/dnsdist-lua.hh index 0e630eb2cf..4794580210 100644 --- a/pdns/dnsdist-lua.hh +++ b/pdns/dnsdist-lua.hh @@ -104,7 +104,7 @@ public: if (ttl < d_min) { ttl = d_min; } - } + } if (ttl > d_max) { ttl = d_max; } @@ -116,7 +116,7 @@ public: std::string toString() const override { - return "limit ttl"; + return "limit ttl (" + std::to_string(d_min) + " <= ttl <= " + std::to_string(d_max) + ")"; } private: diff --git a/pdns/dnsdistdist/dnsdist-lua-ffi.hh b/pdns/dnsdistdist/dnsdist-lua-ffi.hh index 91877bbb4f..24ebe85d0b 100644 --- a/pdns/dnsdistdist/dnsdist-lua-ffi.hh +++ b/pdns/dnsdistdist/dnsdist-lua-ffi.hh @@ -59,6 +59,18 @@ struct dnsdist_ffi_dnsquestion_t boost::optional httpScheme{boost::none}; }; +// dnsdist_ffi_dnsresponse_t is a lightuserdata +template<> +struct LuaContext::Pusher { + static const int minSize = 1; + static const int maxSize = 1; + + static PushedObject push(lua_State* state, dnsdist_ffi_dnsresponse_t* ptr) noexcept { + lua_pushlightuserdata(state, ptr); + return PushedObject{state, 1}; + } +}; + struct dnsdist_ffi_dnsresponse_t { dnsdist_ffi_dnsresponse_t(DNSResponse* dr_): dr(dr_) @@ -66,6 +78,7 @@ struct dnsdist_ffi_dnsresponse_t } DNSResponse* dr{nullptr}; + boost::optional result{boost::none}; }; // dnsdist_ffi_server_t is a lightuserdata