xref: /netbsd-src/external/ibm-public/postfix/dist/src/dns/dns.h (revision a5847cc334d9a7029f6352b847e9e8d71a0f9e0c)
1 /*	$NetBSD: dns.h,v 1.1.1.3 2011/03/02 19:32:10 tron Exp $	*/
2 
3 #ifndef _DNS_H_INCLUDED_
4 #define _DNS_H_INCLUDED_
5 
6 /*++
7 /* NAME
8 /*	dns 3h
9 /* SUMMARY
10 /*	domain name service lookup
11 /* SYNOPSIS
12 /*	#include <dns.h>
13 /* DESCRIPTION
14 /* .nf
15 
16  /*
17   * System library.
18   */
19 #include <netinet/in.h>
20 #include <arpa/nameser.h>
21 #ifdef RESOLVE_H_NEEDS_STDIO_H
22 #include <stdio.h>
23 #endif
24 #ifdef RESOLVE_H_NEEDS_NAMESER8_COMPAT_H
25 #include <nameser8_compat.h>
26 #endif
27 #ifdef RESOLVE_H_NEEDS_ARPA_NAMESER_COMPAT_H
28 #include <arpa/nameser_compat.h>
29 #endif
30 #include <resolv.h>
31 
32  /*
33   * Name server compatibility. These undocumented macros appear in the file
34   * <arpa/nameser.h>, but since they are undocumented we should not count on
35   * their presence, and so they are included here just in case.
36   */
37 #ifndef GETSHORT
38 
39 #define GETSHORT(s, cp) { \
40 	unsigned char *t_cp = (u_char *)(cp); \
41 	(s) = ((unsigned)t_cp[0] << 8) \
42 	    | ((unsigned)t_cp[1]) \
43 	    ; \
44 	(cp) += 2; \
45 }
46 
47 #define GETLONG(l, cp) { \
48 	unsigned char *t_cp = (u_char *)(cp); \
49 	(l) = ((unsigned)t_cp[0] << 24) \
50 	    | ((unsigned)t_cp[1] << 16) \
51 	    | ((unsigned)t_cp[2] << 8) \
52 	    | ((unsigned)t_cp[3]) \
53 	    ; \
54 	(cp) += 4; \
55 }
56 
57 #endif
58 
59  /*
60   * SunOS 4 needs this.
61   */
62 #ifndef T_TXT
63 #define T_TXT	16
64 #endif
65 
66  /*
67   * Utility library.
68   */
69 #include <vstring.h>
70 #include <sock_addr.h>
71 #include <myaddrinfo.h>
72 
73  /*
74   * Structure for fixed resource record data.
75   */
76 typedef struct DNS_FIXED {
77     unsigned short type;		/* T_A, T_CNAME, etc. */
78     unsigned short class;		/* C_IN, etc. */
79     unsigned int ttl;			/* always */
80     unsigned length;			/* record length */
81 } DNS_FIXED;
82 
83  /*
84   * Structure of a DNS resource record after expansion. The components are
85   * named after the things one can expect to find in a DNS resource record.
86   */
87 typedef struct DNS_RR {
88     char   *qname;			/* query name, mystrdup()ed */
89     char   *rname;			/* reply name, mystrdup()ed */
90     unsigned short type;		/* T_A, T_CNAME, etc. */
91     unsigned short class;		/* C_IN, etc. */
92     unsigned int ttl;			/* always */
93     unsigned short pref;		/* T_MX only */
94     struct DNS_RR *next;		/* linkage */
95     size_t  data_len;			/* actual data size */
96     char    data[1];			/* actually a bunch of data */
97 } DNS_RR;
98 
99  /*
100   * dns_strerror.c
101   */
102 extern const char *dns_strerror(unsigned);
103 
104  /*
105   * dns_strtype.c
106   */
107 extern const char *dns_strtype(unsigned);
108 extern unsigned dns_type(const char *);
109 
110  /*
111   * dns_rr.c
112   */
113 extern DNS_RR *dns_rr_create(const char *, const char *,
114 			             ushort, ushort,
115 			             unsigned, unsigned,
116 			             const char *, size_t);
117 extern void dns_rr_free(DNS_RR *);
118 extern DNS_RR *dns_rr_copy(DNS_RR *);
119 extern DNS_RR *dns_rr_append(DNS_RR *, DNS_RR *);
120 extern DNS_RR *dns_rr_sort(DNS_RR *, int (*) (DNS_RR *, DNS_RR *));
121 extern int dns_rr_compare_pref_ipv6(DNS_RR *, DNS_RR *);
122 extern int dns_rr_compare_pref_ipv4(DNS_RR *, DNS_RR *);
123 extern int dns_rr_compare_pref_any(DNS_RR *, DNS_RR *);
124 extern int dns_rr_compare_pref(DNS_RR *, DNS_RR *);
125 extern DNS_RR *dns_rr_shuffle(DNS_RR *);
126 extern DNS_RR *dns_rr_remove(DNS_RR *, DNS_RR *);
127 
128  /*
129   * dns_rr_to_pa.c
130   */
131 extern const char *dns_rr_to_pa(DNS_RR *, MAI_HOSTADDR_STR *);
132 
133  /*
134   * dns_sa_to_rr.c
135   */
136 extern DNS_RR *dns_sa_to_rr(const char *, unsigned, struct sockaddr *);
137 
138  /*
139   * dns_rr_to_sa.c
140   */
141 extern int dns_rr_to_sa(DNS_RR *, unsigned, struct sockaddr *, SOCKADDR_SIZE *);
142 
143  /*
144   * dns_rr_eq_sa.c
145   */
146 extern int dns_rr_eq_sa(DNS_RR *, struct sockaddr *);
147 
148 #ifdef HAS_IPV6
149 #define DNS_RR_EQ_SA(rr, sa) \
150     ((SOCK_ADDR_IN_FAMILY(sa) == AF_INET && (rr)->type == T_A \
151      && SOCK_ADDR_IN_ADDR(sa).s_addr == IN_ADDR((rr)->data).s_addr) \
152     || (SOCK_ADDR_IN_FAMILY(sa) == AF_INET6 && (rr)->type == T_AAAA \
153 	&& memcmp((char *) &(SOCK_ADDR_IN6_ADDR(sa)), \
154 		  (rr)->data, (rr)->data_len) == 0))
155 #else
156 #define DNS_RR_EQ_SA(rr, sa) \
157     (SOCK_ADDR_IN_FAMILY(sa) == AF_INET && (rr)->type == T_A \
158      && SOCK_ADDR_IN_ADDR(sa).s_addr == IN_ADDR((rr)->data).s_addr)
159 #endif
160 
161  /*
162   * dns_lookup.c
163   */
164 extern int dns_lookup(const char *, unsigned, unsigned, DNS_RR **,
165 		              VSTRING *, VSTRING *);
166 extern int dns_lookup_l(const char *, unsigned, DNS_RR **, VSTRING *,
167 			        VSTRING *, int,...);
168 extern int dns_lookup_v(const char *, unsigned, DNS_RR **, VSTRING *,
169 			        VSTRING *, int, unsigned *);
170 
171  /*
172   * Request flags.
173   */
174 #define DNS_REQ_FLAG_STOP_OK	(1<<0)
175 #define DNS_REQ_FLAG_STOP_INVAL	(1<<1)
176 #define DNS_REQ_FLAG_NONE	(0)
177 
178  /*
179   * Status codes. Failures must have negative codes so they will not collide
180   * with valid counts of answer records etc.
181   */
182 #define DNS_INVAL	(-5)		/* query ok, malformed reply */
183 #define DNS_FAIL	(-4)		/* query failed, don't retry */
184 #define DNS_NOTFOUND	(-3)		/* query ok, data not found */
185 #define DNS_RETRY	(-2)		/* query failed, try again */
186 #define DNS_RECURSE	(-1)		/* recursion needed */
187 #define DNS_OK		0		/* query succeeded */
188 
189  /*
190   * How long can a DNS name or single text value be?
191   */
192 #define DNS_NAME_LEN	1024
193 
194 /* LICENSE
195 /* .ad
196 /* .fi
197 /*	The Secure Mailer license must be distributed with this software.
198 /* AUTHOR(S)
199 /*	Wietse Venema
200 /*	IBM T.J. Watson Research
201 /*	P.O. Box 704
202 /*	Yorktown Heights, NY 10598, USA
203 /*--*/
204 
205 #endif
206