re: bug #3429667.  adds support for reverse connection mode

git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@4744 3789f03b-4d11-0410-bbf8-ca57d06f2519
diff --git a/java/com/tigervnc/vncviewer/VncViewer.java b/java/com/tigervnc/vncviewer/VncViewer.java
index e5cf157..604069c 100644
--- a/java/com/tigervnc/vncviewer/VncViewer.java
+++ b/java/com/tigervnc/vncviewer/VncViewer.java
@@ -32,6 +32,10 @@
 import java.awt.Graphics;
 import java.awt.Image;
 import java.io.InputStream;
+import java.io.IOException;
+import java.lang.Character;
+import java.net.ServerSocket;
+import java.net.Socket;
 import java.util.jar.Attributes;
 import java.util.jar.Manifest;
 import javax.swing.*;
@@ -108,8 +112,8 @@
   public static void usage() {
     String usage = ("\nusage: vncviewer [options/parameters] "+
                     "[host:displayNum] [options/parameters]\n"+
-                    //"       vncviewer [options/parameters] -listen [port] "+
-                    //"[options/parameters]\n"+
+                    "       vncviewer [options/parameters] -listen [port] "+
+                    "[options/parameters]\n"+
                     "\n"+
                     "Options:\n"+
                     "  -log <level>    configure logging level\n"+
@@ -188,8 +192,34 @@
 
   public void run() {
     CConn cc = null;
+    Socket sock = null;
+    if (listenMode.getValue()) {
+      int port = 5500;
+      ServerSocket listener = null;
+      if (vncServerName.getValue() != null && 
+          Character.isDigit(vncServerName.getValue().charAt(0)))
+        port = Integer.parseInt(vncServerName.getValue());
+
+      try {
+        listener = new ServerSocket(port);
+      } catch (IOException e) {
+        System.out.println("Could not listen on port: "+port);
+        System.exit(-1);
+      }
+
+      vlog.info("Listening on port "+port);
+
+      try {
+        sock = listener.accept();
+        listener.close();
+      } catch (IOException e) {
+        System.out.println("Accept failed: "+port);
+        System.exit(-1);
+      }
+      
+    }
     try {
-      cc = new CConn(this, null, vncServerName.getValue(), false);
+      cc = new CConn(this, sock, vncServerName.getValue(), false);
       while (true)
         cc.processMsg();
     } catch (EndOfStream e) {
@@ -255,6 +285,9 @@
   = new StringParameter("DesktopSize",
                         "Reconfigure desktop size on the server on "+
                         "connect (if possible)", "");
+  BoolParameter listenMode
+  = new BoolParameter("listen", "Listen for connections from VNC servers", 
+                      false);
   StringParameter scalingFactor
   = new StringParameter("ScalingFactor",
                         "Reduce or enlarge the remote desktop image. "+