before "-load" is processed so that it doesn't clobber it.
I've also changed the semantics of "-load" slightly for PSCP, PSFTP,
and Plink: if it's specified at all, it overrides (disables) the
implicit loading of session details based on a supplied hostname
elsewhere (on the grounds that the user is more likely to want the
"-load" session than the implicit session). (PuTTY itself doesn't do
implicit loading at all, so I haven't changed it.)
This means that all the PuTTY tools' behaviour is now consistent iff
"-load" is specified (otherwise, some tools have implicit-session, and
others don't).
However, I've not documented this behaviour, as there's a good chance
it will be swept away if and when we get round to sorting out how we
deal with settings from multiple sources. It's intended as a "do
something sensible" change.
[originally from svn r4352]
/* This parameter must be processed immediately rather than being
* saved. */
do_defaults(value, cfg);
+ loaded_session = TRUE;
return 2;
}
if (!strcmp(p, "-ssh")) {
* Process the command line.
*/
do_defaults(NULL, &cfg);
+ loaded_session = FALSE;
default_protocol = cfg.protocol;
default_port = cfg.port;
errors = 0;
*/
Config cfg2;
do_defaults(p, &cfg2);
- if (cfg2.host[0] == '\0') {
+ if (loaded_session || cfg2.host[0] == '\0') {
/* No settings for this host; use defaults */
+ /* (or session was already loaded with -load) */
strncpy(cfg.host, p, sizeof(cfg.host) - 1);
cfg.host[sizeof(cfg.host) - 1] = '\0';
cfg.port = default_port;
} else {
cfg = cfg2;
+ /* Ick: patch up internal pointer after copy */
cfg.remote_cmd_ptr = cfg.remote_cmd;
}
} else {
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';
}
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;
GLOBAL int default_protocol;
GLOBAL int default_port;
+/*
+ * This is set TRUE by cmdline.c iff a session is loaded with "-load".
+ */
+GLOBAL int loaded_session;
+
struct RSAKey; /* be a little careful of scope */
/*
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';
}
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] != '-')
* Process the command line.
*/
do_defaults(NULL, &cfg);
+ loaded_session = FALSE;
default_protocol = cfg.protocol;
default_port = cfg.port;
errors = 0;
*/
Config cfg2;
do_defaults(p, &cfg2);
- if (cfg2.host[0] == '\0') {
+ if (loaded_session || cfg2.host[0] == '\0') {
/* No settings for this host; use defaults */
+ /* (or session was already loaded with -load) */
strncpy(cfg.host, p, sizeof(cfg.host) - 1);
cfg.host[sizeof(cfg.host) - 1] = '\0';
cfg.port = default_port;
} else {
cfg = cfg2;
+ /* Ick: patch up internal pointer after copy */
cfg.remote_cmd_ptr = cfg.remote_cmd;
}
} else {