1/* Copyright (C) 1995, 2001, 2002, 2003, 2004, 2005,
2      2006, 2007  Free Software Foundation, Inc.
3
4This file is part of GNU Emacs.
5
6GNU Emacs is free software; you can redistribute it and/or modify
7it under the terms of the GNU General Public License as published by
8the Free Software Foundation; either version 2, or (at your option)
9any later version.
10
11GNU Emacs is distributed in the hope that it will be useful,
12but WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14GNU General Public License for more details.
15
16You should have received a copy of the GNU General Public License
17along with GNU Emacs; see the file COPYING.  If not, write to
18the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
19Boston, MA 02110-1301, USA.  */
20
21
22/* Workable version of <sys/socket.h> based on winsock.h */
23
24#ifndef _SOCKET_H_
25#define _SOCKET_H_
26
27/* defeat the multiple include protection */
28#ifdef _WINSOCKAPI_
29#undef _WINSOCKAPI_
30#endif
31#ifdef _WINSOCK_H
32#undef _WINSOCK_H
33#endif
34
35/* avoid confusion with our version of select */
36#ifdef select
37#undef select
38#define MUST_REDEF_SELECT
39#endif
40
41/* avoid clashing with our version of FD_SET if already defined */
42#ifdef FD_SET
43#undef FD_SET
44#undef FD_CLR
45#undef FD_ISSET
46#undef FD_ZERO
47#endif
48
49/* avoid duplicate definition of timeval */
50#ifdef HAVE_TIMEVAL
51#define timeval ws_timeval
52#endif
53
54#include <winsock.h>
55
56/* redefine select to reference our version */
57#ifdef MUST_REDEF_SELECT
58#define select sys_select
59#undef MUST_REDEF_SELECT
60#endif
61
62/* revert to our version of FD_SET */
63#undef FD_SET
64#undef FD_CLR
65#undef FD_ISSET
66#undef FD_ZERO
67
68/* allow us to provide our own version of fd_set */
69#define fd_set ws_fd_set
70#include "w32.h"
71
72#ifdef HAVE_TIMEVAL
73#undef timeval
74#endif
75
76/* shadow functions where we provide our own wrapper */
77#define socket         sys_socket
78#define bind           sys_bind
79#define connect        sys_connect
80#define htons          sys_htons
81#define ntohs          sys_ntohs
82#define inet_addr      sys_inet_addr
83#define gethostname    sys_gethostname
84#define gethostbyname  sys_gethostbyname
85#define getpeername    sys_getpeername
86#define getservbyname  sys_getservbyname
87#define shutdown       sys_shutdown
88#define setsockopt     sys_setsockopt
89#define listen         sys_listen
90#define getsockname    sys_getsockname
91#define accept         sys_accept
92#define recvfrom       sys_recvfrom
93#define sendto         sys_sendto
94
95int sys_socket(int af, int type, int protocol);
96int sys_bind (int s, const struct sockaddr *addr, int namelen);
97int sys_connect (int s, const struct sockaddr *addr, int namelen);
98u_short sys_htons (u_short hostshort);
99u_short sys_ntohs (u_short netshort);
100unsigned long sys_inet_addr (const char * cp);
101int sys_gethostname (char * name, int namelen);
102struct hostent * sys_gethostbyname (const char * name);
103struct servent * sys_getservbyname (const char * name, const char * proto);
104int sys_getpeername (int s, struct sockaddr *addr, int * namelen);
105int sys_shutdown (int socket, int how);
106int sys_setsockopt (int s, int level, int oname, const void * oval, int olen);
107int sys_listen (int s, int backlog);
108int sys_getsockname (int s, struct sockaddr * name, int * namelen);
109int sys_accept (int s, struct sockaddr *addr, int *addrlen);
110int sys_recvfrom (int s, char *buf, int len, int flags,
111		  struct sockaddr *from, int * fromlen);
112int sys_sendto (int s, const char * buf, int len, int flags,
113		const struct sockaddr *to, int tolen);
114
115/* In addition to wrappers for the winsock functions, we also provide
116   an fcntl function, for setting sockets to non-blocking mode.  */
117int fcntl (int s, int cmd, int options);
118#define F_SETFL   4
119#define O_NDELAY  04000
120
121/* we are providing a real h_errno variable */
122#undef h_errno
123extern int h_errno;
124
125/* map winsock error codes to standard names */
126#define EWOULDBLOCK             WSAEWOULDBLOCK
127#define EINPROGRESS             WSAEINPROGRESS
128#define EALREADY                WSAEALREADY
129#define ENOTSOCK                WSAENOTSOCK
130#define EDESTADDRREQ            WSAEDESTADDRREQ
131#define EMSGSIZE                WSAEMSGSIZE
132#define EPROTOTYPE              WSAEPROTOTYPE
133#define ENOPROTOOPT             WSAENOPROTOOPT
134#define EPROTONOSUPPORT         WSAEPROTONOSUPPORT
135#define ESOCKTNOSUPPORT         WSAESOCKTNOSUPPORT
136#define EOPNOTSUPP              WSAEOPNOTSUPP
137#define EPFNOSUPPORT            WSAEPFNOSUPPORT
138#define EAFNOSUPPORT            WSAEAFNOSUPPORT
139#define EADDRINUSE              WSAEADDRINUSE
140#define EADDRNOTAVAIL           WSAEADDRNOTAVAIL
141#define ENETDOWN                WSAENETDOWN
142#define ENETUNREACH             WSAENETUNREACH
143#define ENETRESET               WSAENETRESET
144#define ECONNABORTED            WSAECONNABORTED
145#define ECONNRESET              WSAECONNRESET
146#define ENOBUFS                 WSAENOBUFS
147#define EISCONN                 WSAEISCONN
148#define ENOTCONN                WSAENOTCONN
149#define ESHUTDOWN               WSAESHUTDOWN
150#define ETOOMANYREFS            WSAETOOMANYREFS
151#define ETIMEDOUT               WSAETIMEDOUT
152#define ECONNREFUSED            WSAECONNREFUSED
153#define ELOOP                   WSAELOOP
154/* #define ENAMETOOLONG            WSAENAMETOOLONG */
155#define EHOSTDOWN               WSAEHOSTDOWN
156#define EHOSTUNREACH            WSAEHOSTUNREACH
157/* #define ENOTEMPTY               WSAENOTEMPTY */
158#define EPROCLIM                WSAEPROCLIM
159#define EUSERS                  WSAEUSERS
160#define EDQUOT                  WSAEDQUOT
161#define ESTALE                  WSAESTALE
162#define EREMOTE                 WSAEREMOTE
163
164#endif /* _SOCKET_H_ */
165
166/* end of socket.h */
167
168/* arch-tag: e3b8b91c-aaa0-4bc4-be57-a85a1dd247b4
169   (do not change this comment) */
170