1 2 /* 3 * Copyright (c) 2003-2008, PostgreSQL Global Development Group 4 * $PostgreSQL: pgsql/src/include/getaddrinfo.h 5 */ 6 7 #if defined(__CYGWIN__) || (defined(HAVE_CONFIG_H) && !defined(HAVE_GETADDRINFO)) 8 9 #ifndef GETADDRINFO_H 10 #define GETADDRINFO_H 11 12 #include <sys/socket.h> 13 #define _XOPEN_SOURCE_EXTENDED 1 14 #include <netdb.h> 15 16 17 /* Various macros that ought to be in <netdb.h>, but might not be */ 18 19 #ifndef EAI_FAIL 20 #define EAI_BADFLAGS (-1) 21 #define EAI_NONAME (-2) 22 #define EAI_AGAIN (-3) 23 #define EAI_FAIL (-4) 24 #define EAI_FAMILY (-6) 25 #define EAI_SOCKTYPE (-7) 26 #define EAI_SERVICE (-8) 27 #define EAI_MEMORY (-10) 28 #define EAI_SYSTEM (-11) 29 #endif /* !EAI_FAIL */ 30 31 #ifndef AI_PASSIVE 32 #define AI_PASSIVE 0x0001 33 #endif 34 35 #ifndef AI_NUMERICHOST 36 /* 37 * some platforms don't support AI_NUMERICHOST; define as zero if using 38 * the system version of getaddrinfo... 39 */ 40 #if defined(HAVE_STRUCT_ADDRINFO) && defined(HAVE_GETADDRINFO) 41 #define AI_NUMERICHOST 0 42 #else 43 #define AI_NUMERICHOST 0x0004 44 #endif 45 #endif 46 47 #ifndef NI_NUMERICHOST 48 #define NI_NUMERICHOST 1 49 #endif 50 #ifndef NI_NUMERICSERV 51 #define NI_NUMERICSERV 2 52 #endif 53 54 #ifndef NI_MAXHOST 55 #define NI_MAXHOST 1025 56 #endif 57 #ifndef NI_MAXSERV 58 #define NI_MAXSERV 32 59 #endif 60 61 #ifdef HAVE_STRUCT_SOCKADDR_STORAGE 62 63 #ifndef HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY 64 #ifdef HAVE_STRUCT_SOCKADDR_STORAGE___SS_FAMILY 65 #define ss_family __ss_family 66 #else 67 #error struct sockaddr_storage does not provide an ss_family member 68 #endif 69 #endif 70 71 #ifdef HAVE_STRUCT_SOCKADDR_STORAGE___SS_LEN 72 #define ss_len __ss_len 73 #define HAVE_STRUCT_SOCKADDR_STORAGE_SS_LEN 1 74 #endif 75 #else /* !HAVE_STRUCT_SOCKADDR_STORAGE */ 76 77 /* Define a struct sockaddr_storage if we don't have one. */ 78 79 #ifndef __CYGWIN__ 80 struct sockaddr_storage 81 { 82 union 83 { 84 struct sockaddr sa; /* get the system-dependent fields */ 85 long long int ss_align; /* ensures struct is properly aligned */ 86 char ss_pad[128]; /* ensures struct has desired size */ 87 } ss_stuff; 88 }; 89 #endif 90 91 #define ss_family ss_stuff.sa.sa_family 92 /* It should have an ss_len field if sockaddr has sa_len. */ 93 #ifdef HAVE_STRUCT_SOCKADDR_SA_LEN 94 #define ss_len ss_stuff.sa.sa_len 95 #define HAVE_STRUCT_SOCKADDR_STORAGE_SS_LEN 1 96 #endif 97 #endif /* HAVE_STRUCT_SOCKADDR_STORAGE */ 98 99 #ifndef HAVE_STRUCT_ADDRINFO 100 101 struct addrinfo 102 { 103 int ai_flags; 104 int ai_family; 105 int ai_socktype; 106 int ai_protocol; 107 size_t ai_addrlen; 108 struct sockaddr *ai_addr; 109 char *ai_canonname; 110 struct addrinfo *ai_next; 111 }; 112 113 #endif /* HAVE_STRUCT_ADDRINFO */ 114 115 116 117 /* Rename private copies per comments above */ 118 #ifdef getaddrinfo 119 #undef getaddrinfo 120 #endif 121 122 #ifdef freeaddrinfo 123 #undef freeaddrinfo 124 #endif 125 126 #ifdef gai_strerror 127 #undef gai_strerror 128 #endif 129 130 #ifdef getnameinfo 131 #undef getnameinfo 132 #endif 133 134 extern int getaddrinfo(const char *node, const char *service, 135 const struct addrinfo * hints, struct addrinfo ** res); 136 extern void freeaddrinfo(struct addrinfo * res); 137 extern const char *gai_strerror(int errcode); 138 extern int getnameinfo(const struct sockaddr * sa, int salen, 139 char *node, int nodelen, 140 char *service, int servicelen, int flags); 141 142 #endif /* GETADDRINFO_H */ 143 144 #endif /* HAVE_GETADDRINFO */ |