1/*	$NetBSD$	*/
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  */
76typedef 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  */
87typedef 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  */
102extern const char *dns_strerror(unsigned);
103
104 /*
105  * dns_strtype.c
106  */
107extern const char *dns_strtype(unsigned);
108extern unsigned dns_type(const char *);
109
110 /*
111  * dns_rr.c
112  */
113extern DNS_RR *dns_rr_create(const char *, const char *,
114			             ushort, ushort,
115			             unsigned, unsigned,
116			             const char *, size_t);
117extern void dns_rr_free(DNS_RR *);
118extern DNS_RR *dns_rr_copy(DNS_RR *);
119extern DNS_RR *dns_rr_append(DNS_RR *, DNS_RR *);
120extern DNS_RR *dns_rr_sort(DNS_RR *, int (*) (DNS_RR *, DNS_RR *));
121extern int dns_rr_compare_pref_ipv6(DNS_RR *, DNS_RR *);
122extern int dns_rr_compare_pref_ipv4(DNS_RR *, DNS_RR *);
123extern int dns_rr_compare_pref_any(DNS_RR *, DNS_RR *);
124extern int dns_rr_compare_pref(DNS_RR *, DNS_RR *);
125extern DNS_RR *dns_rr_shuffle(DNS_RR *);
126extern DNS_RR *dns_rr_remove(DNS_RR *, DNS_RR *);
127
128 /*
129  * dns_rr_to_pa.c
130  */
131extern const char *dns_rr_to_pa(DNS_RR *, MAI_HOSTADDR_STR *);
132
133 /*
134  * dns_sa_to_rr.c
135  */
136extern DNS_RR *dns_sa_to_rr(const char *, unsigned, struct sockaddr *);
137
138 /*
139  * dns_rr_to_sa.c
140  */
141extern int dns_rr_to_sa(DNS_RR *, unsigned, struct sockaddr *, SOCKADDR_SIZE *);
142
143 /*
144  * dns_rr_eq_sa.c
145  */
146extern 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  */
164extern int dns_lookup(const char *, unsigned, unsigned, DNS_RR **,
165		              VSTRING *, VSTRING *);
166extern int dns_lookup_l(const char *, unsigned, DNS_RR **, VSTRING *,
167			        VSTRING *, int,...);
168extern 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