1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
|
/****************************************************************************
* *
* GNAT COMPILER COMPONENTS *
* *
* G S O C K E T *
* *
* C Header File *
* *
* Copyright (C) 2004-2021, Free Software Foundation, Inc. *
* *
* GNAT is free software; you can redistribute it and/or modify it under *
* terms of the GNU General Public License as published by the Free Soft- *
* ware Foundation; either version 3, or (at your option) any later ver- *
* sion. GNAT is distributed in the hope that it will be useful, but WITH- *
* OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY *
* or FITNESS FOR A PARTICULAR PURPOSE. *
* *
* As a special exception under Section 7 of GPL version 3, you are granted *
* additional permissions described in the GCC Runtime Library Exception, *
* version 3.1, as published by the Free Software Foundation. *
* *
* You should have received a copy of the GNU General Public License and *
* a copy of the GCC Runtime Library Exception along with this program; *
* see the files COPYING3 and COPYING.RUNTIME respectively. If not, see *
* <http://www.gnu.org/licenses/>. *
* *
* GNAT was originally developed by the GNAT team at New York University. *
* Extensive contributions were provided by Ada Core Technologies Inc. *
* *
****************************************************************************/
#if defined(VTHREADS) || defined(__PikeOS__) || defined(__DJGPP__)
/* Sockets not supported on these platforms. */
#undef HAVE_SOCKETS
#else
#define HAVE_SOCKETS
#ifndef _XOPEN_SOURCE_EXTENDED
#define _XOPEN_SOURCE_EXTENDED 1
/* For HP-UX */
#endif
#ifndef BSD_COMP
#define BSD_COMP 1
/* For Solaris */
#endif
#ifndef _ALL_SOURCE
#define _ALL_SOURCE 1
/* For AIX */
#endif
/** No system header may be included prior to this point since on some targets
** we need to redefine FD_SETSIZE.
**/
/* Target-specific includes and definitions */
#if defined(__vxworks)
#include <vxWorks.h>
#include <ioLib.h>
#include <hostLib.h>
#define SHUT_RD 0
#define SHUT_WR 1
#define SHUT_RDWR 2
#ifndef IPV6_ADD_MEMBERSHIP
#define IPV6_ADD_MEMBERSHIP IPV6_JOIN_GROUP
#endif
#ifndef IPV6_DROP_MEMBERSHIP
#define IPV6_DROP_MEMBERSHIP IPV6_LEAVE_GROUP
#endif
#elif defined (WINNT)
#define FD_SETSIZE 1024
#ifdef __MINGW32__
/* winsock2.h allows WSAPoll related definitions only when
* _WIN32_WINNT >= 0x0600 */
#if !defined(_WIN32_WINNT) || _WIN32_WINNT < 0x0600
#define _WIN32_WINNT 0x0600
#endif
#include <winsock2.h>
#include <ws2tcpip.h>
#include <versionhelpers.h>
#undef EACCES
#define EACCES WSAEACCES
#undef EADDRINUSE
#define EADDRINUSE WSAEADDRINUSE
#undef EADDRNOTAVAIL
#define EADDRNOTAVAIL WSAEADDRNOTAVAIL
#undef EAFNOSUPPORT
#define EAFNOSUPPORT WSAEAFNOSUPPORT
#undef EALREADY
#define EALREADY WSAEALREADY
#undef EBADF
#define EBADF WSAEBADF
#undef ECONNABORTED
#define ECONNABORTED WSAECONNABORTED
#undef ECONNREFUSED
#define ECONNREFUSED WSAECONNREFUSED
#undef ECONNRESET
#define ECONNRESET WSAECONNRESET
#undef EDESTADDRREQ
#define EDESTADDRREQ WSAEDESTADDRREQ
#undef EFAULT
#define EFAULT WSAEFAULT
#undef EHOSTDOWN
#define EHOSTDOWN WSAEHOSTDOWN
#undef EHOSTUNREACH
#define EHOSTUNREACH WSAEHOSTUNREACH
#undef EINPROGRESS
#define EINPROGRESS WSAEINPROGRESS
#undef EINTR
#define EINTR WSAEINTR
#undef EINVAL
#define EINVAL WSAEINVAL
#undef EIO
#define EIO WSAEDISCON
#undef EISCONN
#define EISCONN WSAEISCONN
#undef ELOOP
#define ELOOP WSAELOOP
#undef EMFILE
#define EMFILE WSAEMFILE
#undef EMSGSIZE
#define EMSGSIZE WSAEMSGSIZE
#undef ENAMETOOLONG
#define ENAMETOOLONG WSAENAMETOOLONG
#undef ENETDOWN
#define ENETDOWN WSAENETDOWN
#undef ENETRESET
#define ENETRESET WSAENETRESET
#undef ENETUNREACH
#define ENETUNREACH WSAENETUNREACH
#undef ENOBUFS
#define ENOBUFS WSAENOBUFS
#undef ENOPROTOOPT
#define ENOPROTOOPT WSAENOPROTOOPT
#undef ENOTCONN
#define ENOTCONN WSAENOTCONN
#undef ENOTSOCK
#define ENOTSOCK WSAENOTSOCK
#undef EOPNOTSUPP
#define EOPNOTSUPP WSAEOPNOTSUPP
#undef EPFNOSUPPORT
#define EPFNOSUPPORT WSAEPFNOSUPPORT
#undef EPROTONOSUPPORT
#define EPROTONOSUPPORT WSAEPROTONOSUPPORT
#undef EPROTOTYPE
#define EPROTOTYPE WSAEPROTOTYPE
#undef ESHUTDOWN
#define ESHUTDOWN WSAESHUTDOWN
#undef ESOCKTNOSUPPORT
#define ESOCKTNOSUPPORT WSAESOCKTNOSUPPORT
#undef ETIMEDOUT
#define ETIMEDOUT WSAETIMEDOUT
#undef ETOOMANYREFS
#define ETOOMANYREFS WSAETOOMANYREFS
#undef EWOULDBLOCK
#define EWOULDBLOCK WSAEWOULDBLOCK
#define SHUT_RD SD_RECEIVE
#define SHUT_WR SD_SEND
#define SHUT_RDWR SD_BOTH
#endif
#include <windows.h>
#elif defined(VMS)
/* Allow a large number of fds for select. */
#define FD_SETSIZE 4096
#ifndef IN_RTS
/* These DEC C headers are not available when building with GCC. Order is
important. */
#include <time.h>
#include <tcp.h>
#include <in.h>
#include <ioctl.h>
#include <netdb.h>
#endif
#endif
#include <limits.h>
#include <errno.h>
#include <stddef.h>
#if defined (__vxworks) && ! defined (__RTP__)
#include <sys/times.h>
#else
#include <sys/time.h>
#endif
#if defined(__rtems__)
#include <unistd.h>
/* Required, for read(), write(), and close() */
#endif
/*
* RTEMS has these .h files but not until you have built and installed RTEMS.
* When building a C/C++ toolset, you also build the newlib C library, so the
* build procedure for an RTEMS GNAT toolset requires that you build a C/C++
* toolset, then build and install RTEMS with --enable-multilib, and finally
* build the Ada part of the toolset.
*/
#if !(defined (VMS) || defined (__MINGW32__))
#include <sys/socket.h>
#include <sys/un.h>
#include <netinet/in.h>
#include <netinet/tcp.h>
#include <sys/ioctl.h>
#include <netdb.h>
#include <unistd.h>
#endif
#ifdef __ANDROID__
#include <unistd.h>
#include <sys/select.h>
#endif
#if defined (_AIX) || defined (__FreeBSD__) || defined (__hpux__) || \
defined (_WIN32) || defined (__APPLE__) || defined (__ANDROID__) || \
defined (__DragonFly__) || defined (__NetBSD__) || defined (__OpenBSD__)
# define HAVE_THREAD_SAFE_GETxxxBYyyy 1
#elif defined (__linux__) || defined (__GLIBC__) || \
(defined (__sun__) && !defined (__vxworks)) || \
defined (__rtems__)
# define HAVE_GETxxxBYyyy_R 1
#endif
/*
* Properties of the unerlying NetDB library:
* Need_Netdb_Buffer __gnat_getXXXbyYYY expects a caller-supplied buffer
* Need_Netdb_Lock __gnat_getXXXbyYYY expects the caller to ensure
* mutual exclusion
*
* See "Handling of gethostbyname, gethostbyaddr, getservbyname and
* getservbyport" in socket.c for details.
*/
#if defined (HAVE_GETxxxBYyyy_R)
# define Need_Netdb_Buffer 1
# define Need_Netdb_Lock 0
#else
# define Need_Netdb_Buffer 0
# if !defined (HAVE_THREAD_SAFE_GETxxxBYyyy)
# define Need_Netdb_Lock 1
# else
# define Need_Netdb_Lock 0
# endif
#endif
# define Has_Sockaddr_Len (offsetof(struct sockaddr_in, sin_family) != 0)
#if !(defined (_WIN32) || defined (__hpux__) || defined (VMS))
# define HAVE_INET_PTON
# define HAVE_INET_NTOP
#endif
#endif /* defined(VTHREADS) */
|