Joris van Rantwijk's fixes for cygwin (NB includes WIN32S_COMPAT)
[u/mdw/putty] / scp.c
diff --git a/scp.c b/scp.c
index 299f6fd..3ea2c35 100644 (file)
--- a/scp.c
+++ b/scp.c
@@ -120,14 +120,10 @@ static void do_cmd(char *host, char *user, char *cmd)
        cfg.port = 22;
     }
 
-    if (portnumber)
-       cfg.port = portnumber;
-
     /* Set username */
     if (user != NULL && user[0] != '\0') {
        strncpy(cfg.username, user, sizeof(cfg.username)-1);
        cfg.username[sizeof(cfg.username)-1] = '\0';
-       cfg.port = 22;
     } else if (cfg.username[0] == '\0') {
        bump("Empty user name");
     }
@@ -135,6 +131,9 @@ static void do_cmd(char *host, char *user, char *cmd)
     if (cfg.protocol != PROT_SSH)
        cfg.port = 22;
 
+    if (portnumber)
+       cfg.port = portnumber;
+
     err = ssh_init(cfg.host, cfg.port, cmd, &realhost);
     if (err != NULL)
        bump("ssh_init: %s", err);
@@ -277,10 +276,25 @@ static void source(char *src)
     }
 
     if ((attr & FILE_ATTRIBUTE_DIRECTORY) != 0) {
-       if (recursive)
-           rsource(src);
-       else
+       if (recursive) {
+            /*
+             * Avoid . and .. directories.
+             */
+            char *p;
+            p = strrchr(src, '/');
+            if (!p)
+                p = strrchr(src, '\\');
+            if (!p)
+                p = src;
+            else
+                p++;
+            if (!strcmp(p, ".") || !strcmp(p, ".."))
+                /* skip . and .. */;
+            else
+                rsource(src);
+        } else {
            run_err("%s: not a regular file", src);
+        }
        return;
     }