6508bf77e9d865d6b1f62640700e53de3090a96d
[debian/amanda] / gnulib / sys_socket.in.h
1 /* Provide a sys/socket header file for systems lacking it (read: MinGW)
2    and for systems where it is incomplete.
3    Copyright (C) 2005-2009 Free Software Foundation, Inc.
4    Written by Simon Josefsson.
5
6    This program is free software; you can redistribute it and/or modify
7    it under the terms of the GNU General Public License as published by
8    the Free Software Foundation; either version 2, or (at your option)
9    any later version.
10
11    This program is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14    GNU General Public License for more details.
15
16    You should have received a copy of the GNU General Public License
17    along with this program; if not, write to the Free Software Foundation,
18    Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
19
20 /* This file is supposed to be used on platforms that lack <sys/socket.h>,
21    on platforms where <sys/socket.h> cannot be included standalone, and on
22    platforms where <sys/socket.h> does not provide all necessary definitions.
23    It is intended to provide definitions and prototypes needed by an
24    application.  */
25
26 #ifndef _GL_SYS_SOCKET_H
27
28 #if @HAVE_SYS_SOCKET_H@
29
30 # if __GNUC__ >= 3
31 @PRAGMA_SYSTEM_HEADER@
32 # endif
33
34 /* On many platforms, <sys/socket.h> assumes prior inclusion of
35    <sys/types.h>.  */
36 # include <sys/types.h>
37
38 /* The include_next requires a split double-inclusion guard.  */
39 # @INCLUDE_NEXT@ @NEXT_SYS_SOCKET_H@
40
41 #endif
42
43 #ifndef _GL_SYS_SOCKET_H
44 #define _GL_SYS_SOCKET_H
45
46 #if @HAVE_SYS_SOCKET_H@
47
48 /* A platform that has <sys/socket.h>.  */
49
50 /* For shutdown().  */
51 # if !defined SHUT_RD
52 #  define SHUT_RD 0
53 # endif
54 # if !defined SHUT_WR
55 #  define SHUT_WR 1
56 # endif
57 # if !defined SHUT_RDWR
58 #  define SHUT_RDWR 2
59 # endif
60
61 #else
62
63 # ifdef __CYGWIN__
64 #  error "Cygwin does have a sys/socket.h, doesn't it?!?"
65 # endif
66
67 /* A platform that lacks <sys/socket.h>.
68
69    Currently only MinGW is supported.  See the gnulib manual regarding
70    Windows sockets.  MinGW has the header files winsock2.h and
71    ws2tcpip.h that declare the sys/socket.h definitions we need.  Note
72    that you can influence which definitions you get by setting the
73    WINVER symbol before including these two files.  For example,
74    getaddrinfo is only available if _WIN32_WINNT >= 0x0501 (that
75    symbol is set indiriectly through WINVER).  You can set this by
76    adding AC_DEFINE(WINVER, 0x0501) to configure.ac.  Note that your
77    code may not run on older Windows releases then.  My Windows 2000
78    box was not able to run the code, for example.  The situation is
79    slightly confusing because:
80    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winsock/winsock/getaddrinfo_2.asp
81    suggests that getaddrinfo should be available on all Windows
82    releases. */
83
84
85 # if @HAVE_WINSOCK2_H@
86 #  include <winsock2.h>
87 # endif
88 # if @HAVE_WS2TCPIP_H@
89 #  include <ws2tcpip.h>
90 # endif
91
92 /* For shutdown(). */
93 # if !defined SHUT_RD && defined SD_RECEIVE
94 #  define SHUT_RD SD_RECEIVE
95 # endif
96 # if !defined SHUT_WR && defined SD_SEND
97 #  define SHUT_WR SD_SEND
98 # endif
99 # if !defined SHUT_RDWR && defined SD_BOTH
100 #  define SHUT_RDWR SD_BOTH
101 # endif
102
103 /* The definition of GL_LINK_WARNING is copied here.  */
104
105 # if @HAVE_WINSOCK2_H@
106 /* Include headers needed by the emulation code.  */
107 #  include <sys/types.h>
108 #  include <io.h>
109
110 typedef int socklen_t;
111
112 # endif
113
114 # ifdef __cplusplus
115 extern "C" {
116 # endif
117
118 # if @HAVE_WINSOCK2_H@
119
120 /* Re-define FD_ISSET to avoid a WSA call while we are not using
121    network sockets.  */
122 static inline int
123 rpl_fd_isset (SOCKET fd, fd_set * set)
124 {
125   u_int i;
126   if (set == NULL)
127     return 0;
128
129   for (i = 0; i < set->fd_count; i++)
130     if (set->fd_array[i] == fd)
131       return 1;
132
133   return 0;
134 }
135
136 #  undef FD_ISSET
137 #  define FD_ISSET(fd, set) rpl_fd_isset(fd, set)
138
139 # endif
140
141 /* Wrap everything else to use libc file descriptors for sockets.  */
142
143 # if @HAVE_WINSOCK2_H@ && !defined _GL_UNISTD_H
144 #  undef close
145 #  define close close_used_without_including_unistd_h
146 # endif
147
148 # if @HAVE_WINSOCK2_H@ && !defined _GL_UNISTD_H
149 #  undef gethostname
150 #  define gethostname gethostname_used_without_including_unistd_h
151 # endif
152
153 # if @GNULIB_SOCKET@
154 #  if @HAVE_WINSOCK2_H@
155 #   undef socket
156 #   define socket               rpl_socket
157 extern int rpl_socket (int, int, int protocol);
158 #  endif
159 # elif @HAVE_WINSOCK2_H@
160 #  undef socket
161 #  define socket socket_used_without_requesting_gnulib_module_socket
162 # elif defined GNULIB_POSIXCHECK
163 #  undef socket
164 #  define socket(d,t,p) \
165      (GL_LINK_WARNING ("socket is not always POSIX compliant - " \
166                        "use gnulib module socket for portability"), \
167       socket (d, t, p))
168 # endif
169
170 # if @GNULIB_CONNECT@
171 #  if @HAVE_WINSOCK2_H@
172 #   undef connect
173 #   define connect              rpl_connect
174 extern int rpl_connect (int, struct sockaddr *, int);
175 #  endif
176 # elif @HAVE_WINSOCK2_H@
177 #  undef connect
178 #  define connect socket_used_without_requesting_gnulib_module_connect
179 # elif defined GNULIB_POSIXCHECK
180 #  undef connect
181 #  define connect(s,a,l) \
182      (GL_LINK_WARNING ("connect is not always POSIX compliant - " \
183                        "use gnulib module connect for portability"), \
184       connect (s, a, l))
185 # endif
186
187 # if @GNULIB_ACCEPT@
188 #  if @HAVE_WINSOCK2_H@
189 #   undef accept
190 #   define accept               rpl_accept
191 extern int rpl_accept (int, struct sockaddr *, int *);
192 #  endif
193 # elif @HAVE_WINSOCK2_H@
194 #  undef accept
195 #  define accept accept_used_without_requesting_gnulib_module_accept
196 # elif defined GNULIB_POSIXCHECK
197 #  undef accept
198 #  define accept(s,a,l) \
199      (GL_LINK_WARNING ("accept is not always POSIX compliant - " \
200                        "use gnulib module accept for portability"), \
201       accept (s, a, l))
202 # endif
203
204 # if @GNULIB_BIND@
205 #  if @HAVE_WINSOCK2_H@
206 #   undef bind
207 #   define bind                 rpl_bind
208 extern int rpl_bind (int, struct sockaddr *, int);
209 #  endif
210 # elif @HAVE_WINSOCK2_H@
211 #  undef bind
212 #  define bind bind_used_without_requesting_gnulib_module_bind
213 # elif defined GNULIB_POSIXCHECK
214 #  undef bind
215 #  define bind(s,a,l) \
216      (GL_LINK_WARNING ("bind is not always POSIX compliant - " \
217                        "use gnulib module bind for portability"), \
218       bind (s, a, l))
219 # endif
220
221 # if @GNULIB_GETPEERNAME@
222 #  if @HAVE_WINSOCK2_H@
223 #   undef getpeername
224 #   define getpeername          rpl_getpeername
225 extern int rpl_getpeername (int, struct sockaddr *, int *);
226 #  endif
227 # elif @HAVE_WINSOCK2_H@
228 #  undef getpeername
229 #  define getpeername getpeername_used_without_requesting_gnulib_module_getpeername
230 # elif defined GNULIB_POSIXCHECK
231 #  undef getpeername
232 #  define getpeername(s,a,l) \
233      (GL_LINK_WARNING ("getpeername is not always POSIX compliant - " \
234                        "use gnulib module getpeername for portability"), \
235       getpeername (s, a, l))
236 # endif
237
238 # if @GNULIB_GETSOCKNAME@
239 #  if @HAVE_WINSOCK2_H@
240 #   undef getsockname
241 #   define getsockname          rpl_getsockname
242 extern int rpl_getsockname (int, struct sockaddr *, int *);
243 #  endif
244 # elif @HAVE_WINSOCK2_H@
245 #  undef getsockname
246 #  define getsockname getsockname_used_without_requesting_gnulib_module_getsockname
247 # elif defined GNULIB_POSIXCHECK
248 #  undef getsockname
249 #  define getsockname(s,a,l) \
250      (GL_LINK_WARNING ("getsockname is not always POSIX compliant - " \
251                        "use gnulib module getsockname for portability"), \
252       getsockname (s, a, l))
253 # endif
254
255 # if @GNULIB_GETSOCKOPT@
256 #  if @HAVE_WINSOCK2_H@
257 #   undef getsockopt
258 #   define getsockopt           rpl_getsockopt
259 extern int rpl_getsockopt (int, int, int, void *, socklen_t *);
260 #  endif
261 # elif @HAVE_WINSOCK2_H@
262 #  undef getsockopt
263 #  define getsockopt getsockopt_used_without_requesting_gnulib_module_getsockopt
264 # elif defined GNULIB_POSIXCHECK
265 #  undef getsockopt
266 #  define getsockopt(s,lvl,o,v,l) \
267      (GL_LINK_WARNING ("getsockopt is not always POSIX compliant - " \
268                        "use gnulib module getsockopt for portability"), \
269       getsockopt (s, lvl, o, v, l))
270 # endif
271
272 # if @GNULIB_LISTEN@
273 #  if @HAVE_WINSOCK2_H@
274 #   undef listen
275 #   define listen               rpl_listen
276 extern int rpl_listen (int, int);
277 #  endif
278 # elif @HAVE_WINSOCK2_H@
279 #  undef listen
280 #  define listen listen_used_without_requesting_gnulib_module_listen
281 # elif defined GNULIB_POSIXCHECK
282 #  undef listen
283 #  define listen(s,b) \
284      (GL_LINK_WARNING ("listen is not always POSIX compliant - " \
285                        "use gnulib module listen for portability"), \
286       listen (s, b))
287 # endif
288
289 # if @GNULIB_RECV@
290 #  if @HAVE_WINSOCK2_H@
291 #   undef recv
292 #   define recv                 rpl_recv
293 extern int rpl_recv (int, void *, int, int);
294 #  endif
295 # elif @HAVE_WINSOCK2_H@
296 #  undef recv
297 #  define recv recv_used_without_requesting_gnulib_module_recv
298 # elif defined GNULIB_POSIXCHECK
299 #  undef recv
300 #  define recv(s,b,n,f) \
301      (GL_LINK_WARNING ("recv is not always POSIX compliant - " \
302                        "use gnulib module recv for portability"), \
303       recv (s, b, n, f))
304 # endif
305
306 # if @GNULIB_SEND@
307 #  if @HAVE_WINSOCK2_H@
308 #   undef send
309 #   define send                 rpl_send
310 extern int rpl_send (int, const void *, int, int);
311 #  endif
312 # elif @HAVE_WINSOCK2_H@
313 #  undef send
314 #  define send send_used_without_requesting_gnulib_module_send
315 # elif defined GNULIB_POSIXCHECK
316 #  undef send
317 #  define send(s,b,n,f) \
318      (GL_LINK_WARNING ("send is not always POSIX compliant - " \
319                        "use gnulib module send for portability"), \
320       send (s, b, n, f))
321 # endif
322
323 # if @GNULIB_RECVFROM@
324 #  if @HAVE_WINSOCK2_H@
325 #   undef recvfrom
326 #   define recvfrom             rpl_recvfrom
327 extern int rpl_recvfrom (int, void *, int, int, struct sockaddr *, int *);
328 #  endif
329 # elif @HAVE_WINSOCK2_H@
330 #  undef recvfrom
331 #  define recvfrom recvfrom_used_without_requesting_gnulib_module_recvfrom
332 # elif defined GNULIB_POSIXCHECK
333 #  undef recvfrom
334 #  define recvfrom(s,b,n,f,a,l) \
335      (GL_LINK_WARNING ("recvfrom is not always POSIX compliant - " \
336                        "use gnulib module recvfrom for portability"), \
337       recvfrom (s, b, n, f, a, l))
338 # endif
339
340 # if @GNULIB_SENDTO@
341 #  if @HAVE_WINSOCK2_H@
342 #   undef sendto
343 #   define sendto               rpl_sendto
344 extern int rpl_sendto (int, const void *, int, int, struct sockaddr *, int);
345 #  endif
346 # elif @HAVE_WINSOCK2_H@
347 #  undef sendto
348 #  define sendto sendto_used_without_requesting_gnulib_module_sendto
349 # elif defined GNULIB_POSIXCHECK
350 #  undef sendto
351 #  define sendto(s,b,n,f,a,l) \
352      (GL_LINK_WARNING ("sendto is not always POSIX compliant - " \
353                        "use gnulib module sendto for portability"), \
354       sendto (s, b, n, f, a, l))
355 # endif
356
357 # if @GNULIB_SETSOCKOPT@
358 #  if @HAVE_WINSOCK2_H@
359 #   undef setsockopt
360 #   define setsockopt           rpl_setsockopt
361 extern int rpl_setsockopt (int, int, int, const void *, socklen_t);
362 #  endif
363 # elif @HAVE_WINSOCK2_H@
364 #  undef setsockopt
365 #  define setsockopt setsockopt_used_without_requesting_gnulib_module_setsockopt
366 # elif defined GNULIB_POSIXCHECK
367 #  undef setsockopt
368 #  define setsockopt(s,lvl,o,v,l) \
369      (GL_LINK_WARNING ("setsockopt is not always POSIX compliant - " \
370                        "use gnulib module setsockopt for portability"), \
371       setsockopt (s, lvl, o, v, l))
372 # endif
373
374 # if @GNULIB_SHUTDOWN@
375 #  if @HAVE_WINSOCK2_H@
376 #   undef shutdown
377 #   define shutdown             rpl_shutdown
378 extern int rpl_shutdown (int, int);
379 #  endif
380 # elif @HAVE_WINSOCK2_H@
381 #  undef shutdown
382 #  define shutdown shutdown_used_without_requesting_gnulib_module_shutdown
383 # elif defined GNULIB_POSIXCHECK
384 #  undef shutdown
385 #  define shutdown(s,h) \
386      (GL_LINK_WARNING ("shutdown is not always POSIX compliant - " \
387                        "use gnulib module shutdown for portability"), \
388       shutdown (s, h))
389 # endif
390
391 # if @HAVE_WINSOCK2_H@
392 #  undef select
393 #  define select                select_used_without_including_sys_select_h
394 # endif
395
396 # ifdef __cplusplus
397 }
398 # endif
399
400 #endif /* HAVE_SYS_SOCKET_H */
401
402 #endif /* _GL_SYS_SOCKET_H */
403 #endif /* _GL_SYS_SOCKET_H */