]> git.ipfire.org Git - thirdparty/ldns.git/commitdiff
* ldns-testns can answer several queries over one tcp connection,
authorW.C.A. Wijngaards <wouter@nlnetlabs.nl>
Tue, 24 Nov 2020 13:04:50 +0000 (14:04 +0100)
committerW.C.A. Wijngaards <wouter@nlnetlabs.nl>
Tue, 24 Nov 2020 13:04:50 +0000 (14:04 +0100)
  if they arrive within 100msec of each other.

Changelog
contrib/DNS-LDNS
examples/ldns-testns.c

index 3fdf8d7141134ba430e4e738e379af27b75507b6..5dc14318e0d9dfb4a7c5eeec46a303a5b309c300 100644 (file)
--- a/Changelog
+++ b/Changelog
@@ -12,6 +12,8 @@
        * Fix #92: ldns-testns.c:429:15: error: 'fork' is unavailable: not
          available on tvOS.
        * Fix for #93: fix packaging/libldns.pc Makefile rule.
+       * ldns-testns can answer several queries over one tcp connection,
+         if they arrive within 100msec of each other.
 
 1.7.1  2019-07-26
        * bugfix: Manage verification paths for OpenSSL >= 1.1.0
index c2aedfffd629a61ee9bd850d6ff58b7e86626a83..9ded846581c12d7cf1be76d20e3a57b7d17a5e28 160000 (submodule)
@@ -1 +1 @@
-Subproject commit c2aedfffd629a61ee9bd850d6ff58b7e86626a83
+Subproject commit 9ded846581c12d7cf1be76d20e3a57b7d17a5e28
index 57a2aac062848325e8294549e0318acf7c2963ce..967d34c118805d2d1115b6a1734e152df9864687 100644 (file)
@@ -345,25 +345,46 @@ handle_tcp(int tcp_sock, struct entry* entries, int *count)
        }
        userdata.s = s;
 
-       /* tcp recv */
-       if (read_n_bytes(s, (uint8_t*)&tcplen, sizeof(tcplen)))
-               return;
-       tcplen = ntohs(tcplen);
-       if(tcplen >= INBUF_SIZE) {
-               log_msg("query %d bytes too large, buffer %d bytes.\n",
-                       tcplen, INBUF_SIZE);
+       while(1) {
+               /* tcp recv */
+               if (read_n_bytes(s, (uint8_t*)&tcplen, sizeof(tcplen)))
+                       return;
+               tcplen = ntohs(tcplen);
+               if(tcplen >= INBUF_SIZE) {
+                       log_msg("query %d bytes too large, buffer %d bytes.\n",
+                               tcplen, INBUF_SIZE);
 #ifndef USE_WINSOCK
-               close(s);
+                       close(s);
 #else
-               closesocket(s);
+                       closesocket(s);
 #endif
-               return;
-       }
-       if (read_n_bytes(s, inbuf, tcplen))
-               return;
+                       return;
+               }
+               if (read_n_bytes(s, inbuf, tcplen))
+                       return;
+
+               handle_query(inbuf, (ssize_t) tcplen, entries, count, transport_tcp, 
+                       send_tcp, &userdata, do_verbose?logfile:0);
+               /* another query straight away? */
+               if(1) {
+                       fd_set rset;
+                       struct timeval tv;
+                       int ret;
+                       FD_ZERO(&rset);
+                       FD_SET(s, &rset);
+                       tv.tv_sec = 0;
+                       tv.tv_usec = 100*1000;
+                       ret = select(s+1, &rset, NULL, NULL, &tv);
+                       if(ret < 0) {
+                               error("select(): %s\n", strerror(errno));
+                       }
+                       if(ret == 0) {
+                               /* timeout */
+                               break;
+                       }
+               }
 
-       handle_query(inbuf, (ssize_t) tcplen, entries, count, transport_tcp, 
-               send_tcp, &userdata, do_verbose?logfile:0);
+       }
 #ifndef USE_WINSOCK
        close(s);
 #else