1
--- vino-2.22.2/server/libvncserver/sockets.c 2008-05-21 22:31:04.000000000 +0200
2
+++ vino-2.22.2-fixed/server/libvncserver/sockets.c 2008-09-11 08:20:25.000000000 +0200
3
@@ -552,52 +552,55 @@ ListenOnTCPPort(port, localOnly)
9
- struct sockaddr_in addr_in;
10
- struct sockaddr *addr;
14
- struct sockaddr_in6 addr_in6;
16
- memset(&addr_in6, 0, sizeof(addr_in6));
17
- addr_in6.sin6_family = AF_INET6;
18
- addr_in6.sin6_port = htons(port);
19
- addr_in6.sin6_addr = localOnly ? in6addr_loopback : in6addr_any;
21
- addr = (struct sockaddr *)&addr_in6;
22
- addrlen = sizeof(addr_in6);
24
- sock = socket(AF_INET6, SOCK_STREAM, 0);
28
- if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0)
31
- memset(&addr_in, 0, sizeof(addr_in));
32
- addr_in.sin_family = AF_INET;
33
- addr_in.sin_port = htons(port);
34
- addr_in.sin_addr.s_addr = localOnly ? htonl(INADDR_LOOPBACK) : htonl(INADDR_ANY);
36
- addr = (struct sockaddr *)&addr_in;
37
- addrlen = sizeof(addr_in);
40
- if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR,
41
- (char *)&one, sizeof(one)) < 0) {
45
- if (bind(sock, addr, addrlen) < 0) {
49
- if (listen(sock, 5) < 0) {
54
+ struct addrinfo hints, *res, *curr;
55
+ char service[NI_MAXSERV];
57
+ memset(&hints, 0, sizeof(hints));
58
+ hints.ai_family = AF_UNSPEC;
59
+ hints.ai_socktype = SOCK_STREAM;
60
+ hints.ai_protocol = IPPROTO_TCP;
61
+ hints.ai_flags = AI_PASSIVE;
63
+ snprintf(service, sizeof(service), "%d", port);
64
+ err = getaddrinfo(localOnly ? "localhost" : NULL, service,
67
+ //fprintf(stderr, "ERROR: getaddrinfo() failed: %s\n", gai_strerror(err));
71
+ for (curr = res; curr != NULL; curr = curr->ai_next) {
72
+ sock = socket(curr->ai_family, curr->ai_socktype,
78
+ setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &err, sizeof(err));
81
+ setsockopt(sock, IPPROTO_IPV6, IPV6_V6ONLY, &err, sizeof(err));
83
+ err = bind(sock, curr->ai_addr, curr->ai_addrlen);
89
+ err = listen(sock, 5);