1/* 2 * Copyright (C) 2004, 2006, 2007, 2012 Internet Systems Consortium, Inc. ("ISC") 3 * Copyright (C) 2000, 2001 Internet Software Consortium. 4 * 5 * Permission to use, copy, modify, and/or distribute this software for any 6 * purpose with or without fee is hereby granted, provided that the above 7 * copyright notice and this permission notice appear in all copies. 8 * 9 * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH 10 * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 11 * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, 12 * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM 13 * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE 14 * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 15 * PERFORMANCE OF THIS SOFTWARE. 16 */ 17 18/* $Id$ */ 19 20#ifndef LWRES_NETDB_H 21#define LWRES_NETDB_H 1 22 23#include <stddef.h> /* Required on FreeBSD (and others?) for size_t. */ 24 25#define off_t _off_t 26#include <sys/types.h> 27 28#include <lwres/net.h> 29#include <lwres/lang.h> 30 31/* 32 * Define if <netdb.h> does not declare struct addrinfo. 33 */ 34#define ISC_LWRES_NEEDADDRINFO 1 35 36#ifdef ISC_LWRES_NEEDADDRINFO 37struct addrinfo { 38 int ai_flags; /* AI_PASSIVE, AI_CANONNAME */ 39 int ai_family; /* PF_xxx */ 40 int ai_socktype; /* SOCK_xxx */ 41 int ai_protocol; /* 0 or IPPROTO_xxx for IPv4 and IPv6 */ 42 size_t ai_addrlen; /* Length of ai_addr */ 43 char *ai_canonname; /* Canonical name for hostname */ 44 struct sockaddr *ai_addr; /* Binary address */ 45 struct addrinfo *ai_next; /* Next structure in linked list */ 46}; 47#endif 48 49/* 50 * Undefine all \#defines we are interested in as <netdb.h> may or may not have 51 * defined them. 52 */ 53 54/* 55 * Error return codes from gethostbyname() and gethostbyaddr() 56 * (left in extern int h_errno). 57 */ 58 59#undef NETDB_INTERNAL 60#undef NETDB_SUCCESS 61#undef HOST_NOT_FOUND 62#undef TRY_AGAIN 63#undef NO_RECOVERY 64#undef NO_DATA 65#undef NO_ADDRESS 66 67#define NETDB_INTERNAL -1 /* see errno */ 68#define NETDB_SUCCESS 0 /* no problem */ 69#define HOST_NOT_FOUND 1 /* Authoritative Answer Host not found */ 70#define TRY_AGAIN 2 /* Non-Authoritive Host not found, or SERVERFAIL */ 71#define NO_RECOVERY 3 /* Non recoverable errors, FORMERR, REFUSED, NOTIMP */ 72#define NO_DATA 4 /* Valid name, no data record of requested type */ 73#define NO_ADDRESS NO_DATA /* no address, look for MX record */ 74 75/* 76 * Error return codes from getaddrinfo() 77 */ 78 79#undef EAI_ADDRFAMILY 80#undef EAI_AGAIN 81#undef EAI_BADFLAGS 82#undef EAI_FAIL 83#undef EAI_FAMILY 84#undef EAI_MEMORY 85#undef EAI_NODATA 86#undef EAI_NONAME 87#undef EAI_SERVICE 88#undef EAI_SOCKTYPE 89#undef EAI_SYSTEM 90#undef EAI_BADHINTS 91#undef EAI_PROTOCOL 92#undef EAI_MAX 93 94#define EAI_ADDRFAMILY 1 /* address family for hostname not supported */ 95#define EAI_AGAIN 2 /* temporary failure in name resolution */ 96#define EAI_BADFLAGS 3 /* invalid value for ai_flags */ 97#define EAI_FAIL 4 /* non-recoverable failure in name resolution */ 98#define EAI_FAMILY 5 /* ai_family not supported */ 99#define EAI_MEMORY 6 /* memory allocation failure */ 100#define EAI_NODATA 7 /* no address associated with hostname */ 101#define EAI_NONAME 8 /* hostname nor servname provided, or not known */ 102#define EAI_SERVICE 9 /* servname not supported for ai_socktype */ 103#define EAI_SOCKTYPE 10 /* ai_socktype not supported */ 104#define EAI_SYSTEM 11 /* system error returned in errno */ 105#define EAI_BADHINTS 12 106#define EAI_PROTOCOL 13 107#define EAI_MAX 14 108 109/* 110 * Flag values for getaddrinfo() 111 */ 112#undef AI_PASSIVE 113#undef AI_CANONNAME 114#undef AI_NUMERICHOST 115 116#define AI_PASSIVE 0x00000001 117#define AI_CANONNAME 0x00000002 118#define AI_NUMERICHOST 0x00000004 119 120/* 121 * Flag values for getipnodebyname() 122 */ 123#undef AI_V4MAPPED 124#undef AI_ALL 125#undef AI_ADDRCONFIG 126#undef AI_DEFAULT 127 128#define AI_V4MAPPED 0x00000008 129#define AI_ALL 0x00000010 130#define AI_ADDRCONFIG 0x00000020 131#define AI_DEFAULT (AI_V4MAPPED|AI_ADDRCONFIG) 132 133/* 134 * Constants for lwres_getnameinfo() 135 */ 136#undef NI_MAXHOST 137#undef NI_MAXSERV 138 139#define NI_MAXHOST 1025 140#define NI_MAXSERV 32 141 142/* 143 * Flag values for lwres_getnameinfo() 144 */ 145#undef NI_NOFQDN 146#undef NI_NUMERICHOST 147#undef NI_NAMEREQD 148#undef NI_NUMERICSERV 149#undef NI_DGRAM 150#undef NI_NUMERICSCOPE 151 152#define NI_NOFQDN 0x00000001 153#define NI_NUMERICHOST 0x00000002 154#define NI_NAMEREQD 0x00000004 155#define NI_NUMERICSERV 0x00000008 156#define NI_DGRAM 0x00000010 157#define NI_NUMERICSCOPE 0x00000020 /*2553bis-00*/ 158 159/* 160 * Structures for getrrsetbyname() 161 */ 162struct rdatainfo { 163 unsigned int rdi_length; 164 unsigned char *rdi_data; 165}; 166 167struct rrsetinfo { 168 unsigned int rri_flags; 169 int rri_rdclass; 170 int rri_rdtype; 171 unsigned int rri_ttl; 172 unsigned int rri_nrdatas; 173 unsigned int rri_nsigs; 174 char *rri_name; 175 struct rdatainfo *rri_rdatas; 176 struct rdatainfo *rri_sigs; 177}; 178 179/* 180 * Flags for getrrsetbyname() 181 */ 182#define RRSET_VALIDATED 0x00000001 183 /* Set was dnssec validated */ 184 185/* 186 * Return codes for getrrsetbyname() 187 */ 188#define ERRSET_SUCCESS 0 189#define ERRSET_NOMEMORY 1 190#define ERRSET_FAIL 2 191#define ERRSET_INVAL 3 192#define ERRSET_NONAME 4 193#define ERRSET_NODATA 5 194 195/* 196 * Define to map into lwres_ namespace. 197 */ 198 199#define LWRES_NAMESPACE 200 201#ifdef LWRES_NAMESPACE 202 203/* 204 * Use our versions not the ones from the C library. 205 */ 206 207#ifdef getnameinfo 208#undef getnameinfo 209#endif 210#define getnameinfo lwres_getnameinfo 211 212#ifdef getaddrinfo 213#undef getaddrinfo 214#endif 215#define getaddrinfo lwres_getaddrinfo 216 217#ifdef freeaddrinfo 218#undef freeaddrinfo 219#endif 220#define freeaddrinfo lwres_freeaddrinfo 221 222#ifdef gai_strerror 223#undef gai_strerror 224#endif 225#define gai_strerror lwres_gai_strerror 226 227#ifdef herror 228#undef herror 229#endif 230#define herror lwres_herror 231 232#ifdef hstrerror 233#undef hstrerror 234#endif 235#define hstrerror lwres_hstrerror 236 237#ifdef getipnodebyname 238#undef getipnodebyname 239#endif 240#define getipnodebyname lwres_getipnodebyname 241 242#ifdef getipnodebyaddr 243#undef getipnodebyaddr 244#endif 245#define getipnodebyaddr lwres_getipnodebyaddr 246 247#ifdef freehostent 248#undef freehostent 249#endif 250#define freehostent lwres_freehostent 251 252#ifdef gethostbyname 253#undef gethostbyname 254#endif 255#define gethostbyname lwres_gethostbyname 256 257#ifdef gethostbyname2 258#undef gethostbyname2 259#endif 260#define gethostbyname2 lwres_gethostbyname2 261 262#ifdef gethostbyaddr 263#undef gethostbyaddr 264#endif 265#define gethostbyaddr lwres_gethostbyaddr 266 267#ifdef gethostent 268#undef gethostent 269#endif 270#define gethostent lwres_gethostent 271 272#ifdef sethostent 273#undef sethostent 274#endif 275#define sethostent lwres_sethostent 276 277#ifdef endhostent 278#undef endhostent 279#endif 280#define endhostent lwres_endhostent 281 282/* #define sethostfile lwres_sethostfile */ 283 284#ifdef gethostbyname_r 285#undef gethostbyname_r 286#endif 287#define gethostbyname_r lwres_gethostbyname_r 288 289#ifdef gethostbyaddr_r 290#undef gethostbyaddr_r 291#endif 292#define gethostbyaddr_r lwres_gethostbyaddr_r 293 294#ifdef gethostent_r 295#undef gethostent_r 296#endif 297#define gethostent_r lwres_gethostent_r 298 299#ifdef sethostent_r 300#undef sethostent_r 301#endif 302#define sethostent_r lwres_sethostent_r 303 304#ifdef endhostent_r 305#undef endhostent_r 306#endif 307#define endhostent_r lwres_endhostent_r 308 309#ifdef getrrsetbyname 310#undef getrrsetbyname 311#endif 312#define getrrsetbyname lwres_getrrsetbyname 313 314#ifdef freerrset 315#undef freerrset 316#endif 317#define freerrset lwres_freerrset 318 319#ifdef notyet 320#define getservbyname lwres_getservbyname 321#define getservbyport lwres_getservbyport 322#define getservent lwres_getservent 323#define setservent lwres_setservent 324#define endservent lwres_endservent 325 326#define getservbyname_r lwres_getservbyname_r 327#define getservbyport_r lwres_getservbyport_r 328#define getservent_r lwres_getservent_r 329#define setservent_r lwres_setservent_r 330#define endservent_r lwres_endservent_r 331 332#define getprotobyname lwres_getprotobyname 333#define getprotobynumber lwres_getprotobynumber 334#define getprotoent lwres_getprotoent 335#define setprotoent lwres_setprotoent 336#define endprotoent lwres_endprotoent 337 338#define getprotobyname_r lwres_getprotobyname_r 339#define getprotobynumber_r lwres_getprotobynumber_r 340#define getprotoent_r lwres_getprotoent_r 341#define setprotoent_r lwres_setprotoent_r 342#define endprotoent_r lwres_endprotoent_r 343 344#ifdef getnetbyname 345#undef getnetbyname 346#endif 347#define getnetbyname lwres_getnetbyname 348 349#ifdef getnetbyaddr 350#undef getnetbyaddr 351#endif 352#define getnetbyaddr lwres_getnetbyaddr 353 354#ifdef getnetent 355#undef getnetent 356#endif 357#define getnetent lwres_getnetent 358 359#ifdef setnetent 360#undef setnetent 361#endif 362#define setnetent lwres_setnetent 363 364#ifdef endnetent 365#undef endnetent 366#endif 367#define endnetent lwres_endnetent 368 369 370#ifdef getnetbyname_r 371#undef getnetbyname_r 372#endif 373#define getnetbyname_r lwres_getnetbyname_r 374 375#ifdef getnetbyaddr_r 376#undef getnetbyaddr_r 377#endif 378#define getnetbyaddr_r lwres_getnetbyaddr_r 379 380#ifdef getnetent_r 381#undef getnetent_r 382#endif 383#define getnetent_r lwres_getnetent_r 384 385#ifdef setnetent_r 386#undef setnetent_r 387#endif 388#define setnetent_r lwres_setnetent_r 389 390#ifdef endnetent_r 391#undef endnetent_r 392#endif 393#define endnetent_r lwres_endnetent_r 394#endif /* notyet */ 395 396#ifdef h_errno 397#undef h_errno 398#endif 399#define h_errno lwres_h_errno 400 401#endif /* LWRES_NAMESPACE */ 402 403LWRES_LANG_BEGINDECLS 404 405LIBLWRES_EXTERNAL_DATA extern int lwres_h_errno; 406 407int lwres_getaddrinfo(const char *, const char *, 408 const struct addrinfo *, struct addrinfo **); 409int lwres_getnameinfo(const struct sockaddr *, size_t, char *, 410 size_t, char *, size_t, int); 411void lwres_freeaddrinfo(struct addrinfo *); 412char *lwres_gai_strerror(int); 413 414struct hostent *lwres_gethostbyaddr(const char *, int, int); 415struct hostent *lwres_gethostbyname(const char *); 416struct hostent *lwres_gethostbyname2(const char *, int); 417struct hostent *lwres_gethostent(void); 418struct hostent *lwres_getipnodebyname(const char *, int, int, int *); 419struct hostent *lwres_getipnodebyaddr(const void *, size_t, int, int *); 420void lwres_endhostent(void); 421void lwres_sethostent(int); 422/* void lwres_sethostfile(const char *); */ 423void lwres_freehostent(struct hostent *); 424 425int lwres_getrrsetbyname(const char *, unsigned int, unsigned int, 426 unsigned int, struct rrsetinfo **); 427void lwres_freerrset(struct rrsetinfo *); 428 429#ifdef notyet 430struct netent *lwres_getnetbyaddr(unsigned long, int); 431struct netent *lwres_getnetbyname(const char *); 432struct netent *lwres_getnetent(void); 433void lwres_endnetent(void); 434void lwres_setnetent(int); 435 436struct protoent *lwres_getprotobyname(const char *); 437struct protoent *lwres_getprotobynumber(int); 438struct protoent *lwres_getprotoent(void); 439void lwres_endprotoent(void); 440void lwres_setprotoent(int); 441 442struct servent *lwres_getservbyname(const char *, const char *); 443struct servent *lwres_getservbyport(int, const char *); 444struct servent *lwres_getservent(void); 445void lwres_endservent(void); 446void lwres_setservent(int); 447#endif /* notyet */ 448 449void lwres_herror(const char *); 450const char *lwres_hstrerror(int); 451 452 453#ifdef _REENTRANT 454struct hostent *lwres_gethostbyaddr_r(const char *, int, int, struct hostent *, 455 char *, int, int *); 456struct hostent *lwres_gethostbyname_r(const char *, struct hostent *, 457 char *, int, int *); 458struct hostent *lwres_gethostent_r(struct hostent *, char *, int, int *); 459void lwres_sethostent_r(int); 460void lwres_endhostent_r(void); 461 462#ifdef notyet 463struct netent *lwres_getnetbyname_r(const char *, struct netent *, 464 char *, int); 465struct netent *lwres_getnetbyaddr_r(long, int, struct netent *, 466 char *, int); 467struct netent *lwres_getnetent_r(struct netent *, char *, int); 468void lwres_setnetent_r(int); 469void lwres_endnetent_r(void); 470 471struct protoent *lwres_getprotobyname_r(const char *, 472 struct protoent *, char *, int); 473struct protoent *lwres_getprotobynumber_r(int, 474 struct protoent *, char *, int); 475struct protoent *lwres_getprotoent_r(struct protoent *, char *, int); 476void lwres_setprotoent_r(int); 477void lwres_endprotoent_r(void); 478 479struct servent *lwres_getservbyname_r(const char *name, const char *, 480 struct servent *, char *, int); 481struct servent *lwres_getservbyport_r(int port, const char *, 482 struct servent *, char *, int); 483struct servent *lwres_getservent_r(struct servent *, char *, int); 484void lwres_setservent_r(int); 485void lwres_endservent_r(void); 486#endif /* notyet */ 487#endif /* _REENTRANT */ 488 489LWRES_LANG_ENDDECLS 490 491#ifdef notyet 492/* This is nec'y to make this include file properly replace the sun version. */ 493#ifdef sun 494#ifdef __GNU_LIBRARY__ 495#include <rpc/netdb.h> /* Required. */ 496#else /* !__GNU_LIBRARY__ */ 497struct rpcent { 498 char *r_name; /* name of server for this rpc program */ 499 char **r_aliases; /* alias list */ 500 int r_number; /* rpc program number */ 501}; 502struct rpcent *lwres_getrpcbyname(); 503struct rpcent *lwres_getrpcbynumber(), 504struct rpcent *lwres_getrpcent(); 505#endif /* __GNU_LIBRARY__ */ 506#endif /* sun */ 507#endif /* notyet */ 508 509/* 510 * Tell Emacs to use C mode on this file. 511 * Local variables: 512 * mode: c 513 * End: 514 */ 515 516#endif /* LWRES_NETDB_H */ 517