Accept a cfg as an argument as an alt way to start the viewer

The user can specify a tigervnc configuration file as an argument to the
viewer. Previously the viewer assumed this to be a server, but now we
will first check if there is any file matching the given argument. If
so, try to load the content of that file, like we normally do.

Fixes issue #38.
diff --git a/vncviewer/vncviewer.cxx b/vncviewer/vncviewer.cxx
index 413260d..fabd665 100644
--- a/vncviewer/vncviewer.cxx
+++ b/vncviewer/vncviewer.cxx
@@ -349,8 +349,9 @@
 
   fprintf(stderr,
           "\nusage: %s [parameters] [host:displayNum] [parameters]\n"
-          "       %s [parameters] -listen [port] [parameters]\n",
-          programName, programName);
+          "       %s [parameters] -listen [port] [parameters]\n"
+          "       %s [parameters] [.tigervnc file]\n",
+          programName, programName, programName);
   fprintf(stderr,"\n"
           "Parameters can be turned on with -<param> or off with -<param>=0\n"
           "Parameters which take a value can be specified as "
@@ -368,6 +369,31 @@
   exit(1);
 }
 
+static void
+potentiallyLoadConfigurationFile(char *vncServerName)
+{
+  const bool hasPathSeparator = (strchr(vncServerName, '/') != NULL ||
+                                 (strchr(vncServerName, '\\')) != NULL);
+
+  if (hasPathSeparator) {
+    try {
+      strncpy(vncServerName, loadViewerParameters(vncServerName),
+              VNCSERVERNAMELEN);
+      if (vncServerName[0] == '\0') {
+        vlog.error("Unable to load the server name from given file");
+        if (alertOnFatalError)
+          fl_alert("Unable to load the server name from given file");
+        exit(EXIT_FAILURE);
+      }
+    } catch (rfb::Exception& e) {
+      vlog.error("%s", e.str());
+      if (alertOnFatalError)
+        fl_alert("%s", e.str());
+      exit(EXIT_FAILURE);
+    }
+  }
+}
+
 #ifndef WIN32
 static int
 interpretViaParam(char *remoteHost, int *remotePort, int localPort)
@@ -516,6 +542,9 @@
     i++;
   }
 
+  // Check if the server name in reality is a configuration file
+  potentiallyLoadConfigurationFile(vncServerName);
+
   mkvnchomedir();
 
 #if !defined(WIN32) && !defined(__APPLE__)