]> granicus.if.org Git - pdns/commitdiff
its a wip
authorbert hubert <bert.hubert@netherlabs.nl>
Thu, 15 Oct 2015 12:02:49 +0000 (14:02 +0200)
committerbert hubert <bert.hubert@netherlabs.nl>
Thu, 15 Oct 2015 12:02:49 +0000 (14:02 +0200)
pdns/dumresp.cc
pdns/lua-pdns.cc
pdns/lua-pdns.hh
pdns/lua-recursor.cc
pdns/lua-recursor.hh
pdns/misc.cc
pdns/pdns_recursor.cc
pdns/sstuff.hh
pdns/syncres.cc

index 679dc1b95dc2bb0060e9378282c6fe6931680a1e..02d08652fd5fac773780f717104ec23ae6a7156c 100644 (file)
@@ -10,18 +10,18 @@ StatBag S;
 int main(int argc, char** argv)
 try
 {
-  if(argc != 3) {
-    cerr<<"Syntax: dumresp local-address number-of-threads"<<endl;
+  if(argc != 4) {
+    cerr<<"Syntax: dumresp local-address local-port number-of-threads "<<endl;
     exit(EXIT_FAILURE);
   }
 
-  for(int i=1 ; i < atoi(argv[2]); ++i) {
+  for(int i=1 ; i < atoi(argv[3]); ++i) {
     if(!fork())
       break;
   }
-  Socket s(AF_INET, SOCK_DGRAM);
-  ComboAddress local(argv[1], 5300);
-  
+
+  ComboAddress local(argv[1], atoi(argv[2]));
+  Socket s(local.sin4.sin_family, SOCK_DGRAM);  
 #ifdef SO_REUSEPORT
   int one=1;
   if(setsockopt(s.getHandle(), SOL_SOCKET, SO_REUSEPORT, &one, sizeof(one)) < 0)
@@ -29,6 +29,7 @@ try
 #endif
 
   s.bind(local);
+  cout<<"Bound to "<<local.toStringWithPort()<<endl;
   char buffer[1500];
   struct dnsheader* dh = (struct dnsheader*)buffer;
   int len;
@@ -38,11 +39,13 @@ try
     len=recvfrom(s.getHandle(), buffer, sizeof(buffer), 0, (struct sockaddr*)&rem, &socklen);
     if(len < 0)
       unixDie("recvfrom");
-
+    cout<<"Had packet: "<<string(buffer, len)<<endl;
+    /*
     if(dh->qr)
       continue;
     dh->qr=1;
     dh->ad=0;
+    */
     if(sendto(s.getHandle(), buffer, len, 0,  (struct sockaddr*)&rem, socklen) < 0)
       unixDie("sendto");
 
index 99f77504a923d809ecd50035b4cf3e0318690ff6..e7c07dccda37b8a40e4a4734b6b4611fcc6e7cf9 100644 (file)
@@ -38,6 +38,7 @@ extern "C" {
 #include "logger.hh"
 #include "namespaces.hh"
 #include "dnsparser.hh"
+#undef L
 
 bool netmaskMatchTable(lua_State* lua, const std::string& ip)
 {
@@ -83,6 +84,8 @@ static bool getFromTable(lua_State *lua, const std::string &key, uint32_t& value
   return ret;
 }
 
+
+
 void pushResourceRecordsTable(lua_State* lua, const vector<DNSRecord>& records)
 {
   // make a table of tables
@@ -363,7 +366,6 @@ bool PowerDNSLua::getFromTable(const std::string& key, uint32_t& value)
   return ::getFromTable(d_lua, key, value);
 }
 
-
 PowerDNSLua::~PowerDNSLua()
 {
   lua_close(d_lua);
index 86125d699e5b4d5e24305c24b7e17f588121af0a..f5a6ba5c7f641046b7e2165a93d8aa1d851b78c9 100644 (file)
@@ -1,8 +1,8 @@
 #ifndef PDNS_LUA_PDNS_HH
 #define PDNS_LUA_PDNS_HH
+
 #include "dns.hh"
 #include "iputils.hh"
-
 struct lua_State;
 
 class PowerDNSLua
@@ -26,6 +26,7 @@ protected: // FIXME?
   bool passthrough(const string& func, const ComboAddress& remote,const ComboAddress& local, const string& query, const QType& qtype, vector<DNSResourceRecord>& ret, int& res, bool* variable);
   bool getFromTable(const std::string& key, std::string& value);
   bool getFromTable(const std::string& key, uint32_t& value);
   ComboAddress d_local;
   bool d_failed;
   bool d_variable;  
index 3c25a7f707bd4727e7247c8fac9494970d09504e..8aba70b2890a8a0aaefbbbdb3a39949eec6b730d 100644 (file)
@@ -66,7 +66,7 @@ extern "C" {
 #include "namespaces.hh"
 #include "rec_channel.hh"
 #include "dnsrecords.hh"
-
+#undef L
 static int getRegisteredNameLua(lua_State *L) {
   const char *name = luaL_checkstring(L, 1);
   string regname=getRegisteredName(DNSName(name)).toString(); // hnnggg
@@ -107,6 +107,7 @@ int followCNAMERecords(vector<DNSRecord>& ret, const QType& qtype)
 
 }
 
+
 int getFakeAAAARecords(const std::string& qname, const std::string& prefix, vector<DNSRecord>& ret)
 {
   int rcode=directResolve(qname, QType(QType::A), 1, ret);
@@ -227,6 +228,21 @@ bool RecursorLua::ipfilter(const ComboAddress& remote, const ComboAddress& local
   return newres != -1;
 }
 
+static bool getFromTable(lua_State *lua, const std::string &key, lua_CFunction& value)
+{
+  lua_pushstring(lua, key.c_str()); // 4 is now '1'
+  lua_gettable(lua, -2);  // replace by the first entry of our table we hope
+
+  bool ret=false;
+
+  if(lua_isfunction(lua, -1)) {
+    value = lua_tocfunction(lua, -1);
+    ret=true;
+  }
+  lua_pop(lua, 1);
+  return ret;
+}
+
 
 bool RecursorLua::passthrough(const string& func, const ComboAddress& remote, const ComboAddress& local, const DNSName& query, const QType& qtype, vector<DNSRecord>& ret,
   int& res, bool* variable)
@@ -281,7 +297,38 @@ bool RecursorLua::passthrough(const string& func, const ComboAddress& remote, co
     string tocall = lua_tostring(d_lua,1);
     lua_remove(d_lua, 1); // the name
     ret.clear();
-    if(tocall == "getFakeAAAARecords") {
+    cerr<<"tocall: "<<tocall<<endl;
+    if(tocall == "udpQuestionResponse") {
+      
+      string dest = lua_tostring(d_lua,1);
+      cerr<<"dest: "<<dest<<endl;
+      string uquery;
+      getFromTable("query", uquery);
+      lua_CFunction callback=0;
+      cout<<"callback get:"<<::getFromTable(d_lua, "callback", callback)<<endl;
+      cout<<"callback value: "<<(void*)callback<<endl;
+      cerr<<"query: "<<query<<endl;
+      //      string followup = lua_tostring(d_lua, 3);
+      // cerr<<"followup: "<<dest<<endl;
+      lua_pop(d_lua, 3);
+
+      string answer = udpQuestionResponse(ComboAddress(dest), uquery);
+      cerr<<"Back in lua-recursor, got: '"<<answer<<"'"<<endl;
+      lua_pushcfunction(d_lua, callback);
+      lua_pushstring(d_lua,  remote.toString().c_str() );
+      lua_pushstring(d_lua,  query.toString().c_str() );
+      lua_pushnumber(d_lua,  qtype.getCode() );
+      lua_pushstring(d_lua,  answer.c_str() );
+      cerr<<"Going to call"<<endl;
+      if(lua_pcall(d_lua,  4, 3, 0)) {   // NOTE! Means we always get 3 stack entries back, no matter what our lua hook returned!
+       string error=string("lua error in '"+func+"' while callback for '"+query.toString()+"|"+qtype.getName()+": ")+lua_tostring(d_lua, -1);
+       lua_pop(d_lua, 1);
+       throw runtime_error(error);
+       return false;
+      }
+      cerr<<"We called!"<<endl;
+    }
+    else if(tocall == "getFakeAAAARecords") {
       string luaprefix = lua_tostring(d_lua, 2);
       string luaqname = lua_tostring(d_lua,1);
       lua_pop(d_lua, 2);
index 2cf4eaa4cd6121616d83576277503bfdc94d7f79..e63945fcb07089eaa892b15924b6988cc8ccbd27 100644 (file)
@@ -3,7 +3,7 @@
 #include "dns.hh"
 #include "iputils.hh"
 #include "lua-pdns.hh"
-
+string udpQuestionResponse(const ComboAddress& dest, const string& query);
 class RecursorLua : public PowerDNSLua
 {
 public:
index 16dcab4bf9e166e06ed46132c434ca874cc438a6..72f893396eba77512a7f70d2e78f8d9cc1be0351 100644 (file)
 
 bool g_singleThreaded;
 
+void sometests()
+{
+  vector<std::unique_ptr<int>> vec;
+  vec.push_back(make_unique<int>(12));
+}
+
 int writen2(int fd, const void *buf, size_t count)
 {
   const char *ptr = (char*)buf;
index a0632736adfa9248a0cedb06e24e0e9ad090b262..1aa506437afd52fd9e9daff9475577a6697d7cdb 100644 (file)
@@ -230,6 +230,57 @@ int arecvtcp(string& data, int len, Socket* sock, bool incompleteOkay)
   return ret;
 }
 
+void handleUDPQueryResponse(int fd, FDMultiplexer::funcparam_t& var)
+{
+  cerr<<"In handle UDPQueryResponse"<<endl;
+  PacketID* pident=any_cast<PacketID>(&var);
+  char resp[512];
+  int ret=recv(fd, resp, sizeof(resp), 0);
+  t_fdm->removeReadFD(fd);
+  if(ret >= 0) {
+    string data(resp, ret);
+    cerr<<"Reporting what we got ('"<<data<<"')"<<endl;
+    cerr<<"Reporting returned: "<<MT->sendEvent(*pident, &data)<<endl;
+  }
+  else {
+    cerr<<"Had some kind of error: "<<ret<<endl;
+  }
+}
+string udpQuestionResponse(const ComboAddress& dest, const string& query)
+{
+  cerr<<"In udpQuestionResponse"<<endl;
+  Socket s(dest.sin4.sin_family, SOCK_DGRAM);
+  s.setNonBlocking();
+  ComboAddress local = getQueryLocalAddress(dest.sin4.sin_family, 0);
+  
+  s.bind(local);
+  s.connect(dest);
+  cerr<<"here, query="<<query<<endl;
+  s.send(query);
+
+  PacketID pident;
+  pident.sock=&s;
+  pident.type=0;
+  t_fdm->addReadFD(s.getHandle(), handleUDPQueryResponse, pident);
+
+  string data;
+  cerr<<"Entering waitEvent in udpQuestionResponse"<<endl;
+  int ret=MT->waitEvent(pident,&data, g_networkTimeoutMsec);
+  cerr<<"Got back: "<<data<<endl; 
+  if(!ret || ret==-1) { // timeout
+    cerr<<"Got back some kind of error, ret="<<ret<<endl;
+    t_fdm->removeReadFD(s.getHandle());
+  }
+  else if(data.empty()) {// error, EOF or other
+
+    return data;
+  }
+
+  return data;
+}
+
+
+
 vector<ComboAddress> g_localQueryAddresses4, g_localQueryAddresses6;
 const ComboAddress g_local4("0.0.0.0"), g_local6("::");
 
index bd9b32ef16db7e94ca538cdf136f2476be3692af..23eade607dca9992bdbd5abf414683f9ef05d907 100644 (file)
@@ -120,7 +120,7 @@ public:
       throw NetworkError(string("Setsockopt failed: ")+strerror(errno));
 
     if(::bind(d_socket,(struct sockaddr *)&local, local.getSocklen())<0)
-      throw NetworkError(strerror(errno));
+      throw NetworkError("While binding: "+string(strerror(errno)));
   }
 
 #if 0
@@ -140,7 +140,7 @@ public:
   void connect(const ComboAddress &ep)
   {
     if(::connect(d_socket,(struct sockaddr *)&ep, ep.getSocklen()) < 0 && errno != EINPROGRESS)
-      throw NetworkError(strerror(errno));
+      throw NetworkError("While connecting: "+string(strerror(errno)));
   }
 
 
@@ -153,7 +153,7 @@ public:
     socklen_t remlen=sizeof(ep);
     int bytes;
     if((bytes=recvfrom(d_socket, d_buffer, d_buflen, 0, (sockaddr *)&ep , &remlen)) <0)
-      throw NetworkError(strerror(errno));
+      throw NetworkError("After recvfrom: "+string(strerror(errno)));
     
     dgram.assign(d_buffer,bytes);
   }
@@ -165,7 +165,7 @@ public:
     int bytes;
     if((bytes=recvfrom(d_socket, d_buffer, d_buflen, 0, (sockaddr *)&remote, &remlen))<0) {
       if(errno!=EAGAIN) {
-        throw NetworkError(strerror(errno));
+        throw NetworkError("After async recvfrom: "+string(strerror(errno)));
       }
       else {
         return false;
@@ -180,9 +180,17 @@ public:
   void sendTo(const char* msg, unsigned int len, const ComboAddress &ep)
   {
     if(sendto(d_socket, msg, len, 0, (sockaddr *)&ep, ep.getSocklen())<0)
-      throw NetworkError(strerror(errno));
+      throw NetworkError("After sendto: "+string(strerror(errno)));
   }
 
+  //! For connected datagram sockets, send a datagram
+  void send(const std::string& msg)
+  {
+    if(::send(d_socket, msg.c_str(), msg.size(), 0)<0)
+      throw NetworkError("After send: "+string(strerror(errno)));
+  }
+
+  
   /** For datagram sockets, send a datagram to a destination
       \param dgram The datagram
       \param ep The intended destination of the datagram */
index e967d76bdccd77c285ed537dec86c3c017d6849d..6e72d8ada0bee1bd0279880c960e83dff07be57a 100644 (file)
@@ -107,6 +107,7 @@ void accountAuthLatency(int usec, int family)
 
 }
 
+
 SyncRes::SyncRes(const struct timeval& now) :  d_outqueries(0), d_tcpoutqueries(0), d_throttledqueries(0), d_timeouts(0), d_unreachables(0),
                                               d_totUsec(0), d_doDNSSEC(false), d_now(now),
                                               d_cacheonly(false), d_nocache(false), d_doEDNS0(false), d_lm(s_lm)