From 5fc745a34fb9ec8ded7959aad3a1ed69c92d5742 Mon Sep 17 00:00:00 2001 From: Gonzalo Paniagua Javier Date: Mon, 4 Oct 2010 16:15:24 -0400 Subject: [PATCH] Map SO_EXCLUSIVEADDRUSE to !SO_REUSEADDR This will make windows app that use that property work on *nix. Fixes bug #643475. --- mono/metadata/socket-io.c | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/mono/metadata/socket-io.c b/mono/metadata/socket-io.c index d5a2885510d..8b9d14b882b 100644 --- a/mono/metadata/socket-io.c +++ b/mono/metadata/socket-io.c @@ -1782,8 +1782,18 @@ void ves_icall_System_Net_Sockets_Socket_GetSocketOption_obj_internal(SOCKET soc *error = 0; - ret=convert_sockopt_level_and_name(level, name, &system_level, - &system_name); +#if !defined(SO_EXCLUSIVEADDRUSE) && defined(SO_REUSEADDR) + if (level == SocketOptionLevel_Socket && name == SocketOptionName_ExclusiveAddressUse) { + system_level = SOL_SOCKET; + system_name = SO_REUSEADDR; + ret = 0; + } else +#endif + { + + ret = convert_sockopt_level_and_name (level, name, &system_level, &system_name); + } + if(ret==-1) { *error = WSAENOPROTOOPT; return; @@ -1890,9 +1900,12 @@ void ves_icall_System_Net_Sockets_Socket_GetSocketOption_obj_internal(SOCKET soc #endif default: +#if !defined(SO_EXCLUSIVEADDRUSE) && defined(SO_REUSEADDR) + if (level == SocketOptionLevel_Socket && name == SocketOptionName_ExclusiveAddressUse) + val = val ? 0 : 1; +#endif obj = int_to_object (domain, val); } - *obj_val=obj; } @@ -2007,6 +2020,15 @@ void ves_icall_System_Net_Sockets_Socket_SetSocketOption_internal(SOCKET sock, g ret=convert_sockopt_level_and_name(level, name, &system_level, &system_name); + +#if !defined(SO_EXCLUSIVEADDRUSE) && defined(SO_REUSEADDR) + if (level == SocketOptionLevel_Socket && name == SocketOptionName_ExclusiveAddressUse) { + system_name = SO_REUSEADDR; + int_val = int_val ? 0 : 1; + ret = 0; + } +#endif + if(ret==-1) { *error = WSAENOPROTOOPT; return; -- GitLab