]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
dnsdist: FFI interface for the Lua network endpoint
authorRemi Gacogne <remi.gacogne@powerdns.com>
Thu, 23 Jun 2022 16:08:38 +0000 (18:08 +0200)
committerRemi Gacogne <remi.gacogne@powerdns.com>
Fri, 13 Jan 2023 15:57:52 +0000 (16:57 +0100)
pdns/dnsdistdist/dnsdist-lua-bindings-network.cc
pdns/dnsdistdist/dnsdist-lua-ffi-interface.h
pdns/dnsdistdist/dnsdist-lua-ffi.cc
pdns/dnsdistdist/dnsdist-lua-ffi.hh

index e66a13986ac045b61c2182ec517ed2eae5456253..62dce3ba11478088937ca6549fdf2326a6172c73 100644 (file)
@@ -22,6 +22,7 @@
 #include "dnsdist.hh"
 #include "dnsdist-async.hh"
 #include "dnsdist-lua.hh"
+#include "dnsdist-lua-ffi.hh"
 #include "dnsdist-lua-network.hh"
 #include "dolog.hh"
 
@@ -75,6 +76,22 @@ void setupLuaBindingsNetwork(LuaContext& luaCtx, bool client)
     });
   });
 
+  // if you make the dnsdist_ffi_network_message_t* in the function prototype const, LuaWrapper will stop treating it like a lightuserdata, messing everything up!!
+  luaCtx.registerFunction<bool (std::shared_ptr<dnsdist::NetworkListener>::*)(const std::string&, uint16_t, std::function<void(dnsdist_ffi_network_message_t*)>)>("addUnixListeningEndpointFFI", [client](std::shared_ptr<dnsdist::NetworkListener>& listener, const std::string& path, uint16_t endpointID, std::function<void(dnsdist_ffi_network_message_t*)> cb) {
+    if (client) {
+      return false;
+    }
+
+    return listener->addUnixListeningEndpoint(path, endpointID, [cb](dnsdist::NetworkListener::EndpointID endpoint, std::string&& dgram, const std::string& from) {
+      {
+        auto lock = g_lua.lock();
+        dnsdist_ffi_network_message_t msg(dgram, from, endpoint);
+        cb(&msg);
+      }
+      dnsdist::handleQueuedAsynchronousEvents();
+    });
+  });
+
   luaCtx.registerFunction<void (std::shared_ptr<dnsdist::NetworkListener>::*)()>("start", [client](std::shared_ptr<dnsdist::NetworkListener>& listener) {
     if (client) {
       return;
index 533fc5ea3fb382a34a729782fcd2b1e8e37bc10d..01e64005574c18f1692f6b6fd33d5d81acd2a74d 100644 (file)
@@ -225,3 +225,10 @@ void dnsdist_ffi_metric_inc(const char* metricName, size_t metricNameLen) __attr
 void dnsdist_ffi_metric_dec(const char* metricName, size_t metricNameLen) __attribute__ ((visibility ("default")));
 void dnsdist_ffi_metric_set(const char* metricName, size_t metricNameLen, double value) __attribute__ ((visibility ("default")));
 double dnsdist_ffi_metric_get(const char* metricName, size_t metricNameLen, bool isCounter) __attribute__ ((visibility ("default")));
+
+typedef struct dnsdist_ffi_network_message_t dnsdist_ffi_network_message_t;
+
+const char* dnsdist_ffi_network_message_get_payload(const dnsdist_ffi_network_message_t* msg) __attribute__ ((visibility ("default")));
+size_t dnsdist_ffi_network_message_get_payload_size(const dnsdist_ffi_network_message_t* msg) __attribute__ ((visibility ("default")));
+uint16_t dnsdist_ffi_network_message_get_endpoint_id(const dnsdist_ffi_network_message_t* msg) __attribute__ ((visibility ("default")));
+
index 8bfb877ca66f15ffc6efcd891faf27945add9397..78b83efeb21708522c2a6c6762b8c9c0b7881ba4 100644 (file)
@@ -1498,3 +1498,27 @@ double dnsdist_ffi_metric_get(const char* metricName, size_t metricNameLen, bool
   }
   return 0.;
 }
+
+const char* dnsdist_ffi_network_message_get_payload(const dnsdist_ffi_network_message_t* msg)
+{
+  if (msg != nullptr) {
+    return msg->payload.c_str();
+  }
+  return nullptr;
+}
+
+size_t dnsdist_ffi_network_message_get_payload_size(const dnsdist_ffi_network_message_t* msg)
+{
+  if (msg != nullptr) {
+    return msg->payload.size();
+  }
+  return 0;
+}
+
+uint16_t dnsdist_ffi_network_message_get_endpoint_id(const dnsdist_ffi_network_message_t* msg)
+{
+  if (msg != nullptr) {
+    return msg->endpointID;
+  }
+  return 0;
+}
index b60589de774abd4313df5fb81ff6da340ae18c34..d0ed83341dde71f16abce0e4645a86c1c0b40732 100644 (file)
@@ -128,5 +128,28 @@ struct dnsdist_ffi_servers_list_t
   const ServerPolicy::NumberedServerVector& servers;
 };
 
+// dnsdist_ffi_network_message_t is a lightuserdata
+template<>
+struct LuaContext::Pusher<dnsdist_ffi_network_message_t*> {
+    static const int minSize = 1;
+    static const int maxSize = 1;
+
+    static PushedObject push(lua_State* state, dnsdist_ffi_network_message_t* ptr) noexcept {
+        lua_pushlightuserdata(state, ptr);
+        return PushedObject{state, 1};
+    }
+};
+
+struct dnsdist_ffi_network_message_t
+{
+  dnsdist_ffi_network_message_t(const std::string& payload_ ,const std::string& from_, uint16_t endpointID_): payload(payload_), from(from_), endpointID(endpointID_)
+  {
+  }
+
+  const std::string& payload;
+  const std::string& from;
+  uint16_t endpointID;
+};
+
 const char* getLuaFFIWrappers();
 void setupLuaFFIPerThreadContext(LuaContext& luaCtx);