Bug#182085: vncserver: IPv6 support
Package: vncserver
Version: 3.3.6-4
Severity: normal
Tags: patch
The appended patch enables xvncviewer and Xvnc to communicate over
IPv6. autoconf must be called after applying, as I elided the
configure diff for brevity.
diff -ruNx configure vnc-3.3.6/Xvnc/programs/Xserver/hw/vnc/sockets.c vnc-3.3.6+/Xvnc/programs/Xserver/hw/vnc/sockets.c
--- vnc-3.3.6/Xvnc/programs/Xserver/hw/vnc/sockets.c 2002-11-21 15:47:08.000000000 +0100
+++ vnc-3.3.6+/Xvnc/programs/Xserver/hw/vnc/sockets.c 2003-02-22 22:47:20.000000000 +0100
@@ -409,11 +409,25 @@
ListenOnTCPPort(port)
int port;
{
- struct sockaddr_in addr;
int sock;
int one = 1;
+#ifdef AF_INET6
+ struct sockaddr_in6 addr;
+#else
+ struct sockaddr_in addr;
+#endif
memset(&addr, 0, sizeof(addr));
+#ifdef AF_INET6
+ addr.sin6_family = AF_INET6;
+ addr.sin6_port = htons(port);
+ if (rfbLocalhostOnly)
+ addr.sin6_addr = in6addr_loopback;
+ else
+ addr.sin6_addr = in6addr_any;
+
+ if ((sock = socket(AF_INET6, SOCK_STREAM, 0)) < 0) {
+#else
addr.sin_family = AF_INET;
addr.sin_port = htons(port);
if (rfbLocalhostOnly)
@@ -422,6 +436,7 @@
addr.sin_addr.s_addr = htonl(INADDR_ANY);
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
+#endif
return -1;
}
if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR,
diff -ruNx configure vnc-3.3.6/configure.in vnc-3.3.6+/configure.in
--- vnc-3.3.6/configure.in 2002-11-26 17:33:28.000000000 +0100
+++ vnc-3.3.6+/configure.in 2003-02-22 21:45:51.000000000 +0100
@@ -74,6 +74,8 @@
SOCKLEN_T_DEFINE='-Dsocklen_t=int')
AC_SUBST(SOCKLEN_T_DEFINE)
+AC_CHECK_FUNCS(getaddrinfo)
+
AC_OUTPUT(Makefile:Makefile.in:boilerplate.mk \
rdr/Makefile:rdr/Makefile.in:boilerplate.mk \
rfb/Makefile:rfb/Makefile.in:boilerplate.mk \
diff -ruNx configure vnc-3.3.6/vncviewer/argsresources.c vnc-3.3.6+/vncviewer/argsresources.c
--- vnc-3.3.6/vncviewer/argsresources.c 2003-02-22 22:43:28.000000000 +0100
+++ vnc-3.3.6+/vncviewer/argsresources.c 2003-02-22 21:18:22.000000000 +0100
@@ -369,9 +369,16 @@
exit(1);
}
- for (i = 0; vncServerName[i] != ':' && vncServerName[i] != 0; i++);
+ if (vncServerName[0] == '[') {
+ for (i = 1; vncServerName[i] != ']' && vncServerName[i] != 0; i++);
- strncpy(vncServerHost, vncServerName, i);
+ strncpy(vncServerHost, vncServerName + 1, i - 1);
+ i++;
+ } else {
+ for (i = 0; vncServerName[i] != ':' && vncServerName[i] != 0; i++);
+
+ strncpy(vncServerHost, vncServerName, i);
+ }
if (vncServerName[i] == ':') {
vncServerPort = atoi(&vncServerName[i+1]);
diff -ruNx configure vnc-3.3.6/vncviewer/sockets.cxx vnc-3.3.6+/vncviewer/sockets.cxx
--- vnc-3.3.6/vncviewer/sockets.cxx 2003-02-22 22:43:28.000000000 +0100
+++ vnc-3.3.6+/vncviewer/sockets.cxx 2003-02-22 21:55:05.000000000 +0100
@@ -32,6 +32,9 @@
#include <netdb.h>
#include <fcntl.h>
#include <assert.h>
+#ifdef HAVE_GETADDRINFO
+#include <netdb.h>
+#endif
extern "C" {
#include "vncviewer.h"
}
@@ -166,8 +169,22 @@
int ConnectToTcpAddr(const char* hostname, int port)
{
int sock;
- struct sockaddr_in addr;
int one = 1;
+#ifdef HAVE_GETADDRINFO
+ struct addrinfo *info, hints = { 0, PF_UNSPEC, SOCK_STREAM, 0 };
+ int error;
+
+ if ((error = getaddrinfo(hostname, NULL, &hints, &info)) != 0) {
+ fprintf(stderr, "Couldn't convert '%s' to host address: %s\n", hostname,
+ gai_strerror(error));
+ return -1;
+ }
+
+ ((struct sockaddr_in *)info->ai_addr)->sin_port = htons(port);
+
+ sock = socket(info->ai_family, info->ai_socktype, info->ai_protocol);
+#else
+ struct sockaddr_in addr;
unsigned int host;
if (!StringToIPAddr(hostname, &host)) {
@@ -181,19 +198,28 @@
addr.sin_addr.s_addr = host;
sock = socket(AF_INET, SOCK_STREAM, 0);
+#endif
if (sock < 0) {
fprintf(stderr,programName);
perror(": ConnectToTcpAddr: socket");
return -1;
}
+#ifdef HAVE_GETADDRINFO
+ if (connect(sock, info->ai_addr, info->ai_addrlen) < 0) {
+#else
if (connect(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
+#endif
fprintf(stderr,programName);
perror(": ConnectToTcpAddr: connect");
close(sock);
return -1;
}
+#ifdef HAVE_GETADDRINFO
+ freeaddrinfo(info);
+#endif
+
if (setsockopt(sock, IPPROTO_TCP, TCP_NODELAY,
(char *)&one, sizeof(one)) < 0) {
fprintf(stderr,programName);
--
Robbe
Reply to: