/*
 * Convenience header for <netdb.h> getaddrinfo() & co modern resolution
 * functions.
 * $Id: getaddrinfo.h,v 1.4 2005/06/16 20:08:53 rdenisc Exp $
 *
 * Feel free to reuse in other GPL programs.
 */

/***********************************************************************
 *  Copyright (C) 2002-2004 Remi Denis-Courmont.                       *
 *  This program is free software; you can redistribute and/or modify  *
 *  it under the terms of the GNU General Public License as published  *
 *  by the Free Software Foundation; version 2 of the license.         *
 *                                                                     *
 *  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, you can get it from:              *
 *  http://www.gnu.org/copyleft/gpl.html                               *
 ***********************************************************************/

#ifndef __TCPREEN_GETADDRINFO_H
# define __TCPREEN_GETADDRINFO_H

# include <stddef.h>
# include <sys/types.h>
# ifdef HAVE_SYS_SOCKET_H
#  include <sys/socket.h>
# endif
# ifdef HAVE_NETDB_H
#  include <netdb.h>
# endif

# ifdef WIN32
#  ifdef HAVE_GETADDRINFO
#   define __KLUDGE_STRUCT_ADDRINFO
#   undef HAVE_GETADDRINFO
#  endif
#  undef HAVE_GETNAMEINFO
# endif

# if !(defined(HAVE_GAI_STRERROR)  && defined(HAVE_GETNAMEINFO) \
	&& defined(HAVE_GETADDRINFO))

/* GAI error codes */
#  ifndef EAI_BADFLAGS
#   define EAI_BADFLAGS -1
#  endif
#  ifndef EAI_NONAME
#   define EAI_NONAME -2
#  endif
#  ifndef EAI_AGAIN
#   define EAI_AGAIN -3
#  endif
#  ifndef EAI_FAIL
#   define EAI_FAIL -4
#  endif
#  ifndef EAI_NODATA
#   define EAI_NODATA -5
#  endif
#  ifndef EAI_FAMILY
#   define EAI_FAMILY -6
#  endif
#  ifndef EAI_SOCKTYPE
#   define EAI_SOCKTYPE -7
#  endif
#  ifndef EAI_SERVICE
#   define EAI_SERVICE -8
#  endif
#  ifndef EAI_ADDRFAMILY
#   define EAI_ADDRFAMILY -9
#  endif
#  ifndef EAI_MEMORY
#   define EAI_MEMORY -10
#  endif
#  ifndef EAI_SYSTEM
#   define EAI_SYSTEM -11
#  endif


#  if !HAVE_GETNAMEINFO
/*
 * Replacement for getnameinfo().
 */
#   ifndef NI_MAXHOST
#    define NI_MAXHOST	1025
#    define NI_MAXSERV	32
#   endif

#   ifndef NI_NUMERICHOST
#    define NI_NUMERICHOST	0x01
#    define NI_NUMERICSERV	0x02
#    define NI_NOFQDN		0x04
#    define NI_NAMEREQD		0x08
#    define NI_DGRAM		0x10
#   endif
#   define _NI_MASK		(NI_NUMERICHOST|NI_NUMERICSERV|NI_NOFQDN|\
				NI_NAMEREQD|NI_DGRAM)

#   ifdef __cplusplus
extern "C"
#   endif
int getnameinfo(const struct sockaddr *sa, int salen,
	char *host, int hostlen, char *serv, int servlen, int flags);
#  endif /* if !HAVE_GETNAMEINFO */


#  if !HAVE_GAI_STRERROR
/*
 * Replacement for gai_strerror().
 */
#   ifdef __cplusplus
extern "C"
#   endif
const char *gai_strerror(int errnum);
#  endif /* if !HAVE_GAI_STRERROR */


#  if !HAVE_GETADDRINFO
/*
 * Replacement for getaddrinfo() and freeaddrinfo().
 */
#   ifndef __KLUDGE_STRUCT_ADDRINFO
struct 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 addrinfo *ai_next;
};
#    define AI_PASSIVE		1
#    define AI_CANONNAME		2
#    define AI_NUMERICHOST	4
#   endif
#   define _AI_MASK		7

#   ifdef __cplusplus
extern "C" {
#   endif
void freeaddrinfo(struct addrinfo *res);
int getaddrinfo(const char *node, const char *serv,
		const struct addrinfo *hints, struct addrinfo **res);
#   ifdef __cplusplus
}
#   endif
#  endif /* if !HAVE_GETADDRINFO */
# endif

/*** libidn support ***/
# ifndef AI_IDN
#  define AI_IDN	0
#  define AI_CANONIDN	0
# endif

#endif /* ifndef __RDC_GETADDRINFO_H */



syntax highlighted by Code2HTML, v. 0.9.1