1 /* $NetBSD: dns_rr_to_pa.c,v 1.1.1.1 2009/06/23 10:08:43 tron Exp $ */
2
3 /*++
4 /* NAME
5 /* dns_rr_to_pa 3
6 /* SUMMARY
7 /* resource record to printable address
8 /* SYNOPSIS
9 /* #include <dns.h>
10 /*
11 /* const char *dns_rr_to_pa(rr, hostaddr)
12 /* DNS_RR *rr;
13 /* MAI_HOSTADDR_STR *hostaddr;
14 /* DESCRIPTION
15 /* dns_rr_to_pa() converts the address in a DNS resource record
16 /* into printable form and returns a pointer to the result.
17 /*
18 /* Arguments:
19 /* .IP rr
20 /* The DNS resource record.
21 /* .IP hostaddr
22 /* Storage for the printable address.
23 /* DIAGNOSTICS
24 /* The result is null in case of problems, with errno set
25 /* to indicate the nature of the problem.
26 /* LICENSE
27 /* .ad
28 /* .fi
29 /* The Secure Mailer license must be distributed with this software.
30 /* AUTHOR(S)
31 /* Wietse Venema
32 /* IBM T.J. Watson Research
33 /* P.O. Box 704
34 /* Yorktown Heights, NY 10598, USA
35 /*--*/
36
37 /* System libraries. */
38
39 #include <sys_defs.h>
40 #include <sys/socket.h>
41 #include <netinet/in.h>
42 #include <arpa/inet.h>
43 #include <errno.h>
44
45 /* Utility library. */
46
47 #include <msg.h>
48
49 /* DNS library. */
50
51 #include <dns.h>
52
53 /* dns_rr_to_pa - resource record to printable address */
54
dns_rr_to_pa(DNS_RR * rr,MAI_HOSTADDR_STR * hostaddr)55 const char *dns_rr_to_pa(DNS_RR *rr, MAI_HOSTADDR_STR *hostaddr)
56 {
57 if (rr->type == T_A) {
58 return (inet_ntop(AF_INET, rr->data, hostaddr->buf,
59 sizeof(hostaddr->buf)));
60 #ifdef HAS_IPV6
61 } else if (rr->type == T_AAAA) {
62 return (inet_ntop(AF_INET6, rr->data, hostaddr->buf,
63 sizeof(hostaddr->buf)));
64 #endif
65 } else {
66 errno = EAFNOSUPPORT;
67 return (0);
68 }
69 }
70
71 /*
72 * Stand-alone test program.
73 */
74 #ifdef TEST
75 #include <vstream.h>
76 #include <myaddrinfo.h>
77
78 static const char *myname;
79
usage(void)80 static NORETURN usage(void)
81 {
82 msg_fatal("usage: %s dnsaddrtype hostname", myname);
83 }
84
main(int argc,char ** argv)85 int main(int argc, char **argv)
86 {
87 DNS_RR *rr;
88 MAI_HOSTADDR_STR hostaddr;
89 VSTRING *why;
90 int type;
91
92 myname = argv[0];
93 if (argc < 3)
94 usage();
95 why = vstring_alloc(1);
96
97 while (*++argv) {
98 if (argv[1] == 0)
99 usage();
100 if ((type = dns_type(argv[0])) == 0)
101 usage();
102 if (dns_lookup(argv[1], type, 0, &rr, (VSTRING *) 0, why) != DNS_OK)
103 msg_fatal("%s: %s", argv[1], vstring_str(why));
104 if (dns_rr_to_pa(rr, &hostaddr) == 0)
105 msg_fatal("dns_rr_to_sa: %m");
106 vstream_printf("%s -> %s\n", argv[1], hostaddr.buf);
107 vstream_fflush(VSTREAM_OUT);
108 argv += 1;
109 dns_rr_free(rr);
110 }
111 vstring_free(why);
112 return (0);
113 }
114
115 #endif
116