In the wake of r7415, let's have some better error reporting.
[sgt/putty] / windows / winplink.c
index 4ef2c98..4242600 100644 (file)
@@ -29,6 +29,10 @@ void fatalbox(char *p, ...)
     vfprintf(stderr, p, ap);
     va_end(ap);
     fputc('\n', stderr);
+    if (logctx) {
+        log_free(logctx);
+        logctx = NULL;
+    }
     cleanup_exit(1);
 }
 void modalfatalbox(char *p, ...)
@@ -39,6 +43,10 @@ void modalfatalbox(char *p, ...)
     vfprintf(stderr, p, ap);
     va_end(ap);
     fputc('\n', stderr);
+    if (logctx) {
+        log_free(logctx);
+        logctx = NULL;
+    }
     cleanup_exit(1);
 }
 void connection_fatal(void *frontend, char *p, ...)
@@ -49,6 +57,10 @@ void connection_fatal(void *frontend, char *p, ...)
     vfprintf(stderr, p, ap);
     va_end(ap);
     fputc('\n', stderr);
+    if (logctx) {
+        log_free(logctx);
+        logctx = NULL;
+    }
     cleanup_exit(1);
 }
 void cmdline_error(char *p, ...)
@@ -179,6 +191,8 @@ static void usage(void)
     printf("  -m file   read remote command(s) from file\n");
     printf("  -s        remote command is an SSH subsystem (SSH-2 only)\n");
     printf("  -N        don't start a shell/command (SSH-2 only)\n");
+    printf("  -nc host:port\n");
+    printf("            open tunnel in place of session (SSH-2 only)\n");
     exit(1);
 }
 
@@ -214,11 +228,17 @@ int stdin_gotdata(struct handle *h, void *data, int len)
        /*
         * Special case: report read error.
         */
-       fprintf(stderr, "Unable to read from standard input\n");
+       char buf[4096];
+       FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, -len, 0,
+                     buf, lenof(buf), NULL);
+       buf[lenof(buf)-1] = '\0';
+       if (buf[strlen(buf)-1] == '\n')
+           buf[strlen(buf)-1] = '\0';
+       fprintf(stderr, "Unable to read from standard input: %s\n", buf);
        cleanup_exit(0);
     }
     noise_ultralight(len);
-    if (connopen && back->socket(backhandle) != NULL) {
+    if (connopen && back->connected(backhandle)) {
        if (len > 0) {
            return back->send(backhandle, data, len);
        } else {
@@ -235,11 +255,17 @@ void stdouterr_sent(struct handle *h, int new_backlog)
        /*
         * Special case: report write error.
         */
-       fprintf(stderr, "Unable to write to standard %s\n",
-               (h == stdout_handle ? "output" : "error"));
+       char buf[4096];
+       FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, -new_backlog, 0,
+                     buf, lenof(buf), NULL);
+       buf[lenof(buf)-1] = '\0';
+       if (buf[strlen(buf)-1] == '\n')
+           buf[strlen(buf)-1] = '\0';
+       fprintf(stderr, "Unable to write to standard %s: %s\n",
+               (h == stdout_handle ? "output" : "error"), buf);
        cleanup_exit(0);
     }
-    if (connopen && back->socket(backhandle) != NULL) {
+    if (connopen && back->connected(backhandle)) {
        back->unthrottle(backhandle, (handle_backlog(stdout_handle) +
                                      handle_backlog(stderr_handle)));
     }
@@ -319,7 +345,7 @@ int main(int argc, char **argv)
                errors = 1;
            }
        } else if (*p) {
-           if (!*cfg.host) {
+           if (!cfg_launchable(&cfg)) {
                char *q = p;
                /*
                 * If the hostname starts with "telnet:", set the
@@ -392,7 +418,7 @@ int main(int argc, char **argv)
                    {
                        Config cfg2;
                        do_defaults(host, &cfg2);
-                       if (loaded_session || cfg2.host[0] == '\0') {
+                       if (loaded_session || !cfg_launchable(&cfg2)) {
                            /* No settings for this host; use defaults */
                            /* (or session was already loaded with -load) */
                            strncpy(cfg.host, host, sizeof(cfg.host) - 1);
@@ -446,7 +472,7 @@ int main(int argc, char **argv)
     if (errors)
        return 1;
 
-    if (!*cfg.host) {
+    if (!cfg_launchable(&cfg)) {
        usage();
     }
 
@@ -459,7 +485,7 @@ int main(int argc, char **argv)
     }
 
     /* See if host is of the form user@host */
-    if (cfg.host[0] != '\0') {
+    if (cfg_launchable(&cfg)) {
        char *atsign = strrchr(cfg.host, '@');
        /* Make sure we're not overflowing the user field */
        if (atsign) {
@@ -502,7 +528,7 @@ int main(int argc, char **argv)
        cfg.host[p1] = '\0';
     }
 
-    if (!cfg.remote_cmd_ptr && !*cfg.remote_cmd)
+    if (!cfg.remote_cmd_ptr && !*cfg.remote_cmd && !*cfg.ssh_nc_host)
        flags |= FLAG_INTERACTIVE;
 
     /*
@@ -536,6 +562,9 @@ int main(int argc, char **argv)
        return 1;
     }
 
+    logctx = log_init(NULL, &cfg);
+    console_provide_logctx(logctx);
+
     /*
      * Start up the connection.
      */
@@ -553,9 +582,7 @@ int main(int argc, char **argv)
            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;
@@ -577,8 +604,8 @@ int main(int argc, char **argv)
      * (The input one we leave until we're through the
      * authentication process.)
      */
-    stdout_handle = handle_output_new(outhandle, stdouterr_sent);
-    stderr_handle = handle_output_new(errhandle, stdouterr_sent);
+    stdout_handle = handle_output_new(outhandle, stdouterr_sent, NULL, 0);
+    stderr_handle = handle_output_new(errhandle, stdouterr_sent, NULL, 0);
 
     main_thread_id = GetCurrentThreadId();
 
@@ -593,7 +620,8 @@ int main(int argc, char **argv)
        DWORD ticks;
 
        if (!sending && back->sendok(backhandle)) {
-           stdin_handle = handle_input_new(inhandle, stdin_gotdata);
+           stdin_handle = handle_input_new(inhandle, stdin_gotdata, NULL,
+                                           0);
            sending = TRUE;
        }
 
@@ -694,7 +722,7 @@ int main(int argc, char **argv)
        if (sending)
            handle_unthrottle(stdin_handle, back->sendbuffer(backhandle));
 
-       if ((!connopen || back->socket(backhandle) == NULL) &&
+       if ((!connopen || !back->connected(backhandle)) &&
            handle_backlog(stdout_handle) + handle_backlog(stderr_handle) == 0)
            break;                     /* we closed the connection */
     }