[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

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: