Module: wine Branch: master Commit: 2d4adfc49eba7028a4038369c7a639de7a2f6f77 URL: http://source.winehq.org/git/wine.git/?a=commit;h=2d4adfc49eba7028a4038369c7...
Author: Bruno Jesus 00cpxxx@gmail.com Date: Mon Dec 30 22:24:56 2013 -0200
ws2_32: Use a helper function to set the IPX packet type.
---
dlls/ws2_32/socket.c | 53 +++++++++++++++++++++++++++++-------------------- 1 files changed, 31 insertions(+), 22 deletions(-)
diff --git a/dlls/ws2_32/socket.c b/dlls/ws2_32/socket.c index 0d6838e..732bbad 100644 --- a/dlls/ws2_32/socket.c +++ b/dlls/ws2_32/socket.c @@ -1159,6 +1159,36 @@ convert_socktype_u2w(int unixsocktype) { return -1; }
+static int set_ipx_packettype(int sock, int ptype) +{ +#ifdef HAS_IPX + int fd = get_sock_fd( sock, 0, NULL ), ret = 0; + TRACE("trying to set IPX_PTYPE: %d (fd: %d)\n", ptype, fd); + + /* We try to set the ipx type on ipx socket level. */ +#ifdef SOL_IPX + if(setsockopt(fd, SOL_IPX, IPX_TYPE, &ptype, sizeof(ptype)) == -1) + { + ERR("IPX: could not set ipx option type; expect weird behaviour\n"); + ret = SOCKET_ERROR; + } +#else + { + struct ipx val; + /* Should we retrieve val using a getsockopt call and then + * set the modified one? */ + val.ipx_pt = ptype; + setsockopt(fd, 0, SO_DEFAULT_HEADERS, &val, sizeof(struct ipx)); + } +#endif + release_sock_fd( sock, fd ); + return ret; +#else + WARN("IPX support is not enabled, can't set packet type\n"); + return SOCKET_ERROR; +#endif +} + /* ----------------------------------- API ----- * * Init / cleanup / error checking. @@ -4772,28 +4802,7 @@ int WINAPI WS_setsockopt(SOCKET s, int level, int optname, switch(optname) { case IPX_PTYPE: - fd = get_sock_fd( s, 0, NULL ); - TRACE("trying to set IPX_PTYPE: %d (fd: %d)\n", *(const int*)optval, fd); - - /* We try to set the ipx type on ipx socket level. */ -#ifdef SOL_IPX - if(setsockopt(fd, SOL_IPX, IPX_TYPE, optval, optlen) == -1) - { - ERR("IPX: could not set ipx option type; expect weird behaviour\n"); - release_sock_fd( s, fd ); - return SOCKET_ERROR; - } -#else - { - struct ipx val; - /* Should we retrieve val using a getsockopt call and then - * set the modified one? */ - val.ipx_pt = *optval; - setsockopt(fd, 0, SO_DEFAULT_HEADERS, &val, sizeof(struct ipx)); - } -#endif - release_sock_fd( s, fd ); - return 0; + return set_ipx_packettype(s, *(int*)optval);
case IPX_FILTERPTYPE: /* Sets the receive filter packet type, at the moment we don't support it */