aboutsummaryrefslogtreecommitdiff
path: root/external/unbound/testcode/streamtcp.c
diff options
context:
space:
mode:
Diffstat (limited to 'external/unbound/testcode/streamtcp.c')
-rw-r--r--external/unbound/testcode/streamtcp.c431
1 files changed, 0 insertions, 431 deletions
diff --git a/external/unbound/testcode/streamtcp.c b/external/unbound/testcode/streamtcp.c
deleted file mode 100644
index 34b5c0281..000000000
--- a/external/unbound/testcode/streamtcp.c
+++ /dev/null
@@ -1,431 +0,0 @@
-/*
- * testcode/streamtcp.c - debug program perform multiple DNS queries on tcp.
- *
- * Copyright (c) 2008, NLnet Labs. All rights reserved.
- *
- * This software is open source.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- *
- * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * Neither the name of the NLNET LABS nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/**
- * \file
- *
- * This program performs multiple DNS queries on a TCP stream.
- */
-
-#include "config.h"
-#ifdef HAVE_GETOPT_H
-#include <getopt.h>
-#endif
-#include <signal.h>
-#include "util/locks.h"
-#include "util/log.h"
-#include "util/net_help.h"
-#include "util/data/msgencode.h"
-#include "util/data/msgparse.h"
-#include "util/data/msgreply.h"
-#include "util/data/dname.h"
-#include "sldns/sbuffer.h"
-#include "sldns/str2wire.h"
-#include "sldns/wire2str.h"
-#include <openssl/ssl.h>
-#include <openssl/rand.h>
-#include <openssl/err.h>
-
-#ifndef PF_INET6
-/** define in case streamtcp is compiled on legacy systems */
-#define PF_INET6 10
-#endif
-
-/** usage information for streamtcp */
-static void usage(char* argv[])
-{
- printf("usage: %s [options] name type class ...\n", argv[0]);
- printf(" sends the name-type-class queries over TCP.\n");
- printf("-f server what ipaddr@portnr to send the queries to\n");
- printf("-u use UDP. No retries are attempted.\n");
- printf("-n do not wait for an answer.\n");
- printf("-s use ssl\n");
- printf("-h this help text\n");
- exit(1);
-}
-
-/** open TCP socket to svr */
-static int
-open_svr(const char* svr, int udp)
-{
- struct sockaddr_storage addr;
- socklen_t addrlen;
- int fd = -1;
- /* svr can be ip@port */
- memset(&addr, 0, sizeof(addr));
- if(!extstrtoaddr(svr, &addr, &addrlen)) {
- printf("fatal: bad server specs '%s'\n", svr);
- exit(1);
- }
- fd = socket(addr_is_ip6(&addr, addrlen)?PF_INET6:PF_INET,
- udp?SOCK_DGRAM:SOCK_STREAM, 0);
- if(fd == -1) {
-#ifndef USE_WINSOCK
- perror("socket() error");
-#else
- printf("socket: %s\n", wsa_strerror(WSAGetLastError()));
-#endif
- exit(1);
- }
- if(connect(fd, (struct sockaddr*)&addr, addrlen) < 0) {
-#ifndef USE_WINSOCK
- perror("connect() error");
-#else
- printf("connect: %s\n", wsa_strerror(WSAGetLastError()));
-#endif
- exit(1);
- }
- return fd;
-}
-
-/** write a query over the TCP fd */
-static void
-write_q(int fd, int udp, SSL* ssl, sldns_buffer* buf, uint16_t id,
- const char* strname, const char* strtype, const char* strclass)
-{
- struct query_info qinfo;
- uint16_t len;
- /* qname */
- qinfo.qname = sldns_str2wire_dname(strname, &qinfo.qname_len);
- if(!qinfo.qname) {
- printf("cannot parse query name: '%s'\n", strname);
- exit(1);
- }
-
- /* qtype and qclass */
- qinfo.qtype = sldns_get_rr_type_by_name(strtype);
- qinfo.qclass = sldns_get_rr_class_by_name(strclass);
-
- /* clear local alias */
- qinfo.local_alias = NULL;
-
- /* make query */
- qinfo_query_encode(buf, &qinfo);
- sldns_buffer_write_u16_at(buf, 0, id);
- sldns_buffer_write_u16_at(buf, 2, BIT_RD);
-
- if(1) {
- /* add EDNS DO */
- struct edns_data edns;
- memset(&edns, 0, sizeof(edns));
- edns.edns_present = 1;
- edns.bits = EDNS_DO;
- edns.udp_size = 4096;
- attach_edns_record(buf, &edns);
- }
-
- /* send it */
- if(!udp) {
- len = (uint16_t)sldns_buffer_limit(buf);
- len = htons(len);
- if(ssl) {
- if(SSL_write(ssl, (void*)&len, (int)sizeof(len)) <= 0) {
- log_crypto_err("cannot SSL_write");
- exit(1);
- }
- } else {
- if(send(fd, (void*)&len, sizeof(len), 0) <
- (ssize_t)sizeof(len)){
-#ifndef USE_WINSOCK
- perror("send() len failed");
-#else
- printf("send len: %s\n",
- wsa_strerror(WSAGetLastError()));
-#endif
- exit(1);
- }
- }
- }
- if(ssl) {
- if(SSL_write(ssl, (void*)sldns_buffer_begin(buf),
- (int)sldns_buffer_limit(buf)) <= 0) {
- log_crypto_err("cannot SSL_write");
- exit(1);
- }
- } else {
- if(send(fd, (void*)sldns_buffer_begin(buf),
- sldns_buffer_limit(buf), 0) <
- (ssize_t)sldns_buffer_limit(buf)) {
-#ifndef USE_WINSOCK
- perror("send() data failed");
-#else
- printf("send data: %s\n", wsa_strerror(WSAGetLastError()));
-#endif
- exit(1);
- }
- }
-
- free(qinfo.qname);
-}
-
-/** receive DNS datagram over TCP and print it */
-static void
-recv_one(int fd, int udp, SSL* ssl, sldns_buffer* buf)
-{
- char* pktstr;
- uint16_t len;
- if(!udp) {
- if(ssl) {
- if(SSL_read(ssl, (void*)&len, (int)sizeof(len)) <= 0) {
- log_crypto_err("could not SSL_read");
- exit(1);
- }
- } else {
- if(recv(fd, (void*)&len, sizeof(len), 0) <
- (ssize_t)sizeof(len)) {
-#ifndef USE_WINSOCK
- perror("read() len failed");
-#else
- printf("read len: %s\n",
- wsa_strerror(WSAGetLastError()));
-#endif
- exit(1);
- }
- }
- len = ntohs(len);
- sldns_buffer_clear(buf);
- sldns_buffer_set_limit(buf, len);
- if(ssl) {
- int r = SSL_read(ssl, (void*)sldns_buffer_begin(buf),
- (int)len);
- if(r <= 0) {
- log_crypto_err("could not SSL_read");
- exit(1);
- }
- if(r != (int)len)
- fatal_exit("ssl_read %d of %d", r, len);
- } else {
- if(recv(fd, (void*)sldns_buffer_begin(buf), len, 0) <
- (ssize_t)len) {
-#ifndef USE_WINSOCK
- perror("read() data failed");
-#else
- printf("read data: %s\n",
- wsa_strerror(WSAGetLastError()));
-#endif
- exit(1);
- }
- }
- } else {
- ssize_t l;
- sldns_buffer_clear(buf);
- if((l=recv(fd, (void*)sldns_buffer_begin(buf),
- sldns_buffer_capacity(buf), 0)) < 0) {
-#ifndef USE_WINSOCK
- perror("read() data failed");
-#else
- printf("read data: %s\n",
- wsa_strerror(WSAGetLastError()));
-#endif
- exit(1);
- }
- sldns_buffer_set_limit(buf, (size_t)l);
- len = (size_t)l;
- }
- printf("\nnext received packet\n");
- log_buf(0, "data", buf);
-
- pktstr = sldns_wire2str_pkt(sldns_buffer_begin(buf), len);
- printf("%s", pktstr);
- free(pktstr);
-}
-
-static int get_random(void)
-{
- int r;
- if (RAND_bytes((unsigned char*)&r, (int)sizeof(r)) == 1) {
- return r;
- }
- return arc4random();
-}
-
-/** send the TCP queries and print answers */
-static void
-send_em(const char* svr, int udp, int usessl, int noanswer, int num, char** qs)
-{
- sldns_buffer* buf = sldns_buffer_new(65553);
- int fd = open_svr(svr, udp);
- int i;
- SSL_CTX* ctx = NULL;
- SSL* ssl = NULL;
- if(!buf) fatal_exit("out of memory");
- if(usessl) {
- ctx = connect_sslctx_create(NULL, NULL, NULL);
- if(!ctx) fatal_exit("cannot create ssl ctx");
- ssl = outgoing_ssl_fd(ctx, fd);
- if(!ssl) fatal_exit("cannot create ssl");
- while(1) {
- int r;
- ERR_clear_error();
- if( (r=SSL_do_handshake(ssl)) == 1)
- break;
- r = SSL_get_error(ssl, r);
- if(r != SSL_ERROR_WANT_READ &&
- r != SSL_ERROR_WANT_WRITE) {
- log_crypto_err("could not ssl_handshake");
- exit(1);
- }
- }
- if(1) {
- X509* x = SSL_get_peer_certificate(ssl);
- if(!x) printf("SSL: no peer certificate\n");
- else {
- X509_print_fp(stdout, x);
- X509_free(x);
- }
- }
- }
- for(i=0; i<num; i+=3) {
- printf("\nNext query is %s %s %s\n", qs[i], qs[i+1], qs[i+2]);
- write_q(fd, udp, ssl, buf, (uint16_t)get_random(), qs[i],
- qs[i+1], qs[i+2]);
- /* print at least one result */
- if(!noanswer)
- recv_one(fd, udp, ssl, buf);
- }
-
- if(usessl) {
- SSL_shutdown(ssl);
- SSL_free(ssl);
- SSL_CTX_free(ctx);
- }
-#ifndef USE_WINSOCK
- close(fd);
-#else
- closesocket(fd);
-#endif
- sldns_buffer_free(buf);
- printf("orderly exit\n");
-}
-
-#ifdef SIGPIPE
-/** SIGPIPE handler */
-static RETSIGTYPE sigh(int sig)
-{
- if(sig == SIGPIPE) {
- printf("got SIGPIPE, remote connection gone\n");
- exit(1);
- }
- printf("Got unhandled signal %d\n", sig);
- exit(1);
-}
-#endif /* SIGPIPE */
-
-/** getopt global, in case header files fail to declare it. */
-extern int optind;
-/** getopt global, in case header files fail to declare it. */
-extern char* optarg;
-
-/** main program for streamtcp */
-int main(int argc, char** argv)
-{
- int c;
- const char* svr = "127.0.0.1";
- int udp = 0;
- int noanswer = 0;
- int usessl = 0;
-
-#ifdef USE_WINSOCK
- WSADATA wsa_data;
- if(WSAStartup(MAKEWORD(2,2), &wsa_data) != 0) {
- printf("WSAStartup failed\n");
- return 1;
- }
-#endif
-
- /* lock debug start (if any) */
- log_init(0, 0, 0);
- checklock_start();
-
-#ifdef SIGPIPE
- if(signal(SIGPIPE, &sigh) == SIG_ERR) {
- perror("could not install signal handler");
- return 1;
- }
-#endif
-
- /* command line options */
- if(argc == 1) {
- usage(argv);
- }
- while( (c=getopt(argc, argv, "f:hnsu")) != -1) {
- switch(c) {
- case 'f':
- svr = optarg;
- break;
- case 'n':
- noanswer = 1;
- break;
- case 'u':
- udp = 1;
- break;
- case 's':
- usessl = 1;
- break;
- case 'h':
- case '?':
- default:
- usage(argv);
- }
- }
- argc -= optind;
- argv += optind;
-
- if(argc % 3 != 0) {
- printf("queries must be multiples of name,type,class\n");
- return 1;
- }
- if(usessl) {
- ERR_load_SSL_strings();
-#if OPENSSL_VERSION_NUMBER < 0x10100000 || !defined(HAVE_OPENSSL_INIT_CRYPTO)
- OpenSSL_add_all_algorithms();
-#else
- OPENSSL_init_crypto(OPENSSL_INIT_ADD_ALL_CIPHERS
- | OPENSSL_INIT_ADD_ALL_DIGESTS
- | OPENSSL_INIT_LOAD_CRYPTO_STRINGS, NULL);
-#endif
-#if OPENSSL_VERSION_NUMBER < 0x10100000 || !defined(HAVE_OPENSSL_INIT_SSL)
- (void)SSL_library_init();
-#else
- (void)OPENSSL_init_ssl(0, NULL);
-#endif
- }
- send_em(svr, udp, usessl, noanswer, argc, argv);
- checklock_stop();
-#ifdef USE_WINSOCK
- WSACleanup();
-#endif
- return 0;
-}