Annotation of /trunk/vnc/patches/vnc-ipv6-2.patch
Parent Directory | Revision Log
Revision 639 -
(hide annotations)
(download)
Tue Jun 3 20:56:41 2008 UTC (16 years, 3 months ago) by niro
File size: 6101 byte(s)
Tue Jun 3 20:56:41 2008 UTC (16 years, 3 months ago) by niro
File size: 6101 byte(s)
-renamed patch
1 | niro | 639 | diff -up vnc-4_1_2-unixsrc/common/network/Makefile.am.ipv6 vnc-4_1_2-unixsrc/common/network/Makefile.am |
2 | --- vnc-4_1_2-unixsrc/common/network/Makefile.am.ipv6 2008-06-02 10:22:17.000000000 +0200 | ||
3 | +++ vnc-4_1_2-unixsrc/common/network/Makefile.am 2008-06-02 10:52:56.000000000 +0200 | ||
4 | @@ -1,5 +1,7 @@ | ||
5 | noinst_LTLIBRARIES = libnetwork.la | ||
6 | |||
7 | +libnetwork_la_CPPFLAGS = -DHAVE_GETADDRINFO | ||
8 | + | ||
9 | libnetwork_la_SOURCES = \ | ||
10 | Socket.h \ | ||
11 | TcpSocket.cxx \ | ||
12 | diff -up vnc-4_1_2-unixsrc/common/network/TcpSocket.cxx.ipv6 vnc-4_1_2-unixsrc/common/network/TcpSocket.cxx | ||
13 | --- vnc-4_1_2-unixsrc/common/network/TcpSocket.cxx.ipv6 2008-06-02 10:22:17.000000000 +0200 | ||
14 | +++ vnc-4_1_2-unixsrc/common/network/TcpSocket.cxx 2008-06-02 10:49:04.000000000 +0200 | ||
15 | @@ -109,50 +109,99 @@ TcpSocket::TcpSocket(int sock, bool clos | ||
16 | TcpSocket::TcpSocket(const char *host, int port) | ||
17 | : closeFd(true) | ||
18 | { | ||
19 | - int sock; | ||
20 | +#define CAST_ADDR(x) (*((struct x *)&addr)) | ||
21 | + int sock, err, family, result = -1; | ||
22 | + size_t addrlen; | ||
23 | + struct sockaddr_storage addr; | ||
24 | +#ifdef HAVE_GETADDRINFO | ||
25 | + struct addrinfo *ai, *current, hints; | ||
26 | +#endif | ||
27 | |||
28 | // - Create a socket | ||
29 | initSockets(); | ||
30 | - if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) | ||
31 | - throw SocketException("unable to create socket", errorNumber); | ||
32 | |||
33 | -#ifndef WIN32 | ||
34 | - // - By default, close the socket on exec() | ||
35 | - fcntl(sock, F_SETFD, FD_CLOEXEC); | ||
36 | -#endif | ||
37 | +#ifdef HAVE_GETADDRINFO | ||
38 | + memset(&hints, 0, sizeof(struct addrinfo)); | ||
39 | + hints.ai_family = AF_UNSPEC; | ||
40 | + hints.ai_socktype = SOCK_STREAM; | ||
41 | + hints.ai_canonname = NULL; | ||
42 | + hints.ai_addr = NULL; | ||
43 | + hints.ai_next = NULL; | ||
44 | + | ||
45 | + if ((result = getaddrinfo(host, NULL, &hints, &ai)) != 0) { | ||
46 | + throw Exception("unable to resolve host by name: %s", | ||
47 | + gai_strerror(result)); | ||
48 | + } | ||
49 | + | ||
50 | + for (current = ai; current != NULL; current = current->ai_next) { | ||
51 | + family = current->ai_family; | ||
52 | + if (family != AF_INET && family != AF_INET6) | ||
53 | + continue; | ||
54 | + | ||
55 | + addrlen = current->ai_addrlen; | ||
56 | + memcpy(&addr, current->ai_addr, addrlen); | ||
57 | + | ||
58 | + if (family == AF_INET) | ||
59 | + CAST_ADDR(sockaddr_in).sin_port = htons(port); | ||
60 | + else | ||
61 | + CAST_ADDR(sockaddr_in6).sin6_port = htons(port); | ||
62 | |||
63 | - // - Connect it to something | ||
64 | +#else | ||
65 | + family = AF_INET; | ||
66 | + addrlen = sizeof(struct sockaddr_in); | ||
67 | |||
68 | - // Try processing the host as an IP address | ||
69 | - struct sockaddr_in addr; | ||
70 | - memset(&addr, 0, sizeof(addr)); | ||
71 | - addr.sin_family = AF_INET; | ||
72 | - addr.sin_addr.s_addr = inet_addr(host); | ||
73 | - addr.sin_port = htons(port); | ||
74 | - if ((int)addr.sin_addr.s_addr == -1) { | ||
75 | - // Host was not an IP address - try resolving as DNS name | ||
76 | - struct hostent *hostinfo; | ||
77 | - hostinfo = gethostbyname(host); | ||
78 | - if (hostinfo && hostinfo->h_addr) { | ||
79 | - addr.sin_addr.s_addr = ((struct in_addr *)hostinfo->h_addr)->s_addr; | ||
80 | - } else { | ||
81 | - int e = errorNumber; | ||
82 | - closesocket(sock); | ||
83 | - throw SocketException("unable to resolve host by name", e); | ||
84 | + // Try processing the host as an IP address | ||
85 | + memset(&addr, 0, addrlen); | ||
86 | + CAST_ADDR(sockaddr_in).sin_family = AF_INET; | ||
87 | + CAST_ADDR(sockaddr_in).sin_addr.s_addr = inet_addr(host); | ||
88 | + CAST_ADDR(sockaddr_in).sin_port = htons(port); | ||
89 | + if ((int)CAST_ADDR(sockaddr_in).sin_addr.s_addr == -1) { | ||
90 | + // Host was not an IP address - try resolving as DNS name | ||
91 | + struct hostent *hostinfo; | ||
92 | + hostinfo = gethostbyname(host); | ||
93 | + if (hostinfo && hostinfo->h_addr) { | ||
94 | + CAST_ADDR(sockaddr_in).sin_addr.s_addr = | ||
95 | + ((struct in_addr *)hostinfo->h_addr)->s_addr; | ||
96 | + } else { | ||
97 | + err = errorNumber; | ||
98 | + throw SocketException("unable to resolve host by name", err); | ||
99 | + } | ||
100 | + } | ||
101 | +#endif | ||
102 | + sock = socket (family, SOCK_STREAM, 0); | ||
103 | + if (sock == -1) { | ||
104 | + err = errorNumber; | ||
105 | +#ifdef HAVE_GETADDRINFO | ||
106 | + freeaddrinfo(ai); | ||
107 | +#endif | ||
108 | + throw SocketException("unable to create socket", err); | ||
109 | } | ||
110 | - } | ||
111 | |||
112 | - // Attempt to connect to the remote host | ||
113 | - for (;;) { | ||
114 | - if (connect(sock, (struct sockaddr *)&addr, sizeof(addr)) != 0) { | ||
115 | - int e = errorNumber; | ||
116 | - if (e == EINTR) | ||
117 | - continue; | ||
118 | + // Attempt to connect to the remote host | ||
119 | + while ((result = connect(sock, (struct sockaddr *)&addr, addrlen)) == -1) { | ||
120 | + err = errorNumber; | ||
121 | + if (err == EINTR) | ||
122 | + continue; | ||
123 | closesocket(sock); | ||
124 | - throw SocketException("unable to connect to host", e); | ||
125 | - } else break; | ||
126 | + break; | ||
127 | + } | ||
128 | +#ifdef HAVE_GETADDRINFO | ||
129 | + if (result == 0) | ||
130 | + break; | ||
131 | + else | ||
132 | + continue; | ||
133 | } | ||
134 | |||
135 | + freeaddrinfo(ai); | ||
136 | +#endif | ||
137 | + if (result == -1) | ||
138 | + throw SocketException("unable connect to socket", err); | ||
139 | + | ||
140 | +#ifndef WIN32 | ||
141 | + // - By default, close the socket on exec() | ||
142 | + fcntl(sock, F_SETFD, FD_CLOEXEC); | ||
143 | +#endif | ||
144 | + | ||
145 | // Disable Nagle's algorithm, to reduce latency | ||
146 | enableNagles(sock, false); | ||
147 | |||
148 | diff -up vnc-4_1_2-unixsrc/common/rdr/Exception.cxx.ipv6 vnc-4_1_2-unixsrc/common/rdr/Exception.cxx | ||
149 | --- vnc-4_1_2-unixsrc/common/rdr/Exception.cxx.ipv6 2008-06-02 10:23:35.000000000 +0200 | ||
150 | +++ vnc-4_1_2-unixsrc/common/rdr/Exception.cxx 2008-06-02 10:28:51.000000000 +0200 | ||
151 | @@ -22,8 +22,23 @@ | ||
152 | #include <winsock2.h> | ||
153 | #endif | ||
154 | |||
155 | +#include <stdarg.h> | ||
156 | + | ||
157 | using namespace rdr; | ||
158 | |||
159 | +Exception::Exception(const char *format, ...) { | ||
160 | + va_list ap; | ||
161 | + int result; | ||
162 | + | ||
163 | + va_start(ap, format); | ||
164 | + result = vsnprintf(str_, len, format, ap); | ||
165 | + va_end(ap); | ||
166 | + | ||
167 | + /* XXX - ensure that string ends correctly */ | ||
168 | + if (result > len) | ||
169 | + str_[len - 1] = '\0'; | ||
170 | +} | ||
171 | + | ||
172 | SystemException::SystemException(const char* s, int err_) | ||
173 | : Exception(s), err(err_) | ||
174 | { | ||
175 | diff -up vnc-4_1_2-unixsrc/common/rdr/Exception.h.ipv6 vnc-4_1_2-unixsrc/common/rdr/Exception.h | ||
176 | --- vnc-4_1_2-unixsrc/common/rdr/Exception.h.ipv6 2008-06-02 10:23:05.000000000 +0200 | ||
177 | +++ vnc-4_1_2-unixsrc/common/rdr/Exception.h 2008-06-02 10:28:41.000000000 +0200 | ||
178 | @@ -27,13 +27,7 @@ namespace rdr { | ||
179 | struct Exception { | ||
180 | enum { len = 256 }; | ||
181 | char str_[len]; | ||
182 | - Exception(const char* s=0) { | ||
183 | - str_[0] = 0; | ||
184 | - if (s) | ||
185 | - strncat(str_, s, len-1); | ||
186 | - else | ||
187 | - strcat(str_, "Exception"); | ||
188 | - } | ||
189 | + Exception(const char *format, ...); | ||
190 | virtual const char* str() const { return str_; } | ||
191 | }; | ||
192 |