This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
3b92b13d54696685a6824fd9f3ad449d886aaca0
[perl5.git] / win32 / include / sys / socket.h
1 /* sys/socket.h */
2
3 /* djl */
4 /* Provide UNIX compatibility */
5
6 #ifndef  _INC_SYS_SOCKET
7 #define  _INC_SYS_SOCKET
8
9 #define WIN32_LEAN_AND_MEAN
10 #ifdef __GNUC__
11 #  define Win32_Winsock
12 #endif
13 #include <windows.h>
14
15 /* Too late to include winsock2.h if winsock.h has already been loaded */
16 #ifndef _WINSOCKAPI_
17 #  if defined(UNDER_CE) && UNDER_CE <= 300
18      /* winsock2 only for 4.00+ */
19 #    include <winsock.h>
20 #  else
21 #    include <winsock2.h>
22      /* We need to include ws2tcpip.h to get the IPv6 definitions.
23       * It will in turn include wspiapi.h.  Later versions of that
24       * header in the Windows SDK generate C++ template code that
25       * can't be compiled with VC6 anymore.  The _WSPIAPI_COUNTOF
26       * definition below prevents wspiapi.h from generating this
27       * incompatible code.
28       */
29 #    define _WSPIAPI_COUNTOF(_Array) (sizeof(_Array) / sizeof(_Array[0]))
30 #    include <ws2tcpip.h>
31
32 #    ifndef SIO_GET_INTERFACE_LIST_EX
33        /* The ws2tcpip.h header included in VC6 doesn't define the
34         * sin6_scope_id member of sockaddr_in6.  We define our own
35         * version and redefine sockaddr_in6 to point to this one
36         * instead for compiling e.g. Socket.xs.
37         */
38        struct my_sockaddr_in6 {
39            short   sin6_family;        /* AF_INET6 */
40            u_short sin6_port;          /* Transport level port number */
41            u_long  sin6_flowinfo;      /* IPv6 flow information */
42            struct in_addr6 sin6_addr;  /* IPv6 address */
43            u_long sin6_scope_id;       /* set of interfaces for a scope */
44        };
45 #      define sockaddr_in6 my_sockaddr_in6
46
47        /* Provide implementations of IN6ADDR_SETANY() and IN6ADDR_SETLOOPBACK
48         * that also initialize the sin6_scope_id field.
49         */
50 #      undef IN6ADDR_SETANY
51 #      define IN6ADDR_SETANY(x) {\
52 (x)->sin6_family = AF_INET6; \
53 (x)->sin6_port = 0; \
54 (x)->sin6_flowinfo = 0; \
55 *((u_long *)((x)->sin6_addr.s6_addr)    ) = 0; \
56 *((u_long *)((x)->sin6_addr.s6_addr) + 1) = 0; \
57 *((u_long *)((x)->sin6_addr.s6_addr) + 2) = 0; \
58 *((u_long *)((x)->sin6_addr.s6_addr) + 3) = 0; \
59 (x)->sin6_scope_id = 0; \
60 }
61
62 #      undef IN6ADDR_SETLOOPBACK
63 #      define IN6ADDR_SETLOOPBACK(x) {\
64 (x)->sin6_family = AF_INET6; \
65 (x)->sin6_port = 0; \
66 (x)->sin6_flowinfo = 0; \
67 *((u_long *)((x)->sin6_addr.s6_addr)    ) = 0; \
68 *((u_long *)((x)->sin6_addr.s6_addr) + 1) = 0; \
69 *((u_long *)((x)->sin6_addr.s6_addr) + 2) = 0; \
70 *((u_long *)((x)->sin6_addr.s6_addr) + 3) = 1; \
71 (x)->sin6_scope_id = 0; \
72 }
73
74 #    endif
75
76 #  endif
77 #endif
78
79 #include "win32.h"
80
81 #ifdef __cplusplus
82 extern "C" {
83 #endif
84
85 #undef ENOTSOCK
86 #define ENOTSOCK       WSAENOTSOCK
87
88 #undef ECONNABORTED
89 #define ECONNABORTED WSAECONNABORTED
90
91 #undef ECONNRESET
92 #define ECONNRESET WSAECONNRESET
93
94 #undef EAFNOSUPPORT
95 #define EAFNOSUPPORT WSAEAFNOSUPPORT
96
97 #ifdef USE_SOCKETS_AS_HANDLES
98
99 #ifndef PERL_FD_SETSIZE
100 #define PERL_FD_SETSIZE         64
101 #endif
102
103 #define PERL_BITS_PER_BYTE      8
104 #define PERL_NFDBITS            (sizeof(Perl_fd_mask)*PERL_BITS_PER_BYTE)
105
106 typedef int                     Perl_fd_mask;
107
108 typedef struct  Perl_fd_set {
109     Perl_fd_mask bits[(PERL_FD_SETSIZE+PERL_NFDBITS-1)/PERL_NFDBITS];
110 }                               Perl_fd_set;
111
112 #define PERL_FD_CLR(n,p) \
113     ((p)->bits[(n)/PERL_NFDBITS] &= ~((unsigned)1 << ((n)%PERL_NFDBITS)))
114
115 #define PERL_FD_SET(n,p) \
116     ((p)->bits[(n)/PERL_NFDBITS] |=  ((unsigned)1 << ((n)%PERL_NFDBITS)))
117
118 #define PERL_FD_ZERO(p) memset((char *)(p),0,sizeof(*(p)))
119
120 #define PERL_FD_ISSET(n,p) \
121     ((p)->bits[(n)/PERL_NFDBITS] &   ((unsigned)1 << ((n)%PERL_NFDBITS)))
122
123 #else   /* USE_SOCKETS_AS_HANDLES */
124
125 #define Perl_fd_set     fd_set
126 #define PERL_FD_SET(n,p)        FD_SET(n,p)
127 #define PERL_FD_CLR(n,p)        FD_CLR(n,p)
128 #define PERL_FD_ISSET(n,p)      FD_ISSET(n,p)
129 #define PERL_FD_ZERO(p)         FD_ZERO(p)
130
131 #endif  /* USE_SOCKETS_AS_HANDLES */
132
133 SOCKET win32_accept (SOCKET s, struct sockaddr *addr, int *addrlen);
134 int win32_bind (SOCKET s, const struct sockaddr *addr, int namelen);
135 int win32_closesocket (SOCKET s);
136 int win32_connect (SOCKET s, const struct sockaddr *name, int namelen);
137 int win32_ioctlsocket (SOCKET s, long cmd, u_long *argp);
138 int win32_getpeername (SOCKET s, struct sockaddr *name, int * namelen);
139 int win32_getsockname (SOCKET s, struct sockaddr *name, int * namelen);
140 int win32_getsockopt (SOCKET s, int level, int optname, char * optval, int *optlen);
141 u_long win32_htonl (u_long hostlong);
142 u_short win32_htons (u_short hostshort);
143 unsigned long win32_inet_addr (const char * cp);
144 char * win32_inet_ntoa (struct in_addr in);
145 int win32_listen (SOCKET s, int backlog);
146 u_long win32_ntohl (u_long netlong);
147 u_short win32_ntohs (u_short netshort);
148 int win32_recv (SOCKET s, char * buf, int len, int flags);
149 int win32_recvfrom (SOCKET s, char * buf, int len, int flags,
150                          struct sockaddr *from, int * fromlen);
151 int win32_select (int nfds, Perl_fd_set *rfds, Perl_fd_set *wfds, Perl_fd_set *xfds,
152                   const struct timeval *timeout);
153 int win32_send (SOCKET s, const char * buf, int len, int flags);
154 int win32_sendto (SOCKET s, const char * buf, int len, int flags,
155                        const struct sockaddr *to, int tolen);
156 int win32_setsockopt (SOCKET s, int level, int optname,
157                            const char * optval, int optlen);
158 SOCKET win32_socket (int af, int type, int protocol);
159 int win32_shutdown (SOCKET s, int how);
160
161 /* Database function prototypes */
162
163 struct hostent * win32_gethostbyaddr(const char * addr, int len, int type);
164 struct hostent * win32_gethostbyname(const char * name);
165 int win32_gethostname (char * name, int namelen);
166 struct servent * win32_getservbyport(int port, const char * proto);
167 struct servent * win32_getservbyname(const char * name, const char * proto);
168 struct protoent * win32_getprotobynumber(int proto);
169 struct protoent * win32_getprotobyname(const char * name);
170 struct protoent *win32_getprotoent(void);
171 struct servent *win32_getservent(void);
172 void win32_sethostent(int stayopen);
173 void win32_setnetent(int stayopen);
174 struct netent * win32_getnetent(void);
175 struct netent * win32_getnetbyname(char *name);
176 struct netent * win32_getnetbyaddr(long net, int type);
177 void win32_setprotoent(int stayopen);
178 void win32_setservent(int stayopen);
179 void win32_endhostent(void);
180 void win32_endnetent(void);
181 void win32_endprotoent(void);
182 void win32_endservent(void);
183
184 #ifndef WIN32SCK_IS_STDSCK
185
186 /* direct to our version */
187
188 #define htonl           win32_htonl
189 #define htons           win32_htons
190 #define ntohl           win32_ntohl
191 #define ntohs           win32_ntohs
192 #define inet_addr       win32_inet_addr
193 #define inet_ntoa       win32_inet_ntoa
194
195 #define socket          win32_socket
196 #define bind            win32_bind
197 #define listen          win32_listen
198 #define accept          win32_accept
199 #define connect         win32_connect
200 #define send            win32_send
201 #define sendto          win32_sendto
202 #define recv            win32_recv
203 #define recvfrom        win32_recvfrom
204 #define shutdown        win32_shutdown
205 #define closesocket     win32_closesocket
206 #define ioctlsocket     win32_ioctlsocket
207 #define setsockopt      win32_setsockopt
208 #define getsockopt      win32_getsockopt
209 #define getpeername     win32_getpeername
210 #define getsockname     win32_getsockname
211 #define gethostname     win32_gethostname
212 #define gethostbyname   win32_gethostbyname
213 #define gethostbyaddr   win32_gethostbyaddr
214 #define getprotobyname  win32_getprotobyname
215 #define getprotobynumber win32_getprotobynumber
216 #define getservbyname   win32_getservbyname
217 #define getservbyport   win32_getservbyport
218 #define select          win32_select
219 #define endhostent      win32_endhostent
220 #define endnetent       win32_endnetent
221 #define endprotoent     win32_endprotoent
222 #define endservent      win32_endservent
223 #define getnetent       win32_getnetent
224 #define getnetbyname    win32_getnetbyname
225 #define getnetbyaddr    win32_getnetbyaddr
226 #define getprotoent     win32_getprotoent
227 #define getservent      win32_getservent
228 #define sethostent      win32_sethostent
229 #define setnetent       win32_setnetent
230 #define setprotoent     win32_setprotoent
231 #define setservent      win32_setservent
232
233 #ifdef USE_SOCKETS_AS_HANDLES
234 #undef fd_set
235 #undef FD_SET
236 #undef FD_CLR
237 #undef FD_ISSET
238 #undef FD_ZERO
239 #define fd_set          Perl_fd_set
240 #define FD_SET(n,p)     PERL_FD_SET(n,p)
241 #define FD_CLR(n,p)     PERL_FD_CLR(n,p)
242 #define FD_ISSET(n,p)   PERL_FD_ISSET(n,p)
243 #define FD_ZERO(p)      PERL_FD_ZERO(p)
244 #endif  /* USE_SOCKETS_AS_HANDLES */
245
246 #endif  /* WIN32SCK_IS_STDSCK */
247
248 #ifdef __cplusplus
249 }
250 #endif
251
252 #endif  /* _INC_SYS_SOCKET */