1 /* 2 * Copyright 2009-2020, Haiku, Inc. All rights reserved. 3 * Distributed under the terms of the MIT License. 4 */ 5 6 /* 7 * Portions Copyright (c) 1996-1999 by Internet Software Consortium. 8 * 9 * Permission to use, copy, modify, and distribute this software for any 10 * purpose with or without fee is hereby granted, provided that the above 11 * copyright notice and this permission notice appear in all copies. 12 * 13 * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS 14 * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES 15 * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE 16 * CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL 17 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR 18 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS 19 * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS 20 * SOFTWARE. 21 */ 22 23 /* 24 * Copyright (c) 1983, 1987, 1989 25 * The Regents of the University of California. All rights reserved. 26 * 27 * Redistribution and use in source and binary forms, with or without 28 * modification, are permitted provided that the following conditions 29 * are met: 30 * 1. Redistributions of source code must retain the above copyright 31 * notice, this list of conditions and the following disclaimer. 32 * 2. Redistributions in binary form must reproduce the above copyright 33 * notice, this list of conditions and the following disclaimer in the 34 * documentation and/or other materials provided with the distribution. 35 * 3. Neither the name of the University nor the names of its contributors 36 * may be used to endorse or promote products derived from this software 37 * without specific prior written permission. 38 * 39 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 40 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 41 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 42 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 43 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 44 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 45 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 46 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 47 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 48 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 49 * SUCH DAMAGE. 50 */ 51 52 #ifndef _RESOLV_H_ 53 #define _RESOLV_H_ 54 55 #include <stdint.h> 56 #include <stdio.h> 57 #include <arpa/nameser.h> 58 #include <netinet/in.h> 59 60 #ifdef __cplusplus 61 extern "C" { 62 #endif 63 64 #define __RES 19991006 65 66 struct res_sym { 67 int number; /* Identifying number, like T_MX */ 68 const char *name; /* Its symbolic name, like "MX" */ 69 const char *humanname; /* Its fun name, like "mail exchanger" */ 70 }; 71 72 /* 73 * Global defines and variables for resolver stub. 74 */ 75 #define MAXNS 3 /* max # name servers we'll track */ 76 #define MAXDFLSRCH 3 /* # default domain levels to try */ 77 #define MAXDNSRCH 6 /* max # domains in search path */ 78 #define LOCALDOMAINPARTS 2 /* min levels in name that is "local" */ 79 #define RES_TIMEOUT 5 /* min. seconds between retries */ 80 #define MAXRESOLVSORT 10 /* number of net to sort on */ 81 #define RES_MAXNDOTS 15 /* should reflect bit field size */ 82 #define RES_MAXRETRANS 30 /* only for resolv.conf/RES_OPTIONS */ 83 #define RES_MAXRETRY 5 /* only for resolv.conf/RES_OPTIONS */ 84 #define RES_DFLRETRY 2 /* Default #/tries. */ 85 #define RES_MAXTIME 65535 /* Infinity, in milliseconds. */ 86 87 struct __res_state { 88 int retrans; /* retransmission time interval */ 89 int retry; /* number of times to retransmit */ 90 unsigned long options; /* option flags - see below. */ 91 int nscount; /* number of name servers */ 92 struct sockaddr_in 93 nsaddr_list[MAXNS]; /* address of name server */ 94 unsigned short id; /* current message id */ 95 char *dnsrch[MAXDNSRCH+1]; /* components of domain to search */ 96 char defdname[256]; /* default domain (deprecated) */ 97 unsigned long pfcode; /* RES_PRF_ flags - see below. */ 98 unsigned ndots:4; /* threshold for initial abs. query */ 99 unsigned nsort:4; /* number of elements in sort_list[] */ 100 char unused[3]; 101 struct { 102 struct in_addr addr; 103 uint32_t mask; 104 } sort_list[MAXRESOLVSORT]; 105 void* qhook; /* query hook */ 106 void* rhook; /* response hook */ 107 int res_h_errno; /* last one set for this context */ 108 int _vcsock; /* PRIVATE: for res_send VC i/o */ 109 unsigned int _flags; /* PRIVATE: see below */ 110 unsigned char _rnd[16]; /* PRIVATE: random state */ 111 unsigned int _pad; /* make _u 64 bit aligned */ 112 union { 113 /* On an 32-bit arch this means 512b total. */ 114 char pad[56 - 4*sizeof (int) - 2*sizeof (void *)]; 115 struct { 116 uint16_t nscount; 117 uint16_t nstimes[MAXNS]; /* ms. */ 118 int nssocks[MAXNS]; 119 struct __res_state_ext *ext; /* extention for IPv6 */ 120 } _ext; 121 } _u; 122 }; 123 124 typedef struct __res_state *res_state; 125 126 /* resolver flags; for _flags in __res_state. */ 127 #define RES_F_VC 0x00000001 /* socket is TCP */ 128 #define RES_F_CONN 0x00000002 /* socket is connected */ 129 #define RES_F_EDNS0ERR 0x00000004 /* EDNS0 caused errors */ 130 131 /* res_findzonecut2() options */ 132 #define RES_EXHAUSTIVE 0x00000001 /* always do all queries */ 133 #define RES_IPV4ONLY 0x00000002 /* IPv4 only */ 134 #define RES_IPV6ONLY 0x00000004 /* IPv6 only */ 135 136 /* resolver options */ 137 #define RES_INIT (1 << 0) /* address initialized */ 138 #define RES_DEBUG (1 << 1) /* print debug messages */ 139 #define RES_AAONLY (1 << 2) /* authoritative answers only (!IMPL)*/ 140 #define RES_USEVC (1 << 3) /* use virtual circuit */ 141 #define RES_PRIMARY (1 << 4) /* query primary server only (!IMPL) */ 142 #define RES_IGNTC (1 << 5) /* ignore trucation errors */ 143 #define RES_RECURSE (1 << 6) /* recursion desired */ 144 #define RES_DEFNAMES (1 << 7) /* use default domain name */ 145 #define RES_STAYOPEN (1 << 8) /* Keep TCP socket open */ 146 #define RES_DNSRCH (1 << 9) /* search up local domain tree */ 147 #define RES_INSECURE1 (1 << 10) /* type 1 security disabled */ 148 #define RES_INSECURE2 (1 << 11) /* type 2 security disabled */ 149 #define RES_NOALIASES (1 << 12) /* shuts off HOSTALIASES feature */ 150 #define RES_USE_INET6 (1 << 13) /* use/map IPv6 in gethostbyname() */ 151 #define RES_ROTATE (1 << 14) /* rotate ns list after each query */ 152 #define RES_NOCHECKNAME (1 << 15) /* do not check names for sanity. */ 153 #define RES_KEEPTSIG (1 << 16) /* do not strip TSIG records */ 154 #define RES_BLAST (1 << 17) /* blast all recursive servers */ 155 156 #define RES_NOTLDQUERY (1 << 20) /* don't unqualified name as a tld */ 157 #define RES_USE_DNSSEC (1 << 21) /* use DNSSEC using OK bit in OPT */ 158 159 #define RES_USE_INET4 (1 << 23) /* use IPv4 in gethostbyname() */ 160 161 /* KAME extensions: use higher bit to avoid conflict with ISC use */ 162 #define RES_USE_EDNS0 0x40000000 /* use EDNS0 if configured */ 163 #define RES_NO_NIBBLE2 0x80000000 /* disable alternate nibble lookup */ 164 165 #define RES_DEFAULT \ 166 (RES_RECURSE | RES_DEFNAMES | RES_DNSRCH | RES_NO_NIBBLE2) 167 168 /* resolver "pfcode" values, used by dig. */ 169 #define RES_PRF_STATS 0x00000001 170 #define RES_PRF_UPDATE 0x00000002 171 #define RES_PRF_CLASS 0x00000004 172 #define RES_PRF_CMD 0x00000008 173 #define RES_PRF_QUES 0x00000010 174 #define RES_PRF_ANS 0x00000020 175 #define RES_PRF_AUTH 0x00000040 176 #define RES_PRF_ADD 0x00000080 177 #define RES_PRF_HEAD1 0x00000100 178 #define RES_PRF_HEAD2 0x00000200 179 #define RES_PRF_TTLID 0x00000400 180 #define RES_PRF_HEADX 0x00000800 181 #define RES_PRF_QUERY 0x00001000 182 #define RES_PRF_REPLY 0x00002000 183 #define RES_PRF_INIT 0x00004000 184 185 /* Things involving an internal (static) resolver context. */ 186 extern struct __res_state *__res_state(void) __attribute__ ((__const__)); 187 #define _res (*__res_state()) 188 189 #define fp_nquery __fp_nquery 190 #define fp_query __fp_query 191 #define hostalias __hostalias 192 #define p_query __p_query 193 #define res_close __res_close 194 #define res_init __res_init 195 #define res_isourserver __res_isourserver 196 #define res_mkquery __res_mkquery 197 #define res_query __res_query 198 #define res_querydomain __res_querydomain 199 #define res_search __res_search 200 #define res_send __res_send 201 202 void fp_nquery(const unsigned char *, int, FILE *); 203 void fp_query(const unsigned char *, FILE *); 204 const char *hostalias(const char *); 205 void p_query(const unsigned char *); 206 void res_close(void); 207 int res_init(void); 208 int res_isourserver(const struct sockaddr_in *); 209 int res_mkquery(int, const char *, int, int, const unsigned char *, 210 int, const unsigned char *, unsigned char *, int); 211 int res_query(const char *, int, int, unsigned char *, int); 212 int res_querydomain(const char *, const char *, int, int, 213 unsigned char *, int); 214 int res_search(const char *, int, int, unsigned char *, int); 215 int res_send(const unsigned char *, int, unsigned char *, int); 216 217 #define b64_ntop __b64_ntop 218 #define b64_pton __b64_pton 219 #define dn_comp __dn_comp 220 #define dn_count_labels __dn_count_labels 221 #define dn_expand __dn_expand 222 #define dn_skipname __dn_skipname 223 #define fp_resstat __fp_resstat 224 #define loc_aton __loc_aton 225 #define loc_ntoa __loc_ntoa 226 #define p_cdname __p_cdname 227 #define p_cdnname __p_cdnname 228 #define p_class __p_class 229 #define p_fqname __p_fqname 230 #define p_fqnname __p_fqnname 231 #define p_option __p_option 232 #define p_time __p_time 233 #define p_type __p_type 234 #define p_rcode __p_rcode 235 #define res_dnok __res_dnok 236 #define res_hnok __res_hnok 237 #define res_hostalias __res_hostalias 238 #define res_mailok __res_mailok 239 #define res_nameinquery __res_nameinquery 240 #define res_nclose __res_nclose 241 #define res_ninit __res_ninit 242 #define res_nmkquery __res_nmkquery 243 #define res_nquery __res_nquery 244 #define res_nquerydomain __res_nquerydomain 245 #define res_nsearch __res_nsearch 246 #define res_nsend __res_nsend 247 #define res_ownok __res_ownok 248 #define res_queriesmatch __res_queriesmatch 249 #define res_randomid __res_randomid 250 #define sym_ntop __sym_ntop 251 #define sym_ntos __sym_ntos 252 #define sym_ston __sym_ston 253 254 int res_hnok(const char *); 255 int res_ownok(const char *); 256 int res_mailok(const char *); 257 int res_dnok(const char *); 258 int sym_ston(const struct res_sym *, const char *, int *); 259 const char * sym_ntos(const struct res_sym *, int, int *); 260 const char * sym_ntop(const struct res_sym *, int, int *); 261 int b64_ntop(unsigned char const *, size_t, char *, size_t); 262 int b64_pton(char const *, unsigned char *, size_t); 263 int loc_aton(const char *, unsigned char *); 264 const char * loc_ntoa(const unsigned char *, char *); 265 int dn_skipname(const unsigned char *, const unsigned char *); 266 const char * p_class(int); 267 const char * p_time(uint32_t); 268 const char * p_type(int); 269 const char * p_rcode(int); 270 const unsigned char * p_cdnname(const unsigned char *, const unsigned char *, 271 int, FILE *); 272 const unsigned char * p_cdname(const unsigned char *, const unsigned char *, 273 FILE *); 274 const unsigned char * p_fqnname(const unsigned char *, const unsigned char *, 275 int, char *, int); 276 const unsigned char * p_fqname(const unsigned char *, const unsigned char *, 277 FILE *); 278 const char * p_option(unsigned long); 279 int dn_count_labels(const char *); 280 int dn_comp(const char *, unsigned char *, int, unsigned char **, 281 unsigned char **); 282 int dn_expand(const unsigned char *, const unsigned char *, 283 const unsigned char *, char *, int); 284 unsigned int res_randomid(void); 285 int res_nameinquery(const char *, int, int, const unsigned char *, 286 const unsigned char *); 287 int res_queriesmatch(const unsigned char *, const unsigned char *, 288 const unsigned char *, const unsigned char *); 289 290 /* Things involving a resolver context. */ 291 int res_ninit(res_state); 292 void fp_resstat(const res_state, FILE *); 293 const char * res_hostalias(const res_state, const char *, char *, size_t); 294 int res_nquery(res_state, const char *, int, int, unsigned char *, 295 int); 296 int res_nsearch(res_state, const char *, int, int, unsigned char *, 297 int); 298 int res_nquerydomain(res_state, const char *, const char *, int, 299 int, unsigned char *, int); 300 int res_nmkquery(res_state, int, const char *, int, int, 301 const unsigned char *, int, const unsigned char *, 302 unsigned char *, int); 303 int res_nsend(res_state, const unsigned char *, int, unsigned char *, 304 int); 305 void res_nclose(res_state); 306 307 #ifdef __cplusplus 308 } 309 #endif 310 311 #endif /* !_RESOLV_H_ */ 312