uint64_decimal() incorrectly output 0 as "" instead of "0". This only affected
[sgt/putty] / psftp.c
diff --git a/psftp.c b/psftp.c
index 10056bd..66c5994 100644 (file)
--- a/psftp.c
+++ b/psftp.c
@@ -1812,11 +1812,27 @@ static int psftp_connect(char *userhost, char *user, int portnumber)
            user = userhost;
     }
 
-    /* Try to load settings for this host */
-    do_defaults(host, &cfg);
-    if (cfg.host[0] == '\0') {
-       /* No settings for this host; use defaults */
-       do_defaults(NULL, &cfg);
+    /*
+     * If we haven't loaded session details already (e.g., from -load),
+     * try looking for a session called "host".
+     */
+    if (!loaded_session) {
+       /* Try to load settings for `host' into a temporary config */
+       Config cfg2;
+       cfg2.host[0] = '\0';
+       do_defaults(host, &cfg2);
+       if (cfg2.host[0] != '\0') {
+           /* Settings present and include hostname */
+           /* Re-load data into the real config. */
+           do_defaults(host, &cfg);
+       } else {
+           /* Session doesn't exist or mention a hostname. */
+           /* Use `host' as a bare hostname. */
+           strncpy(cfg.host, host, sizeof(cfg.host) - 1);
+           cfg.host[sizeof(cfg.host) - 1] = '\0';
+       }
+    } else {
+       /* Patch in hostname `host' to session details. */
        strncpy(cfg.host, host, sizeof(cfg.host) - 1);
        cfg.host[sizeof(cfg.host) - 1] = '\0';
     }
@@ -1831,6 +1847,15 @@ static int psftp_connect(char *userhost, char *user, int portnumber)
     }
 
     /*
+     * If saved session / Default Settings says SSH-1 (`1 only' or `1'),
+     * then change it to SSH-2, on the grounds that that's more likely to
+     * work for SFTP. (Can be overridden with `-1' option.)
+     * But if it says `2 only' or `2', respect which.
+     */
+    if (cfg.sshprot != 2 && cfg.sshprot != 3)
+       cfg.sshprot = 2;
+
+    /*
      * Enact command-line overrides.
      */
     cmdline_run_saved(&cfg);
@@ -1845,7 +1870,7 @@ static int psftp_connect(char *userhost, char *user, int portnumber)
 
     /* See if host is of the form user@host */
     if (cfg.host[0] != '\0') {
-       char *atsign = strchr(cfg.host, '@');
+       char *atsign = strrchr(cfg.host, '@');
        /* Make sure we're not overflowing the user field */
        if (atsign) {
            if (atsign - cfg.host < sizeof cfg.username) {
@@ -1882,10 +1907,9 @@ static int psftp_connect(char *userhost, char *user, int portnumber)
        cfg.username[sizeof(cfg.username) - 1] = '\0';
     }
     if (!cfg.username[0]) {
-       printf("login as: ");
-       fflush(stdout);
-       if (!fgets(cfg.username, sizeof(cfg.username), stdin)) {
-           fprintf(stderr, "psftp: aborting\n");
+       if (!console_get_line("login as: ",
+                             cfg.username, sizeof(cfg.username), FALSE)) {
+           fprintf(stderr, "psftp: no username, aborting\n");
            cleanup_exit(1);
        } else {
            int len = strlen(cfg.username);
@@ -1897,9 +1921,6 @@ static int psftp_connect(char *userhost, char *user, int portnumber)
     if (portnumber)
        cfg.port = portnumber;
 
-    /* SFTP uses SSH2 by default always */
-    cfg.sshprot = 2;
-
     /*
      * Disable scary things which shouldn't be enabled for simple
      * things like SCP and SFTP: agent forwarding, port forwarding,
@@ -1996,6 +2017,10 @@ int psftp_main(int argc, char *argv[])
 
     userhost = user = NULL;
 
+    /* Load Default Settings before doing anything else. */
+    do_defaults(NULL, &cfg);
+    loaded_session = FALSE;
+
     errors = 0;
     for (i = 1; i < argc; i++) {
        int ret;
@@ -2041,6 +2066,15 @@ int psftp_main(int argc, char *argv[])
     back = NULL;
 
     /*
+     * If the loaded session provides a hostname, and a hostname has not
+     * otherwise been specified, pop it in `userhost' so that
+     * `psftp -load sessname' is sufficient to start a session.
+     */
+    if (!userhost && cfg.host[0] != '\0') {
+       userhost = dupstr(cfg.host);
+    }
+
+    /*
      * If a user@host string has already been provided, connect to
      * it now.
      */