5
/* compare resource record with socket address
9
/* int dns_rr_eq_sa(DNS_RR *rr, struct sockaddr *sa)
11
/* struct sockaddr *sa;
13
/* int DNS_RR_EQ_SA(DNS_RR *rr, struct sockaddr *sa)
15
/* struct sockaddr *sa;
17
/* dns_rr_eq_sa() compares a DNS resource record with a socket
18
/* address. The result is non-zero when the resource type
19
/* matches the socket address family, and when the network
20
/* address information is identical.
22
/* DNS_RR_EQ_SA() is an unsafe macro version for those who live fast.
26
/* DNS resource record pointer.
28
/* Binary address pointer.
30
/* Panic: unknown socket address family.
34
/* The Secure Mailer license must be distributed with this software.
37
/* IBM T.J. Watson Research
39
/* Yorktown Heights, NY 10598, USA
42
/* System libraries. */
46
/* Utility library. */
49
#include <sock_addr.h>
55
/* dns_rr_eq_sa - compare resource record with socket address */
57
int dns_rr_eq_sa(DNS_RR *rr, struct sockaddr * sa)
59
const char *myname = "dns_rr_eq_sa";
61
if (sa->sa_family == AF_INET) {
62
return (rr->type == T_A
63
&& SOCK_ADDR_IN_ADDR(sa).s_addr == IN_ADDR(rr->data).s_addr);
65
} else if (sa->sa_family == AF_INET6) {
66
return (rr->type == T_AAAA
67
&& memcmp((char *) &SOCK_ADDR_IN6_ADDR(sa),
68
rr->data, rr->data_len) == 0);
71
msg_panic("%s: unsupported socket address family type: %d",
72
myname, sa->sa_family);
77
* Stand-alone test program.
81
#include <myaddrinfo.h>
82
#include <inet_proto.h>
84
static const char *myname;
86
static NORETURN usage(void)
88
msg_fatal("usage: %s hostname address", myname);
91
int main(int argc, char **argv)
93
MAI_HOSTADDR_STR hostaddr;
95
struct addrinfo *res0;
96
struct addrinfo *res1;
105
inet_proto_init(argv[0], INET_PROTO_NAME_ALL);
111
if ((aierr = hostaddr_to_sockaddr(argv[1], (char *) 0, 0, &res1)) != 0)
112
msg_fatal("host address %s: %s", argv[1], MAI_STRERROR(aierr));
113
if ((rr = dns_sa_to_rr(argv[1], 0, res1->ai_addr)) == 0)
114
msg_fatal("dns_sa_to_rr: %m");
117
if ((aierr = hostname_to_sockaddr(argv[0], (char *) 0, 0, &res0)) != 0)
118
msg_fatal("host name %s: %s", argv[0], MAI_STRERROR(aierr));
119
for (res = res0; res != 0; res = res->ai_next) {
120
SOCKADDR_TO_HOSTADDR(res->ai_addr, res->ai_addrlen,
121
&hostaddr, (MAI_SERVPORT_STR *) 0, 0);
122
vstream_printf("%s =?= %s\n", hostaddr.buf, argv[1]);
123
vstream_printf("tested by function: %s\n",
124
dns_rr_eq_sa(rr, res->ai_addr) ?
126
vstream_printf("tested by macro: %s\n",
127
DNS_RR_EQ_SA(rr, res->ai_addr) ?
132
vstream_fflush(VSTREAM_OUT);