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';
}
/* 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) {
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);
{
float ratebs;
unsigned long eta;
- char etastr[10];
+ char *etastr;
int pct;
int len;
int elap;
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));
fflush(stdout);
}
+
+ free(etastr);
}
/*
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] != '-')