Make winsock.h and winsock2.h independent from the Unix headers.
Make them compatible with both the Unix C headers and the MSVCRT
headers.
Ensure compatibility with the Unix headers via the USE_WS_PREFIX
macro.
Add WINE_NOWINSOCK: prevents winsock.h from being included from
windows.h when defined.
Add ws2tcpip.h, move definitions to the right header.

diff --git a/dlls/winsock/Makefile.in b/dlls/winsock/Makefile.in
index b50ac50..c42de39 100644
--- a/dlls/winsock/Makefile.in
+++ b/dlls/winsock/Makefile.in
@@ -1,3 +1,4 @@
+EXTRADEFS = -DUSE_WS_PREFIX
 TOPSRCDIR = @top_srcdir@
 TOPOBJDIR = ../..
 SRCDIR    = @srcdir@
diff --git a/dlls/winsock/async.c b/dlls/winsock/async.c
index 48b748e..79a9c64 100644
--- a/dlls/winsock/async.c
+++ b/dlls/winsock/async.c
@@ -167,10 +167,10 @@
 {
 	char* p_name,*p_aliases,*p_addr,*p;
 	struct ws_hostent16 *p_to16 = (struct ws_hostent16*)p_to;
-	struct ws_hostent32 *p_to32 = (struct ws_hostent32*)p_to;
+	struct WS_hostent *p_to32 = (struct WS_hostent*)p_to;
 	int	size = hostent_size(p_he) +
 		(
-		(flag & AQ_WIN16) ? sizeof(struct ws_hostent16) : sizeof(struct ws_hostent32)
+		(flag & AQ_WIN16) ? sizeof(struct ws_hostent16) : sizeof(struct WS_hostent)
 		- sizeof(struct hostent)
 		);
 
@@ -178,7 +178,7 @@
 		return -size;
 	p = p_to;
 	p += (flag & AQ_WIN16) ?
-		sizeof(struct ws_hostent16) : sizeof(struct ws_hostent32);
+		sizeof(struct ws_hostent16) : sizeof(struct WS_hostent);
 	p_name = p;
 	strcpy(p, p_he->h_name); p += strlen(p) + 1;
 	p_aliases = p;
@@ -225,10 +225,10 @@
 {
 	char* p_name,*p_aliases,*p;
 	struct ws_protoent16 *p_to16 = (struct ws_protoent16*)p_to;
-	struct ws_protoent32 *p_to32 = (struct ws_protoent32*)p_to;
+	struct WS_protoent *p_to32 = (struct WS_protoent*)p_to;
 	int	size = protoent_size(p_pe) +
 		(
-		(flag & AQ_WIN16) ? sizeof(struct ws_protoent16) : sizeof(struct ws_protoent32)
+		(flag & AQ_WIN16) ? sizeof(struct ws_protoent16) : sizeof(struct WS_protoent)
 		- sizeof(struct protoent)
 		);
 
@@ -236,7 +236,7 @@
 		return -size;
 	p = p_to;
 	p += (flag & AQ_WIN16) ?
-		sizeof(struct ws_protoent16) : sizeof(struct ws_protoent32);
+		sizeof(struct ws_protoent16) : sizeof(struct WS_protoent);
 	p_name = p;
 	strcpy(p, p_pe->p_name); p += strlen(p) + 1;
 	p_aliases = p;
@@ -279,10 +279,10 @@
 {
 	char* p_name,*p_aliases,*p_proto,*p;
 	struct ws_servent16 *p_to16 = (struct ws_servent16*)p_to;
-	struct ws_servent32 *p_to32 = (struct ws_servent32*)p_to;
+	struct WS_servent *p_to32 = (struct WS_servent*)p_to;
 	int	size = servent_size(p_se) +
 		(
-		(flag & AQ_WIN16) ? sizeof(struct ws_servent16) : sizeof(struct ws_servent32) 
+		(flag & AQ_WIN16) ? sizeof(struct ws_servent16) : sizeof(struct WS_servent) 
 		- sizeof(struct servent)
 		);
 
@@ -290,7 +290,7 @@
 		return -size;
 	p = p_to;
 	p += (flag & AQ_WIN16) ?
-		sizeof(struct ws_servent16) : sizeof(struct ws_servent32);
+		sizeof(struct ws_servent16) : sizeof(struct WS_servent);
 	p_name = p;
 	strcpy(p, p_se->s_name); p += strlen(p) + 1;
 	p_proto = p;
diff --git a/dlls/winsock/socket.c b/dlls/winsock/socket.c
index 8547df0..12b761c 100644
--- a/dlls/winsock/socket.c
+++ b/dlls/winsock/socket.c
@@ -7,14 +7,8 @@
  * NOTE: If you make any changes to fix a particular app, make sure 
  * they don't break something else like Netscape or telnet and ftp 
  * clients and servers (www.winsite.com got a lot of those).
- *
- * NOTE 2: Many winsock structs such as servent, hostent, protoent, ...
- * are used with 1-byte alignment for Win16 programs and 4-byte alignment
- * for Win32 programs in winsock.h. winsock2.h uses forced 4-byte alignment.
- * So we have non-forced (just as MSDN) ws_XXXXent (winsock.h), 4-byte forced
- * ws_XXXXent32 (winsock2.h) and 1-byte forced ws_XXXXent16 (winsock16.h).
  */
- 
+
 #include "config.h"
 #include "wine/port.h"
 
@@ -92,6 +86,7 @@
 #include "wingdi.h"
 #include "winuser.h"
 #include "winsock2.h"
+#include "ws2tcpip.h"
 #include "wsipx.h"
 #include "wine/winsock16.h"
 #include "winnt.h"
@@ -154,7 +149,6 @@
 int WS_dup_he(struct hostent* p_he, int flag);
 int WS_dup_pe(struct protoent* p_pe, int flag);
 int WS_dup_se(struct servent* p_se, int flag);
-int WINAPI WSOCK32_getpeername(SOCKET s, ws_sockaddr *name, int *namelen);
 
 typedef void	WIN_hostent;
 typedef void	WIN_protoent;
@@ -317,9 +311,9 @@
 }
 
 /***********************************************************************
- *		WSOCK32_LibMain (WS2_32.init)
+ *		WS_LibMain (WS2_32.init)
  */
-BOOL WINAPI WSOCK32_LibMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID fImpLoad)
+BOOL WINAPI WS_LibMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID fImpLoad)
 {
     TRACE("0x%x 0x%lx %p\n", hInstDLL, fdwReason, fImpLoad);
     switch (fdwReason) {
@@ -391,7 +385,7 @@
     if( wsfds ) 
     { 
 #define wsfds16	((ws_fd_set16*)wsfds)
-#define wsfds32 ((ws_fd_set32*)wsfds)
+#define wsfds32 ((WS_fd_set*)wsfds)
 	int i, count;
 
 	FD_ZERO(fds);
@@ -437,7 +431,7 @@
     if( wsfds )
     {
 #define wsfds16 ((ws_fd_set16*)wsfds)
-#define wsfds32 ((ws_fd_set32*)wsfds)
+#define wsfds32 ((WS_fd_set*)wsfds)
 	int i, j, count = (b32) ? wsfds32->fd_count : wsfds16->fd_count;
 
 	for( i = 0, j = 0; i < count; i++ )
@@ -477,7 +471,7 @@
     if ( wsfds )
     {
 #define wsfds16 ((ws_fd_set16*)wsfds)
-#define wsfds32 ((ws_fd_set32*)wsfds)
+#define wsfds32 ((WS_fd_set*)wsfds)
 	int i, count = (b32) ? wsfds32->fd_count : wsfds16->fd_count;
 
 	for( i = 0; i < count; i++ )
@@ -765,17 +759,17 @@
  * start with. Note that the returned pointer may be the original pointer 
  * if no conversion is necessary.
  */
-const struct sockaddr* ws_sockaddr_ws2u(const ws_sockaddr* wsaddr, int wsaddrlen, int *uaddrlen)
+const struct sockaddr* ws_sockaddr_ws2u(const struct WS_sockaddr* wsaddr, int wsaddrlen, int *uaddrlen)
 {
     switch (wsaddr->sa_family)
     {
 #ifdef HAVE_IPX
     case WS_AF_IPX:
         {
-            struct ws_sockaddr_ipx* wsipx=(struct ws_sockaddr_ipx*)wsaddr;
+            struct WS_sockaddr_ipx* wsipx=(struct WS_sockaddr_ipx*)wsaddr;
             struct sockaddr_ipx* uipx;
 
-            if (wsaddrlen<sizeof(struct ws_sockaddr_ipx))
+            if (wsaddrlen<sizeof(struct WS_sockaddr_ipx))
                 return NULL;
 
             *uaddrlen=sizeof(struct sockaddr_ipx);
@@ -793,7 +787,7 @@
 #endif
 
     default:
-        if (wsaddrlen<sizeof(ws_sockaddr))
+        if (wsaddrlen<sizeof(struct WS_sockaddr))
             return NULL;
 
         /* No conversion needed, just return the original address */
@@ -804,7 +798,7 @@
 }
 
 /* allocates a Unix sockaddr structure to receive the data */
-inline struct sockaddr* ws_sockaddr_alloc(const ws_sockaddr* wsaddr, int* wsaddrlen, int* uaddrlen)
+inline struct sockaddr* ws_sockaddr_alloc(const struct WS_sockaddr* wsaddr, int* wsaddrlen, int* uaddrlen)
 {
     if (*wsaddrlen==0)
         *uaddrlen=0;
@@ -817,7 +811,7 @@
 }
 
 /* Returns 0 if successful, -1 if the buffer is too small */
-int ws_sockaddr_u2ws(const struct sockaddr* uaddr, int uaddrlen, ws_sockaddr* wsaddr, int* wsaddrlen)
+int ws_sockaddr_u2ws(const struct sockaddr* uaddr, int uaddrlen, struct WS_sockaddr* wsaddr, int* wsaddrlen)
 {
     int res;
 
@@ -827,7 +821,7 @@
     case AF_IPX:
         {
             struct sockaddr_ipx* uipx=(struct sockaddr_ipx*)uaddr;
-            struct ws_sockaddr_ipx* wsipx=(struct ws_sockaddr_ipx*)wsaddr;
+            struct WS_sockaddr_ipx* wsipx=(struct WS_sockaddr_ipx*)wsaddr;
 
             res=-1;
             switch (*wsaddrlen) /* how much can we copy? */
@@ -873,7 +867,7 @@
 /* to be called to free the memory allocated by ws_sockaddr_ws2u or 
  * ws_sockaddr_alloc
  */
-inline void ws_sockaddr_free(const struct sockaddr* uaddr, const ws_sockaddr* wsaddr)
+inline void ws_sockaddr_free(const struct sockaddr* uaddr, const struct WS_sockaddr* wsaddr)
 {
     if (uaddr!=NULL && uaddr!=(const struct sockaddr*)wsaddr)
         free((void*)uaddr);
@@ -882,7 +876,7 @@
 /***********************************************************************
  *		accept		(WS2_32.1)
  */
-SOCKET WINAPI WSOCK32_accept(SOCKET s, ws_sockaddr *addr,
+SOCKET WINAPI WS_accept(SOCKET s, struct WS_sockaddr *addr,
                                  int *addrlen32)
 {
     int fd = _get_sock_fd(s);
@@ -913,7 +907,7 @@
 	if (as)
 	{
 	    unsigned omask = _get_sock_mask( s );
-	    WSOCK32_getpeername(fd, addr, addrlen32);
+	    WS_getpeername(fd, addr, addrlen32);
 	    if (omask & FD_WINE_SERVEVENT)
 		ws2_async_accept(s, as);
 	    return as;
@@ -929,11 +923,11 @@
 /***********************************************************************
  *              accept		(WINSOCK.1)
  */
-SOCKET16 WINAPI WINSOCK_accept16(SOCKET16 s, ws_sockaddr* addr,
+SOCKET16 WINAPI WINSOCK_accept16(SOCKET16 s, struct WS_sockaddr* addr,
                                  INT16* addrlen16 )
 {
     INT addrlen32 = addrlen16 ? *addrlen16 : 0;
-    SOCKET retSocket = WSOCK32_accept( s, addr, &addrlen32 );
+    SOCKET retSocket = WS_accept( s, addr, &addrlen32 );
     if( addrlen16 ) *addrlen16 = (INT16)addrlen32;
     return (SOCKET16)retSocket;
 }
@@ -941,7 +935,7 @@
 /***********************************************************************
  *		bind			(WS2_32.2)
  */
-int WINAPI WSOCK32_bind(SOCKET s, const ws_sockaddr* name, int namelen)
+int WINAPI WS_bind(SOCKET s, const struct WS_sockaddr* name, int namelen)
 {
     int fd = _get_sock_fd(s);
     int res;
@@ -1007,15 +1001,15 @@
 /***********************************************************************
  *              bind			(WINSOCK.2)
  */
-INT16 WINAPI WINSOCK_bind16(SOCKET16 s, ws_sockaddr *name, INT16 namelen)
+INT16 WINAPI WINSOCK_bind16(SOCKET16 s, struct WS_sockaddr *name, INT16 namelen)
 {
-  return (INT16)WSOCK32_bind( s, name, namelen );
+  return (INT16)WS_bind( s, name, namelen );
 }
 
 /***********************************************************************
  *		closesocket		(WS2_32.3)
  */
-INT WINAPI WSOCK32_closesocket(SOCKET s)
+int WINAPI WS_closesocket(SOCKET s)
 {
     TRACE("socket %08x\n", s);
     if (CloseHandle(s)) return 0;
@@ -1027,13 +1021,13 @@
  */
 INT16 WINAPI WINSOCK_closesocket16(SOCKET16 s)
 {
-    return (INT16)WSOCK32_closesocket(s);
+    return (INT16)WS_closesocket(s);
 }
 
 /***********************************************************************
  *		connect		(WS2_32.4)
  */
-int WINAPI WSOCK32_connect(SOCKET s, const ws_sockaddr* name, int namelen)
+int WINAPI WS_connect(SOCKET s, const struct WS_sockaddr* name, int namelen)
 {
     int fd = _get_sock_fd(s);
 
@@ -1111,15 +1105,15 @@
 /***********************************************************************
  *              connect               (WINSOCK.4)
  */
-INT16 WINAPI WINSOCK_connect16(SOCKET16 s, ws_sockaddr *name, INT16 namelen)
+INT16 WINAPI WINSOCK_connect16(SOCKET16 s, struct WS_sockaddr *name, INT16 namelen)
 {
-  return (INT16)WSOCK32_connect( s, name, namelen );
+  return (INT16)WS_connect( s, name, namelen );
 }
 
 /***********************************************************************
  *		getpeername		(WS2_32.5)
  */
-int WINAPI WSOCK32_getpeername(SOCKET s, ws_sockaddr *name, int *namelen)
+int WINAPI WS_getpeername(SOCKET s, struct WS_sockaddr *name, int *namelen)
 {
     int fd = _get_sock_fd(s);
     int res;
@@ -1159,11 +1153,11 @@
 /***********************************************************************
  *              getpeername		(WINSOCK.5)
  */
-INT16 WINAPI WINSOCK_getpeername16(SOCKET16 s, ws_sockaddr *name,
+INT16 WINAPI WINSOCK_getpeername16(SOCKET16 s, struct WS_sockaddr *name,
                                    INT16 *namelen16)
 {
     INT namelen32 = *namelen16;
-    INT retVal = WSOCK32_getpeername( s, name, &namelen32 );
+    INT retVal = WS_getpeername( s, name, &namelen32 );
 
 #if DEBUG_SOCKADDR
     dump_sockaddr(name);
@@ -1176,7 +1170,7 @@
 /***********************************************************************
  *		getsockname		(WS2_32.6)
  */
-int WINAPI WSOCK32_getsockname(SOCKET s, ws_sockaddr *name, int *namelen)
+int WINAPI WS_getsockname(SOCKET s, struct WS_sockaddr *name, int *namelen)
 {
     int fd = _get_sock_fd(s);
     int res;
@@ -1215,7 +1209,7 @@
 /***********************************************************************
  *              getsockname		(WINSOCK.6)
  */
-INT16 WINAPI WINSOCK_getsockname16(SOCKET16 s, ws_sockaddr *name,
+INT16 WINAPI WINSOCK_getsockname16(SOCKET16 s, struct WS_sockaddr *name,
                                    INT16 *namelen16)
 {
     INT retVal;
@@ -1223,7 +1217,7 @@
     if( namelen16 )
     {
         INT namelen32 = *namelen16;
-        retVal = WSOCK32_getsockname( s, name, &namelen32 );
+        retVal = WS_getsockname( s, name, &namelen32 );
        *namelen16 = namelen32;
 
 #if DEBUG_SOCKADDR
@@ -1239,7 +1233,7 @@
 /***********************************************************************
  *		getsockopt		(WS2_32.7)
  */
-INT WINAPI WSOCK32_getsockopt(SOCKET s, INT level, 
+INT WINAPI WS_getsockopt(SOCKET s, INT level, 
                                   INT optname, char *optval, INT *optlen)
 {
     int fd = _get_sock_fd(s);
@@ -1262,6 +1256,7 @@
     return SOCKET_ERROR;
 }
 
+
 /***********************************************************************
  *              getsockopt		(WINSOCK.7)
  */
@@ -1272,47 +1267,72 @@
     INT *p = &optlen32;
     INT retVal;
     if( optlen ) optlen32 = *optlen; else p = NULL;
-    retVal = WSOCK32_getsockopt( s, (UINT16)level, optname, optval, p );
+    retVal = WS_getsockopt( s, (UINT16)level, optname, optval, p );
     if( optlen ) *optlen = optlen32;
     return (INT16)retVal;
 }
 
+
 /***********************************************************************
  *		htonl			(WINSOCK.8)
  *		htonl			(WS2_32.8)
  */
-u_long WINAPI WINSOCK_htonl(u_long hostlong)   { return( htonl(hostlong) ); }
+u_long WINAPI WS_htonl(u_long hostlong)
+{
+    return htonl(hostlong);
+}
+
+
 /***********************************************************************
  *		htons			(WINSOCK.9)
  *		htons			(WS2_32.9)
  */
-u_short WINAPI WINSOCK_htons(u_short hostshort) { return( htons(hostshort) ); }
+u_short WINAPI WS_htons(u_short hostshort)
+{
+    return htons(hostshort);
+}
+
+
 /***********************************************************************
  *		inet_addr		(WINSOCK.10)
  *		inet_addr		(WS2_32.11)
  */
-u_long WINAPI WINSOCK_inet_addr(char *cp)      { return( inet_addr(cp) ); }
+u_long WINAPI WS_inet_addr(const char *cp)
+{
+    return inet_addr(cp);
+}
+
+
 /***********************************************************************
  *		ntohl			(WINSOCK.14)
  *		ntohl			(WS2_32.14)
  */
-u_long WINAPI WINSOCK_ntohl(u_long netlong)    { return( ntohl(netlong) ); }
+u_long WINAPI WS_ntohl(u_long netlong)
+{
+    return ntohl(netlong);
+}
+
+
 /***********************************************************************
  *		ntohs			(WINSOCK.15)
  *		ntohs			(WS2_32.15)
  */
-u_short WINAPI WINSOCK_ntohs(u_short netshort)  { return( ntohs(netshort) ); }
+u_short WINAPI WS_ntohs(u_short netshort)
+{
+    return ntohs(netshort);
+}
+
 
 /***********************************************************************
  *		inet_ntoa		(WS2_32.12)
  */
-char* WINAPI WSOCK32_inet_ntoa(struct in_addr in)
+char* WINAPI WS_inet_ntoa(struct WS_in_addr in)
 {
   /* use "buffer for dummies" here because some applications have 
    * propensity to decode addresses in ws_hostent structure without 
    * saving them first...
    */
-    char* s = inet_ntoa(in);
+    char* s = inet_ntoa(*((struct in_addr*)&in));
     if( s )
     {
         if( dbuffer == NULL ) {
@@ -1335,7 +1355,7 @@
  */
 SEGPTR WINAPI WINSOCK_inet_ntoa16(struct in_addr in)
 {
-  char* retVal = WSOCK32_inet_ntoa(in);
+  char* retVal = WS_inet_ntoa(*((struct WS_in_addr*)&in));
   return SEGPTR_GET(retVal);
 }
 
@@ -1404,11 +1424,11 @@
                }
                else
                {
-                  struct ws_sockaddr_in *ipTemp = (struct ws_sockaddr_in *)&ifInfo.ifr_addr;
+                  struct WS_sockaddr_in *ipTemp = (struct WS_sockaddr_in *)&ifInfo.ifr_addr;
                
                   intArray->iiAddress.AddressIn.sin_family = AF_INET;
                   intArray->iiAddress.AddressIn.sin_port = ipTemp->sin_port;
-                  intArray->iiAddress.AddressIn.sin_addr.ws_addr = ipTemp->sin_addr.S_un.S_addr;
+                  intArray->iiAddress.AddressIn.sin_addr.WS_s_addr = ipTemp->sin_addr.S_un.S_addr;
                }
                
                /* Broadcast Address */
@@ -1422,11 +1442,11 @@
                }
                else
                {
-                  struct ws_sockaddr_in *ipTemp = (struct ws_sockaddr_in *)&ifInfo.ifr_broadaddr;
+                  struct WS_sockaddr_in *ipTemp = (struct WS_sockaddr_in *)&ifInfo.ifr_broadaddr;
                
                   intArray->iiBroadcastAddress.AddressIn.sin_family = AF_INET; 
                   intArray->iiBroadcastAddress.AddressIn.sin_port = ipTemp->sin_port;
-                  intArray->iiBroadcastAddress.AddressIn.sin_addr.ws_addr = ipTemp->sin_addr.S_un.S_addr; 
+                  intArray->iiBroadcastAddress.AddressIn.sin_addr.WS_s_addr = ipTemp->sin_addr.S_un.S_addr; 
                }
 
                /* Subnet Mask */
@@ -1446,21 +1466,21 @@
                     #ifndef ifr_addr
                        intArray->iiNetmask.AddressIn.sin_family = AF_INET; 
                        intArray->iiNetmask.AddressIn.sin_port = 0;
-                       intArray->iiNetmask.AddressIn.sin_addr.ws_addr = 0; 
+                       intArray->iiNetmask.AddressIn.sin_addr.WS_s_addr = 0; 
                        ERR ("Unable to determine Netmask on your platform!\n");
                     #else
-                       struct ws_sockaddr_in *ipTemp = (struct ws_sockaddr_in *)&ifInfo.ifr_addr;
+                       struct WS_sockaddr_in *ipTemp = (struct WS_sockaddr_in *)&ifInfo.ifr_addr;
             
                        intArray->iiNetmask.AddressIn.sin_family = AF_INET; 
                        intArray->iiNetmask.AddressIn.sin_port = ipTemp->sin_port;
-                       intArray->iiNetmask.AddressIn.sin_addr.ws_addr = ipTemp->sin_addr.S_un.S_addr; 
+                       intArray->iiNetmask.AddressIn.sin_addr.WS_s_addr = ipTemp->sin_addr.S_un.S_addr; 
                     #endif
                   #else
-                     struct ws_sockaddr_in *ipTemp = (struct ws_sockaddr_in *)&ifInfo.ifr_netmask;
+                     struct WS_sockaddr_in *ipTemp = (struct WS_sockaddr_in *)&ifInfo.ifr_netmask;
             
                      intArray->iiNetmask.AddressIn.sin_family = AF_INET; 
                      intArray->iiNetmask.AddressIn.sin_port = ipTemp->sin_port;
-                     intArray->iiNetmask.AddressIn.sin_addr.ws_addr = ipTemp->sin_addr.S_un.S_addr; 
+                     intArray->iiNetmask.AddressIn.sin_addr.WS_s_addr = ipTemp->sin_addr.S_un.S_addr; 
                   #endif
                }
                
@@ -1631,7 +1651,7 @@
 /***********************************************************************
  *		ioctlsocket		(WS2_32.10)
  */
-INT WINAPI WSOCK32_ioctlsocket(SOCKET s, LONG cmd, ULONG *argp)
+int WINAPI WS_ioctlsocket(SOCKET s, long cmd, u_long *argp)
 {
   int fd = _get_sock_fd(s);
 
@@ -1670,7 +1690,7 @@
 		newcmd=SIOCATMARK; 
 		break;
 
-	case WS_IOW('f',125,u_long): 
+	case WS__IOW('f',125,u_long): 
 		WARN("Warning: WS1.1 shouldn't be using async I/O\n");
 		SetLastError(WSAEINVAL); 
 		return SOCKET_ERROR;
@@ -1703,14 +1723,14 @@
  */
 INT16 WINAPI WINSOCK_ioctlsocket16(SOCKET16 s, LONG cmd, ULONG *argp)
 {
-    return (INT16)WSOCK32_ioctlsocket( s, cmd, argp );
+    return (INT16)WS_ioctlsocket( s, cmd, argp );
 }
 
 
 /***********************************************************************
  *		listen		(WS2_32.13)
  */
-INT WINAPI WSOCK32_listen(SOCKET s, INT backlog)
+int WINAPI WS_listen(SOCKET s, int backlog)
 {
     int fd = _get_sock_fd(s);
 
@@ -1736,14 +1756,14 @@
  */
 INT16 WINAPI WINSOCK_listen16(SOCKET16 s, INT16 backlog)
 {
-    return (INT16)WSOCK32_listen( s, backlog );
+    return (INT16)WS_listen( s, backlog );
 }
 
 
 /***********************************************************************
  *		recv			(WS2_32.16)
  */
-INT WINAPI WSOCK32_recv(SOCKET s, char *buf, INT len, INT flags)
+int WINAPI WS_recv(SOCKET s, char *buf, int len, int flags)
 {
     int fd = _get_sock_fd(s);
 
@@ -1780,15 +1800,15 @@
  */
 INT16 WINAPI WINSOCK_recv16(SOCKET16 s, char *buf, INT16 len, INT16 flags)
 {
-    return (INT16)WSOCK32_recv( s, buf, len, flags );
+    return (INT16)WS_recv( s, buf, len, flags );
 }
 
 
 /***********************************************************************
  *		recvfrom		(WS2_32.17)
  */
-int WINAPI WSOCK32_recvfrom(SOCKET s, char *buf, INT len, int flags,
-                                ws_sockaddr *from, int *fromlen)
+int WINAPI WS_recvfrom(SOCKET s, char *buf, INT len, int flags,
+                                struct WS_sockaddr *from, int *fromlen)
 {
     int fd = _get_sock_fd(s);
     int res;
@@ -1850,14 +1870,14 @@
  *              recvfrom		(WINSOCK.17)
  */
 INT16 WINAPI WINSOCK_recvfrom16(SOCKET16 s, char *buf, INT16 len, INT16 flags,
-                                ws_sockaddr *from, INT16 *fromlen16)
+                                struct WS_sockaddr *from, INT16 *fromlen16)
 {
     INT fromlen32;
     INT *p = &fromlen32;
     INT retVal;
 
     if( fromlen16 ) fromlen32 = *fromlen16; else p = NULL;
-    retVal = WSOCK32_recvfrom( s, buf, len, flags, from, p );
+    retVal = WS_recvfrom( s, buf, len, flags, from, p );
     if( fromlen16 ) *fromlen16 = fromlen32;
     return (INT16)retVal;
 }
@@ -1865,9 +1885,9 @@
 /***********************************************************************
  *		__ws_select
  */
-static INT __ws_select(BOOL b32,
+static int __ws_select(BOOL b32,
                        void *ws_readfds, void *ws_writefds, void *ws_exceptfds,
-                       const struct timeval* ws_timeout)
+                       const struct WS_timeval *ws_timeout)
 {
     int         highfd = 0;
     fd_set      readfds, writefds, exceptfds;
@@ -1875,8 +1895,8 @@
     int         readfd[FD_SETSIZE], writefd[FD_SETSIZE], exceptfd[FD_SETSIZE];
     struct timeval timeout, *timeoutaddr = NULL;
 
-    TRACE("read %p, write %p, excp %p timeout %p\n", 
-           ws_readfds, ws_writefds, ws_exceptfds, ws_timeout);
+    TRACE("read %p, write %p, excp %p timeout %p\n",
+          ws_readfds, ws_writefds, ws_exceptfds, ws_timeout);
 
     p_read = fd_set_import(&readfds, ws_readfds, &highfd, readfd, b32);
     p_write = fd_set_import(&writefds, ws_writefds, &highfd, writefd, b32);
@@ -1896,7 +1916,7 @@
         if (p_except && ws_exceptfds)
         {
 #define wsfds16 ((ws_fd_set16*)ws_exceptfds)
-#define wsfds32 ((ws_fd_set32*)ws_exceptfds)
+#define wsfds32 ((WS_fd_set*)ws_exceptfds)
             int i, j, count = (b32) ? wsfds32->fd_count : wsfds16->fd_count;
 
             for (i = j = 0; i < count; i++)
@@ -1924,9 +1944,9 @@
     fd_set_unimport(ws_readfds, readfd, b32);
     fd_set_unimport(ws_writefds, writefd, b32);
     fd_set_unimport(ws_exceptfds, exceptfd, b32);
-    if( ws_readfds ) ((ws_fd_set32*)ws_readfds)->fd_count = 0;
-    if( ws_writefds ) ((ws_fd_set32*)ws_writefds)->fd_count = 0;
-    if( ws_exceptfds ) ((ws_fd_set32*)ws_exceptfds)->fd_count = 0;
+    if( ws_readfds ) ((WS_fd_set*)ws_readfds)->fd_count = 0;
+    if( ws_writefds ) ((WS_fd_set*)ws_writefds)->fd_count = 0;
+    if( ws_exceptfds ) ((WS_fd_set*)ws_exceptfds)->fd_count = 0;
 
     if( highfd == 0 ) return 0;
     SetLastError(wsaErrno());
@@ -1938,7 +1958,7 @@
  */
 INT16 WINAPI WINSOCK_select16(INT16 nfds, ws_fd_set16 *ws_readfds,
                               ws_fd_set16 *ws_writefds, ws_fd_set16 *ws_exceptfds,
-                              struct timeval *timeout)
+                              struct WS_timeval* timeout)
 {
     return (INT16)__ws_select( FALSE, ws_readfds, ws_writefds, ws_exceptfds, timeout );
 }
@@ -1946,9 +1966,9 @@
 /***********************************************************************
  *		select			(WS2_32.18)
  */
-INT WINAPI WSOCK32_select(INT nfds, ws_fd_set32 *ws_readfds,
-                              ws_fd_set32 *ws_writefds, ws_fd_set32 *ws_exceptfds,
-                              const struct timeval *timeout)
+int WINAPI WS_select(int nfds, WS_fd_set *ws_readfds,
+                     WS_fd_set *ws_writefds, WS_fd_set *ws_exceptfds,
+                     const struct WS_timeval* timeout)
 {
     /* struct timeval is the same for both 32- and 16-bit code */
     return (INT)__ws_select( TRUE, ws_readfds, ws_writefds, ws_exceptfds, timeout );
@@ -1958,7 +1978,7 @@
 /***********************************************************************
  *		send			(WS2_32.19)
  */
-INT WINAPI WSOCK32_send(SOCKET s, char *buf, INT len, INT flags)
+int WINAPI WS_send(SOCKET s, const char *buf, int len, int flags)
 {
     int fd = _get_sock_fd(s);
 
@@ -2024,7 +2044,7 @@
   /* Send all buffers with the same flags */
   for(dwCount = 0; dwCount < dwBufferCount; dwCount++ )
   {
-    if( ( rc = WSOCK32_send( s, lpBuffers[ dwCount ].buf, 
+    if( ( rc = WS_send( s, lpBuffers[ dwCount ].buf, 
                              lpBuffers[ dwCount ].len, iFlags ) ) != 0 )
     {
       break;
@@ -2042,14 +2062,14 @@
  */
 INT16 WINAPI WINSOCK_send16(SOCKET16 s, char *buf, INT16 len, INT16 flags)
 {
-    return WSOCK32_send( s, buf, len, flags );
+    return WS_send( s, buf, len, flags );
 }
 
 /***********************************************************************
  *		sendto		(WS2_32.20)
  */
-int WINAPI WSOCK32_sendto(SOCKET s, const char *buf, int len, int flags,
-                              const ws_sockaddr *to, int tolen)
+int WINAPI WS_sendto(SOCKET s, const char *buf, int len, int flags,
+                              const struct WS_sockaddr *to, int tolen)
 {
     int fd = _get_sock_fd(s);
     int res;
@@ -2097,16 +2117,16 @@
  *              sendto		(WINSOCK.20)
  */
 INT16 WINAPI WINSOCK_sendto16(SOCKET16 s, char *buf, INT16 len, INT16 flags,
-                              ws_sockaddr *to, INT16 tolen)
+                              struct WS_sockaddr *to, INT16 tolen)
 {
-    return (INT16)WSOCK32_sendto( s, buf, len, flags, to, tolen );
+    return (INT16)WS_sendto( s, buf, len, flags, to, tolen );
 }
 
 /***********************************************************************
  *		setsockopt		(WS2_32.21)
  */
-INT WINAPI WSOCK32_setsockopt(SOCKET16 s, INT level, INT optname, 
-                                  char *optval, INT optlen)
+int WINAPI WS_setsockopt(SOCKET s, int level, int optname, 
+                                  const char *optval, int optlen)
 {
     int fd = _get_sock_fd(s);
 
@@ -2144,7 +2164,7 @@
                 /* FIXME: what is documented behavior if SO_LINGER optval
                    is null?? */
                 optval = (char*)&linger;
-                optlen = sizeof(struct linger);
+                optlen = sizeof(struct WS_linger);
             } else if (optlen < sizeof(int)){
                 woptval= *((INT16 *) optval);
                 optval= (char*) &woptval;
@@ -2176,14 +2196,14 @@
                                   char *optval, INT16 optlen)
 {
     if( !optval ) return SOCKET_ERROR;
-    return (INT16)WSOCK32_setsockopt( s, (UINT16)level, optname, optval, optlen );
+    return (INT16)WS_setsockopt( s, (UINT16)level, optname, optval, optlen );
 }
 
 
 /***********************************************************************
  *		shutdown		(WS2_32.22)
  */
-INT WINAPI WSOCK32_shutdown(SOCKET s, INT how)
+int WINAPI WS_shutdown(SOCKET s, int how)
 {
     int fd = _get_sock_fd(s);
 
@@ -2236,14 +2256,14 @@
  */
 INT16 WINAPI WINSOCK_shutdown16(SOCKET16 s, INT16 how)
 {
-    return (INT16)WSOCK32_shutdown( s, how );
+    return (INT16)WS_shutdown( s, how );
 }
 
 
 /***********************************************************************
  *		socket		(WS2_32.23)
  */
-SOCKET WINAPI WSOCK32_socket(INT af, INT type, INT protocol)
+SOCKET WINAPI WS_socket(int af, int type, int protocol)
 {
     SOCKET ret;
 
@@ -2326,7 +2346,7 @@
  */
 SOCKET16 WINAPI WINSOCK_socket16(INT16 af, INT16 type, INT16 protocol)
 {
-    return (SOCKET16)WSOCK32_socket( af, type, protocol );
+    return (SOCKET16)WS_socket( af, type, protocol );
 }
     
 
@@ -2398,8 +2418,8 @@
 /***********************************************************************
  *		gethostbyaddr		(WS2_32.51)
  */
-WIN_hostent* WINAPI WSOCK32_gethostbyaddr(const char *addr, INT len,
-                                                INT type)
+struct WS_hostent* WINAPI WS_gethostbyaddr(const char *addr, int len,
+                                                int type)
 {
     TRACE("ptr %08x, len %d, type %d\n",
                              (unsigned) addr, len, type);
@@ -2460,7 +2480,7 @@
 /***********************************************************************
  *		gethostbyname		(WS2_32.52)
  */
-WIN_hostent* WINAPI WSOCK32_gethostbyname(const char* name)
+struct WS_hostent* WINAPI WS_gethostbyname(const char* name)
 {
     TRACE("%s\n", (name)?name:NULL_STRING);
     return __ws_gethostbyname( name, WS_DUP_LINEAR );
@@ -2505,7 +2525,7 @@
 /***********************************************************************
  *		getprotobyname		(WS2_32.53)
  */
-WIN_protoent* WINAPI WSOCK32_getprotobyname(const char* name)
+struct WS_protoent* WINAPI WS_getprotobyname(const char* name)
 {
     TRACE("%s\n", (name)?name:NULL_STRING);
     return __ws_getprotobyname(name, WS_DUP_LINEAR);
@@ -2549,7 +2569,7 @@
 /***********************************************************************
  *		getprotobynumber	(WS2_32.54)
  */
-WIN_protoent* WINAPI WSOCK32_getprotobynumber(INT number)
+struct WS_protoent* WINAPI WS_getprotobynumber(int number)
 {
     TRACE("%i\n", number);
     return __ws_getprotobynumber(number, WS_DUP_LINEAR);
@@ -2602,7 +2622,7 @@
 /***********************************************************************
  *		getservbyname		(WS2_32.55)
  */
-WIN_servent* WINAPI WSOCK32_getservbyname(const char *name, const char *proto)
+struct WS_servent* WINAPI WS_getservbyname(const char *name, const char *proto)
 {
     TRACE("'%s', '%s'\n",
                             (name)?name:NULL_STRING, (proto)?proto:NULL_STRING);
@@ -2651,7 +2671,7 @@
 /***********************************************************************
  *		getservbyport		(WS2_32.56)
  */
-WIN_servent* WINAPI WSOCK32_getservbyport(INT port, const char *proto)
+struct WS_servent* WINAPI WS_getservbyport(int port, const char *proto)
 {
     TRACE("%d (i.e. port %d), '%s'\n",
                             (int)port, (int)ntohl(port), (proto)?proto:NULL_STRING);
@@ -2662,7 +2682,7 @@
 /***********************************************************************
  *              gethostname           (WS2_32.57)
  */
-INT WINAPI WSOCK32_gethostname(char *name, INT namelen)
+int WINAPI WS_gethostname(char *name, int namelen)
 {
     TRACE("name %p, len %d\n", name, namelen);
 
@@ -2681,7 +2701,7 @@
  */
 INT16 WINAPI WINSOCK_gethostname16(char *name, INT16 namelen)
 {
-    return (INT16)WSOCK32_gethostname(name, namelen);
+    return (INT16)WS_gethostname(name, namelen);
 }
 
 
@@ -2861,7 +2881,8 @@
  *
  * See description for WSARecvEx()
  */
-INT16     WINAPI WSARecvEx16(SOCKET16 s, char *buf, INT16 len, INT16 *flags) {
+INT16     WINAPI WSARecvEx16(SOCKET16 s, char *buf, INT16 len, INT16 *flags)
+{
   FIXME("(WSARecvEx16) partial packet return value not set \n");
 
   return WINSOCK_recv16(s, buf, len, *flags);
@@ -2907,7 +2928,7 @@
    TRACE("af=%d type=%d protocol=%d protocol_info=%p group=%d flags=0x%lx\n", 
          af, type, protocol, lpProtocolInfo, g, dwFlags );
 
-   return ( WSOCK32_socket (af, type, protocol) );
+   return ( WS_socket (af, type, protocol) );
 }
 
 
@@ -2928,7 +2949,7 @@
 /***********************************************************************
  *      __WSAFDIsSet			(WS2_32.151)
  */
-INT WINAPI __WSAFDIsSet(SOCKET s, ws_fd_set32 *set)
+int WINAPI __WSAFDIsSet(SOCKET s, WS_fd_set *set)
 {
   int i = set->fd_count;
 
@@ -3080,7 +3101,7 @@
 	char *p_name,*p_aliases,*p_addr,*p_base,*p;
 	char *p_to;
 	struct ws_hostent16 *p_to16;
-	struct ws_hostent32 *p_to32;
+	struct WS_hostent *p_to32;
 
 	check_buffer_he(size);
 	p_to = he_buffer;
@@ -3091,7 +3112,7 @@
 	p_base = (flag & WS_DUP_OFFSET) ? NULL
 	    : ((flag & WS_DUP_SEGPTR) ? (char*)SEGPTR_GET(p) : p);
 	p += (flag & WS_DUP_SEGPTR) ?
-	    sizeof(struct ws_hostent16) : sizeof(struct ws_hostent32);
+	    sizeof(struct ws_hostent16) : sizeof(struct WS_hostent);
 	p_name = p;
 	strcpy(p, p_he->h_name); p += strlen(p) + 1;
 	p_aliases = p;
@@ -3115,7 +3136,7 @@
 	    p_to32->h_name = (p_base + (p_name - p_to));
 	    p_to32->h_aliases = (char **)(p_base + (p_aliases - p_to));
 	    p_to32->h_addr_list = (char **)(p_base + (p_addr - p_to));
-	    size += (sizeof(struct ws_hostent32) - sizeof(struct hostent));
+	    size += (sizeof(struct WS_hostent) - sizeof(struct hostent));
 	}
     }
     return size;
@@ -3140,7 +3161,7 @@
     {
 	char *p_to;
 	struct ws_protoent16 *p_to16;
-	struct ws_protoent32 *p_to32;
+	struct WS_protoent *p_to32;
 	char *p_name,*p_aliases,*p_base,*p;
 
 	check_buffer_pe(size);
@@ -3151,7 +3172,7 @@
 	p_base = (flag & WS_DUP_OFFSET) ? NULL
 	    : ((flag & WS_DUP_SEGPTR) ? (char*)SEGPTR_GET(p) : p);
 	p += (flag & WS_DUP_SEGPTR) ?
-	    sizeof(struct ws_protoent16) : sizeof(struct ws_protoent32);
+	    sizeof(struct ws_protoent16) : sizeof(struct WS_protoent);
 	p_name = p;
 	strcpy(p, p_pe->p_name); p += strlen(p) + 1;
 	p_aliases = p;
@@ -3169,7 +3190,7 @@
 	    p_to32->p_proto = p_pe->p_proto;
 	    p_to32->p_name = (p_base) + (p_name - p_to);
 	    p_to32->p_aliases = (char **)((p_base) + (p_aliases - p_to)); 
-	    size += (sizeof(struct ws_protoent32) - sizeof(struct protoent));
+	    size += (sizeof(struct WS_protoent) - sizeof(struct protoent));
 	}
     }
     return size;
@@ -3195,7 +3216,7 @@
 	char *p_name,*p_aliases,*p_proto,*p_base,*p;
 	char *p_to;
 	struct ws_servent16 *p_to16;
-	struct ws_servent32 *p_to32;
+	struct WS_servent *p_to32;
 
 	check_buffer_se(size);
 	p_to = se_buffer;
@@ -3205,7 +3226,7 @@
 	p_base = (flag & WS_DUP_OFFSET) ? NULL 
 	    : ((flag & WS_DUP_SEGPTR) ? (char*)SEGPTR_GET(p) : p);
 	p += (flag & WS_DUP_SEGPTR) ?
-	    sizeof(struct ws_servent16) : sizeof(struct ws_servent32);
+	    sizeof(struct ws_servent16) : sizeof(struct WS_servent);
 	p_name = p;
 	strcpy(p, p_se->s_name); p += strlen(p) + 1;
 	p_proto = p;
@@ -3227,7 +3248,7 @@
 	    p_to32->s_name = (p_base + (p_name - p_to));
 	    p_to32->s_proto = (p_base + (p_proto - p_to));
 	    p_to32->s_aliases = (char **)(p_base + (p_aliases - p_to));
-	    size += (sizeof(struct ws_servent32) - sizeof(struct servent));
+	    size += (sizeof(struct WS_servent) - sizeof(struct servent));
 	}
     }
     return size;
@@ -3331,7 +3352,7 @@
  *              WSARecvFrom             (WS2_32.69)
  */
 INT WINAPI WSARecvFrom( SOCKET s, LPWSABUF lpBuffers, DWORD dwBufferCount,
-                        LPDWORD lpNumberOfBytesRecvd, LPDWORD lpFlags, struct sockaddr *lpFrom,
+                        LPDWORD lpNumberOfBytesRecvd, LPDWORD lpFlags, struct WS_sockaddr *lpFrom,
                         LPINT lpFromlen, LPWSAOVERLAPPED lpOverlapped,
                         LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine )
 {
@@ -3345,7 +3366,7 @@
   for( dwCount = 0, rc = 0; dwCount < dwBufferCount; dwCount++ )
   {
 
-    if( ( rc = WSOCK32_recvfrom(s, lpBuffers[ dwCount ].buf, (INT)lpBuffers[ dwCount ].len,
+    if( ( rc = WS_recvfrom(s, lpBuffers[ dwCount ].buf, (INT)lpBuffers[ dwCount ].len,
                                 (INT)*lpFlags, lpFrom, lpFromlen ) ) != 0 )
     {
        break;
diff --git a/dlls/winsock/winsock.spec b/dlls/winsock/winsock.spec
index e52544d..99237b5 100644
--- a/dlls/winsock/winsock.spec
+++ b/dlls/winsock/winsock.spec
@@ -14,14 +14,14 @@
 5   pascal16 getpeername(word ptr ptr) WINSOCK_getpeername16
 6   pascal16 getsockname(word ptr ptr) WINSOCK_getsockname16
 7   pascal16 getsockopt(word word word ptr ptr) WINSOCK_getsockopt16
-8   pascal   htonl(long) WINSOCK_htonl
-9   pascal16 htons(word) WINSOCK_htons
-10  pascal   inet_addr(ptr) WINSOCK_inet_addr
+8   pascal   htonl(long) WS_htonl
+9   pascal16 htons(word) WS_htons
+10  pascal   inet_addr(ptr) WS_inet_addr
 11  pascal   inet_ntoa(long) WINSOCK_inet_ntoa16
 12  pascal16 ioctlsocket(word long ptr) WINSOCK_ioctlsocket16
 13  pascal16 listen(word word) WINSOCK_listen16
-14  pascal   ntohl(long) WINSOCK_ntohl
-15  pascal16 ntohs(word) WINSOCK_ntohs
+14  pascal   ntohl(long) WS_ntohl
+15  pascal16 ntohs(word) WS_ntohs
 16  pascal16 recv(word ptr word word) WINSOCK_recv16
 17  pascal16 recvfrom(word ptr word word ptr ptr) WINSOCK_recvfrom16
 18  pascal16 select(word ptr ptr ptr ptr) WINSOCK_select16
diff --git a/dlls/winsock/ws2_32.spec b/dlls/winsock/ws2_32.spec
index 85ff47d..8958ea7 100644
--- a/dlls/winsock/ws2_32.spec
+++ b/dlls/winsock/ws2_32.spec
@@ -4,7 +4,7 @@
 
 name ws2_32
 type win32
-init WSOCK32_LibMain
+init WS_LibMain
 
 import user32.dll
 import kernel32.dll
@@ -13,29 +13,29 @@
 debug_channels (winsock)
 
 #  EXPORTS ***********
-1   stdcall  accept(long ptr ptr) WSOCK32_accept
-2   stdcall  bind(long ptr long) WSOCK32_bind
-3   stdcall  closesocket(long) WSOCK32_closesocket
-4   stdcall  connect(long ptr long) WSOCK32_connect
-5   stdcall  getpeername(long ptr ptr) WSOCK32_getpeername
-6   stdcall  getsockname(long ptr ptr) WSOCK32_getsockname
-7   stdcall  getsockopt(long long long ptr ptr) WSOCK32_getsockopt
-8   stdcall  htonl(long) WINSOCK_htonl
-9   stdcall  htons(long) WINSOCK_htons
-10  stdcall  ioctlsocket(long long ptr) WSOCK32_ioctlsocket
-11  stdcall  inet_addr(str) WINSOCK_inet_addr
-12  stdcall  inet_ntoa(ptr) WSOCK32_inet_ntoa
-13  stdcall  listen(long long) WSOCK32_listen
-14  stdcall  ntohl(long) WINSOCK_ntohl
-15  stdcall  ntohs(long) WINSOCK_ntohs
-16  stdcall  recv(long ptr long long) WSOCK32_recv
-17  stdcall  recvfrom(long ptr long long ptr ptr) WSOCK32_recvfrom
-18  stdcall  select(long ptr ptr ptr ptr) WSOCK32_select
-19  stdcall  send(long ptr long long) WSOCK32_send
-20  stdcall  sendto(long ptr long long ptr long) WSOCK32_sendto
-21  stdcall  setsockopt(long long long ptr long) WSOCK32_setsockopt
-22  stdcall  shutdown(long long) WSOCK32_shutdown
-23  stdcall  socket(long long long) WSOCK32_socket
+1   stdcall  accept(long ptr ptr) WS_accept
+2   stdcall  bind(long ptr long) WS_bind
+3   stdcall  closesocket(long) WS_closesocket
+4   stdcall  connect(long ptr long) WS_connect
+5   stdcall  getpeername(long ptr ptr) WS_getpeername
+6   stdcall  getsockname(long ptr ptr) WS_getsockname
+7   stdcall  getsockopt(long long long ptr ptr) WS_getsockopt
+8   stdcall  htonl(long) WS_htonl
+9   stdcall  htons(long) WS_htons
+10  stdcall  ioctlsocket(long long ptr) WS_ioctlsocket
+11  stdcall  inet_addr(str) WS_inet_addr
+12  stdcall  inet_ntoa(ptr) WS_inet_ntoa
+13  stdcall  listen(long long) WS_listen
+14  stdcall  ntohl(long) WS_ntohl
+15  stdcall  ntohs(long) WS_ntohs
+16  stdcall  recv(long ptr long long) WS_recv
+17  stdcall  recvfrom(long ptr long long ptr ptr) WS_recvfrom
+18  stdcall  select(long ptr ptr ptr ptr) WS_select
+19  stdcall  send(long ptr long long) WS_send
+20  stdcall  sendto(long ptr long long ptr long) WS_sendto
+21  stdcall  setsockopt(long long long ptr long) WS_setsockopt
+22  stdcall  shutdown(long long) WS_shutdown
+23  stdcall  socket(long long long) WS_socket
 24  stdcall  WSApSetPostRoutine(ptr) WSApSetPostRoutine
 25  stub     WPUCompleteOverlappedRequest
 26  stub     WSAAccept
@@ -63,13 +63,13 @@
 48  stub     WSAInstallServiceClassA
 49  stub     WSAInstallServiceClassW
 50  stdcall  WSAIoctl(long long ptr long ptr long ptr ptr ptr) WSAIoctl
-51  stdcall  gethostbyaddr(ptr long long) WSOCK32_gethostbyaddr
-52  stdcall  gethostbyname(str) WSOCK32_gethostbyname
-53  stdcall  getprotobyname(str) WSOCK32_getprotobyname
-54  stdcall  getprotobynumber(long) WSOCK32_getprotobynumber
-55  stdcall  getservbyname(str str) WSOCK32_getservbyname
-56  stdcall  getservbyport(long str) WSOCK32_getservbyport
-57  stdcall  gethostname(ptr long) WSOCK32_gethostname
+51  stdcall  gethostbyaddr(ptr long long) WS_gethostbyaddr
+52  stdcall  gethostbyname(str) WS_gethostbyname
+53  stdcall  getprotobyname(str) WS_getprotobyname
+54  stdcall  getprotobynumber(long) WS_getprotobynumber
+55  stdcall  getservbyname(str str) WS_getservbyname
+56  stdcall  getservbyport(long str) WS_getservbyport
+57  stdcall  gethostname(ptr long) WS_gethostname
 58  stub     WSAJoinLeaf
 59  stub     WSALookupServiceBeginA
 60  stub     WSALookupServiceBeginW
diff --git a/dlls/wsock32/protocol.c b/dlls/wsock32/protocol.c
index 5b819f1..3a1b567 100644
--- a/dlls/wsock32/protocol.c
+++ b/dlls/wsock32/protocol.c
@@ -4,10 +4,20 @@
  * Copyright (C) 2001 Stefan Leichter
  */
 
+/* All we need are a couple constants for EnumProtocols. Once it is 
+ * moved to ws2_32 we may no longer need it
+ */
+#define USE_WS_PREFIX
+
 #include "config.h"
 
+#include <arpa/inet.h>
+#include <netdb.h>
+#include <netinet/in.h>
 #include <stdio.h>
 #include <string.h>
+#include <sys/socket.h>
+
 #include "winbase.h"
 #include "winnls.h"
 #include "wine/unicode.h"
@@ -52,12 +62,12 @@
 
   *lpSize = sizeof( PROTOCOL_INFOA);
   switch (iProtocol) {
-    case IPPROTO_TCP :
+    case WS_IPPROTO_TCP :
         dwLength = (unicode) ? sizeof(WCHAR) * (strlenW(NameTcp)+1) :
                                WideCharToMultiByte( CP_ACP, 0, NameTcp, -1,
                                                     NULL, 0, NULL, NULL);
       break;
-    case IPPROTO_UDP :
+    case WS_IPPROTO_UDP :
         dwLength = (unicode) ? sizeof(WCHAR) * (strlenW(NameUdp)+1) :
                                WideCharToMultiByte( CP_ACP, 0, NameUdp, -1,
                                                     NULL, 0, NULL, NULL);
@@ -97,7 +107,7 @@
   lpBuffer->iProtocol  = iProtocol;
 
   switch (iProtocol) {
-    case IPPROTO_TCP :
+    case WS_IPPROTO_TCP :
         lpBuffer->dwServiceFlags = XP_FRAGMENTATION      | XP_EXPEDITED_DATA     |
                                    XP_GRACEFUL_CLOSE     | XP_GUARANTEED_ORDER   |
                                    XP_GUARANTEED_DELIVERY;
@@ -108,7 +118,7 @@
         lpBuffer->dwMessageSize  = 0;
         lpProtName = NameTcp;
       break;
-    case IPPROTO_UDP :
+    case WS_IPPROTO_UDP :
         lpBuffer->dwServiceFlags = XP_FRAGMENTATION      | XP_SUPPORTS_BROADCAST |
                                    XP_SUPPORTS_MULTICAST | XP_MESSAGE_ORIENTED   |
                                    XP_CONNECTIONLESS;
@@ -162,6 +172,10 @@
   return iAnz;
 }
 
+/* FIXME: EnumProtocols should be moved to winsock2, and this should be 
+ * implemented by calling out to WSAEnumProtocols. See:
+ * http://support.microsoft.com/support/kb/articles/Q129/3/15.asp
+ */
 /*****************************************************************************
  *          WSOCK32_EnumProtocol [internal]
  *
@@ -194,7 +208,7 @@
                                  LPDWORD lpdwLength, BOOL unicode)
 { DWORD dwCurSize, dwOldSize = *lpdwLength, dwTemp;
   INT   anz = 0, i;
-  INT   iLocal[] = { IPPROTO_TCP, IPPROTO_UDP, NSPROTO_IPX, NSPROTO_SPXII, 0};
+  INT   iLocal[] = { WS_IPPROTO_TCP, WS_IPPROTO_UDP, NSPROTO_IPX, NSPROTO_SPXII, 0};
 
   if (!lpiProtocols) lpiProtocols = iLocal;
 
diff --git a/dlls/wsock32/socket.c b/dlls/wsock32/socket.c
index 05e0b6d..1440f68 100644
--- a/dlls/wsock32/socket.c
+++ b/dlls/wsock32/socket.c
@@ -5,17 +5,23 @@
  */
 
 
-/*
-  FIXME: This hack is fixing a problem in WsControl.  When we call socket(),
-         it is supposed to call into ws2_32's WSOCK32_socket.
-         The problem is that socket() is predefined in a linux system header that 
-         we are including, which is different from the WINE definition.
-         (cdecl vs. stdapi)  The result is stack corruption.
+/* FIXME: This hack is fixing a problem in WsControl.  When we call socket(),
+ * it will call into ws2_32's WSOCK32_socket (because of the redirection in 
+ * our own .spec file).
+ * The problem is that socket() is predefined in a linux system header that 
+ * we are including, which is different from the WINE definition.
+ * (cdecl vs. stdapi).  The result is stack corruption.
+ * Furthermore WsControl uses Unix macros and types. This forces us to include 
+ * the Unix headers which then conflict with the winsock headers. This forces
+ * us to use USE_WS_PREFIX but then ioctlsocket is called WS_ioctlsocket, 
+ * which causes link problems. The correct solution is to implement 
+ * WsControl using calls to WSAIoctl. Then we should no longer need to use the 
+ * Unix headers. This would also have the advantage of reducing code 
+ * duplication.
+ * Until that happens we need this ugly hack.
+ */
+#define USE_WS_PREFIX
 
-         The correct answer to this problem is to make winsock.h not dependent 
-         on system headers, that way all of our functions are defined consistently.
-         Until that happens we need this hack.
-*/
 #define socket  linux_socket
 #define recv    linux_recv
 /* */
@@ -31,6 +37,7 @@
 #include "winnt.h"
 #include "wscontrol.h"
 #include <ctype.h>
+#include <fcntl.h>
 #include <sys/ioctl.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -48,11 +55,15 @@
 #endif
 
 /* FIXME: The rest of the socket() cdecl<->stdapi stack corruption problem
-          discussed above. */
+ * discussed above.
+ */
 #undef socket
 #undef recv
 extern SOCKET WINAPI socket(INT af, INT type, INT protocol);
 extern SOCKET WINAPI recv(SOCKET,char*,int,int);
+/* Plus some missing prototypes, due to the WS_ prefixing */
+extern int    WINAPI closesocket(SOCKET);
+extern int    WINAPI ioctlsocket(SOCKET,long,u_long*);
 /* */
 
 
@@ -199,7 +210,7 @@
                      }
                
                      /* Get a socket so that we can use ioctl */
-                     if ( (sock = socket (AF_INET, SOCK_DGRAM, 0)) == INVALID_SOCKET)
+                     if ( (sock = socket(AF_INET, SOCK_DGRAM, 0)) == INVALID_SOCKET)
                      {
                         ERR ("Error creating socket!\n");
                         return (-1);
@@ -365,7 +376,7 @@
                
                
                /* Get a socket so we can use ioctl */
-               if ( (sock = socket (AF_INET, SOCK_DGRAM, 0)) == INVALID_SOCKET)
+               if ( (sock = socket(AF_INET, SOCK_DGRAM, 0)) == INVALID_SOCKET)
                {
                   ERR ("Error creating socket!\n");
                   return (-1);
@@ -380,13 +391,13 @@
                /* IP Address */
                strcpy (ifInfo.ifr_name, ifName);
 	       ifInfo.ifr_addr.sa_family = AF_INET;
-	       if (ioctlsocket(sock, SIOCGIFADDR, (ULONG*)&ifInfo) < 0) 
+	       if (ioctlsocket(sock, SIOCGIFADDR, (ULONG*)&ifInfo) < 0)
                {
                   baseIPInfo->iae_addr = 0x0;
                }
                else
                {
-                  struct ws_sockaddr_in *ipTemp = (struct ws_sockaddr_in *)&ifInfo.ifr_addr;
+                  struct WS_sockaddr_in* ipTemp = (struct WS_sockaddr_in*)&ifInfo.ifr_addr;
                   baseIPInfo->iae_addr = ipTemp->sin_addr.S_un.S_addr;
                }
                
@@ -398,8 +409,8 @@
                }
 	       else
                {
-                  struct ws_sockaddr_in *ipTemp = (struct ws_sockaddr_in *)&ifInfo.ifr_broadaddr;
-                  baseIPInfo->iae_bcastaddr = ipTemp->sin_addr.S_un.S_addr; 
+                  struct WS_sockaddr_in* ipTemp = (struct WS_sockaddr_in*)&ifInfo.ifr_broadaddr;
+                  baseIPInfo->iae_bcastaddr = ipTemp->sin_addr.S_un.S_addr;
                }
 
                /* Subnet Mask */
@@ -417,12 +428,12 @@
                         baseIPInfo->iae_mask = 0;
                         ERR ("Unable to determine Netmask on your platform!\n");
                      #else
-                        struct ws_sockaddr_in *ipTemp = (struct ws_sockaddr_in *)&ifInfo.ifr_addr;
-                        baseIPInfo->iae_mask = ipTemp->sin_addr.S_un.S_addr; 
+                        struct WS_sockaddr_in* ipTemp = (struct WS_sockaddr_in*)&ifInfo.ifr_addr;
+                        baseIPInfo->iae_mask = ipTemp->sin_addr.S_un.S_addr;
                      #endif
-                  #else  
-                     struct ws_sockaddr_in *ipTemp = (struct ws_sockaddr_in *)&ifInfo.ifr_netmask;
-                     baseIPInfo->iae_mask = ipTemp->sin_addr.S_un.S_addr; 
+                  #else
+                     struct WS_sockaddr_in* ipTemp = (struct WS_sockaddr_in*)&ifInfo.ifr_netmask;
+                     baseIPInfo->iae_mask = ipTemp->sin_addr.S_un.S_addr;
                   #endif
                }
 
@@ -959,7 +970,7 @@
 /***********************************************************************
  *       s_perror         (WSOCK32.1108)
  */
-void WINAPI WS_s_perror(LPCSTR message)
+void WINAPI s_perror(LPCSTR message)
 {
     FIXME("(%s): stub\n",message);
     return;
diff --git a/dlls/wsock32/wsock32.spec b/dlls/wsock32/wsock32.spec
index 5ddd20b..e2e6cb07 100644
--- a/dlls/wsock32/wsock32.spec
+++ b/dlls/wsock32/wsock32.spec
@@ -68,7 +68,7 @@
 #1105 stub sethostname
 #1106 stub dn_expand
 1107 stdcall WSARecvEx(long ptr long ptr) WSARecvEx
-1108 stdcall s_perror(str) WS_s_perror
+1108 stdcall s_perror(str) s_perror
 1109 stub GetAddressByNameA
 1110 stub GetAddressByNameW
 1111 stdcall EnumProtocolsA(ptr ptr ptr) EnumProtocolsA
diff --git a/include/Makefile.in b/include/Makefile.in
index fbe99f7..82a413a 100644
--- a/include/Makefile.in
+++ b/include/Makefile.in
@@ -188,6 +188,7 @@
 	wnaspi32.h \
 	wownt32.h \
 	ws2spi.h \
+	ws2tcpip.h \
 	wshisotp.h \
 	wsipx.h \
 	wtypes.h \
diff --git a/include/windows.h b/include/windows.h
index 595294f..a041926 100644
--- a/include/windows.h
+++ b/include/windows.h
@@ -35,8 +35,10 @@
 #include "shellapi.h"
 /* #include "winperf.h" */
 
+#ifndef WINE_NOWINSOCK
 #include "winsock2.h"
 /* #include "mswsock.h" */
+#endif /* WINE_NOWINSOCK */
 
 #ifndef NOCRYPT
 #include "wincrypt.h"
diff --git a/include/wine/winsock16.h b/include/wine/winsock16.h
index 21890e4..9306771 100644
--- a/include/wine/winsock16.h
+++ b/include/wine/winsock16.h
@@ -60,7 +60,7 @@
 #include "poppack.h"
 
 #define WS_FD_CLR16(fd, set)   __WS_FD_CLR((fd),(set), ws_fd_set16)
-#define WS_FD_SET16(fd, set)   __WS_FD_SET((fd),(set), ws_fd_set16)
+#define WS_FD_SET16(fd, set)   __WS_FD_SET1((fd),(set), ws_fd_set16)
 #define WS_FD_ZERO16(set)      (((ws_fd_set16*)(set))->fd_count=0)
 #define WS_FD_ISSET16(fd, set) __WSAFDIsSet16((SOCKET16)(fd), (ws_fd_set16*)(set))
 
diff --git a/include/winsock.h b/include/winsock.h
index 124154d..502ca8c 100644
--- a/include/winsock.h
+++ b/include/winsock.h
@@ -4,113 +4,415 @@
  * specification.
  */
 
+#ifdef __WINE__
+# ifndef __WINE_WINSOCK2__
+#  error Please use Winsock2 in Wine
+# endif
+#endif
+
 #ifndef _WINSOCKAPI_
 #define _WINSOCKAPI_
 
-#ifndef RC_INVOKED
-#include <sys/types.h>
-
 #ifndef __WINE__
-#if defined(__svr4__) || defined(__NetBSD__) || defined(__FreeBSD__)
-#ifndef HAVE_SYS_SOCKET_H
-#define HAVE_SYS_SOCKET_H
-#endif /* HAVE_SYS_SOCKET_H */
-#endif /* __svr4__ || __NetBSD__ || __FreeBSD__ */
-#endif /* __WINE__ */
-
-/* Solaris uses these macro names */
-#undef FSHIFT
-#undef TRANSPARENT
-#include <netinet/in.h>
-/* Restore the Windows values */
-#ifdef _WINUSER_
-#undef FSHIFT
-#define FSHIFT            0x04
-#endif
-#ifdef _WINGDI_
-#undef TRANSPARENT
-#define TRANSPARENT       1
+# include "windows.h"
+#else
+# include "windef.h"
 #endif
 
-#ifdef	HAVE_ARPA_INET_H
-#include <arpa/inet.h>
-#endif	/* HAVE_ARPA_INET_H */
-#include <sys/time.h>
-#include <fcntl.h>
-#ifdef	HAVE_NETDB_H
-#include <netdb.h>
-#endif	/* HAVE_NETDB_H */
-#ifdef	HAVE_SYS_SOCKET_H
-#include <sys/socket.h>
-#endif	/* HAVE_SYS_SOCKET_H */
-#include <sys/ioctl.h>
-#endif /* RC_INVOKED */
+/*
+ * Setup phase
+ */
 
-#include "windef.h"
+#ifdef USE_WS_PREFIX
+# define WS(x)    WS_##x
+#else
+# define WS(x)    x
+#endif
+
 
 #ifdef __cplusplus
 extern "C" {
 #endif /* defined(__cplusplus) */
 
-/* no "forced" alignment of ws_XXXXent here ! */
-	
-typedef struct ws_hostent
+/* proper 4-byte packing */
+#include "pshpack4.h"
+
+/*
+ * This section defines the items that conflict with the Unix headers.
+ */
+
+#ifndef __WINE_USE_MSVCRT
+/* Get the u_xxx types from the Unix headers. They will do and 
+ * doing it this way will avoid redefinitions.
+ */
+# include <sys/types.h>
+#else
+/* Since we are using the MSVCRT headers, we must define the u_xxx 
+ * types ourselves.
+ */
+typedef unsigned char u_char;
+typedef unsigned char u_short;
+typedef unsigned int  u_int;
+typedef unsigned long u_long;
+#endif /* __WINE_USE_MSVCRT */
+
+
+
+/*
+ * Address families
+ */
+#ifndef USE_WS_PREFIX
+#define AF_UNSPEC                  0
+#define AF_UNIX                    1
+#define AF_INET                    2
+#define AF_IMPLINK                 3
+#define AF_PUP                     4
+#define AF_CHAOS                   5
+#define AF_NS                      6
+#define AF_IPX                     AF_NS
+#define AF_ISO                     7
+#define AF_OSI                     AF_ISO
+#define AF_ECMA                    8
+#define AF_DATAKIT                 9
+#define AF_CCITT                   10
+#define AF_SNA                     11
+#define AF_DECnet                  12
+#define AF_DLI                     13
+#define AF_LAT                     14
+#define AF_HYLINK                  15
+#define AF_APPLETALK               16
+#define AF_NETBIOS                 17
+#define AF_VOICEVIEW               18
+#define AF_FIREFOX                 19
+#define AF_UNKNOWN1                20
+#define AF_BAN                     21
+#define AF_ATM                     22
+#define AF_INET6                   23
+#define AF_CLUSTER                 24
+#define AF_12844                   25
+#define AF_IRDA                    26
+#define AF_MAX                     27
+#define PF_UNSPEC                  AF_UNSPEC
+#define PF_UNIX                    AF_UNIX
+#define PF_INET                    AF_INET
+#define PF_IMPLINK                 AF_IMPLINK
+#define PF_PUP                     AF_PUP
+#define PF_CHAOS                   AF_CHAOS
+#define PF_NS                      AF_NS
+#define PF_IPX                     AF_IPX
+#define PF_ISO                     AF_ISO
+#define PF_OSI                     AF_OSI
+#define PF_ECMA                    AF_ECMA
+#define PF_DATAKIT                 AF_DATAKIT
+#define PF_CCITT                   AF_CCITT
+#define PF_SNA                     AF_SNA
+#define PF_DECnet                  AF_DECnet
+#define PF_DLI                     AF_DLI
+#define PF_LAT                     AF_LAT
+#define PF_HYLINK                  AF_HYLINK
+#define PF_APPLETALK               AF_APPLETALK
+#define PF_VOICEVIEW               AF_VOICEVIEW
+#define PF_FIREFOX                 AF_FIREFOX
+#define PF_UNKNOWN1                AF_UNKNOWN1
+#define PF_BAN                     AF_BAN
+#define PF_MAX                     AF_MAX
+#else /* USE_WS_PREFIX */
+#define WS_AF_UNSPEC               0
+#define WS_AF_UNIX                 1
+#define WS_AF_INET                 2
+#define WS_AF_IMPLINK              3
+#define WS_AF_PUP                  4
+#define WS_AF_CHAOS                5
+#define WS_AF_NS                   6
+#define WS_AF_IPX                  WS_AF_NS
+#define WS_AF_ISO                  7
+#define WS_AF_OSI                  AF_ISO
+#define WS_AF_ECMA                 8
+#define WS_AF_DATAKIT              9
+#define WS_AF_CCITT                10
+#define WS_AF_SNA                  11
+#define WS_AF_DECnet               12
+#define WS_AF_DLI                  13
+#define WS_AF_LAT                  14
+#define WS_AF_HYLINK               15
+#define WS_AF_APPLETALK            16
+#define WS_AF_NETBIOS              17
+#define WS_AF_VOICEVIEW            18
+#define WS_AF_FIREFOX              19
+#define WS_AF_UNKNOWN1             20
+#define WS_AF_BAN                  21
+#define WS_AF_ATM                  22
+#define WS_AF_INET6                23
+#define WS_AF_CLUSTER              24
+#define WS_AF_12844                25
+#define WS_AF_IRDA                 26
+#define WS_AF_MAX                  27
+#endif /* USE_WS_PREFIX */
+
+/*
+ * Types
+ */
+#ifndef USE_WS_PREFIX
+#define SOCK_STREAM                1
+#define SOCK_DGRAM                 2
+#define SOCK_RAW                   3
+#define SOCK_RDM                   4
+#define SOCK_SEQPACKET             5
+#else /* USE_WS_PREFIX */
+#define WS_SOCK_STREAM             1
+#define WS_SOCK_DGRAM              2
+#define WS_SOCK_RAW                3
+#define WS_SOCK_RDM                4
+#define WS_SOCK_SEQPACKET          5
+#endif /* USE_WS_PREFIX */
+
+
+/*
+ * Protocols
+ */
+#ifndef USE_WS_PREFIX
+#define IPPROTO_IP                 0
+#define IPPROTO_ICMP               1
+#define IPPROTO_IGMP               2
+#define IPPROTO_GGP                3
+#define IPPROTO_TCP                6
+#define IPPROTO_UDP                17
+#define IPPROTO_IDP                22
+#define IPPROTO_ND                 77
+#define IPPROTO_RAW                255
+#define IPPROTO_MAX                256
+#else /* USE_WS_PREFIX */
+#define WS_IPPROTO_IP              0
+#define WS_IPPROTO_ICMP            1
+#define WS_IPPROTO_IGMP            2
+#define WS_IPPROTO_GGP             3
+#define WS_IPPROTO_TCP             6
+#define WS_IPPROTO_UDP             17
+#define WS_IPPROTO_IDP             22
+#define WS_IPPROTO_ND              77
+#define WS_IPPROTO_RAW             255
+#define WS_IPPROTO_MAX             256
+#endif /* USE_WS_PREFIX */
+
+typedef struct WS(protoent)
 {
-        char    *h_name;        /* official name of host */
-        char    **h_aliases;    /* alias list */
-        short   h_addrtype;     /* host address type */
-        short   h_length;       /* length of address */
-        char    **h_addr_list;  /* list of addresses from name server */
-} _ws_hostent;
+    char* p_name;
+    char** p_aliases;
+    short p_proto;
+} PROTOENT, *PPROTOENT, *LPPROTOENT;
 
-typedef struct ws_protoent
+
+
+/*
+ * Networks
+ */
+struct WS(netent)
 {
-        char    *p_name;        /* official protocol name */
-        char    **p_aliases;    /* alias list */
-        short   p_proto;        /* protocol # */
-} _ws_protoent;
+    char* n_name;                  /* official name of net */
+    char** n_aliases;              /* alias list */
+    short n_addrtype;              /* net address type */
+    u_long n_net;              /* network # */
+};
 
-typedef struct ws_servent 
+
+/*
+ * Services
+ */
+#ifndef USE_WS_PREFIX
+#define IPPORT_ECHO                7
+#define IPPORT_DISCARD             9
+#define IPPORT_SYSTAT              11
+#define IPPORT_DAYTIME             13
+#define IPPORT_NETSTAT             15
+#define IPPORT_FTP                 21
+#define IPPORT_TELNET              23
+#define IPPORT_SMTP                25
+#define IPPORT_TIMESERVER          37
+#define IPPORT_NAMESERVER          42
+#define IPPORT_WHOIS               43
+#define IPPORT_MTP                 57
+#define IPPORT_TFTP                69
+#define IPPORT_RJE                 77
+#define IPPORT_FINGER              79
+#define IPPORT_TTYLINK             87
+#define IPPORT_SUPDUP              95
+#define IPPORT_EXECSERVER          512
+#define IPPORT_LOGINSERVER         513
+#define IPPORT_CMDSERVER           514
+#define IPPORT_EFSSERVER           520
+#define IPPORT_BIFFUDP             512
+#define IPPORT_WHOSERVER           513
+#define IPPORT_ROUTESERVER         520
+#define IPPORT_RESERVED            1024
+#else /* USE_WS_PREFIX */
+#define WS_IPPORT_ECHO             7
+#define WS_IPPORT_DISCARD          9
+#define WS_IPPORT_SYSTAT           11
+#define WS_IPPORT_DAYTIME          13
+#define WS_IPPORT_NETSTAT          15
+#define WS_IPPORT_FTP              21
+#define WS_IPPORT_TELNET           23
+#define WS_IPPORT_SMTP             25
+#define WS_IPPORT_TIMESERVER       37
+#define WS_IPPORT_NAMESERVER       42
+#define WS_IPPORT_WHOIS            43
+#define WS_IPPORT_MTP              57
+#define WS_IPPORT_TFTP             69
+#define WS_IPPORT_RJE              77
+#define WS_IPPORT_FINGER           79
+#define WS_IPPORT_TTYLINK          87
+#define WS_IPPORT_SUPDUP           95
+#define WS_IPPORT_EXECSERVER       512
+#define WS_IPPORT_LOGINSERVER      513
+#define WS_IPPORT_CMDSERVER        514
+#define WS_IPPORT_EFSSERVER        520
+#define WS_IPPORT_BIFFUDP          512
+#define WS_IPPORT_WHOSERVER        513
+#define WS_IPPORT_ROUTESERVER      520
+#define WS_IPPORT_RESERVED         1024
+#endif /* USE_WS_PREFIX */
+
+typedef struct WS(servent)
 {
-        char    *s_name;        /* official service name */
-        char    **s_aliases;    /* alias list */
-        short   s_port;         /* port # */
-        char    *s_proto;       /* protocol to use */
-} _ws_servent;
+    char* s_name;                  /* official service name */
+    char** s_aliases;              /* alias list */
+    short s_port;                  /* port # */
+    char* s_proto;                 /* protocol to use */
+} SERVENT, *PSERVENT, *LPSERVENT;
 
-typedef struct ws_netent
+
+
+/*
+ * Hosts
+ */
+
+typedef struct WS(hostent)
 {
-        char    *n_name;        /* official name of net */
-        char    **n_aliases;    /* alias list */
-        short   n_addrtype;     /* net address type */
-        u_long  n_net;          /* network # */
-} _ws_netent;
+    char* h_name;                  /* official name of host */
+    char** h_aliases;              /* alias list */
+    short h_addrtype;              /* host address type */
+    short h_length;                /* length of address */
+    char** h_addr_list;            /* list of addresses from name server */
+#define h_addr h_addr_list[0]      /* address, for backward compat */
+} HOSTENT, *PHOSTENT, *LPHOSTENT;
 
-#include "pshpack1.h"
 
-typedef UINT		SOCKET;
+/*
+ * Sockets
+ */
 
-typedef struct sockaddr		ws_sockaddr;
+typedef u_int                  SOCKET;
 
-typedef struct ws_fd_set32_struct
+/*
+ * This is used instead of -1, since the
+ * SOCKET type is unsigned.
+ */
+#define INVALID_SOCKET             (~0)
+#define SOCKET_ERROR               (-1)
+
+typedef struct WS(sockaddr)
 {
-        UINT    fd_count;               /* how many are SET? */
-        SOCKET  fd_array[FD_SETSIZE];   /* an array of SOCKETs */
-} ws_fd_set32;
+        u_short sa_family;
+        char    sa_data[14];
+} SOCKADDR, *PSOCKADDR, *LPSOCKADDR;
 
+typedef struct WS(linger)
+{
+    u_short l_onoff;           /* option on/off */
+    u_short l_linger;          /* linger time */
+} LINGER, *PLINGER, *LPLINGER;
 
-/* ws_fd_set operations */
+/*
+ * Select
+ */
 
-INT WINAPI __WSAFDIsSet( SOCKET, ws_fd_set32 * );
+#if !defined(USE_WS_PREFIX) && !defined(__WINE_USE_MSVCRT)
+/* We are not using the WS_ prefix and not using the MSVCRT either so we 
+ * risk getting conflicts for everything related to select.
+ */
+# ifdef FD_CLR
+/* Too late, the Unix version of stdlib.h was included before winsock.h. 
+ * This means select and all the related stuff is already defined and we 
+ * cannot override types and function prototypes.
+ * All we can do is disable all these symbols so that they are not used 
+ * inadvertantly.
+ */
+#  undef FD_SETSIZE
+#  undef FD_CLR
+#  undef FD_SET
+#  undef FD_ZERO
+#  undef FD_ISSET
 
-#define __WS_FD_CLR(fd, set, cast) do { \
-    UINT __i; \
+#  define FD_SETSIZE Include_winsock_h_before_stdlib_h_or_use_the_MSVCRT_library
+#  define FD_CLR     Include_winsock_h_before_stdlib_h_or_use_the_MSVCRT_library
+#  define FD_SET     Include_winsock_h_before_stdlib_h_or_use_the_MSVCRT_library
+#  define FD_ZERO    Include_winsock_h_before_stdlib_h_or_use_the_MSVCRT_library
+#  define FD_ISSET   Include_winsock_h_before_stdlib_h_or_use_the_MSVCRT_library
+#  define fd_set     Include_winsock_h_before_stdlib_h_or_use_the_MSVCRT_library
+#  define select     Include_winsock_h_before_stdlib_h_or_use_the_MSVCRT_library
+# else
+/* stdlib.h has not been included yet so it's not too late. Include it now 
+ * making sure that none of the select symbols is affected. Then we can 
+ * define them with our own values.
+ */
+#  define fd_set unix_fd_set
+#  define timeval unix_timeval
+#  define select unix_select
+#  include <stdlib.h>
+#  undef fd_set
+#  undef timeval
+#  undef select
+#  undef FD_SETSIZE
+#  undef FD_CLR
+#  undef FD_SET
+#  undef FD_ZERO
+#  undef FD_ISSET
+
+#  define WS_DEFINE_SELECT
+# endif /* FD_CLR */
+
+#else
+# define WS_DEFINE_SELECT
+#endif /* !USE_WS_PREFIX && !__WINE_USE_MSVCRT */
+
+#ifdef WS_DEFINE_SELECT
+# undef WS_DEFINE_SELECT
+/* Define our own version of select and the associated types and macros */
+
+# ifndef USE_WS_PREFIX
+#  ifndef FD_SETSIZE
+#   define FD_SETSIZE              64
+#  endif
+# else
+#  ifndef WS_FD_SETSIZE
+#   define WS_FD_SETSIZE           64
+#  endif
+# endif
+
+typedef struct WS(fd_set)
+{
+    u_int fd_count;            /* how many are SET? */
+# ifndef USE_WS_PREFIX
+    SOCKET fd_array[FD_SETSIZE];   /* an array of SOCKETs */
+# else
+    SOCKET fd_array[WS_FD_SETSIZE];/* an array of SOCKETs */
+# endif
+} WS(fd_set), FD_SET, *PFD_SET, *LPFD_SET;
+
+typedef struct WS(timeval)
+{
+    long    tv_sec;                /* seconds */
+    long    tv_usec;               /* and microseconds */
+} TIMEVAL, *PTIMEVAL, *LPTIMEVAL;
+
+#define WINE_FD_CLR(fd, set, cast) do { \
+    u_int __i; \
     for (__i = 0; __i < ((cast*)(set))->fd_count ; __i++) \
     { \
         if (((cast*)(set))->fd_array[__i] == fd) \
-	{ \
+        { \
             while (__i < ((cast*)(set))->fd_count-1) \
-	    { \
+            { \
                 ((cast*)(set))->fd_array[__i] = \
                     ((cast*)(set))->fd_array[__i+1]; \
                 __i++; \
@@ -120,146 +422,269 @@
         } \
     } \
 } while(0)
-#define WS_FD_CLR(fd, set)	__WS_FD_CLR((fd),(set), ws_fd_set32)
-
-#define __WS_FD_SET(fd, set, cast) do { \
+#define __WS_FD_SET1(fd, set, cast) do { \
     if (((cast*)(set))->fd_count < FD_SETSIZE) \
-        ((cast*)(set))->fd_array[((cast*)(set))->fd_count++]=(fd);\
+        ((cast*)(set))->fd_array[((cast*)(set))->fd_count++]=(fd); \
 } while(0)
-#define WS_FD_SET(fd, set)    __WS_FD_SET((fd),(set), ws_fd_set32)
-#define WS_FD_ZERO(set) (((ws_fd_set32*)(set))->fd_count=0)
-#define WS_FD_ISSET(fd, set) __WSAFDIsSet((SOCKET)(fd), (ws_fd_set32*)(set))
+/* This version checks if the filedesc is already in the list, and appends it 
+ * only if it's not the case
+ */
+#define __WS_FD_SET2(fd, set, cast) do { \
+    u_int __i; \
+    for (__i = 0; __i < ((cast*)(set))->fd_count ; __i++) \
+    { \
+        if ((cast*)(set))->fd_array[__i]=(fd) \
+            break; \
+    } \
+    if (__i == ((cast*)(set))->fd_count && ((cast*)(set))->fd_count < FD_SETSIZE) \
+    { \
+        ((cast*)(set))->fd_count++; \
+        ((cast*)(set))->fd_array[__i]=(fd);\
+    } \
+} while(0)
+
+#ifndef __WINE_WINSOCK2__
+#define __WS_FD_SET(fd, set, cast) __WS_FD_SET1((fd),(set), (cast))
+#else
+#define __WS_FD_SET(fd, set, cast) __WS_FD_SET2((fd),(set), (cast))
+#endif
+
+#ifndef USE_WS_PREFIX
+#define FD_CLR(fd, set)      __WS_FD_CLR((fd),(set), WS(fd_set))
+#define FD_SET(fd, set)      __WS_FD_SET((fd),(set), WS(fd_set))
+#define FD_ZERO(set)         (((WS(fd_set)*)(set))->fd_count=0)
+#define FD_ISSET(fd, set)    __WSAFDIsSet((SOCKET)(fd), (WS(fd_set)*)(set))
+#else
+#define WS_FD_CLR(fd, set)   WINE_FD_CLR((fd),(set), WS(fd_set))
+#define WS_FD_SET(fd, set)   WINE_FD_SET((fd),(set), WS(fd_set))
+#define WS_FD_ZERO(set)      (((WS(fd_set)*)(set))->fd_count=0)
+#define WS_FD_ISSET(fd, set) __WSAFDIsSet((SOCKET)(fd), (WS(fd_set)*)(set))
+#endif
+#endif /* WS_DEFINE_SELECT */
+
 
 /* 
  * Internet address (old style... should be updated) 
  */
 
-struct ws_in_addr
-{
-        union {
-                struct { BYTE   s_b1,s_b2,s_b3,s_b4; } S_un_b;
-                struct { WORD   s_w1,s_w2; } S_un_w;
-                UINT S_addr;
-        } S_un;
-#define ws_addr  S_un.S_addr		/* can be used for most tcp & ip code */
-#define ws_host  S_un.S_un_b.s_b2	/* host on imp */
-#define ws_net   S_un.S_un_b.s_b1	/* network */
-#define ws_imp   S_un.S_un_w.s_w2	/* imp */
-#define ws_impno S_un.S_un_b.s_b4	/* imp # */
-#define ws_lh    S_un.S_un_b.s_b3	/* logical host */
-};
+#ifndef USE_WS_PREFIX
+#define IN_CLASSA_NSHIFT           24
+#define IN_CLASSA_MAX              128
+#define IN_CLASSA_NET              0xff000000
+#define IN_CLASSA_HOST             0x00ffffff
+#define IN_CLASSA(i)               (((long)(i) & 0x80000000) == 0)
+#define IN_CLASSB_NSHIFT           16
+#define IN_CLASSB_MAX              65536
+#define IN_CLASSB_NET              0xffff0000
+#define IN_CLASSB_HOST             0x0000ffff
+#define IN_CLASSB(i)               (((long)(i) & 0xc0000000) == 0x80000000)
+#define IN_CLASSC_NSHIFT           8
+#define IN_CLASSC_NET              0xffffff00
+#define IN_CLASSC_HOST             0x000000ff
+#define IN_CLASSC(i)               (((long)(i) & 0xe0000000) == 0xc0000000)
+#else
+#define WS_IN_CLASSA_NSHIFT        24
+#define WS_IN_CLASSA_MAX           128
+#define WS_IN_CLASSA_NET           0xff000000
+#define WS_IN_CLASSA_HOST          0x00ffffff
+#define WS_IN_CLASSA(i)            (((long)(i) & 0x80000000) == 0)
+#define WS_IN_CLASSB_NSHIFT        16
+#define WS_IN_CLASSB_MAX           65536
+#define WS_IN_CLASSB_NET           0xffff0000
+#define WS_IN_CLASSB_HOST          0x0000ffff
+#define WS_IN_CLASSB(i)            (((long)(i) & 0xc0000000) == 0x80000000)
+#define WS_IN_CLASSC_NSHIFT        8
+#define WS_IN_CLASSC_NET           0xffffff00
+#define WS_IN_CLASSC_HOST          0x000000ff
+#define WS_IN_CLASSC(i)            (((long)(i) & 0xe0000000) == 0xc0000000)
+#endif /* USE_WS_PREFIX */
 
-struct ws_sockaddr_in
-{
-        SHORT		sin_family;
-        WORD 		sin_port;
-        struct ws_in_addr sin_addr;
-        BYTE    	sin_zero[8];
-};
+#ifndef USE_WS_PREFIX
+#define INADDR_ANY                 (u_long)0x00000000
+#define INADDR_LOOPBACK            0x7f000001
+#define INADDR_BROADCAST           (u_long)0xffffffff
+#define INADDR_NONE                0xffffffff
+#else
+#define WS_INADDR_ANY              (u_long)0x00000000
+#define WS_INADDR_LOOPBACK         0x7f000001
+#define WS_INADDR_BROADCAST        (u_long)0xffffffff
+#define WS_INADDR_NONE             0xffffffff
+#endif /* USE_WS_PREFIX */
 
+typedef struct WS(in_addr)
+{
+    union {
+        struct {
+            u_char s_b1,s_b2,s_b3,s_b4;
+        } S_un_b;
+        struct {
+            u_short s_w1,s_w2;
+        } S_un_w;
+        u_long S_addr;
+    } S_un;
+#ifndef USE_WS_PREFIX
+#define s_addr  S_un.S_addr
+#define s_host  S_un.S_un_b.s_b2
+#define s_net   S_un.S_un_b.s_b1
+#define s_imp   S_un.S_un_w.s_w2
+#define s_impno S_un.S_un_b.s_b4
+#define s_lh    S_un.S_un_b.s_b3
+#else
+#define WS_s_addr  S_un.S_addr
+#define WS_s_host  S_un.S_un_b.s_b2
+#define WS_s_net   S_un.S_un_b.s_b1
+#define WS_s_imp   S_un.S_un_w.s_w2
+#define WS_s_impno S_un.S_un_b.s_b4
+#define WS_s_lh    S_un.S_un_b.s_b3
+#endif /* USE_WS_PREFIX */
+} IN_ADDR, *PIN_ADDR, *LPIN_ADDR;
+
+typedef struct WS(sockaddr_in)
+{
+    short              sin_family;
+    u_short               sin_port;
+    struct WS(in_addr) sin_addr;
+    char               sin_zero[8];
+} SOCKADDR_IN, *PSOCKADDR_IN, *LPSOCKADDR_IN;
+
+
+/*
+ * WSAStartup
+ */
 #define WSADESCRIPTION_LEN      256
 #define WSASYS_STATUS_LEN       128
 
-typedef struct WSAData {
-        WORD                    wVersion;
-        WORD                    wHighVersion;
-        char                    szDescription[WSADESCRIPTION_LEN+1];
-        char                    szSystemStatus[WSASYS_STATUS_LEN+1];
-        WORD                    iMaxSockets;
-        WORD                    iMaxUdpDg;
-        char                   *lpVendorInfo;
+typedef struct WS(WSAData)
+{
+    WORD                    wVersion;
+    WORD                    wHighVersion;
+    char                    szDescription[WSADESCRIPTION_LEN+1];
+    char                    szSystemStatus[WSASYS_STATUS_LEN+1];
+    WORD                    iMaxSockets;
+    WORD                    iMaxUdpDg;
+    char                   *lpVendorInfo;
 } WSADATA, *LPWSADATA;
 
-#include "poppack.h"
-
-/*
- * This is used instead of -1, since the
- * SOCKET type is unsigned.
- */
-#define INVALID_SOCKET 	   (~0)
-#define SOCKET_ERROR               (-1)
 
 
 /*
- * Types
+ * {get,set}sockopt
  */
-#define WS_SOCK_STREAM     1               /* stream socket */
-#define WS_SOCK_DGRAM      2               /* datagram socket */
-#define WS_SOCK_RAW        3               /* raw-protocol interface */
-#define WS_SOCK_RDM        4               /* reliably-delivered message */
-#define WS_SOCK_SEQPACKET  5               /* sequenced packet stream */
+#ifndef USE_WS_PREFIX
+#define SOL_SOCKET                 0xffff
+#define SO_DEBUG                   0x0001
+#define SO_ACCEPTCONN              0x0002
+#define SO_REUSEADDR               0x0004
+#define SO_KEEPALIVE               0x0008
+#define SO_DONTROUTE               0x0010
+#define SO_BROADCAST               0x0020
+#define SO_USELOOPBACK             0x0040
+#define SO_LINGER                  0x0080
+#define SO_OOBINLINE               0x0100
+#define SO_DONTLINGER              (u_int)(~SO_LINGER)
+#define SO_SNDBUF                  0x1001
+#define SO_RCVBUF                  0x1002
+#define SO_SNDLOWAT                0x1003
+#define SO_RCVLOWAT                0x1004
+#define SO_SNDTIMEO                0x1005
+#define SO_RCVTIMEO                0x1006
+#define SO_ERROR                   0x1007
+#define SO_TYPE                    0x1008
 
-#define WS_SOL_SOCKET		0xffff
-#define WS_IPPROTO_TCP		6
+#define IOCPARM_MASK               0x7f
+#define IOC_VOID                   0x20000000
+#define IOC_OUT                    0x40000000
+#define IOC_IN                     0x80000000
+#define IOC_INOUT                  (IOC_IN|IOC_OUT)
 
-/*
- * Option flags per-socket.
- */
-#define WS_SO_DEBUG        0x0001          /* turn on debugging info recording */
-#define WS_SO_ACCEPTCONN   0x0002          /* socket has had listen() */
-#define WS_SO_REUSEADDR    0x0004          /* allow local address reuse */
-#define WS_SO_KEEPALIVE    0x0008          /* keep connections alive */
-#define WS_SO_DONTROUTE    0x0010          /* just use interface addresses */
-#define WS_SO_BROADCAST    0x0020          /* permit sending of broadcast msgs */
-#define WS_SO_USELOOPBACK  0x0040          /* bypass hardware when possible */
-#define WS_SO_LINGER       0x0080          /* linger on close if data present */
-#define WS_SO_OOBINLINE    0x0100          /* leave received OOB data in line */
+#define _IO(x,y)    (IOC_VOID|((x)<<8)|(y))
+#define _IOR(x,y,t) (IOC_OUT|(((UINT)sizeof(t)&IOCPARM_MASK)<<16)|((x)<<8)|(y))
+#define _IOW(x,y,t) (IOC_IN|(((UINT)sizeof(t)&IOCPARM_MASK)<<16)|((x)<<8)|(y))
 
-#define WS_SO_DONTLINGER   (UINT)(~WS_SO_LINGER)
+#else
 
-/*
- * Additional options.
- */
-#define WS_SO_SNDBUF       0x1001          /* send buffer size */
-#define WS_SO_RCVBUF       0x1002          /* receive buffer size */
-#define WS_SO_SNDLOWAT     0x1003          /* send low-water mark */
-#define WS_SO_RCVLOWAT     0x1004          /* receive low-water mark */
-#define WS_SO_SNDTIMEO     0x1005          /* send timeout */
-#define WS_SO_RCVTIMEO     0x1006          /* receive timeout */
-#define WS_SO_ERROR        0x1007          /* get error status and clear */
-#define WS_SO_TYPE         0x1008          /* get socket type */
+#define WS_SOL_SOCKET              0xffff
+#define WS_SO_DEBUG                0x0001
+#define WS_SO_ACCEPTCONN           0x0002
+#define WS_SO_REUSEADDR            0x0004
+#define WS_SO_KEEPALIVE            0x0008
+#define WS_SO_DONTROUTE            0x0010
+#define WS_SO_BROADCAST            0x0020
+#define WS_SO_USELOOPBACK          0x0040
+#define WS_SO_LINGER               0x0080
+#define WS_SO_OOBINLINE            0x0100
+#define WS_SO_DONTLINGER           (u_int)(~WS_SO_LINGER)
+#define WS_SO_SNDBUF               0x1001
+#define WS_SO_RCVBUF               0x1002
+#define WS_SO_SNDLOWAT             0x1003
+#define WS_SO_RCVLOWAT             0x1004
+#define WS_SO_SNDTIMEO             0x1005
+#define WS_SO_RCVTIMEO             0x1006
+#define WS_SO_ERROR                0x1007
+#define WS_SO_TYPE                 0x1008
 
-#define WS_IOCPARM_MASK    0x7f            /* parameters must be < 128 bytes */
-#define WS_IOC_VOID        0x20000000      /* no parameters */
-#define WS_IOC_OUT         0x40000000      /* copy out parameters */
-#define WS_IOC_IN          0x80000000      /* copy in parameters */
-#define WS_IOC_INOUT       (WS_IOC_IN|WS_IOC_OUT)
-#define WS_IOR(x,y,t)      (WS_IOC_OUT|(((UINT)sizeof(t)&WS_IOCPARM_MASK)<<16)|((x)<<8)|(y))
-#define WS_IOW(x,y,t)      (WS_IOC_IN|(((UINT)sizeof(t)&WS_IOCPARM_MASK)<<16)|((x)<<8)|(y))
+#define WS_IOCPARM_MASK            0x7f
+#define WS_IOC_VOID                0x20000000
+#define WS_IOC_OUT                 0x40000000
+#define WS_IOC_IN                  0x80000000
+#define WS_IOC_INOUT               (WS_IOC_IN|WS_IOC_OUT)
+
+#define WS__IO(x,y)    (WS_IOC_VOID|((x)<<8)|(y))
+#define WS__IOR(x,y,t) (WS_IOC_OUT|(((long)sizeof(t)&WS_IOCPARM_MASK)<<16)|((x)<<8)|(y))
+#define WS__IOW(x,y,t) (WS_IOC_IN|(((long)sizeof(t)&WS_IOCPARM_MASK)<<16)|((x)<<8)|(y))
+
+#endif
 
 /* IPPROTO_TCP options */
-#define WS_TCP_NODELAY	1		/* do not apply nagle algorithm */
+#ifndef USE_WS_PREFIX
+#define TCP_NODELAY                1
+#else
+#define WS_TCP_NODELAY             1
+#endif
 
 /*
  * Socket I/O flags (supported by spec 1.1)
  */
-
-#define WS_FIONREAD    WS_IOR('f', 127, u_long)
-#define WS_FIONBIO     WS_IOW('f', 126, u_long)
-
-#define WS_SIOCATMARK  WS_IOR('s',  7, u_long)
+#ifndef USE_WS_PREFIX
+#define FIONREAD                   _IOR('f', 127, u_long)
+#define FIONBIO                    _IOW('f', 126, u_long)
+#define SIOCATMARK                 _IOR('s',  7, u_long)
+#else
+#define WS_FIONREAD                WS__IOR('f', 127, u_long)
+#define WS_FIONBIO                 WS__IOW('f', 126, u_long)
+#define WS_SIOCATMARK              WS__IOR('s',  7, u_long)
+#endif
 
 /*
  * Maximum queue length specifiable by listen.
  */
-#ifdef SOMAXCONN
-#undef SOMAXCONN
-#endif
-#define SOMAXCONN       5
+#ifndef USE_WS_PREFIX
+#define SOMAXCONN                  5
 
-#ifndef MSG_DONTROUTE
-#define MSG_DONTROUTE   0x4             /* send without using routing tables */
-#endif
-#define MSG_MAXIOVLEN   16
+#define MSG_OOB                    0x0001
+#define MSG_PEEK                   0x0002
+#define MSG_DONTROUTE              0x0004
+#define MSG_MAXIOVLEN              0x000a
+#define MSG_PARTIAL                0x8000
+#else /* USE_WS_PREFIX */
+#define WS_SOMAXCONN               5
 
-#ifndef MSG_PARTIAL
-#define MSG_PARTIAL     0x8000 /* partial send or recv (WSARecvEx) */
-#endif
+#define WS_MSG_OOB                 0x0001
+#define WS_MSG_PEEK                0x0002
+#define WS_MSG_DONTROUTE           0x0004
+#define WS_MSG_MAXIOVLEN           0x000a
+#define WS_MSG_PARTIAL             0x8000
+#endif /* USE_WS_PREFIX */
 
 /*
  * Define constant based on rfc883, used by gethostbyxxxx() calls.
  */
-#define MAXGETHOSTSTRUCT        1024
+#ifndef USE_WS_PREFIX
+#define MAXGETHOSTSTRUCT           1024
+#else
+#define MAXGETHOSTSTRUCT           1024
+#endif
+
 
 /*
  * Define flags to be used with the WSAAsyncSelect() call.
@@ -285,64 +710,64 @@
  * All Windows Sockets error constants are biased by WSABASEERR from
  * the "normal"
  */
-#define WSABASEERR              10000
+#define WSABASEERR                 10000
 /*
  * Windows Sockets definitions of regular Microsoft C error constants
  */
-#define WSAEINTR                (WSABASEERR+4)
-#define WSAEBADF                (WSABASEERR+9)
-#define WSAEACCES               (WSABASEERR+13)
-#define WSAEFAULT               (WSABASEERR+14)
-#define WSAEINVAL               (WSABASEERR+22)
-#define WSAEMFILE               (WSABASEERR+24)
+#define WSAEINTR                   (WSABASEERR+4)
+#define WSAEBADF                   (WSABASEERR+9)
+#define WSAEACCES                  (WSABASEERR+13)
+#define WSAEFAULT                  (WSABASEERR+14)
+#define WSAEINVAL                  (WSABASEERR+22)
+#define WSAEMFILE                  (WSABASEERR+24)
 
 /*
  * Windows Sockets definitions of regular Berkeley error constants
  */
-#define WSAEWOULDBLOCK          (WSABASEERR+35)
-#define WSAEINPROGRESS          (WSABASEERR+36)
-#define WSAEALREADY             (WSABASEERR+37)
-#define WSAENOTSOCK             (WSABASEERR+38)
-#define WSAEDESTADDRREQ         (WSABASEERR+39)
-#define WSAEMSGSIZE             (WSABASEERR+40)
-#define WSAEPROTOTYPE           (WSABASEERR+41)
-#define WSAENOPROTOOPT          (WSABASEERR+42)
-#define WSAEPROTONOSUPPORT      (WSABASEERR+43)
-#define WSAESOCKTNOSUPPORT      (WSABASEERR+44)
-#define WSAEOPNOTSUPP           (WSABASEERR+45)
-#define WSAEPFNOSUPPORT         (WSABASEERR+46)
-#define WSAEAFNOSUPPORT         (WSABASEERR+47)
-#define WSAEADDRINUSE           (WSABASEERR+48)
-#define WSAEADDRNOTAVAIL        (WSABASEERR+49)
-#define WSAENETDOWN             (WSABASEERR+50)
-#define WSAENETUNREACH          (WSABASEERR+51)
-#define WSAENETRESET            (WSABASEERR+52)
-#define WSAECONNABORTED         (WSABASEERR+53)
-#define WSAECONNRESET           (WSABASEERR+54)
-#define WSAENOBUFS              (WSABASEERR+55)
-#define WSAEISCONN              (WSABASEERR+56)
-#define WSAENOTCONN             (WSABASEERR+57)
-#define WSAESHUTDOWN            (WSABASEERR+58)
-#define WSAETOOMANYREFS         (WSABASEERR+59)
-#define WSAETIMEDOUT            (WSABASEERR+60)
-#define WSAECONNREFUSED         (WSABASEERR+61)
-#define WSAELOOP                (WSABASEERR+62)
-#define WSAENAMETOOLONG         (WSABASEERR+63)
-#define WSAEHOSTDOWN            (WSABASEERR+64)
-#define WSAEHOSTUNREACH         (WSABASEERR+65)
-#define WSAENOTEMPTY            (WSABASEERR+66)
-#define WSAEPROCLIM             (WSABASEERR+67)
-#define WSAEUSERS               (WSABASEERR+68)
-#define WSAEDQUOT               (WSABASEERR+69)
-#define WSAESTALE               (WSABASEERR+70)
-#define WSAEREMOTE              (WSABASEERR+71)
+#define WSAEWOULDBLOCK             (WSABASEERR+35)
+#define WSAEINPROGRESS             (WSABASEERR+36)
+#define WSAEALREADY                (WSABASEERR+37)
+#define WSAENOTSOCK                (WSABASEERR+38)
+#define WSAEDESTADDRREQ            (WSABASEERR+39)
+#define WSAEMSGSIZE                (WSABASEERR+40)
+#define WSAEPROTOTYPE              (WSABASEERR+41)
+#define WSAENOPROTOOPT             (WSABASEERR+42)
+#define WSAEPROTONOSUPPORT         (WSABASEERR+43)
+#define WSAESOCKTNOSUPPORT         (WSABASEERR+44)
+#define WSAEOPNOTSUPP              (WSABASEERR+45)
+#define WSAEPFNOSUPPORT            (WSABASEERR+46)
+#define WSAEAFNOSUPPORT            (WSABASEERR+47)
+#define WSAEADDRINUSE              (WSABASEERR+48)
+#define WSAEADDRNOTAVAIL           (WSABASEERR+49)
+#define WSAENETDOWN                (WSABASEERR+50)
+#define WSAENETUNREACH             (WSABASEERR+51)
+#define WSAENETRESET               (WSABASEERR+52)
+#define WSAECONNABORTED            (WSABASEERR+53)
+#define WSAECONNRESET              (WSABASEERR+54)
+#define WSAENOBUFS                 (WSABASEERR+55)
+#define WSAEISCONN                 (WSABASEERR+56)
+#define WSAENOTCONN                (WSABASEERR+57)
+#define WSAESHUTDOWN               (WSABASEERR+58)
+#define WSAETOOMANYREFS            (WSABASEERR+59)
+#define WSAETIMEDOUT               (WSABASEERR+60)
+#define WSAECONNREFUSED            (WSABASEERR+61)
+#define WSAELOOP                   (WSABASEERR+62)
+#define WSAENAMETOOLONG            (WSABASEERR+63)
+#define WSAEHOSTDOWN               (WSABASEERR+64)
+#define WSAEHOSTUNREACH            (WSABASEERR+65)
+#define WSAENOTEMPTY               (WSABASEERR+66)
+#define WSAEPROCLIM                (WSABASEERR+67)
+#define WSAEUSERS                  (WSABASEERR+68)
+#define WSAEDQUOT                  (WSABASEERR+69)
+#define WSAESTALE                  (WSABASEERR+70)
+#define WSAEREMOTE                 (WSABASEERR+71)
 
 /*
  * Extended Windows Sockets error constant definitions
  */
-#define WSASYSNOTREADY          (WSABASEERR+91)
-#define WSAVERNOTSUPPORTED      (WSABASEERR+92)
-#define WSANOTINITIALISED       (WSABASEERR+93)
+#define WSASYSNOTREADY             (WSABASEERR+91)
+#define WSAVERNOTSUPPORTED         (WSABASEERR+92)
+#define WSANOTINITIALISED          (WSABASEERR+93)
 
 /*
  * Error return codes from gethostbyname() and gethostbyaddr()
@@ -355,112 +780,43 @@
  * compatibility purposes.
  */
 
-/* #define h_errno         WSAGetLastError() */
+#ifndef USE_WS_PREFIX
+#define h_errno                    WSAGetLastError()
+#else
+#define WS_h_errno                 WSAGetLastError()
+#endif
 
 /* Authoritative Answer: Host not found */
-#define WSAHOST_NOT_FOUND       (WSABASEERR+1001)
+#define WSAHOST_NOT_FOUND          (WSABASEERR+1001)
 
 /* Non-Authoritative: Host not found, or SERVERFAIL */
-#define WSATRY_AGAIN            (WSABASEERR+1002)
+#define WSATRY_AGAIN               (WSABASEERR+1002)
 
 /* Non recoverable errors, FORMERR, REFUSED, NOTIMP */
-#define WSANO_RECOVERY          (WSABASEERR+1003)
+#define WSANO_RECOVERY             (WSABASEERR+1003)
 
 /* Valid name, no data record of requested type */
-#define WSANO_DATA              (WSABASEERR+1004)
+#define WSANO_DATA                 (WSABASEERR+1004)
 
 /* no address, look for MX record */
-#define WSANO_ADDRESS           WSANO_DATA
+#define WSANO_ADDRESS              WSANO_DATA
 
-/* Socket function prototypes */
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Microsoft Windows Extension function prototypes */
-
-int     WINAPI closesocket(SOCKET s);
-
-int     WINAPI WSAStartup(WORD wVersionRequired, LPWSADATA lpWSAData);
-void    WINAPI WSASetLastError(INT iError);
-INT     WINAPI WSACleanup(void);
-INT     WINAPI WSAGetLastError(void);
-BOOL    WINAPI WSAIsBlocking(void);
-INT     WINAPI WSACancelBlockingCall(void);
-INT     WINAPI WSAUnhookBlockingHook(void);
-FARPROC WINAPI WSASetBlockingHook(FARPROC lpBlockFunc);
-HANDLE  WINAPI WSAAsyncGetServByName(HWND hWnd, UINT uMsg, LPCSTR name, LPCSTR proto,
-					 LPSTR sbuf, INT buflen);
-HANDLE  WINAPI WSAAsyncGetServByPort(HWND hWnd, UINT uMsg, INT port,
-					 LPCSTR proto, LPSTR sbuf, INT buflen);
-HANDLE  WINAPI WSAAsyncGetProtoByName(HWND hWnd, UINT uMsg,
-					  LPCSTR name, LPSTR sbuf, INT buflen);
-HANDLE  WINAPI WSAAsyncGetProtoByNumber(HWND hWnd, UINT uMsg,
-					    INT number, LPSTR sbuf, INT buflen);
-HANDLE  WINAPI WSAAsyncGetHostByName(HWND hWnd, UINT uMsg,
-					 LPCSTR name, LPSTR sbuf, INT buflen);
-HANDLE  WINAPI WSAAsyncGetHostByAddr(HWND hWnd, UINT uMsg, LPCSTR addr,
-			      INT len, INT type, LPSTR sbuf, INT buflen);
-INT     WINAPI WSACancelAsyncRequest(HANDLE hAsyncTaskHandle);
-INT     WINAPI WSAAsyncSelect(SOCKET s, HWND hWnd, UINT uMsg, LONG lEvent);
-INT     WINAPI   WSARecvEx(SOCKET s, char *buf, INT len, INT *flags);
-
-/*
- * Address families
- */
-#define WS_AF_UNSPEC       0               /* unspecified */
-#define WS_AF_UNIX         1               /* local to host (pipes, portals) */
-#define WS_AF_INET         2               /* internetwork: UDP, TCP, etc. */
-#define WS_AF_IMPLINK      3               /* arpanet imp addresses */
-#define WS_AF_PUP          4               /* pup protocols: e.g. BSP */
-#define WS_AF_CHAOS        5               /* mit CHAOS protocols */
-#define WS_AF_NS           6               /* XEROX NS protocols */
-#define WS_AF_IPX          WS_AF_NS        /* IPX protocols: IPX, SPX, etc. */
-#define WS_AF_ISO          7               /* ISO protocols */
-#define WS_AF_OSI          AF_ISO          /* OSI is ISO */
-#define WS_AF_ECMA         8               /* european computer manufacturers */
-#define WS_AF_DATAKIT      9               /* datakit protocols */
-#define WS_AF_CCITT        10              /* CCITT protocols, X.25 etc */
-#define WS_AF_SNA          11              /* IBM SNA */
-#define WS_AF_DECnet       12              /* DECnet */
-#define WS_AF_DLI          13              /* Direct data link interface */
-#define WS_AF_LAT          14              /* LAT */
-#define WS_AF_HYLINK       15              /* NSC Hyperchannel */
-#define WS_AF_APPLETALK    16              /* AppleTalk */
-#define WS_AF_NETBIOS      17              /* NetBios-style addresses */
-#define WS_AF_VOICEVIEW    18              /* VoiceView */
-#define WS_AF_FIREFOX      19              /* Protocols from Firefox */
-#define WS_AF_UNKNOWN1     20              /* Somebody is using this! */
-#define WS_AF_BAN          21              /* Banyan */
-#define WS_AF_ATM          22              /* Native ATM Services */
-#define WS_AF_INET6        23              /* Internetwork Version 6 */
-#define WS_AF_CLUSTER      24              /* Microsoft Wolfpack */
-#define WS_AF_12844        25              /* IEEE 1284.4 WG AF */
-#define WS_AF_IRDA         26              /* IrDA */
-
-#define WS_AF_MAX          27
+#ifndef USE_WS_PREFIX
+#define HOST_NOT_FOUND             WSAHOST_NOT_FOUND
+#define TRY_AGAIN                  WSATRY_AGAIN
+#define NO_RECOVERY                WSANO_RECOVERY
+#define NO_DATA                    WSANO_DATA
+#define NO_ADDRESS                 WSANO_ADDRESS
+#endif /* USE_WS_PREFIX */
 
 
-#ifdef __cplusplus
-}
-#endif
-
-/* Microsoft Windows Extended data types */
-typedef struct sockaddr SOCKADDR, *PSOCKADDR, *LPSOCKADDR;
-typedef struct sockaddr_in SOCKADDR_IN, *PSOCKADDR_IN, *LPSOCKADDR_IN;
-typedef struct linger LINGER, *PLINGER, *LPLINGER;
-typedef struct in_addr IN_ADDR, *PIN_ADDR, *LPIN_ADDR;
-typedef struct ws_fd_set32_struct FD_SET, *PFD_SET, *LPFD_SET;
-typedef struct hostent HOSTENT, *PHOSTENT, *LPHOSTENT;
-typedef struct servent SERVENT, *PSERVENT, *LPSERVENT;
-typedef struct protoent PROTOENT, *PPROTOENT, *LPPROTOENT;
-typedef struct timeval TIMEVAL, *PTIMEVAL, *LPTIMEVAL;
 
 /*
  * Windows message parameter composition and decomposition
  * macros.
- *
+ */
+
+/*
  * WSAMAKEASYNCREPLY is intended for use by the Windows Sockets implementation
  * when constructing the response to a WSAAsyncGetXByY() routine.
  */
@@ -495,9 +851,85 @@
  */
 #define WSAGETSELECTERROR(lParam)           HIWORD(lParam)
 
+
+
+/*
+ * Prototypes
+ *
+ * Remember to keep this section in sync with the 
+ * "Winsock Function Typedefs" section in winsock2.h.
+ */
+#if !defined(__WINE_WINSOCK2__) || WS_API_PROTOTYPES
+HANDLE WINAPI WSAAsyncGetHostByAddr(HWND,u_int,const char*,int,int,char*,int);
+HANDLE WINAPI WSAAsyncGetHostByName(HWND,u_int,const char*,char*,int);
+HANDLE WINAPI WSAAsyncGetProtoByName(HWND,u_int,const char*,char*,int);
+HANDLE WINAPI WSAAsyncGetProtoByNumber(HWND,u_int,int,char*,int);
+HANDLE WINAPI WSAAsyncGetServByName(HWND,u_int,const char*,const char*,char*,int);
+HANDLE WINAPI WSAAsyncGetServByPort(HWND,u_int,int,const char*,char*,int);
+int WINAPI WSAAsyncSelect(SOCKET,HWND,u_int,long);
+int WINAPI WSACancelAsyncRequest(HANDLE);
+int WINAPI WSACancelBlockingCall(void);
+int WINAPI WSACleanup(void);
+int WINAPI WSAGetLastError(void);
+BOOL WINAPI WSAIsBlocking(void);
+FARPROC WINAPI WSASetBlockingHook(FARPROC);
+void WINAPI WSASetLastError(int);
+int WINAPI WSAStartup(WORD,LPWSADATA);
+int WINAPI WSAUnhookBlockingHook(void);
+
+SOCKET WINAPI WS(accept)(SOCKET,struct WS(sockaddr)*,int*);
+int WINAPI WS(bind)(SOCKET,const struct WS(sockaddr)*,int);
+int WINAPI WS(closesocket)(SOCKET);
+int WINAPI WS(connect)(SOCKET,const struct WS(sockaddr)*,int);
+struct WS(hostent)* WINAPI WS(gethostbyaddr)(const char*,int,int);
+struct WS(hostent)* WINAPI WS(gethostbyname)(const char*);
+int WINAPI WS(gethostname)(char*,int);
+int WINAPI WS(getpeername)(SOCKET,struct WS(sockaddr)*,int*);
+struct WS(protoent)* WINAPI WS(getprotobyname)(const char*);
+struct WS(protoent)* WINAPI WS(getprotobynumber)(int);
+#ifdef WS_DEFINE_SELECT
+int WS(select)(int,WS(fd_set)*,WS(fd_set)*,WS(fd_set)*,const struct WS(timeval)*);
+#endif
+struct WS(servent)* WINAPI WS(getservbyname)(const char*,const char*);
+struct WS(servent)* WINAPI WS(getservbyport)(int,const char*);
+int WINAPI WS(getsockname)(SOCKET,struct WS(sockaddr)*,int*);
+int WINAPI WS(getsockopt)(SOCKET,int,int,char*,int*);
+u_long WINAPI WS(htonl)(u_long);
+u_short WINAPI WS(htons)(u_short);
+unsigned long WINAPI WS(inet_addr)(const char*);
+char* WINAPI WS(inet_ntoa)(struct WS(in_addr));
+int WINAPI WS(ioctlsocket)(SOCKET,long,u_long*);
+int WINAPI WS(listen)(SOCKET,int);
+u_long WINAPI WS(ntohl)(u_long);
+u_short WINAPI WS(ntohs)(u_short);
+int WINAPI WS(recv)(SOCKET,char*,int,int);
+int WINAPI WS(recvfrom)(SOCKET,char*,int,int,struct WS(sockaddr)*,int*);
+int WINAPI WS(send)(SOCKET,const char*,int,int);
+int WINAPI WS(sendto)(SOCKET,const char*,int,int,const struct WS(sockaddr)*,int);
+int WINAPI WS(setsockopt)(SOCKET,int,int,const char*,int);
+int WINAPI WS(shutdown)(SOCKET,int);
+SOCKET WINAPI WS(socket)(int,int,int);
+
+
+#if defined(__WINE__) || !defined(__WINE_WINSOCK2__)
+/* Stuff specific to winsock.h */
+
+int WINAPI WSARecvEx(SOCKET,char*,int,int*);
+
+#endif /* __WINE_WINSOCK2__ */
+#endif /* !defined(__WINE_WINSOCK2__) || WS_API_PROTOTYPES */
+
+
+#include "poppack.h"
+
 #ifdef __cplusplus
-} /* extern "C" */
-#endif /* defined(__cplusplus) */
+}
+#endif
+
+#ifndef __WINE_WINSOCK2__
+#undef WS
+#undef WS_API_PROTOTYPES
+#undef WS_API_TYPEDEFS
+#endif
 
 #endif  /* _WINSOCKAPI_ */
-
diff --git a/include/winsock2.h b/include/winsock2.h
index cb97ea0..e060bf4 100644
--- a/include/winsock2.h
+++ b/include/winsock2.h
@@ -3,166 +3,143 @@
  *
  * FIXME: Still missing required Winsock 2 definitions.
  */
- 
-#ifndef __WINSOCK2API__
-#define __WINSOCK2API__
 
+#ifndef _WINSOCK2API_
+#define _WINSOCK2API_
+
+/*
+ * Setup phase
+ */
+
+/* Everything common between winsock.h and winsock2.h */
+#ifndef INCL_WINSOCK_API_PROTOTYPES
+#define INCL_WINSOCK_API_PROTOTYPES 1
+#define WS_API_PROTOTYPES          1
+#else
+#define WS_API_PROTOTYPES          INCL_WINSOCK_API_PROTOTYPES
+#endif
+
+#ifndef INCL_WINSOCK_API_TYPEDEFS
+#define INCL_WINSOCK_API_TYPEDEFS  0
+#define WS_API_TYPEDEFS            0
+#else
+#define WS_API_TYPEDEFS            INCL_WINSOCK_API_TYPEDEFS
+#endif
+
+#define __WINE_WINSOCK2__
 #include "winsock.h"
+#undef  __WINE_WINSOCK2__
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* defined(__cplusplus) */
 
 /* proper 4-byte packing */
 #include "pshpack4.h"
 
-#define WS_SO_GROUP_ID       0x2001
-#define WS_SO_GROUP_PRIORITY 0x2002
-#define WS_SO_MAX_MSG_SIZE   0x2003
-#define WS_SO_PROTOCOL_INFOA 0x2004
-#define WS_SO_PROTOCOL_INFOW 0x2005
-#define WS_SO_PROTOCOL_INFO WINELIB_NAME_AW(WS_SO_PROTOCOL_INFO)
 
-#define PVD_CONFIG            0x3001
-#define SO_CONDITIONAL_ACCEPT 0x3002
+#ifndef USE_WS_PREFIX
+#define SO_GROUP_ID                0x2001
+#define SO_GROUP_PRIORITY          0x2002
+#define SO_MAX_MSG_SIZE            0x2003
+#define SO_PROTOCOL_INFOA          0x2004
+#define SO_PROTOCOL_INFOW          0x2005
+#define SO_PROTOCOL_INFO           WINELIB_NAME_AW(WS_SO_PROTOCOL_INFO)
+#define PVD_CONFIG                 0x3001
+#define SO_CONDITIONAL_ACCEPT      0x3002
+#else
+#define WS_SO_GROUP_ID             0x2001
+#define WS_SO_GROUP_PRIORITY       0x2002
+#define WS_SO_MAX_MSG_SIZE         0x2003
+#define WS_SO_PROTOCOL_INFOA       0x2004
+#define WS_SO_PROTOCOL_INFOW       0x2005
+#define WS_SO_PROTOCOL_INFO        WINELIB_NAME_AW(WS_SO_PROTOCOL_INFO)
+#define WS_PVD_CONFIG              0x3001
+#define WS_SO_CONDITIONAL_ACCEPT   0x3002
+#endif
 
 
 /* option flags per socket */
 
-#define FD_MAX_EVENTS   10
-#define FD_READ_BIT	0
-#define FD_WRITE_BIT	1
-#define FD_OOB_BIT	2
-#define FD_ACCEPT_BIT	3
-#define FD_CONNECT_BIT	4
-#define FD_CLOSE_BIT	5
+#define FD_MAX_EVENTS              10
+#define FD_READ_BIT                0
+#define FD_WRITE_BIT               1
+#define FD_OOB_BIT                 2
+#define FD_ACCEPT_BIT              3
+#define FD_CONNECT_BIT             4
+#define FD_CLOSE_BIT               5
 
-/*
- * Constants for WSAIoctl()
- */
-#define IOC_UNIX                      0x00000000
-#define IOC_WS2                       0x08000000
-#define IOC_PROTOCOL                  0x10000000
-#define IOC_VENDOR                    0x18000000
-#define _WSAIO(x,y)                   (IOC_VOID|(x)|(y))
-#define _WSAIOR(x,y)                  (IOC_OUT|(x)|(y))
-#define _WSAIOW(x,y)                  (IOC_IN|(x)|(y))
-#define _WSAIORW(x,y)                 (IOC_INOUT|(x)|(y))
-#define SIO_ASSOCIATE_HANDLE          _WSAIOW(IOC_WS2,1)
-#define SIO_ENABLE_CIRCULAR_QUEUEING  _WSAIO(IOC_WS2,2)
-#define SIO_FIND_ROUTE                _WSAIOR(IOC_WS2,3)
-#define SIO_FLUSH                     _WSAIO(IOC_WS2,4)
-#define SIO_GET_BROADCAST_ADDRESS     _WSAIOR(IOC_WS2,5)
+/* Constants for LPCONDITIONPROC */
+#define CF_ACCEPT                  0x0000
+#define CF_REJECT                  0x0001
+#define CF_DEFER                   0x0002
+
+/* Constants for shutdown() */
+#define SD_RECEIVE                 0x00
+#define SD_SEND                    0x01
+#define SD_BOTH                    0x02
+
+/* Constants for WSAIoctl() */
+#define IOC_UNIX                   0x00000000
+#define IOC_WS2                    0x08000000
+#define IOC_PROTOCOL               0x10000000
+#define IOC_VENDOR                 0x18000000
+#define _WSAIO(x,y)                (IOC_VOID|(x)|(y))
+#define _WSAIOR(x,y)               (IOC_OUT|(x)|(y))
+#define _WSAIOW(x,y)               (IOC_IN|(x)|(y))
+#define _WSAIORW(x,y)              (IOC_INOUT|(x)|(y))
+#define SIO_ASSOCIATE_HANDLE       _WSAIOW(IOC_WS2,1)
+#define SIO_ENABLE_CIRCULAR_QUEUEING _WSAIO(IOC_WS2,2)
+#define SIO_FIND_ROUTE             _WSAIOR(IOC_WS2,3)
+#define SIO_FLUSH                  _WSAIO(IOC_WS2,4)
+#define SIO_GET_BROADCAST_ADDRESS  _WSAIOR(IOC_WS2,5)
 #define SIO_GET_EXTENSION_FUNCTION_POINTER  _WSAIORW(IOC_WS2,6)
-#define SIO_GET_QOS                   _WSAIORW(IOC_WS2,7)
-#define SIO_GET_GROUP_QOS             _WSAIORW(IOC_WS2,8)
-#define SIO_MULTIPOINT_LOOPBACK       _WSAIOW(IOC_WS2,9)
-#define SIO_MULTICAST_SCOPE           _WSAIOW(IOC_WS2,10)
-#define SIO_SET_QOS                   _WSAIOW(IOC_WS2,11)
-#define SIO_SET_GROUP_QOS             _WSAIOW(IOC_WS2,12)
-#define SIO_TRANSLATE_HANDLE          _WSAIORW(IOC_WS2,13)
-#define SIO_ROUTING_INTERFACE_QUERY   _WSAIORW(IOC_WS2,20)
-#define SIO_ROUTING_INTERFACE_CHANGE  _WSAIOW(IOC_WS2,21)
-#define SIO_ADDRESS_LIST_QUERY        _WSAIOR(IOC_WS2,22)
-#define SIO_ADDRESS_LIST_CHANGE       _WSAIO(IOC_WS2,23)
-#define SIO_QUERY_TARGET_PNP_HANDLE   _WSAIOR(IOC_W32,24)
-#define SIO_GET_INTERFACE_LIST        WS_IOR ('t', 127, u_long)
-
-/* Unfortunately the sockaddr_in6 structure doesn't
-   seem to be defined in a standard place, even across 
-   different Linux distributions.  Until IPv6 support settles
-   down, let's do our own here so the sockaddr_gen 
-   union is the correct size.*/
-#ifdef s6_addr
-#undef s6_addr
+#define SIO_GET_QOS                _WSAIORW(IOC_WS2,7)
+#define SIO_GET_GROUP_QOS          _WSAIORW(IOC_WS2,8)
+#define SIO_MULTIPOINT_LOOPBACK    _WSAIOW(IOC_WS2,9)
+#define SIO_MULTICAST_SCOPE        _WSAIOW(IOC_WS2,10)
+#define SIO_SET_QOS                _WSAIOW(IOC_WS2,11)
+#define SIO_SET_GROUP_QOS          _WSAIOW(IOC_WS2,12)
+#define SIO_TRANSLATE_HANDLE       _WSAIORW(IOC_WS2,13)
+#define SIO_ROUTING_INTERFACE_QUERY _WSAIORW(IOC_WS2,20)
+#define SIO_ROUTING_INTERFACE_CHANGE _WSAIOW(IOC_WS2,21)
+#define SIO_ADDRESS_LIST_QUERY     _WSAIOR(IOC_WS2,22)
+#define SIO_ADDRESS_LIST_CHANGE    _WSAIO(IOC_WS2,23)
+#define SIO_QUERY_TARGET_PNP_HANDLE _WSAIOR(IOC_W32,24)
+#ifndef USE_WS_PREFIX
+#define SIO_GET_INTERFACE_LIST     _IOR ('t', 127, u_long)
+#else
+#define SIO_GET_INTERFACE_LIST     WS__IOR ('t', 127, u_long)
 #endif
 
-struct ws_in_addr6
-{
-   unsigned char s6_addr[16];   /* IPv6 address */
-};
-struct ws_sockaddr_in6
-{
-   short   sin6_family;            /* AF_INET6 */
-   u_short sin6_port;              /* Transport level port number */
-   u_long  sin6_flowinfo;          /* IPv6 flow information */
-   struct  ws_in_addr6 sin6_addr;  /* IPv6 address */
-};
+/* Constants for WSAIoctl() */
+#define WSA_FLAG_OVERLAPPED        0x01
+#define WSA_FLAG_MULTIPOINT_C_ROOT 0x02
+#define WSA_FLAG_MULTIPOINT_C_LEAF 0x04
+#define WSA_FLAG_MULTIPOINT_D_ROOT 0x08
+#define WSA_FLAG_MULTIPOINT_D_LEAF 0x10
 
-typedef union sockaddr_gen
-{
-   struct sockaddr Address;
-   struct ws_sockaddr_in  AddressIn;
-   struct ws_sockaddr_in6 AddressIn6;
-} sockaddr_gen;
-
-/* ws_hostent, ws_protoent, ws_servent, ws_netent are 4-byte aligned here ! */
-
-typedef struct ws_hostent32
-{
-        char    *h_name;        /* official name of host */
-        char    **h_aliases;    /* alias list */
-        short   h_addrtype;     /* host address type */
-        short   h_length;       /* length of address */
-        char    **h_addr_list;  /* list of addresses from name server */
-} _ws_hostent32;
-
-typedef struct ws_protoent32
-{
-        char    *p_name;        /* official protocol name */
-        char    **p_aliases;    /* alias list */
-        short   p_proto;        /* protocol # */
-} _ws_protoent32;
-
-typedef struct ws_servent32
-{
-        char    *s_name;        /* official service name */
-        char    **s_aliases;    /* alias list */
-        short   s_port;         /* port # */
-        char    *s_proto;       /* protocol to use */
-} _ws_servent32;
-
-typedef struct ws_netent32
-{
-        char    *n_name;        /* official name of net */
-        char    **n_aliases;    /* alias list */
-        short   n_addrtype;     /* net address type */
-        u_long  n_net;          /* network # */
-} _ws_netent32;
-
-/* Structure to keep interface specific information */
-typedef struct _INTERFACE_INFO
-{
-   u_long        iiFlags;             /* Interface flags */
-   sockaddr_gen  iiAddress;           /* Interface address */
-   sockaddr_gen  iiBroadcastAddress;  /* Broadcast address */
-   sockaddr_gen  iiNetmask;           /* Network mask */
-} INTERFACE_INFO, * LPINTERFACE_INFO;
-
-/* Possible flags for the  iiFlags - bitmask  */ 
-#ifndef HAVE_NET_IF_H
-#  define IFF_UP                0x00000001 /* Interface is up */
-#  define IFF_BROADCAST         0x00000002 /* Broadcast is  supported */
-#  define IFF_LOOPBACK          0x00000004 /* this is loopback interface */
-#  define IFF_POINTTOPOINT      0x00000008 /* this is point-to-point interface */
-#  define IFF_MULTICAST         0x00000010 /* multicast is supported */
-#endif
 
 #ifndef GUID_DEFINED
 #include "guiddef.h"
 #endif
 
-#define MAX_PROTOCOL_CHAIN 7
-#define BASE_PROTOCOL      1
-#define LAYERED_PROTOCOL   0
+#define MAX_PROTOCOL_CHAIN         7
+#define BASE_PROTOCOL              1
+#define LAYERED_PROTOCOL           0
 
-typedef struct _WSAPROTOCOLCHAIN 
+typedef struct _WSAPROTOCOLCHAIN
 {
-    int ChainLen;                                 /* the length of the chain,     */
-                                                  /* length = 0 means layered protocol, */
-                                                  /* length = 1 means base protocol, */
-                                                  /* length > 1 means protocol chain */
-    DWORD ChainEntries[MAX_PROTOCOL_CHAIN];       /* a list of dwCatalogEntryIds */
+    int ChainLen;                  /* the length of the chain,     */
+                                   /* length = 0 means layered protocol, */
+                                   /* length = 1 means base protocol, */
+                                   /* length > 1 means protocol chain */
+    DWORD ChainEntries[MAX_PROTOCOL_CHAIN]; /* a list of dwCatalogEntryIds */
 } WSAPROTOCOLCHAIN, * LPWSAPROTOCOLCHAIN;
-#define WSAPROTOCOL_LEN  255
 
-typedef struct _WSAPROTOCOL_INFOA 
+#define WSAPROTOCOL_LEN  255
+typedef struct _WSAPROTOCOL_INFOA
 {
     DWORD dwServiceFlags1;
     DWORD dwServiceFlags2;
@@ -183,7 +160,7 @@
     int iSecurityScheme;
     DWORD dwMessageSize;
     DWORD dwProviderReserved;
-    CHAR   szProtocol[WSAPROTOCOL_LEN+1];
+    CHAR szProtocol[WSAPROTOCOL_LEN+1];
 } WSAPROTOCOL_INFOA, * LPWSAPROTOCOL_INFOA;
 
 typedef struct _WSAPROTOCOL_INFOW
@@ -207,51 +184,270 @@
     int iSecurityScheme;
     DWORD dwMessageSize;
     DWORD dwProviderReserved;
-    WCHAR  szProtocol[WSAPROTOCOL_LEN+1];
-} WSAPROTOCOL_INFOW, * LPWSAPROTOCOL_INFOW;
+    WCHAR szProtocol[WSAPROTOCOL_LEN+1];
+} WSAPROTOCOL_INFOW, *LPWSAPROTOCOL_INFOW;
 
 DECL_WINELIB_TYPE_AW(WSAPROTOCOL_INFO)
 DECL_WINELIB_TYPE_AW(LPWSAPROTOCOL_INFO)
 
-typedef struct _WSANETWORKEVENTS 
+typedef struct _WSANETWORKEVENTS
 {
-  long lNetworkEvents;
-  int iErrorCode[FD_MAX_EVENTS];
+    long lNetworkEvents;
+    int iErrorCode[FD_MAX_EVENTS];
 } WSANETWORKEVENTS, *LPWSANETWORKEVENTS;
 
-typedef struct _WSABUF 
+typedef struct _WSABUF
 {
     ULONG len;
     CHAR* buf;
 } WSABUF, *LPWSABUF;
 
-typedef struct _OVERLAPPED *  LPWSAOVERLAPPED;
-typedef HANDLE WSAEVENT;
+#define WSAEVENT      HANDLE
+#define LPWSAEVENT    LPHANDLE
+#define WSAOVERLAPPED OVERLAPPED
+typedef struct _OVERLAPPED* LPWSAOVERLAPPED;
+
+#define WSA_IO_PENDING             (ERROR_IO_PENDING)
+#define WSA_IO_INCOMPLETE          (ERROR_IO_INCOMPLETE)
+#define WSA_INVALID_HANDLE         (ERROR_INVALID_HANDLE)
+#define WSA_INVALID_PARAMETER      (ERROR_INVALID_PARAMETER)
+#define WSA_NOT_ENOUGH_MEMORY      (ERROR_NOT_ENOUGH_MEMORY)
+#define WSA_OPERATION_ABORTED      (ERROR_OPERATION_ABORTED)
+
+#define WSA_INVALID_EVENT          ((WSAEVENT)NULL)
+#define WSA_MAXIMUM_WAIT_EVENTS    (MAXIMUM_WAIT_OBJECTS)
+#define WSA_WAIT_FAILED            ((DWORD)-1L)
+#define WSA_WAIT_EVENT_0           (WAIT_OBJECT_0)
+#define WSA_WAIT_IO_COMPLETION     (WAIT_IO_COMPLETION)
+#define WSA_WAIT_TIMEOUT           (WAIT_TIMEOUT)
+#define WSA_INFINITE               (INFINITE)
+
 typedef unsigned int   GROUP;
+#define SG_UNCONSTRAINED_GROUP   0x01
+#define SG_CONSTRAINED_GROUP     0x02
+
+/* FIXME: We don't yet have qos.h */
+typedef DWORD QOS, *LPQOS;
+
+typedef int CALLBACK (*LPCONDITIONPROC)
+(
+    LPWSABUF lpCallerId,
+    LPWSABUF lpCallerData,
+    LPQOS lpSQOS,
+    LPQOS lpGQOS,
+    LPWSABUF lpCalleeId,
+    LPWSABUF lpCalleeData,
+    GROUP *g,
+    DWORD dwCallbackData
+);
 
 typedef void CALLBACK (*LPWSAOVERLAPPED_COMPLETION_ROUTINE)
 (
-     DWORD dwError,
-     DWORD cbTransferred,
-     LPWSAOVERLAPPED lpOverlapped,
-     DWORD dwFlags
+    DWORD dwError,
+    DWORD cbTransferred,
+    LPWSAOVERLAPPED lpOverlapped,
+    DWORD dwFlags
 );
 
 
-/* Function declarations */
-int      WINAPI WSAEnumNetworkEvents(SOCKET s, WSAEVENT hEventObject, LPWSANETWORKEVENTS lpNetworkEvents);
-int      WINAPI WSAEventSelect(SOCKET s, WSAEVENT hEventObject, long lNetworkEvents);
+
+/*
+ * Winsock Function Typedefs
+ *
+ * Remember to keep this section in sync with the 
+ * "Prototypes" section in winsock.h.
+ */
+#if WS_API_TYPEDEFS
+typedef HANDLE (WINAPI *LPFN_WSAASYNCGETHOSTBYADDR)(HWND,u_int,const char*,int,int,char*,int));
+typedef HANDLE (WINAPI *LPFN_WSAASYNCGETHOSTBYNAME)(HWND,u_int,const char*,char*,int));
+typedef HANDLE (WINAPI *LPFN_WSAASYNCGETPROTOBYNAME)(HWND,u_int,const char*,char*,int));
+typedef HANDLE (WINAPI *LPFN_WSAASYNCGETPROTOBYNUMBER)(HWND,u_int,int,char*,int));
+typedef HANDLE (WINAPI *LPFN_WSAASYNCGETSERVBYNAME)(HWND,u_int,const char*,const char*,char*,int));
+typedef HANDLE (WINAPI *LPFN_WSAASYNCGETSERVBYPORT)(HWND,u_int,int,const char*,char*,int));
+typedef int (WINAPI *LPFN_WSAASYNCSELECT)(SOCKET,HWND,u_int,long));
+typedef int (WINAPI *LPFN_WSACANCELASYNCREQUEST)(HANDLE));
+typedef int (WINAPI *LPFN_WSACANCELBLOCKINGCALL)(void));
+typedef int (WINAPI *LPFN_WSACLEANUP)(void));
+typedef int (WINAPI *LPFN_WSAGETLASTERROR)(void));
+typedef BOOL (WINAPI *LPFN_WSAISBLOCKING)(void));
+typedef FARPROC (WINAPI *LPFN_WSASETBLOCKINGHOOK)(FARPROC));
+typedef void (WINAPI *LPFN_WSASETLASTERROR)(int));
+typedef int (WINAPI *LPFN_WSASTARTUP)(WORD,LPWSADATA));
+typedef int (WINAPI *LPFN_WSAUNHOOKBLOCKINGHOOK)(void));
+
+typedef SOCKET (WINAPI *LPFN_ACCEPT)(SOCKET,struct WS(sockaddr)*,int*));
+typedef int (WINAPI *LPFN_BIND)(SOCKET,const struct WS(sockaddr)*,int));
+typedef int (WINAPI *LPFN_CLOSESOCKET)(SOCKET));
+typedef int (WINAPI *LPFN_CONNECT)(SOCKET,const struct WS(sockaddr)*,int));
+typedef struct WS(hostent)* (WINAPI *LPFN_GETHOSTBYADDR)(const char*,int,int));
+typedef struct WS(hostent)* (WINAPI *LPFN_GETHOSTBYNAME)(const char*));
+typedef int (WINAPI *LPFN_GETHOSTNAME)(char*,int));
+typedef int (WINAPI *LPFN_GETPEERNAME)(SOCKET,struct WS(sockaddr)*,int*));
+typedef struct WS(protoent)* (WINAPI *LPFN_GETPROTOBYNAME)(const char*));
+typedef struct WS(protoent)* (WINAPI *LPFN_GETPROTOBYNUMBER)(int));
+#ifdef WS_DEFINE_SELECT
+typedef int (WINAPI* LPFN_SELECT)(int,WS(fd_set)*,WS(fd_set)*,WS(fd_set)*,const struct WS(timeval)*);
+#endif
+typedef struct WS(servent)* (WINAPI *LPFN_GETSERVBYNAME)(const char*,const char*));
+typedef struct WS(servent)* (WINAPI *LPFN_GETSERVBYPORT)(int,const char*));
+typedef int (WINAPI *LPFN_GETSOCKNAME)(SOCKET,struct WS(sockaddr)*,int*));
+typedef int (WINAPI *LPFN_GETSOCKOPT)(SOCKET,int,int,char*,int*));
+typedef u_long (WINAPI *LPFN_HTONL)(u_long));
+typedef u_short (WINAPI *LPFN_HTONS)(u_short));
+typedef unsigned long (WINAPI *LPFN_INET_ADDR)(const char*);
+typedef char* (WINAPI *LPFN_INET_NTOA)(struct WS(in_addr));
+typedef int (WINAPI *LPFN_IOCTLSOCKET)(SOCKET,long,u_long*));
+typedef int (WINAPI *LPFN_LISTEN)(SOCKET,int));
+typedef u_long (WINAPI *LPFN_NTOHL)(u_long));
+typedef u_short (WINAPI *LPFN_NTOHS)(u_short));
+typedef int (WINAPI *LPFN_RECV)(SOCKET,char*,int,int));
+typedef int (WINAPI *LPFN_RECVFROM)(SOCKET,char*,int,int,struct WS(sockaddr)*,int*));
+typedef int (WINAPI *LPFN_SEND)(SOCKET,const char*,int,int));
+typedef int (WINAPI *LPFN_SENDTO)(SOCKET,const char*,int,int,const struct WS(sockaddr)*,int));
+typedef int (WINAPI *LPFN_SETSOCKOPT)(SOCKET,int,int,const char*,int));
+typedef int (WINAPI *LPFN_SHUTDOWN)(SOCKET,int));
+typedef SOCKET (WINAPI *LPFN_SOCKET)(int,int,int));
+#endif /* WS_API_TYPEDEFS */
+
+
+
+/*
+ * Winsock2 Prototypes
+ *
+ * Remember to keep this section in sync with the 
+ * "Winsock2 Function Typedefs" section below.
+ */
+#if WS_API_PROTOTYPES
+SOCKET WINAPI WSAAccept(SOCKET,struct WS(sockaddr)*,LPINT,LPCONDITIONPROC,DWORD);
+INT WINAPI WSAAddressToStringA(LPSOCKADDR,DWORD,LPWSAPROTOCOL_INFOA,LPSTR,LPDWORD);
+INT WINAPI WSAAddressToStringW(LPSOCKADDR,DWORD,LPWSAPROTOCOL_INFOW,LPWSTR,LPDWORD);
+#define WSAAddressToString         WINELIB_NAME_AW(WSAAddressToString)
+BOOL WINAPI WSACloseEvent(WSAEVENT);
+int WINAPI WSAConnect(SOCKET,const struct WS(sockaddr)*,int,LPWSABUF,LPWSABUF,LPQOS,LPQOS);
 WSAEVENT WINAPI WSACreateEvent(void);
-BOOL     WINAPI WSACloseEvent(WSAEVENT event);
-INT      WINAPI WSARecvFrom(SOCKET,LPWSABUF,DWORD,LPDWORD,LPDWORD,struct sockaddr*,LPINT,
-                            LPWSAOVERLAPPED,LPWSAOVERLAPPED_COMPLETION_ROUTINE);
-INT      WINAPI WSASend(SOCKET,LPWSABUF,DWORD,LPDWORD,DWORD,LPWSAOVERLAPPED,
-                        LPWSAOVERLAPPED_COMPLETION_ROUTINE);
-SOCKET   WINAPI WSASocketA(int af, int type, int protocol,
-                           LPWSAPROTOCOL_INFOA lpProtocolInfo,
-                           GROUP g, DWORD dwFlags);
-INT      WINAPI ioctlsocket(SOCKET s, LONG cmd, ULONG *argp);
+/* WSADuplicateSocketA */
+/* WSADuplicateSocketW */
+/* WSAEnumNameSpaceProvidersA */
+/* WSAEnumNameSpaceProvidersW */
+int WINAPI WSAEnumNetworkEvents(SOCKET,WSAEVENT,LPWSANETWORKEVENTS);
+int WINAPI WSAEnumProtocolsA(LPINT,LPWSAPROTOCOL_INFOA,LPDWORD);
+int WINAPI WSAEnumProtocolsW(LPINT,LPWSAPROTOCOL_INFOW,LPDWORD);
+#define WSAEnumProtocols           WINELIB_NAME_AW(WSAEnumProtocols)
+int WINAPI WSAEventSelect(SOCKET,WSAEVENT,long);
+BOOL WINAPI WSAGetOverlappedResult(SOCKET,LPWSAOVERLAPPED,LPDWORD,BOOL,LPDWORD);
+/* WSAGetQOSByName */
+/* WSAGetServiceClassInfoA */
+/* WSAGetServiceClassInfoW */
+/* WSAGetServiceClassNameByClassIdA */
+/* WSAGetServiceClassNameByClassIdW */
+int WINAPI WSAHtonl(SOCKET,u_long,u_long*);
+int WINAPI WSAHtons(SOCKET,u_short,u_short*);
+/* WSAInstallServiceClassA */
+/* WSAInstallServiceClassW */
+int WINAPI WSAIoctl(SOCKET,DWORD,LPVOID,DWORD,LPVOID,DWORD,LPDWORD,LPWSAOVERLAPPED,LPWSAOVERLAPPED_COMPLETION_ROUTINE);
+/* WSAJoinLeaf */
+/* WSALookupServiceBeginA */
+/* WSALookupServiceBeginW */
+/* WSALookupServiceEnd */
+/* WSALookupServiceNextA */
+/* WSALookupServiceNextW */
+int WINAPI WSANtohl(SOCKET,u_long,u_long*);
+int WINAPI WSANtohs(SOCKET,u_short,u_short*);
+/* WSAProviderConfigChange */
+int WINAPI WSARecv(SOCKET,LPWSABUF,DWORD,LPDWORD,LPDWORD,LPWSAOVERLAPPED,LPWSAOVERLAPPED_COMPLETION_ROUTINE);
+int WINAPI WSARecvDisconnect(SOCKET,LPWSABUF);
+int WINAPI WSARecvFrom(SOCKET,LPWSABUF,DWORD,LPDWORD,LPDWORD,struct WS(sockaddr)*,LPINT,LPWSAOVERLAPPED,LPWSAOVERLAPPED_COMPLETION_ROUTINE);
+/* WSARemoveServiceClass */
+BOOL WINAPI WSAResetEvent(WSAEVENT);
+int WINAPI WSASend(SOCKET,LPWSABUF,DWORD,LPDWORD,DWORD,LPWSAOVERLAPPED,LPWSAOVERLAPPED_COMPLETION_ROUTINE);
+int WINAPI WSASendDisconnect(SOCKET,LPWSABUF);
+int WINAPI WSASendTo(SOCKET,LPWSABUF,DWORD,LPDWORD,DWORD,const struct WS(sockaddr)*,int,LPWSAOVERLAPPED,LPWSAOVERLAPPED_COMPLETION_ROUTINE);
+BOOL WINAPI WSASetEvent(WSAEVENT);
+/* WSASetServiceA */
+/* WSASetServiceW */
+SOCKET WINAPI WSASocketA(int,int,int,LPWSAPROTOCOL_INFOA,GROUP,DWORD);
+SOCKET WINAPI WSASocketW(int,int,int,LPWSAPROTOCOL_INFOW,GROUP,DWORD);
+INT WINAPI WSAStringToAddressA(LPSTR,INT,LPWSAPROTOCOL_INFOA,LPSOCKADDR,LPINT);
+INT WINAPI WSAStringToAddressW(LPSTR,INT,LPWSAPROTOCOL_INFOA,LPSOCKADDR,LPINT);
+#define WSASocket                  WINELIB_NAME_AW(WSASocket)
+#define WSAStringToAddress         WINELIB_NAME_AW(WSAStringToAddress)
+DWORD WINAPI WSAWaitForMultipleEvents(DWORD,const WSAEVENT*,BOOL,DWORD,BOOL);
+#endif /* WS_API_PROTOTYPES */
+
+
+
+/*
+ * Winsock2 Function Typedefs
+ *
+ * Remember to keep this section in sync with the 
+ * "Winsock2 Prototypes" section above.
+ */
+#if WS_API_TYPEDEFS
+typedef SOCKET (WINAPI *LPFN_WSAACCEPT)(SOCKET,WS(sockaddr)*,LPINT,LPCONDITIONPROC,DWORD);
+typedef INT (WINAPI *LPFN_WSAADRESSTOSTRINGA)(LPSOCKADDR,DWORD,LPWSAPROTOCOL_INFOA,LPSTR,LPDWORD);
+typedef INT (WINAPI *LPFN_WSAADRESSTOSTRINGW)(LPSOCKADDR,DWORD,LPWSAPROTOCOL_INFOW,LPWSTR,LPDWORD);
+#define LPFN_WSAADDRESSTOSTRING    WINELIB_NAME_AW(LPFN_WSAADDRESSTOSTRING)
+typedef BOOL (WINAPI *LPFN_WSACLOSEEVENT)(WSAEVENT);
+typedef int (WINAPI *LPFN_WSACONNECT)(SOCKET,const struct WS(sockaddr)*,int,LPWSABUF,LPWSABUF,LPQOS,LPQOS);
+typedef WSAEVENT (WINAPI *LPFN_WSACREATEEVENT)(void);
+/* WSADuplicateSocketA */
+/* WSADuplicateSocketW */
+/* WSAEnumNameSpaceProvidersA */
+/* WSAEnumNameSpaceProvidersW */
+typedef int (WINAPI *LPFN_WSAENUMNETWORKEVENT)(SOCKET,WSAEVENT,LPWSANETWORKEVENTS);
+typedef int (WINAPI *LPFN_WSAENUMPROTOCOLSA)(LPINT,LPWSAPROTOCOL_INFOA,LPDWORD);
+typedef int (WINAPI *LPFN_WSAENUMPROTOCOLSW)(LPINT,LPWSAPROTOCOL_INFOW,LPDWORD);
+#define LPFN_WSAENUMPROTOCOLS      WINELIB_NAME_AW(LPFN_WSAENUMPROTOCOLS)
+typedef int (WINAPI *LPFN_WSAEVENTSELECT)(SOCKET,WSAEVENT,long);
+typedef BOOL (WINAPI *LPFN_WSAGETOVERLAPPEDRESULT)(SOCKET,LPWSAOVERLAPPED,LPDWORD,BOOL,LPDWORD);
+/* WSAGetQOSByName */
+/* WSAGetServiceClassInfoA */
+/* WSAGetServiceClassInfoW */
+/* WSAGetServiceClassNameByClassIdA */
+/* WSAGetServiceClassNameByClassIdW */
+typedef int (WINAPI *LPFN_WSAHTONL)(SOCKET,u_long,u_long*);
+typedef int (WINAPI *LPFN_WSAHTONS)(SOCKET,u_short,u_short*);
+/* WSAInstallServiceClassA */
+/* WSAInstallServiceClassW */
+typedef int (WINAPI *LPFN_WSAIOCTL)(SOCKET,DWORD,LPVOID,DWORD,LPVOID,DWORD,LPDWORD,LPWSAOVERLAPPED,LPWSAOVERLAPPED_COMPLETION_ROUTINE);
+/* WSAJoinLeaf */
+/* WSALookupServiceBeginA */
+/* WSALookupServiceBeginW */
+/* WSALookupServiceEnd */
+/* WSALookupServiceNextA */
+/* WSALookupServiceNextW */
+typedef int (WINAPI *LPFN_WSANTOHL)(SOCKET,u_long,u_long*);
+typedef int (WINAPI *LPFN_WSANTOHS)(SOCKET,u_short,u_short*);
+/* WSAProviderConfigChange */
+typedef int (WINAPI *LPFN_WSARECV)(SOCKET,LPWSABUF,DWORD,LPDWORD,LPDWORD,LPWSAOVERLAPPED,LPWSAOVERLAPPED_COMPLETION_ROUTINE);
+typedef int (WINAPI *LPFN_WSARECVDISCONNECT)(SOCKET,LPWSABUF);
+typedef int (WINAPI *LPFN_WSARECVFROM)(SOCKET,LPWSABUF,DWORD,LPDWORD,LPDWORD,struct WS(sockaddr)*,LPINT,LPWSAOVERLAPPED,LPWSAOVERLAPPED_COMPLETION_ROUTINE);
+/* WSARemoveServiceClass */
+typedef BOOL (WINAPI *LPFN_WSARESETEVENT)(WSAEVENT);
+typedef int (WINAPI *LPFN_WSASEND)(SOCKET,LPWSABUF,DWORD,LPDWORD,DWORD,LPWSAOVERLAPPED,LPWSAOVERLAPPED_COMPLETION_ROUTINE);
+typedef int (WINAPI *LPFN_WSASENDDISCONNECT)(SOCKET,LPWSABUF);
+typedef int (WINAPI *LPFN_WSASENDTO)(SOCKET,LPWSABUF,DWORD,LPDWORD,DWORD,const struct WS(sockaddr)*,int,LPWSAOVERLAPPED,LPWSAOVERLAPPED_COMPLETION_ROUTINE);
+typedef BOOL (WINAPI *LPFN_WSASETEVENT)(WSAEVENT);
+/* WSASetServiceA */
+/* WSASetServiceW */
+typedef SOCKET (WINAPI *LPFN_WSASOCKETA)(int,int,int,LPWSAPROTOCOL_INFOA,GROUP,DWORD);
+typedef SOCKET (WINAPI *LPFN_WSASOCKETW)(int,int,int,LPWSAPROTOCOL_INFOW,GROUP,DWORD);
+typedef INT (WINAPI *LPFN_WSASTRINGTOADDRESSA)(LPSTR,INT,LPWSAPROTOCOL_INFOA,LPSOCKADDR,LPINT);
+typedef INT (WINAPI *LPFN_WSASTRINGTOADDRESSW)(LPSTR,INT,LPWSAPROTOCOL_INFOA,LPSOCKADDR,LPINT);
+#define LPFN_WSASOCKET             WINELIB_NAME_AW(LPFN_WSASOCKET)
+#define LPFN_WSASTRINGTOADDRESS    WINELIB_NAME_AW(LPFN_WSASTRINGTOADDRESS)
+typedef DWORD (WINAPI *LPFN_WSAWAITFORMULTIPLEEVENTS)(DWORD,const WSAEVENT*,BOOL,DWORD,BOOL);
+#endif /* WS_API_TYPEDEFS */
+
 
 #include "poppack.h"
 
+#ifdef __cplusplus
+}
 #endif
+
+#undef WS
+#undef WS_API_PROTOTYPES
+#undef WS_API_TYPEDEFS
+
+#endif /* __WINSOCK2API__ */
diff --git a/include/ws2tcpip.h b/include/ws2tcpip.h
new file mode 100644
index 0000000..3ef49a4
--- /dev/null
+++ b/include/ws2tcpip.h
@@ -0,0 +1,57 @@
+#ifndef __WS2TCPIP__
+#define __WS2TCPIP__
+
+#ifdef USE_WS_PREFIX
+#define WS(x)    WS_##x
+#else
+#define WS(x)    x
+#endif
+
+/* FIXME: This gets defined by some Unix (Linux) header and messes things */
+#undef s6_addr
+
+typedef struct WS(in_addr6)
+{
+   u_char s6_addr[16];   /* IPv6 address */
+} IN6_ADDR, *PIN6_ADDR, *LPIN6_ADDR;
+
+typedef struct WS(sockaddr_in6)
+{
+   short   sin6_family;            /* AF_INET6 */
+   u_short sin6_port;              /* Transport level port number */
+   u_long  sin6_flowinfo;          /* IPv6 flow information */
+   struct  WS(in_addr6) sin6_addr; /* IPv6 address */
+} SOCKADDR_IN6,*PSOCKADDR_IN6, *LPSOCKADDR_IN6;
+
+typedef union sockaddr_gen
+{
+   struct WS(sockaddr) Address;
+   struct WS(sockaddr_in)  AddressIn;
+   struct WS(sockaddr_in6) AddressIn6;
+} WS(sockaddr_gen);
+
+/* Structure to keep interface specific information */
+typedef struct _INTERFACE_INFO
+{
+    u_long            iiFlags;             /* Interface flags */
+    WS(sockaddr_gen)  iiAddress;           /* Interface address */
+    WS(sockaddr_gen)  iiBroadcastAddress;  /* Broadcast address */
+    WS(sockaddr_gen)  iiNetmask;           /* Network mask */
+} INTERFACE_INFO, * LPINTERFACE_INFO;
+
+/* Possible flags for the  iiFlags - bitmask  */
+#ifndef USE_WS_PREFIX
+#define IFF_UP                0x00000001 /* Interface is up */
+#define IFF_BROADCAST         0x00000002 /* Broadcast is  supported */
+#define IFF_LOOPBACK          0x00000004 /* this is loopback interface */
+#define IFF_POINTTOPOINT      0x00000008 /* this is point-to-point interface */
+#define IFF_MULTICAST         0x00000010 /* multicast is supported */
+#else
+#define WS_IFF_UP             0x00000001 /* Interface is up */
+#define WS_IFF_BROADCAST      0x00000002 /* Broadcast is  supported */
+#define WS_IFF_LOOPBACK       0x00000004 /* this is loopback interface */
+#define WS_IFF_POINTTOPOINT   0x00000008 /* this is point-to-point interface */
+#define WS_IFF_MULTICAST      0x00000010 /* multicast is supported */
+#endif /* USE_WS_PREFIX */
+
+#endif /* __WS2TCPIP__ */
diff --git a/include/wsipx.h b/include/wsipx.h
index 7ed21c0..aa18538 100644
--- a/include/wsipx.h
+++ b/include/wsipx.h
@@ -1,14 +1,16 @@
-/* WCIPX.H
+/* WSIPX.H
  */
 
 #ifndef _WINE_WSIPX_
 #define _WINE_WSIPX_
 
-#ifdef __cplusplus
-extern "C" {
-#endif /* defined(__cplusplus) */
+#ifdef USE_WS_PREFIX
+# define WS(x)    WS_##x
+#else
+# define WS(x)    x
+#endif
 
-typedef struct ws_sockaddr_ipx
+typedef struct WS_sockaddr_ipx
 {
     short sa_family;
     char sa_netnum[4];
@@ -19,13 +21,9 @@
 /*
  * constants
  */
-#define NSPROTO_IPX      1000
-#define NSPROTO_SPX      1256
-#define NSPROTO_SPXII    1257
+#define NSPROTO_IPX                 1000
+#define NSPROTO_SPX                 1256
+#define NSPROTO_SPXII               1257
 
-
-#ifdef __cplusplus
-}      /* extern "C" */
-#endif /* defined(__cplusplus) */
-
+#undef WS
 #endif /* _WINE_WSIPX_ */
diff --git a/server/sock.c b/server/sock.c
index 2db76e4..0781055 100644
--- a/server/sock.c
+++ b/server/sock.c
@@ -32,12 +32,17 @@
 
 #include "winerror.h"
 #include "winbase.h"
-#include "winsock2.h"
 #include "process.h"
 #include "handle.h"
 #include "thread.h"
 #include "request.h"
 
+/* To avoid conflicts with the Unix socket headers. Plus we only need a few
+ * macros anyway.
+ */
+#define USE_WS_PREFIX
+#include "winsock2.h"
+
 struct sock
 {
     struct object       obj;         /* object header */