winsock + DSTRICT

Martin Wilck Martin.Wilck at Fujitsu-Siemens.com
Mon Oct 28 09:07:46 CST 2002


Hi Michael, all,

here is a patch to make winsock compile without warnings without 
-DWINE_NO_STRICT. Comments are welcome.

Martin

PS Michael, will you send this stuff to wine-patches?

Index: Makefile.in
===================================================================
RCS file: /home/wine/wine/dlls/winsock/Makefile.in,v
retrieving revision 1.18
diff -u -r1.18 Makefile.in
--- Makefile.in	18 Oct 2002 23:46:28 -0000	1.18
+++ Makefile.in	28 Oct 2002 15:02:23 -0000
@@ -1,4 +1,4 @@
-EXTRADEFS = -DUSE_WS_PREFIX -DWINE_NO_STRICT
+EXTRADEFS = -DUSE_WS_PREFIX
 TOPSRCDIR = @top_srcdir@
 TOPOBJDIR = ../..
 SRCDIR    = @srcdir@
Index: async.c
===================================================================
RCS file: /home/wine/wine/dlls/winsock/async.c,v
retrieving revision 1.27
diff -u -r1.27 async.c
--- async.c	17 Oct 2002 16:43:43 -0000	1.27
+++ async.c	28 Oct 2002 15:02:24 -0000
@@ -136,6 +136,10 @@
 #define AQ_GETSERV	2
 #define AQ_GETMASK	3
 
+/* The handles used are pseudo-handles that can be simply casted. */
+/* 16-bit values are used internally (to be sure handle comparison works right in 16-bit apps). */
+#define WSA_H32(h16) ((HANDLE)(ULONG_PTR)(h16))
+
 /* ----------------------------------- helper functions - */
 
 static int list_size(char** l, int item_size)
@@ -335,7 +339,7 @@
 	return size;
 }
 
-static HANDLE __ws_async_handle = 0xdead;
+static HANDLE16 __ws_async_handle = 0xdead;
 
 /* Generic async query struct. we use symbolic names for the different queries
  * for readability.
@@ -486,7 +490,7 @@
 		}
 		break;
 	}
-	PostMessageA(HWND_32(aq->hWnd),aq->uMsg,aq->async_handle,size|(fail<<16));
+	PostMessageA(HWND_32(aq->hWnd),aq->uMsg,(WPARAM) aq->async_handle,size|(fail<<16));
 	HeapFree(GetProcessHeap(),0,arg);
 	return 0;
 }
@@ -547,7 +551,8 @@
 	aq->ptr1	= ptr1;
 	aq->int2	= int2;
 	aq->ptr2	= ptr2;
-	aq->async_handle = ++__ws_async_handle;
+	/* avoid async_handle = 0 */
+	aq->async_handle = (++__ws_async_handle ? __ws_async_handle : ++__ws_async_handle);
 	aq->flags	= flags;
 	aq->sbuf	= (SEGPTR)sbuf;
 	aq->sbuflen	= sbuflen;
@@ -579,10 +584,10 @@
 HANDLE WINAPI WSAAsyncGetHostByAddr(HWND hWnd, UINT uMsg, LPCSTR addr,
                                INT len, INT type, LPSTR sbuf, INT buflen)
 {
-	TRACE("hwnd %04x, msg %04x, addr %08x[%i]\n",
+	TRACE("hwnd %p, msg %04x, addr %08x[%i]\n",
 	       hWnd, uMsg, (unsigned)addr , len );
-	return __WSAsyncDBQuery(hWnd,uMsg,len,addr,type,NULL,sbuf,buflen,
-				AQ_NUMBER|AQ_COPYPTR1|AQ_WIN32|AQ_GETHOST);
+	return WSA_H32( __WSAsyncDBQuery(hWnd,uMsg,len,addr,type,NULL,sbuf,buflen,
+				AQ_NUMBER|AQ_COPYPTR1|AQ_WIN32|AQ_GETHOST));
 }
 
 /***********************************************************************
@@ -604,10 +609,10 @@
 HANDLE WINAPI WSAAsyncGetHostByName(HWND hWnd, UINT uMsg, LPCSTR name,
 					LPSTR sbuf, INT buflen)
 {
-	TRACE("hwnd %04x, msg %08x, host %s, buffer %i\n",
+	TRACE("hwnd %p, msg %08x, host %s, buffer %i\n",
 	       hWnd, uMsg, (name)?name:"<null>", (int)buflen );
-	return __WSAsyncDBQuery(hWnd,uMsg,0,name,0,NULL,sbuf,buflen,
-				AQ_NAME|AQ_DUPLOWPTR1|AQ_WIN32|AQ_GETHOST);
+	return WSA_H32( __WSAsyncDBQuery(hWnd,uMsg,0,name,0,NULL,sbuf,buflen,
+				AQ_NAME|AQ_DUPLOWPTR1|AQ_WIN32|AQ_GETHOST));
 }
 
 /***********************************************************************
@@ -629,10 +634,10 @@
 HANDLE WINAPI WSAAsyncGetProtoByName(HWND hWnd, UINT uMsg, LPCSTR name,
                                          LPSTR sbuf, INT buflen)
 {
-	TRACE("hwnd %04x, msg %08x, protocol %s\n",
+	TRACE("hwnd %p, msg %08x, protocol %s\n",
 	       hWnd, uMsg, (name)?name:"<null>" );
-	return __WSAsyncDBQuery(hWnd,uMsg,0,name,0,NULL,sbuf,buflen,
-				AQ_NAME|AQ_DUPLOWPTR1|AQ_WIN32|AQ_GETPROTO);
+	return WSA_H32( __WSAsyncDBQuery(hWnd,uMsg,0,name,0,NULL,sbuf,buflen,
+				AQ_NAME|AQ_DUPLOWPTR1|AQ_WIN32|AQ_GETPROTO));
 }
 

@@ -654,9 +659,9 @@
 HANDLE WINAPI WSAAsyncGetProtoByNumber(HWND hWnd, UINT uMsg, INT number,
                                            LPSTR sbuf, INT buflen)
 {
-	TRACE("hwnd %04x, msg %04x, num %i\n", hWnd, uMsg, number );
-	return __WSAsyncDBQuery(hWnd,uMsg,number,NULL,0,NULL,sbuf,buflen,
-				AQ_GETPROTO|AQ_NUMBER|AQ_WIN32);
+	TRACE("hwnd %p, msg %04x, num %i\n", hWnd, uMsg, number );
+	return WSA_H32( __WSAsyncDBQuery(hWnd,uMsg,number,NULL,0,NULL,sbuf,buflen,
+				AQ_GETPROTO|AQ_NUMBER|AQ_WIN32));
 }
 
 /***********************************************************************
@@ -678,10 +683,10 @@
 HANDLE WINAPI WSAAsyncGetServByName(HWND hWnd, UINT uMsg, LPCSTR name,
                                         LPCSTR proto, LPSTR sbuf, INT buflen)
 {
-	TRACE("hwnd %04x, msg %04x, name %s, proto %s\n",
+	TRACE("hwnd %p, msg %04x, name %s, proto %s\n",
 	       hWnd, uMsg, (name)?name:"<null>", (proto)?proto:"<null>");
-	return __WSAsyncDBQuery(hWnd,uMsg,0,name,0,proto,sbuf,buflen,
-				AQ_GETSERV|AQ_NAME|AQ_DUPLOWPTR1|AQ_DUPLOWPTR2|AQ_WIN32);
+	return WSA_H32( __WSAsyncDBQuery(hWnd,uMsg,0,name,0,proto,sbuf,buflen,
+				AQ_GETSERV|AQ_NAME|AQ_DUPLOWPTR1|AQ_DUPLOWPTR2|AQ_WIN32));
 }
 
 /***********************************************************************
@@ -703,10 +708,10 @@
 HANDLE WINAPI WSAAsyncGetServByPort(HWND hWnd, UINT uMsg, INT port,
                                         LPCSTR proto, LPSTR sbuf, INT buflen)
 {
-	TRACE("hwnd %04x, msg %04x, port %i, proto %s\n",
+	TRACE("hwnd %p, msg %04x, port %i, proto %s\n",
 	       hWnd, uMsg, port, (proto)?proto:"<null>" );
-	return __WSAsyncDBQuery(hWnd,uMsg,port,NULL,0,proto,sbuf,buflen,
-				AQ_GETSERV|AQ_NUMBER|AQ_DUPLOWPTR2|AQ_WIN32);
+	return WSA_H32( __WSAsyncDBQuery(hWnd,uMsg,port,NULL,0,proto,sbuf,buflen,
+				AQ_GETSERV|AQ_NUMBER|AQ_DUPLOWPTR2|AQ_WIN32));
 }
 
 /***********************************************************************
@@ -714,7 +719,7 @@
  */
 INT WINAPI WSACancelAsyncRequest(HANDLE hAsyncTaskHandle)
 {
-    FIXME("(%08x),stub\n", hAsyncTaskHandle);
+    FIXME("(%p),stub\n", hAsyncTaskHandle);
     return 0;
 }
 
@@ -723,7 +728,7 @@
  */
 INT16 WINAPI WSACancelAsyncRequest16(HANDLE16 hAsyncTaskHandle)
 {
-    return (HANDLE16)WSACancelAsyncRequest((HANDLE)hAsyncTaskHandle);
+    return (INT16)WSACancelAsyncRequest(WSA_H32 (hAsyncTaskHandle));
 }
 
 /***********************************************************************
Index: socket.c
===================================================================
RCS file: /home/wine/wine/dlls/winsock/socket.c,v
retrieving revision 1.109
diff -u -r1.109 socket.c
--- socket.c	17 Oct 2002 16:43:43 -0000	1.109
+++ socket.c	28 Oct 2002 15:02:24 -0000
@@ -26,6 +26,7 @@
 #include "config.h"
 #include "wine/port.h"
 
+#include <assert.h>
 #include <stdio.h>
 #include <string.h>
 #include <sys/types.h>
@@ -131,6 +132,18 @@
                         inet_ntoa(((struct sockaddr_in *)a)->sin_addr), \
                         ntohs(((struct sockaddr_in *)a)->sin_port))
 
+/* HANDLE<->SOCKET conversion (SOCKET is u_int). */
+#define SOCKET2HANDLE(s) ((HANDLE)(ULONG_PTR)(s))
+#define HANDLE2SOCKET(h) ((SOCKET)(ULONG_PTR)(h))
+#define HANDLE2SOCKET_S(h) __handle2socket(h)
+
+inline static SOCKET __handle2socket (HANDLE h)
+/* Sanity check (necessary if sizeof (HANDLE) > sizeof (SOCKET)) */
+{
+    assert ( SOCKET2HANDLE ( HANDLE2SOCKET (h) ) == h );
+    return HANDLE2SOCKET(h);
+}
+
 /****************************************************************
  * Async IO declarations
  ****************************************************************/
@@ -314,14 +327,15 @@
 {
     int fd;
 
-    if (set_error( wine_server_handle_to_fd( s, GENERIC_READ, &fd, NULL, NULL ) )) return -1;
+    if (set_error( wine_server_handle_to_fd( SOCKET2HANDLE(s), GENERIC_READ, &fd, NULL, NULL ) ))
+        return -1;
     return fd;
 }
 
 inline static int _get_sock_fd_type( SOCKET s, DWORD access, enum fd_type *type, int *flags )
 {
     int fd;
-    if (set_error( wine_server_handle_to_fd( s, access, &fd, type, flags ) )) return -1;
+    if (set_error( wine_server_handle_to_fd( SOCKET2HANDLE(s), access, &fd, type, flags ) )) return -1;
     if ( ( (access & GENERIC_READ)  && (*flags & FD_FLAG_RECV_SHUTDOWN ) ) ||
          ( (access & GENERIC_WRITE) && (*flags & FD_FLAG_SEND_SHUTDOWN ) ) )
     {
@@ -332,8 +346,8 @@
     return fd;
 }
 
-static void _enable_event(SOCKET s, unsigned int event,
-			  unsigned int sstate, unsigned int cstate)
+static void _enable_event( HANDLE s, unsigned int event,
+                           unsigned int sstate, unsigned int cstate )
 {
     SERVER_START_REQ( enable_socket_event )
     {
@@ -351,7 +365,7 @@
     int ret;
     SERVER_START_REQ( get_socket_event )
     {
-        req->handle  = s;
+        req->handle  = SOCKET2HANDLE(s);
         req->service = FALSE;
         req->c_event = 0;
         wine_server_call( req );
@@ -366,7 +380,7 @@
     unsigned int ret;
     SERVER_START_REQ( get_socket_event )
     {
-        req->handle  = s;
+        req->handle  = SOCKET2HANDLE(s);
         req->service = FALSE;
         req->c_event = 0;
         wine_server_call( req );
@@ -389,7 +403,7 @@
 
     SERVER_START_REQ( get_socket_event )
     {
-        req->handle  = s;
+        req->handle  = SOCKET2HANDLE(s);
         req->service = FALSE;
         req->c_event = 0;
         wine_server_set_reply( req, events, sizeof(events) );
@@ -427,7 +441,7 @@
  */
 BOOL WINAPI WS_LibMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID fImpLoad)
 {
-    TRACE("0x%x 0x%lx %p\n", hInstDLL, fdwReason, fImpLoad);
+    TRACE("%p 0x%lx %p\n", hInstDLL, fdwReason, fImpLoad);
     switch (fdwReason) {
     case DLL_PROCESS_ATTACH:
         opentype_tls_index = TlsAlloc();
@@ -1089,7 +1103,7 @@
     }
 
     wsa->overlapped->InternalHigh = 0;
-    TRACE ( "wsa %p, ops %p, h %d, ev %d, fd %d, func %p, ov %p, uov %p, cfunc %p\n",
+    TRACE ( "wsa %p, ops %p, h %p, ev %p, fd %d, func %p, ov %p, uov %p, cfunc %p\n",
             wsa, wsa->async.ops, wsa->async.handle, wsa->async.event, wsa->async.fd, wsa->async.func,
             wsa->overlapped, wsa->user_overlapped, wsa->completion_func );
 
@@ -1196,7 +1210,7 @@
         wsa->overlapped->Internal = STATUS_SUCCESS;
         wsa->overlapped->InternalHigh = result;
         TRACE ( "received %d bytes\n", result );
-        _enable_event ( (SOCKET) wsa->async.handle, FD_READ, 0, 0 );
+        _enable_event ( wsa->async.handle, FD_READ, 0, 0 );
         return;
     }
 
@@ -1204,7 +1218,7 @@
     if ( err == WSAEINTR || err == WSAEWOULDBLOCK )  /* errno: EINTR / EAGAIN */
     {
         wsa->overlapped->Internal = STATUS_PENDING;
-        _enable_event ( (SOCKET) wsa->async.handle, FD_READ, 0, 0 );
+        _enable_event ( wsa->async.handle, FD_READ, 0, 0 );
         TRACE ( "still pending\n" );
     }
     else
@@ -1288,7 +1302,7 @@
         wsa->overlapped->Internal = STATUS_SUCCESS;
         wsa->overlapped->InternalHigh = result;
         TRACE ( "sent %d bytes\n", result );
-        _enable_event ( (SOCKET) wsa->async.handle, FD_WRITE, 0, 0 );
+        _enable_event ( wsa->async.handle, FD_WRITE, 0, 0 );
         return;
     }
 
@@ -1296,7 +1310,7 @@
     if ( err == WSAEINTR )
     {
         wsa->overlapped->Internal = STATUS_PENDING;
-        _enable_event ( (SOCKET) wsa->async.handle, FD_WRITE, 0, 0 );
+        _enable_event ( wsa->async.handle, FD_WRITE, 0, 0 );
         TRACE ( "still pending\n" );
     }
     else
@@ -1373,7 +1387,7 @@
         goto out;
     }
     /* Try immediate completion */
-    if ( WSAGetOverlappedResult ( (HANDLE) s, ovl, NULL, FALSE, NULL ) )
+    if ( WSAGetOverlappedResult ( s, ovl, NULL, FALSE, NULL ) )
         return 0;
     if ( (err = WSAGetLastError ()) == WSA_IO_INCOMPLETE )
         return 0;
@@ -1411,11 +1425,11 @@
         close(fd);
         SERVER_START_REQ( accept_socket )
         {
-            req->lhandle = s;
+            req->lhandle = SOCKET2HANDLE(s);
             req->access  = GENERIC_READ|GENERIC_WRITE|SYNCHRONIZE;
             req->inherit = TRUE;
             set_error( wine_server_call( req ) );
-            as = (SOCKET)reply->handle;
+            as = HANDLE2SOCKET_S( reply->handle );
         }
         SERVER_END_REQ;
 	if (as)
@@ -1524,7 +1538,7 @@
 int WINAPI WS_closesocket(SOCKET s)
 {
     TRACE("socket %08x\n", s);
-    if (CloseHandle(s)) return 0;
+    if (CloseHandle(SOCKET2HANDLE(s))) return 0;
     return SOCKET_ERROR;
 }
 
@@ -1571,7 +1585,7 @@
         if (errno == EINPROGRESS)
         {
             /* tell wineserver that a connection is in progress */
-            _enable_event(s, FD_CONNECT|FD_READ|FD_WRITE,
+            _enable_event(SOCKET2HANDLE(s), FD_CONNECT|FD_READ|FD_WRITE,
                           FD_CONNECT|FD_READ|FD_WRITE,
                           FD_WINE_CONNECTED|FD_WINE_LISTENING);
             if (_is_blocking(s))
@@ -1608,7 +1622,7 @@
 
 connect_success:
     close(fd);
-    _enable_event(s, FD_CONNECT|FD_READ|FD_WRITE,
+    _enable_event(SOCKET2HANDLE(s), FD_CONNECT|FD_READ|FD_WRITE,
                   FD_WINE_CONNECTED|FD_READ|FD_WRITE,
                   FD_CONNECT|FD_WINE_LISTENING);
     return 0;
@@ -2236,9 +2250,9 @@
 		}
 		close(fd);
 		if (*argp)
-		    _enable_event(s, 0, FD_WINE_NONBLOCKING, 0);
+		    _enable_event(SOCKET2HANDLE(s), 0, FD_WINE_NONBLOCKING, 0);
 		else
-		    _enable_event(s, 0, 0, FD_WINE_NONBLOCKING);
+		    _enable_event(SOCKET2HANDLE(s), 0, 0, FD_WINE_NONBLOCKING);
 		return 0;
 
 	case WS_SIOCATMARK:
@@ -2295,7 +2309,7 @@
 	if (listen(fd, backlog) == 0)
 	{
 	    close(fd);
-	    _enable_event(s, FD_ACCEPT,
+	    _enable_event(SOCKET2HANDLE(s), FD_ACCEPT,
 			  FD_WINE_LISTENING,
 			  FD_CONNECT|FD_WINE_CONNECTED);
 	    return 0;
@@ -2562,7 +2576,7 @@
         /* Try immediate completion */
         if ( lpOverlapped && !NtResetEvent( lpOverlapped->hEvent, NULL ) )
         {
-            if  ( WSAGetOverlappedResult ( (HANDLE) s, lpOverlapped,
+            if  ( WSAGetOverlappedResult ( s, lpOverlapped,
                                            lpNumberOfBytesSent, FALSE, &dwFlags) )
                 return 0;
 
@@ -2585,7 +2599,7 @@
     {
         err = wsaErrno();
         if ( err == WSAEWOULDBLOCK )
-            _enable_event (s, FD_WRITE, 0, 0);
+            _enable_event (SOCKET2HANDLE(s), FD_WRITE, 0, 0);
         goto err_free;
     }
 
@@ -2849,12 +2863,12 @@
         close(fd);
     }
 
-    _enable_event( s, 0, 0, clear_flags );
+    _enable_event( SOCKET2HANDLE(s), 0, 0, clear_flags );
     if ( how > 1) WSAAsyncSelect( s, 0, 0, 0 );
     return 0;
 
 error:
-    _enable_event( s, 0, 0, clear_flags );
+    _enable_event( SOCKET2HANDLE(s), 0, 0, clear_flags );
     WSASetLastError ( err );
     return SOCKET_ERROR;
 }
@@ -3247,11 +3261,11 @@
 {
     int ret;
 
-    TRACE("%08x, hEvent %08x, lpEvent %08x\n", s, hEvent, (unsigned)lpEvent );
+    TRACE("%08x, hEvent %p, lpEvent %08x\n", s, hEvent, (unsigned)lpEvent );
 
     SERVER_START_REQ( get_socket_event )
     {
-        req->handle  = s;
+        req->handle  = SOCKET2HANDLE(s);
         req->service = TRUE;
         req->c_event = hEvent;
         wine_server_set_reply( req, lpEvent->iErrorCode, sizeof(lpEvent->iErrorCode) );
@@ -3270,11 +3284,11 @@
 {
     int ret;
 
-    TRACE("%08x, hEvent %08x, event %08x\n", s, hEvent, (unsigned)lEvent );
+    TRACE("%08x, hEvent %p, event %08x\n", s, hEvent, (unsigned)lEvent );
 
     SERVER_START_REQ( set_socket_event )
     {
-        req->handle = s;
+        req->handle = SOCKET2HANDLE(s);
         req->mask   = lEvent;
         req->event  = hEvent;
         req->window = 0;
@@ -3319,7 +3333,7 @@
         if ( r == WAIT_OBJECT_0 )
             NtSetEvent ( lpOverlapped->hEvent, NULL );
     }
-    
+
     if ( lpcbTransfer )
         *lpcbTransfer = lpOverlapped->InternalHigh;
 
@@ -3348,11 +3362,11 @@
 {
     int ret;
 
-    TRACE("%x, hWnd %x, uMsg %08x, event %08lx\n", s, hWnd, uMsg, lEvent );
+    TRACE("%x, hWnd %p, uMsg %08x, event %08lx\n", s, hWnd, uMsg, lEvent );
 
     SERVER_START_REQ( set_socket_event )
     {
-        req->handle = s;
+        req->handle = SOCKET2HANDLE(s);
         req->mask   = lEvent;
         req->event  = 0;
         req->window = hWnd;
@@ -3404,7 +3418,7 @@
  */
 BOOL WINAPI WSACloseEvent(WSAEVENT event)
 {
-    TRACE ("event=0x%x\n", event);
+    TRACE ("event=%p\n", event);
 
     return CloseHandle(event);
 }
@@ -3491,7 +3505,7 @@
         req->flags    = dwFlags;
         req->inherit  = TRUE;
         set_error( wine_server_call( req ) );
-        ret = (SOCKET)reply->handle;
+        ret = HANDLE2SOCKET_S( reply->handle );
     }
     SERVER_END_REQ;
     if (ret)
@@ -4005,7 +4019,7 @@
         /* Try immediate completion */
         if ( lpOverlapped && !NtResetEvent( lpOverlapped->hEvent, NULL ) )
         {
-            if  ( WSAGetOverlappedResult ( (HANDLE) s, lpOverlapped,
+            if  ( WSAGetOverlappedResult ( s, lpOverlapped,
                                            lpNumberOfBytesRecvd, FALSE, lpFlags) )
                 return 0;
 
@@ -4036,7 +4050,7 @@
 
     HeapFree (GetProcessHeap(), 0, iovec);
     close(fd);
-    _enable_event(s, FD_READ, 0, 0);
+    _enable_event(SOCKET2HANDLE(s), FD_READ, 0, 0);
 
     return 0;
 
@@ -4127,12 +4141,12 @@
                case CF_DEFER:
                        SERVER_START_REQ ( set_socket_deferred )
                        {
-                           req->handle = s;
-                           req->deferred = cs;
+                           req->handle = SOCKET2HANDLE (s);
+                           req->deferred = SOCKET2HANDLE (cs);
                            if ( !wine_server_call_err ( req ) )
                            {
                                SetLastError ( WSATRY_AGAIN );
-                               CloseHandle ( cs );
+                               WS_closesocket ( cs );
                            }
                        }
                        SERVER_END_REQ;
@@ -4184,7 +4198,7 @@
     * the target use the global duplicate, or we could copy a reference to us to the structure
     * and let the target duplicate it from us, but let's do it as simple as possible */
    hProcess = OpenProcess(PROCESS_DUP_HANDLE, FALSE, dwProcessId);
-   DuplicateHandle(GetCurrentProcess(), s,
+   DuplicateHandle(GetCurrentProcess(), SOCKET2HANDLE(s),
                    hProcess, (LPHANDLE)&lpProtocolInfo->dwCatalogEntryId,
                    0, FALSE, DUPLICATE_SAME_ACCESS);
    CloseHandle(hProcess);




More information about the wine-devel mailing list