/* Copyright (C) 2008 Andreas Baumann This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #ifndef WOLF_NETDB_H #define WOLF_NETDB_H /** * @addtogroup wolf_port Porting * @{ */ /** * @file netdb.h * @brief POSIX getaddrinfo and getnameinfo * @author Andreas Baumann */ /* * Based on ideas found in: * - Postgres src/port/getaddrinfo.c * Copyright (c) 2003-2008, PostgreSQL Global Development Group * - Unix Stevens Network Programming * libgai implementation in unpv12e */ #include "port/sys.h" #ifdef FREEBSD /* not sure about that */ #define __BSD_VISIBLE 0 #include /* for AF_UNSPEC */ #include /* for IPPROTO_TCP */ #endif #ifdef SUNOS #if OS_MAJOR_VERSION == 5 #if OS_MINOR_VERSION >= 8 && OS_MINOR_VERSION <= 10 #include #include #include #endif #endif #endif #ifdef NETBSD #include /* for AF_UNDEF */ #include /* for IPPROTO_TCP */ #endif #ifdef OPENBSD #include #include #include /* for IPPROTO_TCP */ #endif /* for all modern Unix systems */ #ifndef _WIN32 #include /* for getaddrinfo, freeadrinfo, struct getaddrinfo */ #endif /* exists on Windows in slightly different form */ #ifdef _WIN32 #define WIN32_MEAN_AND_LEAN #include /* all kind of prerequisites */ #include /* for getaddrinfo */ #endif #ifndef NI_MAXHOST #define NI_MAXHOST 1025 #endif #ifndef NI_MAXSERV #define NI_MAXSERV 32 #endif #if !defined HAVE_GETADDRINFO || defined TEST_GETADDRINFO #include /* for size_t */ #include /* for AF_UNSPEC */ #include /* for TCPPROTO and others */ /* for errors returned by getaddrinfo */ #if !defined EAI_NONAME #define EAI_NONAME -2 /**< NAME or SERVICE is unknown */ #define EAI_AGAIN -3 /**< temporary failure in name resolution */ #define EAI_FAIL -4 /**< non-recoverable failure in name resultion */ #define EAI_FAMILY -6 /**< socket family not supported */ #define EAI_MEMORY -10 /**< memory allocation failure */ #endif /* for ai_flags */ #if !defined AI_PASSIVE #define AI_PASSIVE 1 /**< socket is intended for bind() + listen() */ #define AI_CANONNAME 2 /**< return canonical name */ #define AI_NUMERICHOST 4 /**< don't use name resolution */ #endif /* for flags in getnameinfo */ #if !defined NI_NUMERICHOST #define NI_NUMERICHOST 1 /**< don't try to look up hostname. */ #define NI_NUMERICSERV 2 /**< don't convert port number to name. */ #endif struct wolf_port_addrinfo { int ai_flags; int ai_family; int ai_socktype; int ai_protocol; size_t ai_addrlen; struct sockaddr *ai_addr; char *ai_canonname; struct wolf_port_addrinfo *ai_next; }; int wolf_port_getaddrinfo( const char *host_name, const char *service_name, const struct wolf_port_addrinfo *hints, struct wolf_port_addrinfo **result ); void wolf_port_freeaddrinfo( struct wolf_port_addrinfo *result ); int wolf_port_getnameinfo( const struct sockaddr *sa, socklen_t salen, char *host, size_t hostlen, char *serv, size_t servlen, int flags ); const char *wolf_port_gai_strerror( int errcode ); #if !defined HAVE_GETADDRINFO #define addrinfo wolf_port_addrinfo #define getaddrinfo( host_name, service_name, hints, result ) wolf_port_getaddrinfo( host_name, service_name, hints, result ) #define freeaddrinfo( result ) wolf_port_freeaddrinfo( result ) #define getnameinfo( sa, salen, host, hostlen, serv, servlen, flags ) wolf_port_getnameinfo( sa, salen, host, hostlen, serv, servlen, flags ) #define gai_strerror( errcode ) wolf_port_gai_strerror( errcode ) #endif #endif /* !defined HAVE_GETADDRINFO || defined TEST_GETADDRINFO */ /* gai_strerror is not thread-safe. Some platforms (like AIX 6.1) started to * introduce a thread-safe version gai_strerror_r */ #if !defined HAVE_GAI_STRERROR_R || defined TEST_GAI_STRERROR_R int wolf_port_gai_strerror_r( int errcode, char *buf, size_t buflen ); #if !defined HAVE_GAI_STRERROR_R #define gai_strerror_r( errcode, buf, buflen ) wolf_port_gai_strerror_r( errcode, buf, buflen ) #endif /* !defined HAVE_GAI_STRERROR_R */ #endif /* !defined HAVE_GAI_STRERROR_R || defined TEST_GAI_STRERROR_R */ /** @} */ /* @addtogroup wolf_port */ #endif /* ifndef WOLF_NETDB_H */