October 18, 2019 9:28 AM, "Fabian Maurer" <dark.shadow4(a)web.de> wrote:
diff --git a/dlls/ws2_32/socket.c b/dlls/ws2_32/socket.c index aa0a164ff9..22a07ce893 100644 --- a/dlls/ws2_32/socket.c +++ b/dlls/ws2_32/socket.c @@ -6011,6 +6016,23 @@ int WINAPI WS_setsockopt(SOCKET s, int level, int optname, case WS_IPPROTO_IP: switch(optname) { + case WS_IP_ADD_SOURCE_MEMBERSHIP: + case WS_IP_DROP_SOURCE_MEMBERSHIP: + case WS_IP_BLOCK_SOURCE: + case WS_IP_UNBLOCK_SOURCE: + { + /* ip_mreq_source is different on Windows (switched source/interface)m so we need to make a copy */
Only on Linux. BSD has it in the same order as Windows.
+ WS_IP_MREQ_SOURCE* val = (void*)optval; + mreq_source.imr_interface.s_addr = val->imr_interface.S_un.S_addr; + mreq_source.imr_multiaddr.s_addr = val->imr_multiaddr.S_un.S_addr; + mreq_source.imr_sourceaddr.s_addr = val->imr_sourceaddr.S_un.S_addr; + + optval = (char*)&mreq_source; + optlen = sizeof(mreq_source); + + convert_sockopt(&level, &optname); + break; + } case WS_IP_ADD_MEMBERSHIP: case WS_IP_DROP_MEMBERSHIP: #ifdef IP_HDRINCL
Chip