Philip Nilsson : ws2_32: Set IPV6_V6ONLY when required to be compatible with Windows.

Alexandre Julliard julliard at winehq.org
Tue Sep 25 07:50:55 CDT 2007


Module: wine
Branch: master
Commit: 1399a6eaf8a4185a5606be56f4d951725289b2b4
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=1399a6eaf8a4185a5606be56f4d951725289b2b4

Author: Philip Nilsson <wine-devel at nullref.se>
Date:   Sat Sep 22 16:18:55 2007 +0200

ws2_32: Set IPV6_V6ONLY when required to be compatible with Windows.

---

 dlls/ws2_32/socket.c |   14 ++++++++++++++
 1 files changed, 14 insertions(+), 0 deletions(-)

diff --git a/dlls/ws2_32/socket.c b/dlls/ws2_32/socket.c
index 13878a7..c517f7e 100644
--- a/dlls/ws2_32/socket.c
+++ b/dlls/ws2_32/socket.c
@@ -1405,6 +1405,20 @@ int WINAPI WS_bind(SOCKET s, const struct WS_sockaddr* name, int namelen)
             }
             else
             {
+#ifdef IPV6_V6ONLY
+                const struct sockaddr_in6 *in6 = (const struct sockaddr_in6*) &uaddr;
+                if (name->sa_family == WS_AF_INET6 &&
+                    !memcmp(&in6->sin6_addr, &in6addr_any, sizeof(struct in6_addr)))
+                {
+                    int enable = 1;
+                    if (setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, &enable, sizeof(enable)) == -1)
+                    {
+                        release_sock_fd( s, fd );
+                        SetLastError(WSAEAFNOSUPPORT);
+                        return INVALID_SOCKET;
+                    }
+                }
+#endif
                 if (bind(fd, &uaddr.addr, uaddrlen) < 0)
                 {
                     int loc_errno = errno;




More information about the wine-cvs mailing list