1/*++
2/* NAME
3/*	test_dns_lookup 1
4/* SUMMARY
5/*	DNS lookup test program
6/* SYNOPSIS
7/*	test_dns_lookup query-type domain-name
8/* DESCRIPTION
9/*	test_dns_lookup performs a DNS query of the specified resource
10/*	type for the specified resource name.
11/* DIAGNOSTICS
12/*	Problems are reported to the standard error stream.
13/* LICENSE
14/* .ad
15/* .fi
16/*	The Secure Mailer license must be distributed with this software.
17/* AUTHOR(S)
18/*	Wietse Venema
19/*	IBM T.J. Watson Research
20/*	P.O. Box 704
21/*	Yorktown Heights, NY 10598, USA
22/*--*/
23
24/* System library. */
25
26#include <sys_defs.h>
27#include <netinet/in.h>
28#include <arpa/inet.h>
29#include <stdlib.h>
30
31/* Utility library. */
32
33#include <vstring.h>
34#include <msg.h>
35#include <msg_vstream.h>
36#include <mymalloc.h>
37#include <argv.h>
38
39/* Application-specific. */
40
41#include "dns.h"
42
43static void print_rr(DNS_RR *rr)
44{
45    MAI_HOSTADDR_STR host;
46
47    while (rr) {
48	printf("%s: ttl: %9d ", rr->rname, rr->ttl);
49	switch (rr->type) {
50	case T_A:
51#ifdef T_AAAA
52	case T_AAAA:
53#endif
54	    if (dns_rr_to_pa(rr, &host) == 0)
55		msg_fatal("conversion error for resource record type %s: %m",
56			  dns_strtype(rr->type));
57	    printf("%s: %s\n", dns_strtype(rr->type), host.buf);
58	    break;
59	case T_CNAME:
60	case T_MB:
61	case T_MG:
62	case T_MR:
63	case T_NS:
64	case T_PTR:
65	case T_TXT:
66	    printf("%s: %s\n", dns_strtype(rr->type), rr->data);
67	    break;
68	case T_MX:
69	    printf("pref: %d %s: %s\n",
70		   rr->pref, dns_strtype(rr->type), rr->data);
71	    break;
72	default:
73	    msg_fatal("print_rr: don't know how to print type %s",
74		      dns_strtype(rr->type));
75	}
76	rr = rr->next;
77    }
78}
79
80int     main(int argc, char **argv)
81{
82    ARGV   *types_argv;
83    unsigned *types;
84    char   *name;
85    VSTRING *fqdn = vstring_alloc(100);
86    VSTRING *why = vstring_alloc(100);
87    DNS_RR *rr;
88    int     i;
89
90    msg_vstream_init(argv[0], VSTREAM_ERR);
91    if (argc != 3)
92	msg_fatal("usage: %s types name", argv[0]);
93    types_argv = argv_split(argv[1], ", \t\r\n");
94    types = (unsigned *) mymalloc(sizeof(*types) * (types_argv->argc + 1));
95    for (i = 0; i < types_argv->argc; i++)
96	if ((types[i] = dns_type(types_argv->argv[i])) == 0)
97	    msg_fatal("invalid query type: %s", types_argv->argv[i]);
98    types[i] = 0;
99    argv_free(types_argv);
100    name = argv[2];
101    msg_verbose = 1;
102    switch (dns_lookup_v(name, RES_DEBUG, &rr, fqdn, why,
103			 DNS_REQ_FLAG_NONE, types)) {
104    default:
105	msg_fatal("%s", vstring_str(why));
106    case DNS_OK:
107	printf("%s: fqdn: %s\n", name, vstring_str(fqdn));
108	print_rr(rr);
109	dns_rr_free(rr);
110    }
111    myfree((char *) types);
112    exit(0);
113}
114