~ubuntu-branches/ubuntu/lucid/vino/lucid

« back to all changes in this revision

Viewing changes to debian/patches/01_localonly_ipv4.patch

  • Committer: Bazaar Package Importer
  • Author(s): Josselin Mouette
  • Date: 2009-03-05 15:28:24 UTC
  • mfrom: (1.1.27 upstream)
  • mto: (4.2.1 squeeze)
  • mto: This revision was merged to the branch mainline in revision 18.
  • Revision ID: james.westby@ubuntu.com-20090305152824-gouyt5cxdaq37hxr
Tags: 2.24.1-2
Upload to unstable.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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)
 
4
     int port;
 
5
     rfbBool localOnly;
 
6
 {
 
7
-    int sock = -1;
 
8
-    int one = 1;
 
9
-    struct sockaddr_in addr_in;
 
10
-    struct sockaddr *addr;
 
11
-    socklen_t addrlen;
 
12
-
 
13
-#ifdef ENABLE_IPV6
 
14
-    struct sockaddr_in6 addr_in6;
 
15
-
 
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;
 
20
-
 
21
-    addr = (struct sockaddr *)&addr_in6;
 
22
-    addrlen = sizeof(addr_in6);
 
23
-
 
24
-    sock = socket(AF_INET6, SOCK_STREAM, 0);
 
25
-#endif
 
26
-
 
27
-    if (sock < 0) {
 
28
-        if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0)
 
29
-            return -1;
 
30
-
 
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);
 
35
-
 
36
-        addr = (struct sockaddr *)&addr_in;
 
37
-        addrlen = sizeof(addr_in);
 
38
-    }
 
39
-
 
40
-    if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR,
 
41
-                  (char *)&one, sizeof(one)) < 0) {
 
42
-       close(sock);
 
43
-       return -1;
 
44
-    }
 
45
-    if (bind(sock, addr, addrlen) < 0) {
 
46
-       close(sock);
 
47
-       return -1;
 
48
-    }
 
49
-    if (listen(sock, 5) < 0) {
 
50
-       close(sock);
 
51
-       return -1;
 
52
-    }
 
53
+       int sock, err;
 
54
+       struct addrinfo hints, *res, *curr;
 
55
+       char service[NI_MAXSERV];
 
56
+
 
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;
 
62
+
 
63
+       snprintf(service, sizeof(service), "%d", port);
 
64
+       err = getaddrinfo(localOnly ? "localhost" : NULL, service,
 
65
+                       &hints, &res);
 
66
+       if (err) {
 
67
+               //fprintf(stderr, "ERROR: getaddrinfo() failed: %s\n", gai_strerror(err));
 
68
+               return err;
 
69
+       }
 
70
+
 
71
+       for (curr = res; curr != NULL; curr = curr->ai_next) {
 
72
+               sock = socket(curr->ai_family, curr->ai_socktype,
 
73
+                               curr->ai_protocol);
 
74
+               if (sock < 0)
 
75
+                       continue;
 
76
+
 
77
+               err = 1;
 
78
+               setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &err, sizeof(err));
 
79
+
 
80
+               err = 0;
 
81
+               setsockopt(sock, IPPROTO_IPV6, IPV6_V6ONLY, &err, sizeof(err));
 
82
+
 
83
+               err = bind(sock, curr->ai_addr, curr->ai_addrlen);
 
84
+               if (err) {
 
85
+                       close(sock);
 
86
+                       continue;
 
87
+               }
 
88
+
 
89
+               err = listen(sock, 5);
 
90
+               if (err) {
 
91
+                       close(sock);
 
92
+                       continue;
 
93
+               }
 
94
+
 
95
+               break;
 
96
+       }
 
97
 
 
98
-    return sock;
 
99
+       if (curr == NULL)
 
100
+               sock = -1;
 
101
+
 
102
+       freeaddrinfo(res);
 
103
+
 
104
+       return sock;
 
105
 }