Fix for `psftp-pscp-ignore-load': Default Settings is now loaded
authorjacob <jacob@cda61777-01e9-0310-a592-d414129be87e>
Sun, 25 Jul 2004 14:00:26 +0000 (14:00 +0000)
committerjacob <jacob@cda61777-01e9-0310-a592-d414129be87e>
Sun, 25 Jul 2004 14:00:26 +0000 (14:00 +0000)
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.

git-svn-id: svn://svn.tartarus.org/sgt/putty@4352 cda61777-01e9-0310-a592-d414129be87e

cmdline.c
plink.c
psftp.c
putty.h
scp.c
unix/uxplink.c

index a67b013..29456a1 100644 (file)
--- a/cmdline.c
+++ b/cmdline.c
@@ -137,6 +137,7 @@ int cmdline_process_param(char *p, char *value, int need_save, Config *cfg)
        /* This parameter must be processed immediately rather than being
         * saved. */
        do_defaults(value, cfg);
+       loaded_session = TRUE;
        return 2;
     }
     if (!strcmp(p, "-ssh")) {
diff --git a/plink.c b/plink.c
index 92769e8..3afd73c 100644 (file)
--- a/plink.c
+++ b/plink.c
@@ -295,6 +295,7 @@ int main(int argc, char **argv)
      * Process the command line.
      */
     do_defaults(NULL, &cfg);
+    loaded_session = FALSE;
     default_protocol = cfg.protocol;
     default_port = cfg.port;
     errors = 0;
@@ -409,13 +410,15 @@ int main(int argc, char **argv)
                         */
                        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 {
diff --git a/psftp.c b/psftp.c
index 10056bd..218d363 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';
     }
@@ -1996,6 +2012,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;
diff --git a/putty.h b/putty.h
index fed589b..6d4d83a 100644 (file)
--- a/putty.h
+++ b/putty.h
@@ -517,6 +517,11 @@ GLOBAL int flags;
 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 */
 
 /*
diff --git a/scp.c b/scp.c
index f7fa255..fe341be 100644 (file)
--- 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';
     }
@@ -2158,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] != '-')
index 6bf2c85..c9b5075 100644 (file)
@@ -270,6 +270,7 @@ int main(int argc, char **argv)
      * Process the command line.
      */
     do_defaults(NULL, &cfg);
+    loaded_session = FALSE;
     default_protocol = cfg.protocol;
     default_port = cfg.port;
     errors = 0;
@@ -396,13 +397,15 @@ int main(int argc, char **argv)
                         */
                        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 {