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