Index: vino/ChangeLog =================================================================== --- vino.orig/ChangeLog 2006-10-20 10:30:42.000000000 +0100 +++ vino.orig/ChangeLog 2006-10-20 10:30:42.000000000 +0100 @@ -0,0 +0,9 @@ +2006-10-20 Mark McLoughlin + + And here's where we actually create an IPv6 socket. + + * vino/server/libvncserver/sockets.c: + (ListenOnTCPPort): if ipv6 support is compiled in, + always try and create an AF_INET6 socket and fallback + to an AF_INET one if it fails. + Index: vino/server/libvncserver/sockets.c =================================================================== --- vino.orig/server/libvncserver/sockets.c 2006-10-20 10:23:52.000000000 +0100 +++ vino.orig/server/libvncserver/sockets.c 2006-10-20 10:23:52.000000000 +0100 @@ -552,25 +552,45 @@ ListenOnTCPPort(port, localOnly) int port; rfbBool localOnly; { - struct sockaddr_in addr; - int sock; + int sock = -1; int one = 1; + struct sockaddr_in addr_in; + struct sockaddr *addr; + socklen_t addrlen; - memset(&addr, 0, sizeof(addr)); - addr.sin_family = AF_INET; - addr.sin_port = htons(port); - /* addr.sin_addr.s_addr = interface.s_addr; */ - addr.sin_addr.s_addr = localOnly ? htonl(INADDR_LOOPBACK) : htonl(INADDR_ANY); +#ifdef ENABLE_IPV6 + struct sockaddr_in6 addr_in6; - if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) { - return -1; + memset(&addr_in6, 0, sizeof(addr_in6)); + addr_in6.sin6_family = AF_INET6; + addr_in6.sin6_port = htons(port); + addr_in6.sin6_addr = localOnly ? in6addr_loopback : in6addr_any; + + addr = (struct sockaddr *)&addr_in6; + addrlen = sizeof(addr_in6); + + sock = socket(AF_INET6, SOCK_STREAM, 0); +#endif + + if (sock < 0) { + if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) + return -1; + + memset(&addr_in, 0, sizeof(addr_in)); + addr_in.sin_family = AF_INET; + addr_in.sin_port = htons(port); + addr_in.sin_addr.s_addr = localOnly ? htonl(INADDR_LOOPBACK) : htonl(INADDR_ANY); + + addr = (struct sockaddr *)&addr_in; + addrlen = sizeof(addr_in); } + if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char *)&one, sizeof(one)) < 0) { close(sock); return -1; } - if (bind(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) { + if (bind(sock, addr, addrlen) < 0) { close(sock); return -1; }