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;