Postfix3.3.1
全て データ構造 ファイル 関数 変数 型定義 マクロ定義
dns_rr_eq_sa.c
[詳解]
1 /*++
2 /* NAME
3 /* dns_rr_eq_sa 3
4 /* SUMMARY
5 /* compare resource record with socket address
6 /* SYNOPSIS
7 /* #include <dns.h>
8 /*
9 /* int dns_rr_eq_sa(DNS_RR *rr, struct sockaddr *sa)
10 /* DNS_RR *rr;
11 /* struct sockaddr *sa;
12 /*
13 /* int DNS_RR_EQ_SA(DNS_RR *rr, struct sockaddr *sa)
14 /* DNS_RR *rr;
15 /* struct sockaddr *sa;
16 /* DESCRIPTION
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.
21 /*
22 /* DNS_RR_EQ_SA() is an unsafe macro version for those who live fast.
23 /*
24 /* Arguments:
25 /* .IP rr
26 /* DNS resource record pointer.
27 /* .IP sa
28 /* Binary address pointer.
29 /* DIAGNOSTICS
30 /* Panic: unknown socket address family.
31 /* LICENSE
32 /* .ad
33 /* .fi
34 /* The Secure Mailer license must be distributed with this software.
35 /* AUTHOR(S)
36 /* Wietse Venema
37 /* IBM T.J. Watson Research
38 /* P.O. Box 704
39 /* Yorktown Heights, NY 10598, USA
40 /*--*/
41 
42 /* System libraries. */
43 
44 #include <sys_defs.h>
45 
46 /* Utility library. */
47 
48 #include <msg.h>
49 #include <sock_addr.h>
50 
51 /* DNS library. */
52 
53 #include <dns.h>
54 
55 /* dns_rr_eq_sa - compare resource record with socket address */
56 
57 int dns_rr_eq_sa(DNS_RR *rr, struct sockaddr *sa)
58 {
59  const char *myname = "dns_rr_eq_sa";
60 
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);
64 #ifdef HAS_IPV6
65  } else if (sa->sa_family == AF_INET6) {
66  return (rr->type == T_AAAA
67  && memcmp((void *) &SOCK_ADDR_IN6_ADDR(sa),
68  rr->data, rr->data_len) == 0);
69 #endif
70  } else {
71  msg_panic("%s: unsupported socket address family type: %d",
72  myname, sa->sa_family);
73  }
74 }
75 
76  /*
77  * Stand-alone test program.
78  */
79 #ifdef TEST
80 #include <stdlib.h>
81 #include <vstream.h>
82 #include <myaddrinfo.h>
83 #include <inet_proto.h>
84 #include <mymalloc.h>
85 
86 static const char *myname;
87 
88 static NORETURN usage(void)
89 {
90  msg_fatal("usage: %s hostname address", myname);
91 }
92 
93 static int compare_family(const void *a, const void *b)
94 {
95  struct addrinfo *resa = *(struct addrinfo **) a;
96  struct addrinfo *resb = *(struct addrinfo **) b;
97 
98  return (resa->ai_family - resb->ai_family);
99 }
100 
101 int main(int argc, char **argv)
102 {
103  MAI_HOSTADDR_STR hostaddr;
104  DNS_RR *rr;
105  struct addrinfo *res0;
106  struct addrinfo *res1;
107  struct addrinfo *res;
108  struct addrinfo **resv;
109  size_t len, n;
110  int aierr;
111 
112  myname = argv[0];
113 
114  if (argc < 3)
115  usage();
116 
118 
119  while (*++argv) {
120  if (argv[1] == 0)
121  usage();
122 
123  if ((aierr = hostaddr_to_sockaddr(argv[1], (char *) 0, 0, &res1)) != 0)
124  msg_fatal("host address %s: %s", argv[1], MAI_STRERROR(aierr));
125  if ((rr = dns_sa_to_rr(argv[1], 0, res1->ai_addr)) == 0)
126  msg_fatal("dns_sa_to_rr: %m");
127  freeaddrinfo(res1);
128 
129  if ((aierr = hostname_to_sockaddr(argv[0], (char *) 0, 0, &res0)) != 0)
130  msg_fatal("host name %s: %s", argv[0], MAI_STRERROR(aierr));
131  for (len = 0, res = res0; res != 0; res = res->ai_next)
132  len += 1;
133  resv = (struct addrinfo **) mymalloc(len * sizeof(*resv));
134  for (len = 0, res = res0; res != 0; res = res->ai_next)
135  resv[len++] = res;
136  qsort((void *) resv, len, sizeof(*resv), compare_family);
137  for (n = 0; n < len; n++) {
138  SOCKADDR_TO_HOSTADDR(resv[n]->ai_addr, resv[n]->ai_addrlen,
139  &hostaddr, (MAI_SERVPORT_STR *) 0, 0);
140  vstream_printf("%s =?= %s\n", hostaddr.buf, argv[1]);
141  vstream_printf("tested by function: %s\n",
142  dns_rr_eq_sa(rr, resv[n]->ai_addr) ?
143  "yes" : "no");
144  vstream_printf("tested by macro: %s\n",
145  DNS_RR_EQ_SA(rr, resv[n]->ai_addr) ?
146  "yes" : "no");
147  }
148  dns_rr_free(rr);
149  freeaddrinfo(res0);
150  myfree((void *) resv);
152  argv += 1;
153  }
154  return (0);
155 }
156 
157 #endif
#define IN_ADDR(ia)
Definition: sock_addr.h:34
void myfree(void *ptr)
Definition: mymalloc.c:207
void freeaddrinfo(struct addrinfo *ai)
Definition: myaddrinfo.c:742
#define NORETURN
Definition: sys_defs.h:1583
NORETURN msg_panic(const char *fmt,...)
Definition: msg.c:295
#define VSTREAM_OUT
Definition: vstream.h:67
int main(int argc, char **argv)
Definition: anvil.c:1010
INET_PROTO_INFO * inet_proto_init(const char *context, const char *protocols)
Definition: inet_proto.c:180
#define hostname_to_sockaddr(host, serv, sock, res)
Definition: myaddrinfo.h:171
char data[1]
Definition: dns.h:149
#define SOCKADDR_TO_HOSTADDR(sa, salen, host, port, sock)
Definition: myaddrinfo.h:197
#define INET_PROTO_NAME_ALL
Definition: mail_params.h:992
int hostaddr_to_sockaddr(const char *hostaddr, const char *service, int socktype, struct addrinfo **res)
Definition: myaddrinfo.c:464
int dns_rr_eq_sa(DNS_RR *rr, struct sockaddr *sa)
Definition: dns_rr_eq_sa.c:57
char buf[MAI_HOSTADDR_STRSIZE]
Definition: myaddrinfo.h:146
VSTREAM * vstream_printf(const char *fmt,...)
Definition: vstream.c:1335
size_t data_len
Definition: dns.h:148
DNS_RR * dns_sa_to_rr(const char *, unsigned, struct sockaddr *)
Definition: dns_sa_to_rr.c:53
NORETURN msg_fatal(const char *fmt,...)
Definition: msg.c:249
int vstream_fflush(VSTREAM *stream)
Definition: vstream.c:1257
#define MAI_STRERROR(e)
Definition: myaddrinfo.h:169
#define SOCK_ADDR_IN_ADDR(sa)
Definition: sock_addr.h:33
unsigned short type
Definition: dns.h:142
void dns_rr_free(DNS_RR *)
Definition: dns_rr.c:137
Definition: dns.h:139
#define DNS_RR_EQ_SA(rr, sa)
Definition: dns.h:214
void * mymalloc(ssize_t len)
Definition: mymalloc.c:150