| 1 | /*------------------------------------------------------------------------- | 
| 2 |  * | 
| 3 |  * getaddrinfo.h | 
| 4 |  *	  Support getaddrinfo() on platforms that don't have it. | 
| 5 |  * | 
| 6 |  * Note: we use our own routines on platforms that don't HAVE_STRUCT_ADDRINFO, | 
| 7 |  * whether or not the library routine getaddrinfo() can be found.  This | 
| 8 |  * policy is needed because on some platforms a manually installed libbind.a | 
| 9 |  * may provide getaddrinfo(), yet the system headers may not provide the | 
| 10 |  * struct definitions needed to call it.  To avoid conflict with the libbind | 
| 11 |  * definition in such cases, we rename our routines to pg_xxx() via macros. | 
| 12 |  * | 
| 13 |  * This code will also work on platforms where struct addrinfo is defined | 
| 14 |  * in the system headers but no getaddrinfo() can be located. | 
| 15 |  * | 
| 16 |  * Copyright (c) 2003-2019, PostgreSQL Global Development Group | 
| 17 |  * | 
| 18 |  * src/include/getaddrinfo.h | 
| 19 |  * | 
| 20 |  *------------------------------------------------------------------------- | 
| 21 |  */ | 
| 22 | #ifndef GETADDRINFO_H | 
| 23 | #define GETADDRINFO_H | 
| 24 |  | 
| 25 | #include <sys/socket.h> | 
| 26 | #include <netdb.h> | 
| 27 |  | 
| 28 |  | 
| 29 | /* Various macros that ought to be in <netdb.h>, but might not be */ | 
| 30 |  | 
| 31 | #ifndef EAI_FAIL | 
| 32 | #ifndef WIN32 | 
| 33 | #define EAI_BADFLAGS	(-1) | 
| 34 | #define EAI_NONAME		(-2) | 
| 35 | #define EAI_AGAIN		(-3) | 
| 36 | #define EAI_FAIL		(-4) | 
| 37 | #define EAI_FAMILY		(-6) | 
| 38 | #define EAI_SOCKTYPE	(-7) | 
| 39 | #define EAI_SERVICE		(-8) | 
| 40 | #define EAI_MEMORY		(-10) | 
| 41 | #define EAI_SYSTEM		(-11) | 
| 42 | #else							/* WIN32 */ | 
| 43 | #ifdef _MSC_VER | 
| 44 | #ifndef WSA_NOT_ENOUGH_MEMORY | 
| 45 | #define WSA_NOT_ENOUGH_MEMORY	(WSAENOBUFS) | 
| 46 | #endif | 
| 47 | #define WSATYPE_NOT_FOUND		(WSABASEERR+109) | 
| 48 | #endif | 
| 49 | #define EAI_AGAIN		WSATRY_AGAIN | 
| 50 | #define EAI_BADFLAGS	WSAEINVAL | 
| 51 | #define EAI_FAIL		WSANO_RECOVERY | 
| 52 | #define EAI_FAMILY		WSAEAFNOSUPPORT | 
| 53 | #define EAI_MEMORY		WSA_NOT_ENOUGH_MEMORY | 
| 54 | #define EAI_NODATA		WSANO_DATA | 
| 55 | #define EAI_NONAME		WSAHOST_NOT_FOUND | 
| 56 | #define EAI_SERVICE		WSATYPE_NOT_FOUND | 
| 57 | #define EAI_SOCKTYPE	WSAESOCKTNOSUPPORT | 
| 58 | #endif							/* !WIN32 */ | 
| 59 | #endif							/* !EAI_FAIL */ | 
| 60 |  | 
| 61 | #ifndef AI_PASSIVE | 
| 62 | #define AI_PASSIVE		0x0001 | 
| 63 | #endif | 
| 64 |  | 
| 65 | #ifndef AI_NUMERICHOST | 
| 66 | /* | 
| 67 |  * some platforms don't support AI_NUMERICHOST; define as zero if using | 
| 68 |  * the system version of getaddrinfo... | 
| 69 |  */ | 
| 70 | #if defined(HAVE_STRUCT_ADDRINFO) && defined(HAVE_GETADDRINFO) | 
| 71 | #define AI_NUMERICHOST	0 | 
| 72 | #else | 
| 73 | #define AI_NUMERICHOST	0x0004 | 
| 74 | #endif | 
| 75 | #endif | 
| 76 |  | 
| 77 | #ifndef NI_NUMERICHOST | 
| 78 | #define NI_NUMERICHOST	1 | 
| 79 | #endif | 
| 80 | #ifndef NI_NUMERICSERV | 
| 81 | #define NI_NUMERICSERV	2 | 
| 82 | #endif | 
| 83 | #ifndef NI_NAMEREQD | 
| 84 | #define NI_NAMEREQD		4 | 
| 85 | #endif | 
| 86 |  | 
| 87 | #ifndef NI_MAXHOST | 
| 88 | #define NI_MAXHOST	1025 | 
| 89 | #endif | 
| 90 | #ifndef NI_MAXSERV | 
| 91 | #define NI_MAXSERV	32 | 
| 92 | #endif | 
| 93 |  | 
| 94 |  | 
| 95 | #ifndef HAVE_STRUCT_ADDRINFO | 
| 96 |  | 
| 97 | #ifndef WIN32 | 
| 98 | struct addrinfo | 
| 99 | { | 
| 100 | 	int			ai_flags; | 
| 101 | 	int			ai_family; | 
| 102 | 	int			ai_socktype; | 
| 103 | 	int			ai_protocol; | 
| 104 | 	size_t		ai_addrlen; | 
| 105 | 	struct sockaddr *ai_addr; | 
| 106 | 	char	   *ai_canonname; | 
| 107 | 	struct addrinfo *ai_next; | 
| 108 | }; | 
| 109 | #else | 
| 110 | /* | 
| 111 |  *	The order of the structure elements on Win32 doesn't match the | 
| 112 |  *	order specified in the standard, but we have to match it for | 
| 113 |  *	IPv6 to work. | 
| 114 |  */ | 
| 115 | struct addrinfo | 
| 116 | { | 
| 117 | 	int			ai_flags; | 
| 118 | 	int			ai_family; | 
| 119 | 	int			ai_socktype; | 
| 120 | 	int			ai_protocol; | 
| 121 | 	size_t		ai_addrlen; | 
| 122 | 	char	   *ai_canonname; | 
| 123 | 	struct sockaddr *ai_addr; | 
| 124 | 	struct addrinfo *ai_next; | 
| 125 | }; | 
| 126 | #endif | 
| 127 | #endif							/* HAVE_STRUCT_ADDRINFO */ | 
| 128 |  | 
| 129 |  | 
| 130 | #ifndef HAVE_GETADDRINFO | 
| 131 |  | 
| 132 | /* Rename private copies per comments above */ | 
| 133 | #ifdef getaddrinfo | 
| 134 | #undef getaddrinfo | 
| 135 | #endif | 
| 136 | #define getaddrinfo pg_getaddrinfo | 
| 137 |  | 
| 138 | #ifdef freeaddrinfo | 
| 139 | #undef freeaddrinfo | 
| 140 | #endif | 
| 141 | #define freeaddrinfo pg_freeaddrinfo | 
| 142 |  | 
| 143 | #ifdef gai_strerror | 
| 144 | #undef gai_strerror | 
| 145 | #endif | 
| 146 | #define gai_strerror pg_gai_strerror | 
| 147 |  | 
| 148 | #ifdef getnameinfo | 
| 149 | #undef getnameinfo | 
| 150 | #endif | 
| 151 | #define getnameinfo pg_getnameinfo | 
| 152 |  | 
| 153 | extern int	getaddrinfo(const char *node, const char *service, | 
| 154 | 						const struct addrinfo *hints, struct addrinfo **res); | 
| 155 | extern void freeaddrinfo(struct addrinfo *res); | 
| 156 | extern const char *gai_strerror(int errcode); | 
| 157 | extern int	getnameinfo(const struct sockaddr *sa, int salen, | 
| 158 | 						char *node, int nodelen, | 
| 159 | 						char *service, int servicelen, int flags); | 
| 160 | #endif							/* HAVE_GETADDRINFO */ | 
| 161 |  | 
| 162 | #endif							/* GETADDRINFO_H */ | 
| 163 |  |