Postfix3.3.1
dns_sa_to_rr.c
[詳解]
1 /*++
2 /* NAME
3 /* dns_sa_to_rr 3
4 /* SUMMARY
5 /* socket address to resource record
6 /* SYNOPSIS
7 /* #include <dns.h>
8 /*
9 /* DNS_RR *dns_sa_to_rr(hostname, pref, sa)
10 /* const char *hostname;
11 /* unsigned pref;
12 /* struct sockaddr *sa;
13 /* DESCRIPTION
14 /* dns_sa_to_rr() converts a socket address into a DNS resource record.
15 /*
16 /* Arguments:
17 /* .IP hostname
18 /* The resource record host name. This will be both the qname
19 /* and the rname in the synthetic DNS resource record.
20 /* .IP pref
21 /* The resource record MX host preference, if applicable.
22 /* .IP sa
23 /* Binary address.
24 /* DIAGNOSTICS
25 /* The result is a null pointer in case of problems, with the
26 /* errno variable set to indicate the problem type.
27 /* LICENSE
28 /* .ad
29 /* .fi
30 /* The Secure Mailer license must be distributed with this software.
31 /* AUTHOR(S)
32 /* Wietse Venema
33 /* IBM T.J. Watson Research
34 /* P.O. Box 704
35 /* Yorktown Heights, NY 10598, USA
36 /*--*/
37 
38 /* System libraries. */
39 
40 #include <sys_defs.h>
41 #include <errno.h>
42 
43 /* Utility library. */
44 
45 #include <msg.h>
46 
47 /* DNS library. */
48 
49 #include <dns.h>
50 
51 /* dns_sa_to_rr - socket address to resource record */
52 
53 DNS_RR *dns_sa_to_rr(const char *hostname, unsigned pref, struct sockaddr *sa)
54 {
55 #define DUMMY_TTL 0
56 
57  if (sa->sa_family == AF_INET) {
58  return (dns_rr_create(hostname, hostname, T_A, C_IN, DUMMY_TTL, pref,
59  (char *) &SOCK_ADDR_IN_ADDR(sa),
60  sizeof(SOCK_ADDR_IN_ADDR(sa))));
61 #ifdef HAS_IPV6
62  } else if (sa->sa_family == AF_INET6) {
63  return (dns_rr_create(hostname, hostname, T_AAAA, C_IN, DUMMY_TTL, pref,
64  (char *) &SOCK_ADDR_IN6_ADDR(sa),
65  sizeof(SOCK_ADDR_IN6_ADDR(sa))));
66 #endif
67  } else {
68  errno = EAFNOSUPPORT;
69  return (0);
70  }
71 }
72 
73  /*
74  * Stand-alone test program.
75  */
76 #ifdef TEST
77 #include <stdlib.h>
78 #include <vstream.h>
79 #include <myaddrinfo.h>
80 #include <inet_proto.h>
81 #include <mymalloc.h>
82 
83 static const char *myname;
84 
85 static NORETURN usage(void)
86 {
87  msg_fatal("usage: %s hostname", myname);
88 }
89 
90 static int compare_family(const void *a, const void *b)
91 {
92  struct addrinfo *resa = *(struct addrinfo **) a;
93  struct addrinfo *resb = *(struct addrinfo **) b;
94 
95  return (resa->ai_family - resb->ai_family);
96 }
97 
98 int main(int argc, char **argv)
99 {
100  MAI_HOSTADDR_STR hostaddr;
101  struct addrinfo *res0;
102  struct addrinfo *res;
103  struct addrinfo **resv;
104  size_t len, n;
105  DNS_RR *rr;
106  int aierr;
107 
108  myname = argv[0];
109  if (argc < 2)
110  usage();
111 
113 
114  while (*++argv) {
115  if ((aierr = hostname_to_sockaddr(argv[0], (char *) 0, 0, &res0)) != 0)
116  msg_fatal("%s: %s", argv[0], MAI_STRERROR(aierr));
117  for (len = 0, res = res0; res != 0; res = res->ai_next)
118  len += 1;
119  resv = (struct addrinfo **) mymalloc(len * sizeof(*resv));
120  for (len = 0, res = res0; res != 0; res = res->ai_next)
121  resv[len++] = res;
122  qsort((void *) resv, len, sizeof(*resv), compare_family);
123  for (n = 0; n < len; n++) {
124  if ((rr = dns_sa_to_rr(argv[0], 0, resv[n]->ai_addr)) == 0)
125  msg_fatal("dns_sa_to_rr: %m");
126  if (dns_rr_to_pa(rr, &hostaddr) == 0)
127  msg_fatal("dns_rr_to_pa: %m");
128  vstream_printf("%s -> %s\n", argv[0], hostaddr.buf);
130  dns_rr_free(rr);
131  }
132  freeaddrinfo(res0);
133  myfree((void *) resv);
134  }
135  return (0);
136 }
137 
138 #endif
void myfree(void *ptr)
Definition: mymalloc.c:207
void freeaddrinfo(struct addrinfo *ai)
Definition: myaddrinfo.c:742
#define NORETURN
Definition: sys_defs.h:1583
#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
#define DUMMY_TTL
#define INET_PROTO_NAME_ALL
Definition: mail_params.h:992
const char * dns_rr_to_pa(DNS_RR *, MAI_HOSTADDR_STR *)
Definition: dns_rr_to_pa.c:53
DNS_RR * dns_rr_create(const char *, const char *, ushort, ushort, unsigned, unsigned, const char *, size_t)
char buf[MAI_HOSTADDR_STRSIZE]
Definition: myaddrinfo.h:146
VSTREAM * vstream_printf(const char *fmt,...)
Definition: vstream.c:1335
DNS_RR * dns_sa_to_rr(const char *hostname, unsigned pref, struct sockaddr *sa)
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
void dns_rr_free(DNS_RR *)
Definition: dns_rr.c:137
Definition: dns.h:139
void * mymalloc(ssize_t len)
Definition: mymalloc.c:150