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