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