CVS: winex/dlls/winsock socket.c,1.46,1.47

[email protected] 31 Jul 2007 17:32:11 -0000
Newsgroups gmane.comp.emulators.winex.cvs
Message-ID <[email protected]>
Subject: winex/dlls/winsock socket.c,1.46,1.47Update of /var/lib/cvsd/cvsroot/winex/dlls/winsock
In directory agravaine:/tmp/cvs-serv20468/dlls/winsock

Modified Files:
	socket.c 
Log Message:

- handle sockaddr having different layout on MacOS X from Linux & Windows
- use correct allocator
- add hex dumping of network data if +winsockhex is enabled
- always dump addresses when +winsock is enabled
- warning fix



Index: socket.c
===================================================================
RCS file: /var/lib/cvsd/cvsroot/winex/dlls/winsock/socket.c,v
retrieving revision 1.46
retrieving revision 1.47
diff -u -d -r1.46 -r1.47
--- socket.c	30 Mar 2007 20:11:23 -0000	1.46
+++ socket.c	31 Jul 2007 17:32:09 -0000	1.47
@@ -108,16 +108,16 @@
 
 
 WINE_DEFAULT_DEBUG_CHANNEL(winsock);
+WINE_DECLARE_DEBUG_CHANNEL(winsockhex);
 
 /* critical section to protect some non-rentrant net function */
 extern CRITICAL_SECTION csWSgetXXXbyYYY;
 
-#define DEBUG_SOCKADDR 0
 #define dump_sockaddr(a) \
-        DPRINTF("sockaddr_in: family %d, address %s, port %d\n", \
-                        ((struct sockaddr_in *)a)->sin_family, \
-                        inet_ntoa(((struct sockaddr_in *)a)->sin_addr), \
-                        ntohs(((struct sockaddr_in *)a)->sin_port))
+        TRACE ("sockaddr_in: family %d, address %s, port %d\n", \
+               ((SOCKADDR_IN *)a)->sin_family,               \
+               WS_inet_ntoa(((SOCKADDR_IN *)a)->sin_addr),   \
+               ntohs(((SOCKADDR_IN *)a)->sin_port))
 
 extern void initialize_async_cs(void);
 extern void deinitialize_async_cs(void);
@@ -816,6 +816,42 @@
     WSASetLastError(iError);
 }
 
+static void debug_hexdump(void *data, unsigned long len)
+{
+    unsigned int i;
+    char *cdata = (char *)data;
+    char textout[16];
+
+    if (!WINE_TRACE_ON(winsockhex))
+       return;
+
+    for (i = 0; i < len; i++)
+    {
+        if ((i % 8) == 0 && i) DPRINTF("  ");
+        if ((i % 16) == 0 && i) DPRINTF("     '%.8s' '%.8s'\n", &textout[0], &textout[8]);
+        textout[i % 16] = (cdata[i] && isprint(cdata[i])) ? cdata[i] : '.';
+        DPRINTF("%02hhx ", cdata[i]);
+    }
+    if (i % 16)
+    {
+        unsigned int j;
+        for (j = 0; j < (16 - (i % 16)); j++)
+        {
+            if (((16 - (i % 16)) - j) == 8) DPRINTF("  ");
+            DPRINTF(".. ");
+        }
+        DPRINTF("       '");
+        for (j = 0; j < (i % 16); j++)
+        {
+            DPRINTF("%c", textout[j]);
+            if (j == 8) DPRINTF("' '");
+        }
+        DPRINTF("'\n");
+    }
+    DPRINTF("\n");
+
+}
+
 static char* check_buffer(int size)
 {
     static int local_buflen;
@@ -885,7 +921,9 @@
  * start with. Note that the returned pointer may be the original pointer
  * if no conversion is necessary.
  */
-static const struct sockaddr* ws_sockaddr_ws2u(const struct WS_sockaddr* wsaddr, int wsaddrlen, int *uaddrlen)
+static const struct sockaddr*
+ws_sockaddr_ws2u (const struct WS_sockaddr* wsaddr, int wsaddrlen,
+                  int *uaddrlen)
 {
     switch (wsaddr->sa_family)
     {
@@ -899,7 +937,10 @@
                 return NULL;
 
             *uaddrlen=sizeof(struct sockaddr_ipx);
-            uipx=malloc(*uaddrlen);
+            uipx = HeapAlloc (GetProcessHeap (), 0, *uaddrlen);
+            if (!uipx)
+               return NULL;
+
             uipx->sipx_family=AF_IPX;
             uipx->sipx_port=wsipx->sa_socket;
             /* copy sa_netnum and sa_nodenum to sipx_network and sipx_node
@@ -916,6 +957,24 @@
         if (wsaddrlen<sizeof(struct WS_sockaddr))
             return NULL;
 
+#ifdef HAVE_STRUCT_SOCKADDR_SA_LEN
+        /* Always need to copy in this case as the structure layout
+           is slightly different from Windows */
+        {
+           struct sockaddr *sa =
+              HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY, wsaddrlen);
+
+           if (!sa)
+              return NULL;
+
+           memcpy (sa, wsaddr, wsaddrlen);
+           sa->sa_family = wsaddr->sa_family;
+           sa->sa_len = wsaddrlen;
+           *uaddrlen = wsaddrlen;
+           return sa;
+        }
+#endif
+
         /* No conversion needed, just return the original address */
         *uaddrlen=wsaddrlen;
         return (const struct sockaddr*)wsaddr;
@@ -924,7 +983,9 @@
 }
 
 /* Allocates a Unix sockaddr structure to receive the data */
-inline struct sockaddr* ws_sockaddr_alloc(const struct WS_sockaddr* wsaddr, int* wsaddrlen, int* uaddrlen)
+inline struct sockaddr*
+ws_sockaddr_alloc (const struct WS_sockaddr* wsaddr, int* wsaddrlen,
+                   int* uaddrlen)
 {
     if (wsaddr==NULL)
     {
@@ -941,11 +1002,12 @@
     else
         *uaddrlen=max(sizeof(struct sockaddr),*wsaddrlen);
 
-    return malloc(*uaddrlen);
+    return HeapAlloc (GetProcessHeap (), 0, *uaddrlen);
 }
 
 /* Returns 0 if successful, -1 if the buffer is too small */
-static int ws_sockaddr_u2ws(const struct sockaddr* uaddr, int uaddrlen, struct WS_sockaddr* wsaddr, int* wsaddrlen)
+static int ws_sockaddr_u2ws(const struct sockaddr* uaddr, int uaddrlen,
+                            struct WS_sockaddr* wsaddr, int* wsaddrlen)
 {
     int res;
 
@@ -995,6 +1057,14 @@
     default:
         /* No conversion needed */
         memcpy(wsaddr,uaddr,*wsaddrlen);
+
+#ifdef HAVE_STRUCT_SOCKADDR_SA_LEN
+        /* Need to fix contents of sa_family; it's the first 2 bytes
+           on Windows, but it's only the second byte on this platform
+           as it has a sa_len field (which is the first byte) */
+        wsaddr->sa_family = uaddr->sa_family;
+#endif
+
         if (*wsaddrlen<uaddrlen) {
             res=-1;
         } else {
@@ -1011,7 +1081,7 @@
 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);
+       HeapFree (GetProcessHeap (), 0, (LPVOID)uaddr);
 }
 
 /**************************************************************************
@@ -1154,9 +1224,7 @@
 
     if ( lpFrom )
     {
-#if DEBUG_SOCKADDR
         dump_sockaddr (lpFrom);
-#endif
 
         hdr.msg_namelen = *lpFromlen;
         hdr.msg_name = ws_sockaddr_alloc ( lpFrom, lpFromlen, &hdr.msg_namelen );
@@ -1193,13 +1261,11 @@
         WARN ( "Address buffer too small\n" );
     }
 
-#if DEBUG_SOCKADDR
     if( lpFrom )
-    {
         dump_sockaddr (lpFrom);
-    }
-#endif
 
+    if (n > 0)
+       debug_hexdump (iov[0].iov_base, n);
 
 out:
 
@@ -1262,6 +1328,7 @@
 {
     struct msghdr hdr;
     int n = -1;
+
     TRACE ( "fd %d, iovec %p, count %d addr %p, len %d, flags %lx\n",
             fd, iov, count, to, tolen, dwFlags);
 
@@ -1269,9 +1336,8 @@
 
     if ( to )
     {
-#if DEBUG_SOCKADDR
         dump_sockaddr (to);
-#endif
+
         hdr.msg_name = (struct sockaddr*) ws_sockaddr_ws2u ( to, tolen, &hdr.msg_namelen );
         if ( !hdr.msg_name )
         {
@@ -1288,6 +1354,8 @@
     hdr.msg_controllen = 0;
     hdr.msg_flags = 0;
 
+    debug_hexdump (hdr.msg_iov[0].iov_base, hdr.msg_iov[0].iov_len);
+
     n = sendmsg (fd, &hdr, dwFlags);
 
 out:
@@ -1482,9 +1550,7 @@
     int res;
 
     TRACE("socket %04x, ptr %p, length %d\n", s, name, namelen);
-#if DEBUG_SOCKADDR
     dump_sockaddr(name);
-#endif
 
     res=SOCKET_ERROR;
     if (fd != -1)
@@ -1596,9 +1662,7 @@
     int fd = _get_sock_fd(s);
 
     TRACE("socket %04x, ptr %p, length %d\n", s, name, namelen);
-#if DEBUG_SOCKADDR
     dump_sockaddr(name);
-#endif
 
     if (fd != -1)
     {
@@ -1745,9 +1809,7 @@
     INT namelen32 = *namelen16;
     INT retVal = WS_getpeername( s, name, &namelen32 );
 
-#if DEBUG_SOCKADDR
     dump_sockaddr(name);
-#endif
 
    *namelen16 = namelen32;
     return (INT16)retVal;
@@ -1814,10 +1876,7 @@
         retVal = WS_getsockname( s, name, &namelen32 );
        *namelen16 = namelen32;
 
-#if DEBUG_SOCKADDR
-    dump_sockaddr(name);
-#endif
-
+       dump_sockaddr(name);
     }
     else retVal = SOCKET_ERROR;
     return (INT16)retVal;
@@ -2744,6 +2803,7 @@
 
 
     fd = _get_sock_fd(s);
+    TRACE ("fd = %d\n", fd);
     if (fd != -1)
     {
 	struct	linger linger;
@@ -3427,7 +3487,8 @@
         else
             dst->ai_addrlen = src->ai_addrlen;
         dst->ai_addr = HeapAlloc(GetProcessHeap(), 0, dst->ai_addrlen);
-        ws_sockaddr_u2ws(src->ai_addr, src->ai_addrlen, dst->ai_addr, &dst->ai_addrlen);
+        ws_sockaddr_u2ws(src->ai_addr, src->ai_addrlen, dst->ai_addr,
+                         (int *)&dst->ai_addrlen);
 
         if (pdst) pdst->ai_next = dst;
         else *res = dst;