]> granicus.if.org Git - pdns/commitdiff
Port calidns to openbsd and other systems without recvmmsg or sched_setscheduler.
authorOtto Moerbeek <otto.moerbeek@open-xchange.com>
Tue, 4 Jun 2019 12:21:33 +0000 (14:21 +0200)
committerPeter van Dijk <peter.van.dijk@powerdns.com>
Mon, 24 Jun 2019 08:29:42 +0000 (10:29 +0200)
(cherry picked from commit 63fd0bc9d43bf51c5471aea8b25cd0b6f3aa4029)

configure.ac
pdns/Makefile.am
pdns/calidns.cc

index 501661e6a7faedfb93cd35b1709c51f6e813a80f..02d93318f9e14295d18b46542ad4556107245588 100644 (file)
@@ -130,10 +130,12 @@ PDNS_CHECK_VIRTUALENV
 PDNS_FROM_GIT
 
 dnl Checks for library functions.
-AC_CHECK_FUNCS_ONCE([strcasestr localtime_r recvmmsg getrandom arc4random])
+AC_CHECK_FUNCS_ONCE([strcasestr localtime_r recvmmsg sched_setscheduler getrandom arc4random])
 
 AM_CONDITIONAL([HAVE_RECVMMSG], [test "x$ac_cv_func_recvmmsg" = "xyes"])
 
+AM_CONDITIONAL([HAVE_SCHED_SETSCHEDULER], [test "x$ac_cv_func_sched_setscheduler" = "xyes"])
+
 AS_IF([test "x$lt_cv_dlopen" = "xno"],
   [AC_MSG_ERROR([Your system does not support dlopen])]
 )
index edf380e967554e8ce17a4f09c6742f5808e857e2..b29a58686c839ad1cb2612c118c713253933cb83 100644 (file)
@@ -99,9 +99,7 @@ bin_PROGRAMS += \
        ixplore \
        sdig
 
-if HAVE_RECVMMSG
 bin_PROGRAMS += calidns
-endif
 
 if HAVE_BOOST_GE_148
 bin_PROGRAMS += \
index f2c8bb0a302f02eca6dba6151ce3bfba964721aa..06862882af771a72e9918e15f1529459ac6c8739 100644 (file)
@@ -68,37 +68,52 @@ static void* recvThread(const vector<Socket*>* sockets)
 
   int err;
 
+#if HAVE_RECVMMSG
   vector<struct mmsghdr> buf(100);
   for(auto& m : buf) {
     fillMSGHdr(&m.msg_hdr, new struct iovec, new char[512], 512, new char[1500], 1500, new ComboAddress("127.0.0.1"));
   }
+#else
+  struct msghdr buf;
+  fillMSGHdr(&buf, new struct iovec, new char[512], 512, new char[1500], 1500, new ComboAddress("127.0.0.1"));
+#endif
 
   while(!g_done) {
     fds=rfds;
 
     err = poll(&fds[0], fds.size(), -1);
-    if(err < 0) {
-      if(errno==EINTR)
-       continue;
+    if (err < 0) {
+      if (errno == EINTR)
+        continue;
       unixDie("Unable to poll for new UDP events");
-    }    
-    
+    }
+
     for(auto &pfd : fds) {
-      if(pfd.revents & POLLIN) {
-       
-       if((err=recvmmsg(pfd.fd, &buf[0], buf.size(), MSG_WAITFORONE, 0)) < 0 ) {
-         if(errno != EAGAIN)
-           cerr<<"recvfrom gave error, ignoring: "<<strerror(errno)<<endl;
-         unixDie("recvmmsg");
-         continue;
-       }
-       g_recvcounter+=err;
-       for(int n=0; n < err; ++n)
-         g_recvbytes += buf[n].msg_len;
+      if (pfd.revents & POLLIN) {
+#if HAVE_RECVMMSG
+        if ((err=recvmmsg(pfd.fd, &buf[0], buf.size(), MSG_WAITFORONE, 0)) < 0 ) {
+          if(errno != EAGAIN)
+            cerr<<"recvmmsg gave error, ignoring: "<<strerror(errno)<<endl;
+          unixDie("recvmmsg");
+          continue;
+        }
+        g_recvcounter+=err;
+        for(int n=0; n < err; ++n)
+        g_recvbytes += buf[n].msg_len;
+#else
+        if ((err = recvmsg(pfd.fd, &buf, 0)) < 0) {
+          if (errno != EAGAIN)
+            cerr << "recvmsg gave error, ignoring: " << strerror(errno) << endl;
+          unixDie("recvmsg");
+          continue;
+        }
+        g_recvcounter++;
+        for (int i = 0; i < buf.msg_iovlen; i++)
+          g_recvbytes += buf.msg_iov[i].iov_len;
+#endif
       }
     }
   }
-
   return 0;
 }
 
@@ -184,11 +199,11 @@ static void sendPackets(const vector<Socket*>* sockets, const vector<vector<uint
       replaceEDNSClientSubnet(p, ecsRange);
     }
 
-    fillMSGHdr(&u.msgh, &u.iov, u.cbuf, 0, (char*)&(*p)[0], p->size(), &dest);
+    fillMSGHdr(&u.msgh, &u.iov, nullptr, 0, (char*)&(*p)[0], p->size(), &dest);
     if((ret=sendmsg((*sockets)[count % sockets->size()]->getHandle(), 
                    &u.msgh, 0)))
       if(ret < 0)
-       unixDie("sendmmsg");
+             unixDie("sendmsg");
     
     
     if(!(count%burst)) {
@@ -339,11 +354,13 @@ try
   struct sched_param param;
   param.sched_priority=99;
 
+#if HAVE_SCHED_SETSCHEDULER
   if(sched_setscheduler(0, SCHED_FIFO, &param) < 0) {
     if (!g_quiet) {
       cerr<<"Unable to set SCHED_FIFO: "<<strerror(errno)<<endl;
     }
   }
+#endif
 
   ifstream ifs(g_vm["query-file"].as<string>());
   string line;