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