1b528cefcSMark Murray /* 2*ae771770SStanislav Sedov * Copyright (c) 1995 - 2002 Kungliga Tekniska Högskolan 3b528cefcSMark Murray * (Royal Institute of Technology, Stockholm, Sweden). 4b528cefcSMark Murray * All rights reserved. 5b528cefcSMark Murray * 6b528cefcSMark Murray * Redistribution and use in source and binary forms, with or without 7b528cefcSMark Murray * modification, are permitted provided that the following conditions 8b528cefcSMark Murray * are met: 9b528cefcSMark Murray * 10b528cefcSMark Murray * 1. Redistributions of source code must retain the above copyright 11b528cefcSMark Murray * notice, this list of conditions and the following disclaimer. 12b528cefcSMark Murray * 13b528cefcSMark Murray * 2. Redistributions in binary form must reproduce the above copyright 14b528cefcSMark Murray * notice, this list of conditions and the following disclaimer in the 15b528cefcSMark Murray * documentation and/or other materials provided with the distribution. 16b528cefcSMark Murray * 17b528cefcSMark Murray * 3. Neither the name of the Institute nor the names of its contributors 18b528cefcSMark Murray * may be used to endorse or promote products derived from this software 19b528cefcSMark Murray * without specific prior written permission. 20b528cefcSMark Murray * 21b528cefcSMark Murray * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND 22b528cefcSMark Murray * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 23b528cefcSMark Murray * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 24b528cefcSMark Murray * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE 25b528cefcSMark Murray * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 26b528cefcSMark Murray * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 27b528cefcSMark Murray * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28b528cefcSMark Murray * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29b528cefcSMark Murray * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30b528cefcSMark Murray * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31b528cefcSMark Murray * SUCH DAMAGE. 32b528cefcSMark Murray */ 33b528cefcSMark Murray 34*ae771770SStanislav Sedov /* $Id$ */ 35b528cefcSMark Murray 36b528cefcSMark Murray #ifndef __RESOLVE_H__ 37b528cefcSMark Murray #define __RESOLVE_H__ 38b528cefcSMark Murray 39c19800e8SDoug Rabson #ifndef ROKEN_LIB_FUNCTION 40c19800e8SDoug Rabson #ifdef _WIN32 41*ae771770SStanislav Sedov #define ROKEN_LIB_FUNCTION 42*ae771770SStanislav Sedov #define ROKEN_LIB_CALL __cdecl 43c19800e8SDoug Rabson #else 44c19800e8SDoug Rabson #define ROKEN_LIB_FUNCTION 45*ae771770SStanislav Sedov #define ROKEN_LIB_CALL 46c19800e8SDoug Rabson #endif 47c19800e8SDoug Rabson #endif 48c19800e8SDoug Rabson 49*ae771770SStanislav Sedov enum { 50*ae771770SStanislav Sedov rk_ns_c_in = 1 51*ae771770SStanislav Sedov }; 52*ae771770SStanislav Sedov 53*ae771770SStanislav Sedov enum { 54c19800e8SDoug Rabson rk_ns_t_invalid = 0, /* Cookie. */ 55c19800e8SDoug Rabson rk_ns_t_a = 1, /* Host address. */ 56c19800e8SDoug Rabson rk_ns_t_ns = 2, /* Authoritative server. */ 57c19800e8SDoug Rabson rk_ns_t_md = 3, /* Mail destination. */ 58c19800e8SDoug Rabson rk_ns_t_mf = 4, /* Mail forwarder. */ 59c19800e8SDoug Rabson rk_ns_t_cname = 5, /* Canonical name. */ 60c19800e8SDoug Rabson rk_ns_t_soa = 6, /* Start of authority zone. */ 61c19800e8SDoug Rabson rk_ns_t_mb = 7, /* Mailbox domain name. */ 62c19800e8SDoug Rabson rk_ns_t_mg = 8, /* Mail group member. */ 63c19800e8SDoug Rabson rk_ns_t_mr = 9, /* Mail rename name. */ 64c19800e8SDoug Rabson rk_ns_t_null = 10, /* Null resource record. */ 65c19800e8SDoug Rabson rk_ns_t_wks = 11, /* Well known service. */ 66c19800e8SDoug Rabson rk_ns_t_ptr = 12, /* Domain name pointer. */ 67c19800e8SDoug Rabson rk_ns_t_hinfo = 13, /* Host information. */ 68c19800e8SDoug Rabson rk_ns_t_minfo = 14, /* Mailbox information. */ 69c19800e8SDoug Rabson rk_ns_t_mx = 15, /* Mail routing information. */ 70c19800e8SDoug Rabson rk_ns_t_txt = 16, /* Text strings. */ 71c19800e8SDoug Rabson rk_ns_t_rp = 17, /* Responsible person. */ 72c19800e8SDoug Rabson rk_ns_t_afsdb = 18, /* AFS cell database. */ 73c19800e8SDoug Rabson rk_ns_t_x25 = 19, /* X_25 calling address. */ 74c19800e8SDoug Rabson rk_ns_t_isdn = 20, /* ISDN calling address. */ 75c19800e8SDoug Rabson rk_ns_t_rt = 21, /* Router. */ 76c19800e8SDoug Rabson rk_ns_t_nsap = 22, /* NSAP address. */ 77c19800e8SDoug Rabson rk_ns_t_nsap_ptr = 23, /* Reverse NSAP lookup (deprecated). */ 78c19800e8SDoug Rabson rk_ns_t_sig = 24, /* Security signature. */ 79c19800e8SDoug Rabson rk_ns_t_key = 25, /* Security key. */ 80c19800e8SDoug Rabson rk_ns_t_px = 26, /* X.400 mail mapping. */ 81c19800e8SDoug Rabson rk_ns_t_gpos = 27, /* Geographical position (withdrawn). */ 82c19800e8SDoug Rabson rk_ns_t_aaaa = 28, /* Ip6 Address. */ 83c19800e8SDoug Rabson rk_ns_t_loc = 29, /* Location Information. */ 84c19800e8SDoug Rabson rk_ns_t_nxt = 30, /* Next domain (security). */ 85c19800e8SDoug Rabson rk_ns_t_eid = 31, /* Endpoint identifier. */ 86c19800e8SDoug Rabson rk_ns_t_nimloc = 32, /* Nimrod Locator. */ 87c19800e8SDoug Rabson rk_ns_t_srv = 33, /* Server Selection. */ 88c19800e8SDoug Rabson rk_ns_t_atma = 34, /* ATM Address */ 89c19800e8SDoug Rabson rk_ns_t_naptr = 35, /* Naming Authority PoinTeR */ 90c19800e8SDoug Rabson rk_ns_t_kx = 36, /* Key Exchange */ 91c19800e8SDoug Rabson rk_ns_t_cert = 37, /* Certification record */ 92c19800e8SDoug Rabson rk_ns_t_a6 = 38, /* IPv6 address (deprecates AAAA) */ 93c19800e8SDoug Rabson rk_ns_t_dname = 39, /* Non-terminal DNAME (for IPv6) */ 94c19800e8SDoug Rabson rk_ns_t_sink = 40, /* Kitchen sink (experimentatl) */ 95c19800e8SDoug Rabson rk_ns_t_opt = 41, /* EDNS0 option (meta-RR) */ 96c19800e8SDoug Rabson rk_ns_t_apl = 42, /* Address prefix list (RFC 3123) */ 97c19800e8SDoug Rabson rk_ns_t_ds = 43, /* Delegation Signer (RFC 3658) */ 98c19800e8SDoug Rabson rk_ns_t_sshfp = 44, /* SSH fingerprint */ 99c19800e8SDoug Rabson rk_ns_t_tkey = 249, /* Transaction key */ 100c19800e8SDoug Rabson rk_ns_t_tsig = 250, /* Transaction signature. */ 101c19800e8SDoug Rabson rk_ns_t_ixfr = 251, /* Incremental zone transfer. */ 102c19800e8SDoug Rabson rk_ns_t_axfr = 252, /* Transfer zone of authority. */ 103c19800e8SDoug Rabson rk_ns_t_mailb = 253, /* Transfer mailbox records. */ 104c19800e8SDoug Rabson rk_ns_t_maila = 254, /* Transfer mail agent records. */ 105c19800e8SDoug Rabson rk_ns_t_any = 255, /* Wildcard match. */ 106c19800e8SDoug Rabson rk_ns_t_zxfr = 256, /* BIND-specific, nonstandard. */ 107c19800e8SDoug Rabson rk_ns_t_max = 65536 108*ae771770SStanislav Sedov }; 109c19800e8SDoug Rabson 110c19800e8SDoug Rabson #ifndef MAXDNAME 111c19800e8SDoug Rabson #define MAXDNAME 1025 112c19800e8SDoug Rabson #endif 113b528cefcSMark Murray 1148373020dSJacques Vidrine #define mx_record rk_mx_record 1158373020dSJacques Vidrine #define srv_record rk_srv_record 1168373020dSJacques Vidrine #define key_record rk_key_record 1178373020dSJacques Vidrine #define sig_record rk_sig_record 1188373020dSJacques Vidrine #define cert_record rk_cert_record 119c19800e8SDoug Rabson #define sshfp_record rk_sshfp_record 1208373020dSJacques Vidrine 121*ae771770SStanislav Sedov struct rk_dns_query{ 122b528cefcSMark Murray char *domain; 123b528cefcSMark Murray unsigned type; 124b528cefcSMark Murray unsigned class; 125b528cefcSMark Murray }; 126b528cefcSMark Murray 127*ae771770SStanislav Sedov struct rk_mx_record{ 128b528cefcSMark Murray unsigned preference; 129b528cefcSMark Murray char domain[1]; 130b528cefcSMark Murray }; 131b528cefcSMark Murray 132*ae771770SStanislav Sedov struct rk_srv_record{ 133b528cefcSMark Murray unsigned priority; 134b528cefcSMark Murray unsigned weight; 135b528cefcSMark Murray unsigned port; 136b528cefcSMark Murray char target[1]; 137b528cefcSMark Murray }; 138b528cefcSMark Murray 139*ae771770SStanislav Sedov struct rk_key_record { 1405e9cd1aeSAssar Westerlund unsigned flags; 1415e9cd1aeSAssar Westerlund unsigned protocol; 1425e9cd1aeSAssar Westerlund unsigned algorithm; 1435e9cd1aeSAssar Westerlund size_t key_len; 1445e9cd1aeSAssar Westerlund u_char key_data[1]; 1455e9cd1aeSAssar Westerlund }; 1465e9cd1aeSAssar Westerlund 147*ae771770SStanislav Sedov struct rk_sig_record { 1485e9cd1aeSAssar Westerlund unsigned type; 1495e9cd1aeSAssar Westerlund unsigned algorithm; 1505e9cd1aeSAssar Westerlund unsigned labels; 1515e9cd1aeSAssar Westerlund unsigned orig_ttl; 1525e9cd1aeSAssar Westerlund unsigned sig_expiration; 1535e9cd1aeSAssar Westerlund unsigned sig_inception; 1545e9cd1aeSAssar Westerlund unsigned key_tag; 1555e9cd1aeSAssar Westerlund char *signer; 156*ae771770SStanislav Sedov size_t sig_len; 1575e9cd1aeSAssar Westerlund char sig_data[1]; /* also includes signer */ 1585e9cd1aeSAssar Westerlund }; 1595e9cd1aeSAssar Westerlund 160*ae771770SStanislav Sedov struct rk_cert_record { 1615e9cd1aeSAssar Westerlund unsigned type; 1625e9cd1aeSAssar Westerlund unsigned tag; 1635e9cd1aeSAssar Westerlund unsigned algorithm; 1645e9cd1aeSAssar Westerlund size_t cert_len; 1655e9cd1aeSAssar Westerlund u_char cert_data[1]; 1665e9cd1aeSAssar Westerlund }; 1675e9cd1aeSAssar Westerlund 168*ae771770SStanislav Sedov struct rk_sshfp_record { 169c19800e8SDoug Rabson unsigned algorithm; 170c19800e8SDoug Rabson unsigned type; 171c19800e8SDoug Rabson size_t sshfp_len; 172c19800e8SDoug Rabson u_char sshfp_data[1]; 173c19800e8SDoug Rabson }; 174c19800e8SDoug Rabson 175*ae771770SStanislav Sedov struct rk_ds_record { 176c19800e8SDoug Rabson unsigned key_tag; 177c19800e8SDoug Rabson unsigned algorithm; 178c19800e8SDoug Rabson unsigned digest_type; 179*ae771770SStanislav Sedov size_t digest_len; 180c19800e8SDoug Rabson u_char digest_data[1]; 181c19800e8SDoug Rabson }; 182c19800e8SDoug Rabson 183*ae771770SStanislav Sedov struct rk_resource_record{ 184b528cefcSMark Murray char *domain; 185b528cefcSMark Murray unsigned type; 186b528cefcSMark Murray unsigned class; 187b528cefcSMark Murray unsigned ttl; 188b528cefcSMark Murray unsigned size; 189b528cefcSMark Murray union { 190b528cefcSMark Murray void *data; 191*ae771770SStanislav Sedov struct rk_mx_record *mx; 192*ae771770SStanislav Sedov struct rk_mx_record *afsdb; /* mx and afsdb are identical */ 193*ae771770SStanislav Sedov struct rk_srv_record *srv; 194b528cefcSMark Murray struct in_addr *a; 195b528cefcSMark Murray char *txt; 196*ae771770SStanislav Sedov struct rk_key_record *key; 197*ae771770SStanislav Sedov struct rk_cert_record *cert; 198*ae771770SStanislav Sedov struct rk_sig_record *sig; 199*ae771770SStanislav Sedov struct rk_sshfp_record *sshfp; 200*ae771770SStanislav Sedov struct rk_ds_record *ds; 201b528cefcSMark Murray }u; 202*ae771770SStanislav Sedov struct rk_resource_record *next; 203b528cefcSMark Murray }; 204b528cefcSMark Murray 205c19800e8SDoug Rabson #define rk_DNS_MAX_PACKET_SIZE 0xffff 206c19800e8SDoug Rabson 207*ae771770SStanislav Sedov struct rk_dns_header { 208c19800e8SDoug Rabson unsigned id; 209c19800e8SDoug Rabson unsigned flags; 210c19800e8SDoug Rabson #define rk_DNS_HEADER_RESPONSE_FLAG 1 211c19800e8SDoug Rabson #define rk_DNS_HEADER_AUTHORITIVE_ANSWER 2 212c19800e8SDoug Rabson #define rk_DNS_HEADER_TRUNCATED_MESSAGE 4 213c19800e8SDoug Rabson #define rk_DNS_HEADER_RECURSION_DESIRED 8 214c19800e8SDoug Rabson #define rk_DNS_HEADER_RECURSION_AVAILABLE 16 215c19800e8SDoug Rabson #define rk_DNS_HEADER_AUTHENTIC_DATA 32 216c19800e8SDoug Rabson #define rk_DNS_HEADER_CHECKING_DISABLED 64 217c19800e8SDoug Rabson unsigned opcode; 218c19800e8SDoug Rabson unsigned response_code; 219c19800e8SDoug Rabson unsigned qdcount; 220c19800e8SDoug Rabson unsigned ancount; 221c19800e8SDoug Rabson unsigned nscount; 222c19800e8SDoug Rabson unsigned arcount; 223c19800e8SDoug Rabson }; 224b528cefcSMark Murray 225*ae771770SStanislav Sedov struct rk_dns_reply{ 226*ae771770SStanislav Sedov struct rk_dns_header h; 227*ae771770SStanislav Sedov struct rk_dns_query q; 228*ae771770SStanislav Sedov struct rk_resource_record *head; 229b528cefcSMark Murray }; 230b528cefcSMark Murray 231b528cefcSMark Murray 232*ae771770SStanislav Sedov #ifdef __cplusplus 233*ae771770SStanislav Sedov extern "C" { 234*ae771770SStanislav Sedov #endif 235*ae771770SStanislav Sedov 236*ae771770SStanislav Sedov ROKEN_LIB_FUNCTION struct rk_dns_reply* ROKEN_LIB_CALL 237*ae771770SStanislav Sedov rk_dns_lookup(const char *, const char *); 238*ae771770SStanislav Sedov ROKEN_LIB_FUNCTION void ROKEN_LIB_CALL 239*ae771770SStanislav Sedov rk_dns_free_data(struct rk_dns_reply *); 240*ae771770SStanislav Sedov ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL 241*ae771770SStanislav Sedov rk_dns_string_to_type(const char *name); 242*ae771770SStanislav Sedov ROKEN_LIB_FUNCTION const char * ROKEN_LIB_CALL 243*ae771770SStanislav Sedov rk_dns_type_to_string(int type); 244*ae771770SStanislav Sedov ROKEN_LIB_FUNCTION void ROKEN_LIB_CALL 245*ae771770SStanislav Sedov rk_dns_srv_order(struct rk_dns_reply*); 246*ae771770SStanislav Sedov 247*ae771770SStanislav Sedov #ifdef __cplusplus 248*ae771770SStanislav Sedov } 249*ae771770SStanislav Sedov #endif 250b528cefcSMark Murray 251b528cefcSMark Murray #endif /* __RESOLVE_H__ */ 252