1/*
2 * Copyright (c) 2001, 02  Motoyuki Kasahara
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 * 1. Redistributions of source code must retain the above copyright
8 *    notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 *    notice, this list of conditions and the following disclaimer in the
11 *    documentation and/or other materials provided with the distribution.
12 * 3. Neither the name of the project nor the names of its contributors
13 *    may be used to endorse or promote products derived from this software
14 *    without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
17 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
20 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26 * SUCH DAMAGE.
27 */
28
29#ifndef GETADDRINFO_H
30#define GETADDRINFO_H
31
32#ifdef HAVE_CONFIG_H
33#include "config.h"
34#endif
35
36#include <sys/types.h>
37
38#ifdef WIN32
39#include <time.h>
40#include <winsock2.h>
41#ifdef DO_IPV6
42#include <ws2tcpip.h>
43#endif  /* DO_IPV6 */
44#include <windows.h>
45#else
46#include <sys/socket.h>
47#include <netdb.h>
48#endif
49
50
51/********************************************************************/
52/*
53 * Undefine all the macros.
54 * <netdb.h> might defines some of them.
55 */
56#ifdef EAI_ADDRFAMILY
57#undef EAI_ADDRFAMILY
58#endif
59#ifdef EAI_AGAIN
60#undef EAI_AGAIN
61#endif
62#ifdef EAI_BADFLAGS
63#undef EAI_BADFLAGS
64#endif
65#ifdef EAI_FAIL
66#undef EAI_FAIL
67#endif
68#ifdef EAI_FAMILY
69#undef EAI_FAMILY
70#endif
71#ifdef EAI_MEMORY
72#undef EAI_MEMORY
73#endif
74#ifdef EAI_NONAME
75#undef EAI_NONAME
76#endif
77#ifdef EAI_OVERFLOW
78#undef EAI_OVERFLOW
79#endif
80#ifdef EAI_SERVICE
81#undef EAI_SERVICE
82#endif
83#ifdef EAI_SOCKTYPE
84#undef EAI_SOCKTYPE
85#endif
86#ifdef EAI_SYSTEM
87#undef EAI_SYSTEM
88#endif
89
90#ifdef AI_PASSIVE
91#undef AI_PASSIVE
92#endif
93#ifdef AI_CANONNAME
94#undef AI_CANONNAME
95#endif
96#ifdef AI_NUMERICHOST
97#undef AI_NUMERICHOST
98#endif
99#ifdef AI_NUMERICSERV
100#undef AI_NUMERICSERV
101#endif
102#ifdef AI_V4MAPPED
103#undef AI_V4MAPPED
104#endif
105#ifdef AI_ALL
106#undef AI_ALL
107#endif
108#ifdef AI_ADDRCONFIG
109#undef AI_ADDRCONFIG
110#endif
111#ifdef AI_DEFAULT
112#undef AI_DEFAULT
113#endif
114
115#ifdef NI_NOFQDN
116#undef NI_NOFQDN
117#endif
118#ifdef NI_NUMERICHOST
119#undef NI_NUMERICHOST
120#endif
121#ifdef NI_NAMEREQD
122#undef NI_NAMEREQD
123#endif
124#ifdef NI_NUMERICSERV
125#undef NI_NUMERICSERV
126#endif
127#ifdef NI_NUMERICSCOPE
128#undef NI_NUMERICSCOPE
129#endif
130
131#ifdef NI_DGRAM
132#undef NI_DGRAM
133#endif
134#ifdef NI_MAXHOST
135#undef NI_MAXHOST
136#endif
137#ifdef NI_MAXSERV
138#undef NI_MAXSERV
139#endif
140
141/*
142 * Fake struct and function names.
143 * <netdb.h> might declares all or some of them.
144 */
145#if defined(HAVE_GETADDRINFO) || defined(HAVE_GETNAMEINFO)
146#define addrinfo my_addrinfo
147#define gai_strerror my_gai_strerror
148#define freeaddrinfo my_freeaddrinfo
149#define getaddrinfo my_getaddrinfo
150#define getnameinfo my_getnameinfo
151#endif
152
153/********************************************************************/
154/*
155 * Error codes.
156 */
157#define EAI_ADDRFAMILY	1
158#define EAI_AGAIN	2
159#define EAI_BADFLAGS	3
160#define EAI_FAIL	4
161#define EAI_FAMILY	5
162#define EAI_MEMORY	6
163#define EAI_NONAME	7
164#define EAI_OVERFLOW	8
165#define EAI_SERVICE	9
166#define EAI_SOCKTYPE	10
167#define EAI_SYSTEM	11
168
169/*
170 * Flags for getaddrinfo().
171 */
172#define AI_ADDRCONFIG	0x0001
173#define AI_ALL		0x0002
174#define AI_CANONNAME	0x0004
175#define AI_NUMERICHOST	0x0008
176#define AI_NUMERICSERV	0x0010
177#define AI_PASSIVE	0x0020
178#define AI_V4MAPPED	0x0040
179#define AI_DEFAULT	(AI_V4MAPPED | AI_ADDRCONFIG)
180
181/*
182 * Flags for getnameinfo().
183 */
184#define NI_DGRAM	0x0001
185#define NI_NAMEREQD	0x0002
186#define NI_NOFQDN	0x0004
187#define NI_NUMERICHOST	0x0008
188#define NI_NUMERICSCOPE	0x0010
189#define NI_NUMERICSERV	0x0020
190
191/*
192 * Maximum length of FQDN and servie name for getnameinfo().
193 */
194#define NI_MAXHOST	1025
195#define NI_MAXSERV	32
196
197/*
198 * Address families and Protocol families.
199 */
200#ifndef AF_UNSPEC
201#define AF_UNSPEC AF_INET
202#endif
203#ifndef PF_UNSPEC
204#define PF_UNSPEC PF_INET
205#endif
206
207/*
208 * struct addrinfo.
209 */
210struct addrinfo {
211    int ai_flags;
212    int ai_family;
213    int ai_socktype;
214    int ai_protocol;
215    socklen_t ai_addrlen;
216    char *ai_canonname;
217    struct sockaddr *ai_addr;
218    struct addrinfo *ai_next;
219};
220
221/*
222 * Functions.
223 */
224#ifdef __STDC__
225const char *gai_strerror(int);
226void freeaddrinfo(struct addrinfo *);
227int getaddrinfo(const char *, const char *, const struct addrinfo *,
228    struct addrinfo **);
229int getnameinfo(const struct sockaddr *, socklen_t, char *,
230    socklen_t, char *, socklen_t, int);
231#else
232const char *gai_strerror();
233void freeaddrinfo();
234int getaddrinfo();
235int getnameinfo();
236#endif
237
238#endif /* not GETADDRINFO_H */
239