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