Package: xvnc4viewer
Version: 4.1.1+X4.3.0-31
Severity: wishlist
Tags: patch

I sometimes have occasion to use xvnc4viewer to access an X display
behind a gateway host whose ssh server listens on a non-standard port.
To date, I've had to use a stub shell script via $VNC_VIA_CMD that
passes the appropriate -p option to ssh.  Other VNC viewer programs I've
used, however, allow the gateway to be specified as "host:port" for
precisely this reason, and I believe this would be useful functionality
to add to xvnc4viewer's -via option.  The necessary modifications are
fairly small; I've attached a patch.  Thank you for your consideration.

                                                -sbigham

-- System Information:
Debian Release: 5.0
  APT prefers stable
  APT policy: (990, 'stable'), (500, 'unstable'), (500, 'testing')
Architecture: i386 (i686)

Kernel: Linux 2.6.26-2-686 (SMP w/2 CPU cores)
Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/bash

Versions of packages xvnc4viewer depends on:
ii  libc6                  2.10.2-2          GNU C Library: Shared libraries
ii  libgcc1                1:4.3.3-3         GCC support library
ii  libice6                2:1.0.4-1         X11 Inter-Client Exchange library
ii  libsm6                 2:1.0.3-2         X11 Session Management library
ii  libstdc++6             4.3.3-3           The GNU Standard C++ Library v3
ii  libx11-6               2:1.1.5-2         X11 client-side library
ii  libxext6               2:1.0.4-1         X11 miscellaneous extension librar
ii  zlib1g                 1:1.2.3.3.dfsg-12 compression library - runtime

xvnc4viewer recommends no packages.

xvnc4viewer suggests no packages.

-- no debconf information
--- unix/vncviewer/vncviewer.cxx.orig	2010-02-06 16:02:39.000000000 -0500
+++ unix/vncviewer/vncviewer.cxx	2010-02-06 17:42:09.000000000 -0500
@@ -168,9 +168,9 @@
 
 /* Tunnelling support. */
 static void
-interpretViaParam (char **gatewayHost, char **remoteHost,
-                  int *remotePort, char **vncServerName,
-                  int localPort)
+interpretViaParam (char **gatewayHost, int *sshPort,
+                  char **remoteHost, int *remotePort,
+                  char **vncServerName, int localPort)
 {
   const int SERVER_PORT_OFFSET = 5900;
   char *pos = strchr (*vncServerName, ':');
@@ -196,25 +196,39 @@
     *remoteHost = *vncServerName;
 
   *gatewayHost = strDup (via.getValueStr ());
+  pos = strchr (*gatewayHost, ':');
+  if (pos == NULL)
+    *sshPort = 22;
+  else {
+    size_t len;
+    *pos++ = '\0';
+    len = strlen (pos);
+    if (!len || strspn (pos, "0123456789") != len)
+      usage ();
+    *sshPort = atoi (pos);
+  }
+
   *vncServerName = new char[50];
   sprintf (*vncServerName, "localhost::%d", localPort);
 }
 
 static void
-createTunnel (const char *gatewayHost, const char *remoteHost,
-             int remotePort, int localPort)
+createTunnel (const char *gatewayHost, int sshPort,
+             const char *remoteHost, int remotePort, int localPort)
 {
   char *cmd = getenv ("VNC_VIA_CMD");
   char *percent;
-  char lport[10], rport[10];
+  char lport[10], rport[10], sport[10];
   sprintf (lport, "%d", localPort);
   sprintf (rport, "%d", remotePort);
+  sprintf (sport, "%d", sshPort);
   setenv ("G", gatewayHost, 1);
   setenv ("H", remoteHost, 1);
   setenv ("R", rport, 1);
   setenv ("L", lport, 1);
+  setenv ("P", sport, 1);
   if (!cmd)
-    cmd = "/usr/bin/ssh -f -L \"$L\":\"$H\":\"$R\" \"$G\" sleep 20";
+    cmd = "/usr/bin/ssh -f -L \"$L\":\"$H\":\"$R\" -p \"$P\" \"$G\" sleep 20";
   /* Compatibility with TightVNC's method. */
   while ((percent = strchr (cmd, '%')) != NULL)
     *percent = '$';
@@ -272,14 +286,15 @@
     /* Tunnelling support. */
     if (strlen (via.getValueStr ()) > 0) {
       char *gatewayHost = "";
+      int sshPort = 22;
       char *remoteHost = "localhost";
       int localPort = findFreeTcpPort ();
       int remotePort;
       if (!vncServerName)
         usage();
-      interpretViaParam (&gatewayHost, &remoteHost, &remotePort,
+      interpretViaParam (&gatewayHost, &sshPort, &remoteHost, &remotePort,
                         &vncServerName, localPort);
-      createTunnel (gatewayHost, remoteHost, remotePort, localPort);
+      createTunnel (gatewayHost, sshPort, remoteHost, remotePort, localPort);
     }
 
     Socket* sock = 0;
--- unix/vncviewer/vncviewer.man.orig	2010-02-06 16:02:39.000000000 -0500
+++ unix/vncviewer/vncviewer.man	2010-02-06 17:35:46.000000000 -0500
@@ -180,20 +180,23 @@
 prefix from the entries in "/usr/include/X11/keysymdef.h").  Default is F8.
 
 .TP
-\fB\-via\fR \fIgateway\fR
+\fB\-via\fR \fIgateway\fP[:\fIport\fP]
 Automatically create encrypted TCP tunnel to the \fIgateway\fR machine
 before connection, connect to the \fIhost\fR through that tunnel
 (TightVNC\-specific). By default, this option invokes SSH local port
 forwarding, assuming that SSH client binary can be accessed as
-/usr/bin/ssh. Note that when using the \fB\-via\fR option, the host
-machine name should be specified as known to the gateway machine, e.g.
-"localhost" denotes the \fIgateway\fR, not the machine where vncviewer
-was launched. The environment variable \fIVNC_VIA_CMD\fR can override
-the default tunnel command of
-\fB/usr/bin/ssh\ -f\ -L\ "$L":"$H":"$R"\ "$G"\ sleep\ 20\fR.  The tunnel
-command is executed with the environment variables \fIL\fR, \fIH\fR,
-\fIR\fR, and \fIG\fR taken the values of the local port number, the remote
-host, the port number on the remote host, and the gateway machine
+/usr/bin/ssh.  If the SSH server on the gateway machine listens on a
+non-default port, you can specify this port by appending ":" and the port
+number to the gateway name.  Note that when using the \fB\-via\fR option,
+the host machine name should be specified as known to the gateway machine,
+e.g. "localhost" denotes the \fIgateway\fR, not the machine where
+vncviewer was launched. The environment variable \fIVNC_VIA_CMD\fR can
+override the default tunnel command of
+\fB/usr/bin/ssh\ -f\ -L\ "$L":"$H":"$R"\ -p\ "$P"\ "$G"\ sleep\ 20\fR.  The
+tunnel command is executed with the environment variables \fIL\fR, \fIH\fR,
+\fIR\fR, \fIG\fR and \fIP\fR taken the values of the local port number, the
+remote host, the port number on the remote host, the gateway machine, and
+the SSH server port on the gateway machine (22 if not specified),
 respectively.
 
 .SH SEE ALSO

Reply via email to