155682Smarkm/*
2233294Sstas * Copyright (c) 1995 - 2002 Kungliga Tekniska H��gskolan
355682Smarkm * (Royal Institute of Technology, Stockholm, Sweden).
455682Smarkm * All rights reserved.
5233294Sstas *
655682Smarkm * Redistribution and use in source and binary forms, with or without
755682Smarkm * modification, are permitted provided that the following conditions
855682Smarkm * are met:
9233294Sstas *
1055682Smarkm * 1. Redistributions of source code must retain the above copyright
1155682Smarkm *    notice, this list of conditions and the following disclaimer.
12233294Sstas *
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.
16233294Sstas *
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.
20233294Sstas *
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
34233294Sstas/* $Id$ */
3555682Smarkm
3655682Smarkm#ifndef __RESOLVE_H__
3755682Smarkm#define __RESOLVE_H__
3855682Smarkm
39178825Sdfr#ifndef ROKEN_LIB_FUNCTION
40178825Sdfr#ifdef _WIN32
41233294Sstas#define ROKEN_LIB_FUNCTION
42233294Sstas#define ROKEN_LIB_CALL     __cdecl
43178825Sdfr#else
44178825Sdfr#define ROKEN_LIB_FUNCTION
45233294Sstas#define ROKEN_LIB_CALL
46178825Sdfr#endif
47178825Sdfr#endif
48178825Sdfr
49233294Sstasenum {
50233294Sstas    rk_ns_c_in = 1
51233294Sstas};
52233294Sstas
53233294Sstasenum {
54178825Sdfr	rk_ns_t_invalid = 0,	/* Cookie. */
55178825Sdfr	rk_ns_t_a = 1,		/* Host address. */
56178825Sdfr	rk_ns_t_ns = 2,		/* Authoritative server. */
57178825Sdfr	rk_ns_t_md = 3,		/* Mail destination. */
58178825Sdfr	rk_ns_t_mf = 4,		/* Mail forwarder. */
59178825Sdfr	rk_ns_t_cname = 5,	/* Canonical name. */
60178825Sdfr	rk_ns_t_soa = 6,	/* Start of authority zone. */
61178825Sdfr	rk_ns_t_mb = 7,		/* Mailbox domain name. */
62178825Sdfr	rk_ns_t_mg = 8,		/* Mail group member. */
63178825Sdfr	rk_ns_t_mr = 9,		/* Mail rename name. */
64178825Sdfr	rk_ns_t_null = 10,	/* Null resource record. */
65178825Sdfr	rk_ns_t_wks = 11,	/* Well known service. */
66178825Sdfr	rk_ns_t_ptr = 12,	/* Domain name pointer. */
67178825Sdfr	rk_ns_t_hinfo = 13,	/* Host information. */
68178825Sdfr	rk_ns_t_minfo = 14,	/* Mailbox information. */
69178825Sdfr	rk_ns_t_mx = 15,	/* Mail routing information. */
70178825Sdfr	rk_ns_t_txt = 16,	/* Text strings. */
71178825Sdfr	rk_ns_t_rp = 17,	/* Responsible person. */
72178825Sdfr	rk_ns_t_afsdb = 18,	/* AFS cell database. */
73178825Sdfr	rk_ns_t_x25 = 19,	/* X_25 calling address. */
74178825Sdfr	rk_ns_t_isdn = 20,	/* ISDN calling address. */
75178825Sdfr	rk_ns_t_rt = 21,	/* Router. */
76178825Sdfr	rk_ns_t_nsap = 22,	/* NSAP address. */
77178825Sdfr	rk_ns_t_nsap_ptr = 23,	/* Reverse NSAP lookup (deprecated). */
78178825Sdfr	rk_ns_t_sig = 24,	/* Security signature. */
79178825Sdfr	rk_ns_t_key = 25,	/* Security key. */
80178825Sdfr	rk_ns_t_px = 26,	/* X.400 mail mapping. */
81178825Sdfr	rk_ns_t_gpos = 27,	/* Geographical position (withdrawn). */
82178825Sdfr	rk_ns_t_aaaa = 28,	/* Ip6 Address. */
83178825Sdfr	rk_ns_t_loc = 29,	/* Location Information. */
84178825Sdfr	rk_ns_t_nxt = 30,	/* Next domain (security). */
85178825Sdfr	rk_ns_t_eid = 31,	/* Endpoint identifier. */
86178825Sdfr	rk_ns_t_nimloc = 32,	/* Nimrod Locator. */
87178825Sdfr	rk_ns_t_srv = 33,	/* Server Selection. */
88178825Sdfr	rk_ns_t_atma = 34,	/* ATM Address */
89178825Sdfr	rk_ns_t_naptr = 35,	/* Naming Authority PoinTeR */
90178825Sdfr	rk_ns_t_kx = 36,	/* Key Exchange */
91178825Sdfr	rk_ns_t_cert = 37,	/* Certification record */
92178825Sdfr	rk_ns_t_a6 = 38,	/* IPv6 address (deprecates AAAA) */
93178825Sdfr	rk_ns_t_dname = 39,	/* Non-terminal DNAME (for IPv6) */
94178825Sdfr	rk_ns_t_sink = 40,	/* Kitchen sink (experimentatl) */
95178825Sdfr	rk_ns_t_opt = 41,	/* EDNS0 option (meta-RR) */
96178825Sdfr	rk_ns_t_apl = 42,	/* Address prefix list (RFC 3123) */
97178825Sdfr	rk_ns_t_ds = 43,	/* Delegation Signer (RFC 3658) */
98178825Sdfr	rk_ns_t_sshfp = 44,	/* SSH fingerprint */
99178825Sdfr	rk_ns_t_tkey = 249,	/* Transaction key */
100178825Sdfr	rk_ns_t_tsig = 250,	/* Transaction signature. */
101178825Sdfr	rk_ns_t_ixfr = 251,	/* Incremental zone transfer. */
102178825Sdfr	rk_ns_t_axfr = 252,	/* Transfer zone of authority. */
103178825Sdfr	rk_ns_t_mailb = 253,	/* Transfer mailbox records. */
104178825Sdfr	rk_ns_t_maila = 254,	/* Transfer mail agent records. */
105178825Sdfr	rk_ns_t_any = 255,	/* Wildcard match. */
106178825Sdfr	rk_ns_t_zxfr = 256,	/* BIND-specific, nonstandard. */
107178825Sdfr	rk_ns_t_max = 65536
108233294Sstas};
109178825Sdfr
110178825Sdfr#ifndef MAXDNAME
111178825Sdfr#define MAXDNAME	1025
112178825Sdfr#endif
113178825Sdfr
114102644Snectar#define mx_record		rk_mx_record
115102644Snectar#define srv_record		rk_srv_record
116102644Snectar#define key_record		rk_key_record
117102644Snectar#define sig_record		rk_sig_record
118102644Snectar#define cert_record		rk_cert_record
119178825Sdfr#define sshfp_record		rk_sshfp_record
120102644Snectar
121233294Sstasstruct rk_dns_query{
12255682Smarkm    char *domain;
12355682Smarkm    unsigned type;
12455682Smarkm    unsigned class;
12555682Smarkm};
12655682Smarkm
127233294Sstasstruct rk_mx_record{
12855682Smarkm    unsigned  preference;
12955682Smarkm    char domain[1];
13055682Smarkm};
13155682Smarkm
132233294Sstasstruct rk_srv_record{
13355682Smarkm    unsigned priority;
13455682Smarkm    unsigned weight;
13555682Smarkm    unsigned port;
13655682Smarkm    char target[1];
13755682Smarkm};
13855682Smarkm
139233294Sstasstruct rk_key_record {
14072445Sassar    unsigned flags;
14172445Sassar    unsigned protocol;
14272445Sassar    unsigned algorithm;
14372445Sassar    size_t   key_len;
14472445Sassar    u_char   key_data[1];
14572445Sassar};
14672445Sassar
147233294Sstasstruct rk_sig_record {
14872445Sassar    unsigned type;
14972445Sassar    unsigned algorithm;
15072445Sassar    unsigned labels;
15172445Sassar    unsigned orig_ttl;
15272445Sassar    unsigned sig_expiration;
15372445Sassar    unsigned sig_inception;
15472445Sassar    unsigned key_tag;
15572445Sassar    char     *signer;
156233294Sstas    size_t   sig_len;
15772445Sassar    char     sig_data[1];	/* also includes signer */
15872445Sassar};
15972445Sassar
160233294Sstasstruct rk_cert_record {
16172445Sassar    unsigned type;
16272445Sassar    unsigned tag;
16372445Sassar    unsigned algorithm;
16472445Sassar    size_t   cert_len;
16572445Sassar    u_char   cert_data[1];
16672445Sassar};
16772445Sassar
168233294Sstasstruct rk_sshfp_record {
169178825Sdfr    unsigned algorithm;
170178825Sdfr    unsigned type;
171178825Sdfr    size_t   sshfp_len;
172178825Sdfr    u_char   sshfp_data[1];
173178825Sdfr};
174178825Sdfr
175233294Sstasstruct rk_ds_record {
176178825Sdfr    unsigned key_tag;
177178825Sdfr    unsigned algorithm;
178178825Sdfr    unsigned digest_type;
179233294Sstas    size_t digest_len;
180178825Sdfr    u_char digest_data[1];
181178825Sdfr};
182178825Sdfr
183233294Sstasstruct rk_resource_record{
18455682Smarkm    char *domain;
18555682Smarkm    unsigned type;
18655682Smarkm    unsigned class;
18755682Smarkm    unsigned ttl;
18855682Smarkm    unsigned size;
18955682Smarkm    union {
19055682Smarkm	void *data;
191233294Sstas	struct rk_mx_record *mx;
192233294Sstas	struct rk_mx_record *afsdb; /* mx and afsdb are identical */
193233294Sstas	struct rk_srv_record *srv;
19455682Smarkm	struct in_addr *a;
19555682Smarkm	char *txt;
196233294Sstas	struct rk_key_record *key;
197233294Sstas	struct rk_cert_record *cert;
198233294Sstas	struct rk_sig_record *sig;
199233294Sstas	struct rk_sshfp_record *sshfp;
200233294Sstas	struct rk_ds_record *ds;
20155682Smarkm    }u;
202233294Sstas    struct rk_resource_record *next;
20355682Smarkm};
20455682Smarkm
205178825Sdfr#define rk_DNS_MAX_PACKET_SIZE		0xffff
20655682Smarkm
207233294Sstasstruct rk_dns_header {
208178825Sdfr    unsigned id;
209178825Sdfr    unsigned flags;
210178825Sdfr#define rk_DNS_HEADER_RESPONSE_FLAG		1
211178825Sdfr#define rk_DNS_HEADER_AUTHORITIVE_ANSWER	2
212178825Sdfr#define rk_DNS_HEADER_TRUNCATED_MESSAGE		4
213178825Sdfr#define rk_DNS_HEADER_RECURSION_DESIRED		8
214178825Sdfr#define rk_DNS_HEADER_RECURSION_AVAILABLE	16
215178825Sdfr#define rk_DNS_HEADER_AUTHENTIC_DATA		32
216178825Sdfr#define rk_DNS_HEADER_CHECKING_DISABLED		64
217178825Sdfr    unsigned opcode;
218178825Sdfr    unsigned response_code;
219178825Sdfr    unsigned qdcount;
220178825Sdfr    unsigned ancount;
221178825Sdfr    unsigned nscount;
222178825Sdfr    unsigned arcount;
223178825Sdfr};
224178825Sdfr
225233294Sstasstruct rk_dns_reply{
226233294Sstas    struct rk_dns_header h;
227233294Sstas    struct rk_dns_query q;
228233294Sstas    struct rk_resource_record *head;
22955682Smarkm};
23055682Smarkm
23155682Smarkm
232233294Sstas#ifdef __cplusplus
233233294Sstasextern "C" {
234233294Sstas#endif
23555682Smarkm
236233294SstasROKEN_LIB_FUNCTION struct rk_dns_reply* ROKEN_LIB_CALL
237233294Sstas	rk_dns_lookup(const char *, const char *);
238233294SstasROKEN_LIB_FUNCTION void ROKEN_LIB_CALL
239233294Sstas	rk_dns_free_data(struct rk_dns_reply *);
240233294SstasROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
241233294Sstas	rk_dns_string_to_type(const char *name);
242233294SstasROKEN_LIB_FUNCTION const char * ROKEN_LIB_CALL
243233294Sstas	rk_dns_type_to_string(int type);
244233294SstasROKEN_LIB_FUNCTION void ROKEN_LIB_CALL
245233294Sstas	rk_dns_srv_order(struct rk_dns_reply*);
246233294Sstas
247233294Sstas#ifdef __cplusplus
248233294Sstas}
249233294Sstas#endif
250233294Sstas
25155682Smarkm#endif /* __RESOLVE_H__ */
252