From: W.C.A. Wijngaards Date: Tue, 24 Nov 2020 13:09:12 +0000 (+0100) Subject: * ldns-testns can answer several queries over one tcp connection, X-Git-Tag: 1.8.0-rc.1~47 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0f5d452571c05c57dc8a2658964be7b692f43d46;p=thirdparty%2Fldns.git * ldns-testns can answer several queries over one tcp connection, if they arrive within 100msec of each other. --- diff --git a/Changelog b/Changelog index 3fdf8d71..5dc14318 100644 --- 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 diff --git a/examples/ldns-testns.c b/examples/ldns-testns.c index 57a2aac0..1a906ee4 100644 --- a/examples/ldns-testns.c +++ b/examples/ldns-testns.c @@ -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); + 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; + } + } + } #ifndef USE_WINSOCK close(s); #else