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