[PATCH v2] ws2_32: Handle more IGMP socket options
Fabian Maurer
dark.shadow4 at web.de
Fri Oct 18 09:27:06 CDT 2019
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=47956
Signed-off-by: Fabian Maurer <dark.shadow4 at web.de>
---
v2: Don't modify caller data
---
dlls/ws2_32/socket.c | 22 ++++++++++++++++++++++
1 file changed, 22 insertions(+)
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
@@ -692,6 +692,10 @@ static const int ws_ip_map[][2] =
MAP_OPTION( IP_MULTICAST_LOOP ),
MAP_OPTION( IP_ADD_MEMBERSHIP ),
MAP_OPTION( IP_DROP_MEMBERSHIP ),
+ MAP_OPTION( IP_ADD_SOURCE_MEMBERSHIP ),
+ MAP_OPTION( IP_DROP_SOURCE_MEMBERSHIP ),
+ MAP_OPTION( IP_BLOCK_SOURCE ),
+ MAP_OPTION( IP_UNBLOCK_SOURCE ),
MAP_OPTION( IP_OPTIONS ),
#ifdef IP_HDRINCL
MAP_OPTION( IP_HDRINCL ),
@@ -5801,6 +5805,7 @@ int WINAPI WS_setsockopt(SOCKET s, int level, int optname,
int woptval;
struct linger linger;
struct timeval tval;
+ struct ip_mreq_source mreq_source;
TRACE("(socket %04lx, %s, optval %s, optlen %d)\n", s,
debugstr_sockopt(level, optname), debugstr_optval(optval, optlen),
@@ -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 */
+ 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
--
2.23.0
More information about the wine-devel
mailing list