Oops, Ben is quite right about the rather appalling design of
[u/mdw/putty] / plink.c
diff --git a/plink.c b/plink.c
index 3b33264..b1bebf9 100644 (file)
--- a/plink.c
+++ b/plink.c
@@ -40,7 +40,7 @@ void modalfatalbox(char *p, ...)
     WSACleanup();
     cleanup_exit(1);
 }
-void connection_fatal(char *p, ...)
+void connection_fatal(void *frontend, char *p, ...)
 {
     va_list ap;
     fprintf(stderr, "FATAL ERROR: ");
@@ -62,13 +62,15 @@ void cmdline_error(char *p, ...)
     exit(1);
 }
 
-static char *password = NULL;
-
 HANDLE inhandle, outhandle, errhandle;
 DWORD orig_console_mode;
 
 WSAEVENT netevent;
 
+static Backend *back;
+static void *backhandle;
+static Config cfg;
+
 int term_ldisc(Terminal *term, int mode)
 {
     return FALSE;
@@ -164,9 +166,9 @@ void try_output(int is_stderr)
     }
 }
 
-int from_backend(void *frontend_handle, int is_stderr, char *data, int len)
+int from_backend(void *frontend_handle, int is_stderr,
+                const char *data, int len)
 {
-    HANDLE h = (is_stderr ? errhandle : outhandle);
     int osize, esize;
 
     assert(len > 0);
@@ -253,6 +255,7 @@ int main(int argc, char **argv)
     int skcount, sksize;
     int connopen;
     int exitcode;
+    int errors;
 
     ssh_get_line = console_get_line;
 
@@ -272,6 +275,7 @@ int main(int argc, char **argv)
     do_defaults(NULL, &cfg);
     default_protocol = cfg.protocol;
     default_port = cfg.port;
+    errors = 0;
     {
        /*
         * Override the default protocol if PLINK_PROTOCOL is set.
@@ -292,16 +296,21 @@ int main(int argc, char **argv)
     while (--argc) {
        char *p = *++argv;
        if (*p == '-') {
-           int ret = cmdline_process_param(p, (argc > 1 ? argv[1] : NULL), 1);
+           int ret = cmdline_process_param(p, (argc > 1 ? argv[1] : NULL),
+                                           1, &cfg);
            if (ret == -2) {
                fprintf(stderr,
                        "plink: option \"%s\" requires an argument\n", p);
+               errors = 1;
            } else if (ret == 2) {
                --argc, ++argv;
            } else if (ret == 1) {
                continue;
            } else if (!strcmp(p, "-batch")) {
                console_batch_mode = 1;
+           } else {
+               fprintf(stderr, "plink: unknown option \"%s\"\n", p);
+               errors = 1;
            }
        } else if (*p) {
            if (!*cfg.host) {
@@ -423,6 +432,9 @@ int main(int argc, char **argv)
        }
     }
 
+    if (errors)
+       return 1;
+
     if (!*cfg.host) {
        usage();
     }
@@ -451,7 +463,7 @@ int main(int argc, char **argv)
     /*
      * Perform command-line overrides on session configuration.
      */
-    cmdline_run_saved();
+    cmdline_run_saved(&cfg);
 
     /*
      * Trim a colon suffix off the hostname if it's there.
@@ -529,12 +541,15 @@ int main(int argc, char **argv)
        int nodelay = cfg.tcp_nodelay &&
            (GetFileType(GetStdHandle(STD_INPUT_HANDLE)) == FILE_TYPE_CHAR);
 
-       error = back->init(NULL, &backhandle, cfg.host, cfg.port,
+       error = back->init(NULL, &backhandle, &cfg, cfg.host, cfg.port,
                           &realhost, nodelay);
        if (error) {
            fprintf(stderr, "Unable to open connection:\n%s", error);
            return 1;
        }
+       logctx = log_init(NULL, &cfg);
+       back->provide_logctx(backhandle, logctx);
+       console_provide_logctx(logctx);
        sfree(realhost);
     }
     connopen = 1;