X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/blobdiff_plain/510d42ee5074abd7d567be0167d271d60759d30b..1c63e24602c01c5d7e5587088969d90a25807386:/scp.c?ds=sidebyside diff --git a/scp.c b/scp.c index 4334d9ff..1c601e97 100644 --- a/scp.c +++ b/scp.c @@ -321,11 +321,27 @@ static void do_cmd(char *host, char *user, char *cmd) if (host == NULL || host[0] == '\0') bump("Empty host name"); - /* 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'; } @@ -354,7 +370,7 @@ static void do_cmd(char *host, char *user, char *cmd) /* 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) { @@ -450,7 +466,8 @@ static void do_cmd(char *host, char *user, char *cmd) back = &ssh_backend; - err = back->init(NULL, &backhandle, &cfg, cfg.host, cfg.port, &realhost,0); + err = back->init(NULL, &backhandle, &cfg, cfg.host, cfg.port, &realhost, + 0, cfg.tcp_keepalives); if (err != NULL) bump("ssh_init: %s", err); logctx = log_init(NULL, &cfg); @@ -470,7 +487,7 @@ static void print_stats(char *name, unsigned long size, unsigned long done, { float ratebs; unsigned long eta; - char etastr[10]; + char *etastr; int pct; int len; int elap; @@ -486,8 +503,8 @@ static void print_stats(char *name, unsigned long size, unsigned long done, eta = size - done; else eta = (unsigned long) ((size - done) / ratebs); - sprintf(etastr, "%02ld:%02ld:%02ld", - eta / 3600, (eta % 3600) / 60, eta % 60); + etastr = dupprintf("%02ld:%02ld:%02ld", + eta / 3600, (eta % 3600) / 60, eta % 60); pct = (int) (100 * (done * 1.0 / size)); @@ -506,6 +523,8 @@ static void print_stats(char *name, unsigned long size, unsigned long done, fflush(stdout); } + + free(etastr); } /* @@ -2155,6 +2174,10 @@ int psftp_main(int argc, char *argv[]) ssh_get_line = &console_get_line; sk_init(); + /* Load Default Settings before doing anything else. */ + do_defaults(NULL, &cfg); + loaded_session = FALSE; + for (i = 1; i < argc; i++) { int ret; if (argv[i][0] != '-')