[ Adding wine-patches. Alexandre, this is for you! ]
On Sun, 12 Sep 2004, Roderick Colenbrander wrote:
Currently I don't have access to the machine I use for wine stuff, so I haven't been able to create a real patch. Anyway I'll try to assist you fixing the problem as it isn't that difficult to fix.
This is most welcome. Thanks a lot, I really appreciate your help!
//setsockopt code struct ipx val; (perhaps we should retrieve this one using a getsockopt call and then we set modified one) val.ipx_pt = *opt_val; setsockopt(fd, 0, SO_DEFAULT_HEADERS, &val, sizeof(struct ipx)); *opt_val = (int)val.ipx_pt;
I hope this helps.
The last line of code was only a trick to see whether I'm paying attention, wasn't it? ;-)
I added a bit of error checking, similiar to the general case, and guarded variables by #ifdefs as well. Current winehq.com CVS plus the following patch was built on FreeBSD 4.10 and SUSE LINUX 9.1.
Thanks again, Gerald
ChangeLog: Roderick Colenbrander thunderbird2k@gmx.net Gerald Pfeifer gerald@pfeifer.com Make WS2_Send(), WS_getsockopt(), and WS_setsockopt() work on FreeBSD.
Index: socket.c =================================================================== RCS file: /home/wine/wine/dlls/winsock/socket.c,v retrieving revision 1.155 diff -u -3 -p -r1.155 socket.c --- socket.c 7 Sep 2004 20:47:03 -0000 1.155 +++ socket.c 12 Sep 2004 21:19:09 -0000 @@ -1108,6 +1108,7 @@ static int WS2_send ( int fd, struct iov #ifdef HAVE_IPX if(to->sa_family == WS_AF_IPX) { +#ifndef __FreeBSD__ struct sockaddr_ipx* uipx = (struct sockaddr_ipx*)hdr.msg_name; int val=0; int len=sizeof(int); @@ -1122,6 +1123,7 @@ static int WS2_send ( int fd, struct iov TRACE("ptype: %d (fd:%d)\n", val, fd); uipx->sipx_type = val; } +#endif } #endif
@@ -1574,6 +1576,10 @@ INT WINAPI WS_getsockopt(SOCKET s, INT l #ifdef HAVE_IPX if(level == NSPROTO_IPX) { +#ifdef __FreeBSD__ + struct ipx val; + socklen_t len=sizeof(struct ipx); +#endif struct WS_sockaddr_ipx addr; IPX_ADDRESS_DATA *data; int namelen; @@ -1581,11 +1587,20 @@ INT WINAPI WS_getsockopt(SOCKET s, INT l { case IPX_PTYPE: fd = get_sock_fd( s, 0, NULL ); - +#ifdef __FreeBSD__ + + if(getsockopt(fd, 0, SO_DEFAULT_HEADERS, &val, &len) + == -1 ) + { + return SOCKET_ERROR; + } + *optval = (int)val.ipx_pt; +#else if(getsockopt(fd, SOL_IPX, IPX_TYPE, optval, optlen) == -1) { return SOCKET_ERROR; } +#endif TRACE("ptype: %d (fd: %d)\n", *(int*)optval, fd); release_sock_fd( s, fd );
@@ -2305,18 +2320,30 @@ int WINAPI WS_setsockopt(SOCKET s, int l switch(optname) { case IPX_PTYPE: + { +#ifdef __FreeBSD__ + struct ipx val; +#endif fd = get_sock_fd( s, 0, NULL ); TRACE("trying to set IPX_PTYPE: %d (fd: %d)\n", *(int*)optval, fd);
/* We try to set the ipx type on ipx socket level. */ +#ifdef __FreeBSD__ + /* 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)); +#else if(setsockopt(fd, SOL_IPX, IPX_TYPE, optval, optlen) == -1) { ERR("IPX: could not set ipx option type; expect weird behaviour\n"); return SOCKET_ERROR; } +#endif release_sock_fd( s, fd ); return 0; break; + } case IPX_FILTERPTYPE: /* Sets the receive filter packet type, at the moment we don't support it */ FIXME("IPX_FILTERPTYPE: %x\n", *optval);