Merge commit 'release-4-0-0alpha1' into v4-0-test
[kai/samba.git] / source / lib / replace / getaddrinfo.h
1 /*
2 PostgreSQL Database Management System
3 (formerly known as Postgres, then as Postgres95)
4
5 Portions Copyright (c) 1996-2005, The PostgreSQL Global Development Group
6
7 Portions Copyright (c) 1994, The Regents of the University of California
8
9 Permission to use, copy, modify, and distribute this software and its
10 documentation for any purpose, without fee, and without a written agreement
11 is hereby granted, provided that the above copyright notice and this paragraph
12 and the following two paragraphs appear in all copies.
13
14 IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR
15 DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING
16 LOST PROFITS, ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION,
17 EVEN IF THE UNIVERSITY OF CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF
18 SUCH DAMAGE.
19
20 THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES,
21 INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
22 AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
23 ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATIONS
24 TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
25
26 */
27
28 /*-------------------------------------------------------------------------
29  *
30  * getaddrinfo.h
31  *        Support getaddrinfo() on platforms that don't have it.
32  *
33  * Note: we use our own routines on platforms that don't HAVE_STRUCT_ADDRINFO,
34  * whether or not the library routine getaddrinfo() can be found.  This
35  * policy is needed because on some platforms a manually installed libbind.a
36  * may provide getaddrinfo(), yet the system headers may not provide the
37  * struct definitions needed to call it.  To avoid conflict with the libbind
38  * definition in such cases, we rename our routines to pg_xxx() via macros.
39  *
40  * This code will also work on platforms where struct addrinfo is defined
41  * in the system headers but no getaddrinfo() can be located.
42  *
43  * Copyright (c) 2003-2007, PostgreSQL Global Development Group
44  *
45  *-------------------------------------------------------------------------
46  */
47 #ifndef GETADDRINFO_H
48 #define GETADDRINFO_H
49
50
51 /* Various macros that ought to be in <netdb.h>, but might not be */
52
53 #ifndef EAI_FAIL
54 #define EAI_BADFLAGS    (-1)
55 #define EAI_NONAME              (-2)
56 #define EAI_AGAIN               (-3)
57 #define EAI_FAIL                (-4)
58 #define EAI_FAMILY              (-6)
59 #define EAI_SOCKTYPE    (-7)
60 #define EAI_SERVICE             (-8)
61 #define EAI_MEMORY              (-10)
62 #define EAI_SYSTEM              (-11)
63 #endif   /* !EAI_FAIL */
64
65 #ifndef AI_PASSIVE
66 #define AI_PASSIVE              0x0001
67 #endif
68
69 #ifndef AI_NUMERICHOST
70 /*
71  * some platforms don't support AI_NUMERICHOST; define as zero if using
72  * the system version of getaddrinfo...
73  */
74 #if defined(HAVE_STRUCT_ADDRINFO) && defined(HAVE_GETADDRINFO)
75 #define AI_NUMERICHOST  0
76 #else
77 #define AI_NUMERICHOST  0x0004
78 #endif
79 #endif
80
81 #ifndef NI_NUMERICHOST
82 #define NI_NUMERICHOST  1
83 #endif
84
85 #ifndef NI_NUMERICSERV
86 #define NI_NUMERICSERV  2
87 #endif
88
89 #ifndef NI_NOFQDN
90 #define NI_NOFQDN       4
91 #endif
92
93 #ifndef NI_NAMEREQD
94 #define NI_NAMEREQD     8
95 #endif
96
97 #ifndef NI_DGRAM
98 #define NI_DGRAM        16
99 #endif
100
101
102 #ifndef NI_MAXHOST
103 #define NI_MAXHOST      1025
104 #endif
105
106 #ifndef NI_MAXSERV
107 #define NI_MAXSERV      32
108 #endif
109
110 #ifndef HAVE_STRUCT_ADDRINFO
111
112 struct addrinfo
113 {
114         int                     ai_flags;
115         int                     ai_family;
116         int                     ai_socktype;
117         int                     ai_protocol;
118         size_t          ai_addrlen;
119         struct sockaddr *ai_addr;
120         char       *ai_canonname;
121         struct addrinfo *ai_next;
122 };
123 #endif   /* HAVE_STRUCT_ADDRINFO */
124
125
126 #ifndef HAVE_GETADDRINFO
127
128 /* Rename private copies per comments above */
129 #ifdef getaddrinfo
130 #undef getaddrinfo
131 #endif
132 #define getaddrinfo pg_getaddrinfo
133
134 #ifdef freeaddrinfo
135 #undef freeaddrinfo
136 #endif
137 #define freeaddrinfo pg_freeaddrinfo
138
139 #ifdef gai_strerror
140 #undef gai_strerror
141 #endif
142 #define gai_strerror pg_gai_strerror
143
144 #ifdef getnameinfo
145 #undef getnameinfo
146 #endif
147 #define getnameinfo pg_getnameinfo
148
149 extern int getaddrinfo(const char *node, const char *service,
150                         const struct addrinfo * hints, struct addrinfo ** res);
151 extern void freeaddrinfo(struct addrinfo * res);
152 extern const char *gai_strerror(int errcode);
153 extern int getnameinfo(const struct sockaddr * sa, socklen_t salen,
154                         char *node, size_t nodelen,
155                         char *service, size_t servicelen, int flags);
156 #endif   /* HAVE_GETADDRINFO */
157
158 #endif   /* GETADDRINFO_H */