xref: /netbsd-src/external/ibm-public/postfix/dist/src/dns/dns_rr_to_pa.c (revision 41fbaed053f8fbfdf9d2a4ee0a7386a3c83f8505)
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