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