[7/7] ws2_32: Better trace setsockopt/getsockopt (try 2)
Bruno Jesus
00cpxxx at gmail.com
Sat Mar 28 22:54:03 CDT 2015
Use wine_dbg_sprintf instead of plain sprintf, that simplified the patch =)
-------------- next part --------------
---
dlls/ws2_32/socket.c | 141 +++++++++++++++++++++++++++++++++++++++++++++++++--
1 file changed, 137 insertions(+), 4 deletions(-)
diff --git a/dlls/ws2_32/socket.c b/dlls/ws2_32/socket.c
index 4444011..da9bd96 100644
--- a/dlls/ws2_32/socket.c
+++ b/dlls/ws2_32/socket.c
@@ -258,6 +258,9 @@ static int WS2_recv_base( SOCKET s, LPWSABUF lpBuffers, DWORD dwBufferCount,
LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine,
LPWSABUF lpControlBuffer );
+static void trace_sockopt(const char *func, SOCKET s, INT level,
+ INT optname, const char *optval, INT *optlen, INT optlenval);
+
/* critical section to protect some non-reentrant net function */
static CRITICAL_SECTION csWSgetXXXbyYYY;
static CRITICAL_SECTION_DEBUG critsect_debug =
@@ -3147,8 +3150,8 @@ INT WINAPI WS_getsockopt(SOCKET s, INT level,
int fd;
INT ret = 0;
- TRACE("socket %04lx, level 0x%x, name 0x%x, ptr %p, len %d\n",
- s, level, optname, optval, optlen ? *optlen : 0);
+ if (TRACE_ON(winsock))
+ trace_sockopt("getsockopt", s, level, optname, (const char*)optval, optlen, 0);
switch(level)
{
@@ -4955,8 +4958,8 @@ int WINAPI WS_setsockopt(SOCKET s, int level, int optname,
struct linger linger;
struct timeval tval;
- TRACE("socket %04lx, level 0x%x, name 0x%x, ptr %p, len %d\n",
- s, level, optname, optval, optlen);
+ if (TRACE_ON(winsock))
+ trace_sockopt("setsockopt", s, level, optname, optval, NULL, optlen);
/* some broken apps pass the value directly instead of a pointer to it */
if(optlen && IS_INTRESOURCE(optval))
@@ -7843,3 +7846,133 @@ INT WINAPI WSCEnumProtocols( LPINT protocols, LPWSAPROTOCOL_INFOW buffer, LPDWOR
return ret;
}
+
+static void trace_sockopt(const char *func, SOCKET s, INT level,
+ INT optname, const char *optval, INT *optlen, INT optlenval)
+{
+ const char *stropt, *strlevel, *lenstr, *valstr;
+
+ if (optlen) optlenval = *optlen;
+
+ #define DEBUG_SOCKLEVEL(x) case (x): strlevel = #x
+ #define DEBUG_SOCKOPT(x) case (x): stropt = #x; break
+
+ /* use a default for level and option, it will be changed if the option is found */
+ strlevel = wine_dbg_sprintf("WS_0x%x", level);
+ stropt = wine_dbg_sprintf("WS_0x%x", optname);
+
+ switch(level)
+ {
+ DEBUG_SOCKLEVEL(WS_SOL_SOCKET);
+ switch(optname)
+ {
+ DEBUG_SOCKOPT(WS_SO_ACCEPTCONN);
+ DEBUG_SOCKOPT(WS_SO_BROADCAST);
+ DEBUG_SOCKOPT(WS_SO_BSP_STATE);
+ DEBUG_SOCKOPT(WS_SO_CONDITIONAL_ACCEPT);
+ DEBUG_SOCKOPT(WS_SO_CONNECT_TIME);
+ DEBUG_SOCKOPT(WS_SO_DEBUG);
+ DEBUG_SOCKOPT(WS_SO_DONTLINGER);
+ DEBUG_SOCKOPT(WS_SO_DONTROUTE);
+ DEBUG_SOCKOPT(WS_SO_ERROR);
+ DEBUG_SOCKOPT(WS_SO_EXCLUSIVEADDRUSE);
+ DEBUG_SOCKOPT(WS_SO_GROUP_ID);
+ DEBUG_SOCKOPT(WS_SO_GROUP_PRIORITY);
+ DEBUG_SOCKOPT(WS_SO_KEEPALIVE);
+ DEBUG_SOCKOPT(WS_SO_LINGER);
+ DEBUG_SOCKOPT(WS_SO_MAX_MSG_SIZE);
+ DEBUG_SOCKOPT(WS_SO_OOBINLINE);
+ DEBUG_SOCKOPT(WS_SO_OPENTYPE);
+ DEBUG_SOCKOPT(WS_SO_PROTOCOL_INFOA);
+ DEBUG_SOCKOPT(WS_SO_PROTOCOL_INFOW);
+ DEBUG_SOCKOPT(WS_SO_RCVBUF);
+ DEBUG_SOCKOPT(WS_SO_RCVTIMEO);
+ DEBUG_SOCKOPT(WS_SO_REUSEADDR);
+ DEBUG_SOCKOPT(WS_SO_SNDBUF);
+ DEBUG_SOCKOPT(WS_SO_SNDTIMEO);
+ DEBUG_SOCKOPT(WS_SO_TYPE);
+ }
+ break;
+
+ DEBUG_SOCKLEVEL(WS_NSPROTO_IPX);
+ switch(optname)
+ {
+ DEBUG_SOCKOPT(WS_IPX_PTYPE);
+ DEBUG_SOCKOPT(WS_IPX_FILTERPTYPE);
+ DEBUG_SOCKOPT(WS_IPX_DSTYPE);
+ DEBUG_SOCKOPT(WS_IPX_RECVHDR);
+ DEBUG_SOCKOPT(WS_IPX_MAXSIZE);
+ DEBUG_SOCKOPT(WS_IPX_ADDRESS);
+ DEBUG_SOCKOPT(WS_IPX_MAX_ADAPTER_NUM);
+ }
+ break;
+
+ DEBUG_SOCKLEVEL(WS_SOL_IRLMP);
+ switch(optname)
+ {
+ DEBUG_SOCKOPT(WS_IRLMP_ENUMDEVICES);
+ }
+ break;
+
+ DEBUG_SOCKLEVEL(WS_IPPROTO_TCP);
+ switch(optname)
+ {
+ DEBUG_SOCKOPT(WS_TCP_BSDURGENT);
+ DEBUG_SOCKOPT(WS_TCP_EXPEDITED_1122);
+ DEBUG_SOCKOPT(WS_TCP_NODELAY);
+ }
+ break;
+
+ DEBUG_SOCKLEVEL(WS_IPPROTO_IP);
+ switch(optname)
+ {
+ DEBUG_SOCKOPT(WS_IP_ADD_MEMBERSHIP);
+ DEBUG_SOCKOPT(WS_IP_DROP_MEMBERSHIP);
+ DEBUG_SOCKOPT(WS_IP_HDRINCL);
+ DEBUG_SOCKOPT(WS_IP_MULTICAST_IF);
+ DEBUG_SOCKOPT(WS_IP_MULTICAST_LOOP);
+ DEBUG_SOCKOPT(WS_IP_MULTICAST_TTL);
+ DEBUG_SOCKOPT(WS_IP_OPTIONS);
+ DEBUG_SOCKOPT(WS_IP_PKTINFO);
+ DEBUG_SOCKOPT(WS_IP_TOS);
+ DEBUG_SOCKOPT(WS_IP_TTL);
+ DEBUG_SOCKOPT(WS_IP_UNICAST_IF);
+ DEBUG_SOCKOPT(WS_IP_DONTFRAGMENT);
+ }
+ break;
+
+ DEBUG_SOCKLEVEL(WS_IPPROTO_IPV6);
+ switch(optname)
+ {
+ DEBUG_SOCKOPT(WS_IPV6_ADD_MEMBERSHIP);
+ DEBUG_SOCKOPT(WS_IPV6_DROP_MEMBERSHIP);
+ DEBUG_SOCKOPT(WS_IPV6_MULTICAST_IF);
+ DEBUG_SOCKOPT(WS_IPV6_MULTICAST_HOPS);
+ DEBUG_SOCKOPT(WS_IPV6_MULTICAST_LOOP);
+ DEBUG_SOCKOPT(WS_IPV6_UNICAST_HOPS);
+ DEBUG_SOCKOPT(WS_IPV6_V6ONLY);
+ DEBUG_SOCKOPT(WS_IPV6_UNICAST_IF);
+ DEBUG_SOCKOPT(WS_IPV6_DONTFRAG);
+ }
+ break;
+ }
+ #undef DEBUG_SOCKLEVEL
+ #undef DEBUG_SOCKOPT
+
+ valstr = (char*) wine_dbg_sprintf("%p", optval);
+ if (!optlen) /* if possible display the value when tracing from setsockopt */
+ {
+ if (optval && !IS_INTRESOURCE(optval) && optlenval >= 1 && optlenval <= sizeof(DWORD))
+ {
+ DWORD value = 0;
+ memcpy(&value, optval, optlenval);
+ strcat((char*) valstr, wine_dbg_sprintf(" (%u)", value));
+ }
+ lenstr = wine_dbg_sprintf("%d", optlenval);
+ }
+ else
+ lenstr = wine_dbg_sprintf("%p (%d)", optlen, *optlen);
+
+ TRACE(" %s (socket %04lx, level %s, name %s, optval %s, len %s)\n",
+ func, s, strlevel + 3, stropt + 3, valstr, lenstr);
+}
--
2.1.4
More information about the wine-patches
mailing list