155682Smarkm/*
2102644Snectar * Copyright (c) 1995 - 2002 Kungliga Tekniska H�gskolan
355682Smarkm * (Royal Institute of Technology, Stockholm, Sweden).
455682Smarkm * All rights reserved.
555682Smarkm *
655682Smarkm * Redistribution and use in source and binary forms, with or without
755682Smarkm * modification, are permitted provided that the following conditions
855682Smarkm * are met:
955682Smarkm *
1055682Smarkm * 1. Redistributions of source code must retain the above copyright
1155682Smarkm *    notice, this list of conditions and the following disclaimer.
1255682Smarkm *
1355682Smarkm * 2. Redistributions in binary form must reproduce the above copyright
1455682Smarkm *    notice, this list of conditions and the following disclaimer in the
1555682Smarkm *    documentation and/or other materials provided with the distribution.
1655682Smarkm *
1755682Smarkm * 3. Neither the name of the Institute nor the names of its contributors
1855682Smarkm *    may be used to endorse or promote products derived from this software
1955682Smarkm *    without specific prior written permission.
2055682Smarkm *
2155682Smarkm * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
2255682Smarkm * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2355682Smarkm * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2455682Smarkm * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
2555682Smarkm * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2655682Smarkm * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2755682Smarkm * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2855682Smarkm * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2955682Smarkm * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
3055682Smarkm * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
3155682Smarkm * SUCH DAMAGE.
3255682Smarkm */
3355682Smarkm
34178825Sdfr/* $Id: resolve.h 14773 2005-04-12 11:29:18Z lha $ */
3555682Smarkm
3655682Smarkm#ifndef __RESOLVE_H__
3755682Smarkm#define __RESOLVE_H__
3855682Smarkm
39178825Sdfr#ifndef ROKEN_LIB_FUNCTION
40178825Sdfr#ifdef _WIN32
41178825Sdfr#define ROKEN_LIB_FUNCTION _stdcall
42178825Sdfr#else
43178825Sdfr#define ROKEN_LIB_FUNCTION
44178825Sdfr#endif
45178825Sdfr#endif
46178825Sdfr
47178825Sdfrtypedef enum {
48178825Sdfr	rk_ns_t_invalid = 0,	/* Cookie. */
49178825Sdfr	rk_ns_t_a = 1,		/* Host address. */
50178825Sdfr	rk_ns_t_ns = 2,		/* Authoritative server. */
51178825Sdfr	rk_ns_t_md = 3,		/* Mail destination. */
52178825Sdfr	rk_ns_t_mf = 4,		/* Mail forwarder. */
53178825Sdfr	rk_ns_t_cname = 5,	/* Canonical name. */
54178825Sdfr	rk_ns_t_soa = 6,	/* Start of authority zone. */
55178825Sdfr	rk_ns_t_mb = 7,		/* Mailbox domain name. */
56178825Sdfr	rk_ns_t_mg = 8,		/* Mail group member. */
57178825Sdfr	rk_ns_t_mr = 9,		/* Mail rename name. */
58178825Sdfr	rk_ns_t_null = 10,	/* Null resource record. */
59178825Sdfr	rk_ns_t_wks = 11,	/* Well known service. */
60178825Sdfr	rk_ns_t_ptr = 12,	/* Domain name pointer. */
61178825Sdfr	rk_ns_t_hinfo = 13,	/* Host information. */
62178825Sdfr	rk_ns_t_minfo = 14,	/* Mailbox information. */
63178825Sdfr	rk_ns_t_mx = 15,	/* Mail routing information. */
64178825Sdfr	rk_ns_t_txt = 16,	/* Text strings. */
65178825Sdfr	rk_ns_t_rp = 17,	/* Responsible person. */
66178825Sdfr	rk_ns_t_afsdb = 18,	/* AFS cell database. */
67178825Sdfr	rk_ns_t_x25 = 19,	/* X_25 calling address. */
68178825Sdfr	rk_ns_t_isdn = 20,	/* ISDN calling address. */
69178825Sdfr	rk_ns_t_rt = 21,	/* Router. */
70178825Sdfr	rk_ns_t_nsap = 22,	/* NSAP address. */
71178825Sdfr	rk_ns_t_nsap_ptr = 23,	/* Reverse NSAP lookup (deprecated). */
72178825Sdfr	rk_ns_t_sig = 24,	/* Security signature. */
73178825Sdfr	rk_ns_t_key = 25,	/* Security key. */
74178825Sdfr	rk_ns_t_px = 26,	/* X.400 mail mapping. */
75178825Sdfr	rk_ns_t_gpos = 27,	/* Geographical position (withdrawn). */
76178825Sdfr	rk_ns_t_aaaa = 28,	/* Ip6 Address. */
77178825Sdfr	rk_ns_t_loc = 29,	/* Location Information. */
78178825Sdfr	rk_ns_t_nxt = 30,	/* Next domain (security). */
79178825Sdfr	rk_ns_t_eid = 31,	/* Endpoint identifier. */
80178825Sdfr	rk_ns_t_nimloc = 32,	/* Nimrod Locator. */
81178825Sdfr	rk_ns_t_srv = 33,	/* Server Selection. */
82178825Sdfr	rk_ns_t_atma = 34,	/* ATM Address */
83178825Sdfr	rk_ns_t_naptr = 35,	/* Naming Authority PoinTeR */
84178825Sdfr	rk_ns_t_kx = 36,	/* Key Exchange */
85178825Sdfr	rk_ns_t_cert = 37,	/* Certification record */
86178825Sdfr	rk_ns_t_a6 = 38,	/* IPv6 address (deprecates AAAA) */
87178825Sdfr	rk_ns_t_dname = 39,	/* Non-terminal DNAME (for IPv6) */
88178825Sdfr	rk_ns_t_sink = 40,	/* Kitchen sink (experimentatl) */
89178825Sdfr	rk_ns_t_opt = 41,	/* EDNS0 option (meta-RR) */
90178825Sdfr	rk_ns_t_apl = 42,	/* Address prefix list (RFC 3123) */
91178825Sdfr	rk_ns_t_ds = 43,	/* Delegation Signer (RFC 3658) */
92178825Sdfr	rk_ns_t_sshfp = 44,	/* SSH fingerprint */
93178825Sdfr	rk_ns_t_tkey = 249,	/* Transaction key */
94178825Sdfr	rk_ns_t_tsig = 250,	/* Transaction signature. */
95178825Sdfr	rk_ns_t_ixfr = 251,	/* Incremental zone transfer. */
96178825Sdfr	rk_ns_t_axfr = 252,	/* Transfer zone of authority. */
97178825Sdfr	rk_ns_t_mailb = 253,	/* Transfer mailbox records. */
98178825Sdfr	rk_ns_t_maila = 254,	/* Transfer mail agent records. */
99178825Sdfr	rk_ns_t_any = 255,	/* Wildcard match. */
100178825Sdfr	rk_ns_t_zxfr = 256,	/* BIND-specific, nonstandard. */
101178825Sdfr	rk_ns_t_max = 65536
102178825Sdfr} rk_ns_type;
103178825Sdfr
10455682Smarkm/* We use these, but they are not always present in <arpa/nameser.h> */
10555682Smarkm
106178825Sdfr#ifndef C_IN
107178825Sdfr#define C_IN		1
108178825Sdfr#endif
109178825Sdfr
110178825Sdfr#ifndef T_A
111178825Sdfr#define T_A		1
112178825Sdfr#endif
113178825Sdfr#ifndef T_NS
114178825Sdfr#define T_NS		2
115178825Sdfr#endif
116178825Sdfr#ifndef T_CNAME
117178825Sdfr#define T_CNAME		5
118178825Sdfr#endif
119178825Sdfr#ifndef T_SOA
120178825Sdfr#define T_SOA		5
121178825Sdfr#endif
122178825Sdfr#ifndef T_PTR
123178825Sdfr#define T_PTR		12
124178825Sdfr#endif
125178825Sdfr#ifndef T_MX
126178825Sdfr#define T_MX		15
127178825Sdfr#endif
12855682Smarkm#ifndef T_TXT
12955682Smarkm#define T_TXT		16
13055682Smarkm#endif
13155682Smarkm#ifndef T_AFSDB
13255682Smarkm#define T_AFSDB		18
13355682Smarkm#endif
13472445Sassar#ifndef T_SIG
13572445Sassar#define T_SIG		24
13672445Sassar#endif
13772445Sassar#ifndef T_KEY
13872445Sassar#define T_KEY		25
13972445Sassar#endif
140102644Snectar#ifndef T_AAAA
141102644Snectar#define T_AAAA		28
142102644Snectar#endif
14355682Smarkm#ifndef T_SRV
14455682Smarkm#define T_SRV		33
14555682Smarkm#endif
14655682Smarkm#ifndef T_NAPTR
14755682Smarkm#define T_NAPTR		35
14855682Smarkm#endif
14972445Sassar#ifndef T_CERT
15072445Sassar#define T_CERT		37
15172445Sassar#endif
152178825Sdfr#ifndef T_SSHFP
153178825Sdfr#define T_SSHFP		44
154178825Sdfr#endif
15555682Smarkm
156178825Sdfr#ifndef MAXDNAME
157178825Sdfr#define MAXDNAME	1025
158178825Sdfr#endif
159178825Sdfr
160102644Snectar#define dns_query		rk_dns_query
161102644Snectar#define mx_record		rk_mx_record
162102644Snectar#define srv_record		rk_srv_record
163102644Snectar#define key_record		rk_key_record
164102644Snectar#define sig_record		rk_sig_record
165102644Snectar#define cert_record		rk_cert_record
166178825Sdfr#define sshfp_record		rk_sshfp_record
167102644Snectar#define resource_record		rk_resource_record
168102644Snectar#define dns_reply		rk_dns_reply
169102644Snectar
170102644Snectar#define dns_lookup		rk_dns_lookup
171102644Snectar#define dns_free_data		rk_dns_free_data
172102644Snectar#define dns_string_to_type	rk_dns_string_to_type
173102644Snectar#define dns_type_to_string	rk_dns_type_to_string
174102644Snectar#define dns_srv_order		rk_dns_srv_order
175102644Snectar
17655682Smarkmstruct dns_query{
17755682Smarkm    char *domain;
17855682Smarkm    unsigned type;
17955682Smarkm    unsigned class;
18055682Smarkm};
18155682Smarkm
18255682Smarkmstruct mx_record{
18355682Smarkm    unsigned  preference;
18455682Smarkm    char domain[1];
18555682Smarkm};
18655682Smarkm
18755682Smarkmstruct srv_record{
18855682Smarkm    unsigned priority;
18955682Smarkm    unsigned weight;
19055682Smarkm    unsigned port;
19155682Smarkm    char target[1];
19255682Smarkm};
19355682Smarkm
19472445Sassarstruct key_record {
19572445Sassar    unsigned flags;
19672445Sassar    unsigned protocol;
19772445Sassar    unsigned algorithm;
19872445Sassar    size_t   key_len;
19972445Sassar    u_char   key_data[1];
20072445Sassar};
20172445Sassar
20272445Sassarstruct sig_record {
20372445Sassar    unsigned type;
20472445Sassar    unsigned algorithm;
20572445Sassar    unsigned labels;
20672445Sassar    unsigned orig_ttl;
20772445Sassar    unsigned sig_expiration;
20872445Sassar    unsigned sig_inception;
20972445Sassar    unsigned key_tag;
21072445Sassar    char     *signer;
21172445Sassar    unsigned sig_len;
21272445Sassar    char     sig_data[1];	/* also includes signer */
21372445Sassar};
21472445Sassar
21572445Sassarstruct cert_record {
21672445Sassar    unsigned type;
21772445Sassar    unsigned tag;
21872445Sassar    unsigned algorithm;
21972445Sassar    size_t   cert_len;
22072445Sassar    u_char   cert_data[1];
22172445Sassar};
22272445Sassar
223178825Sdfrstruct sshfp_record {
224178825Sdfr    unsigned algorithm;
225178825Sdfr    unsigned type;
226178825Sdfr    size_t   sshfp_len;
227178825Sdfr    u_char   sshfp_data[1];
228178825Sdfr};
229178825Sdfr
230178825Sdfrstruct ds_record {
231178825Sdfr    unsigned key_tag;
232178825Sdfr    unsigned algorithm;
233178825Sdfr    unsigned digest_type;
234178825Sdfr    unsigned digest_len;
235178825Sdfr    u_char digest_data[1];
236178825Sdfr};
237178825Sdfr
23855682Smarkmstruct resource_record{
23955682Smarkm    char *domain;
24055682Smarkm    unsigned type;
24155682Smarkm    unsigned class;
24255682Smarkm    unsigned ttl;
24355682Smarkm    unsigned size;
24455682Smarkm    union {
24555682Smarkm	void *data;
24655682Smarkm	struct mx_record *mx;
24755682Smarkm	struct mx_record *afsdb; /* mx and afsdb are identical */
24855682Smarkm	struct srv_record *srv;
24955682Smarkm	struct in_addr *a;
25055682Smarkm	char *txt;
25172445Sassar	struct key_record *key;
25272445Sassar	struct cert_record *cert;
25372445Sassar	struct sig_record *sig;
254178825Sdfr	struct sshfp_record *sshfp;
255178825Sdfr	struct ds_record *ds;
25655682Smarkm    }u;
25755682Smarkm    struct resource_record *next;
25855682Smarkm};
25955682Smarkm
260178825Sdfr#define rk_DNS_MAX_PACKET_SIZE		0xffff
26155682Smarkm
262178825Sdfrstruct dns_header {
263178825Sdfr    unsigned id;
264178825Sdfr    unsigned flags;
265178825Sdfr#define rk_DNS_HEADER_RESPONSE_FLAG		1
266178825Sdfr#define rk_DNS_HEADER_AUTHORITIVE_ANSWER	2
267178825Sdfr#define rk_DNS_HEADER_TRUNCATED_MESSAGE		4
268178825Sdfr#define rk_DNS_HEADER_RECURSION_DESIRED		8
269178825Sdfr#define rk_DNS_HEADER_RECURSION_AVAILABLE	16
270178825Sdfr#define rk_DNS_HEADER_AUTHENTIC_DATA		32
271178825Sdfr#define rk_DNS_HEADER_CHECKING_DISABLED		64
272178825Sdfr    unsigned opcode;
273178825Sdfr    unsigned response_code;
274178825Sdfr    unsigned qdcount;
275178825Sdfr    unsigned ancount;
276178825Sdfr    unsigned nscount;
277178825Sdfr    unsigned arcount;
278178825Sdfr};
279178825Sdfr
28055682Smarkmstruct dns_reply{
281178825Sdfr    struct dns_header h;
28255682Smarkm    struct dns_query q;
28355682Smarkm    struct resource_record *head;
28455682Smarkm};
28555682Smarkm
28655682Smarkm
287178825Sdfrstruct dns_reply* ROKEN_LIB_FUNCTION
288178825Sdfr	dns_lookup(const char *, const char *);
289178825Sdfrvoid ROKEN_LIB_FUNCTION
290178825Sdfr	dns_free_data(struct dns_reply *);
291178825Sdfrint ROKEN_LIB_FUNCTION
292178825Sdfr	dns_string_to_type(const char *name);
293178825Sdfrconst char *ROKEN_LIB_FUNCTION
294178825Sdfr	dns_type_to_string(int type);
295178825Sdfrvoid ROKEN_LIB_FUNCTION
296178825Sdfr	dns_srv_order(struct dns_reply*);
29755682Smarkm
29855682Smarkm#endif /* __RESOLVE_H__ */
299