Fix some picky compiler warnings kindly provided by Borland C++ 5.5
[u/mdw/putty] / scp.c
diff --git a/scp.c b/scp.c
index d0f70ae..8a82b2f 100644 (file)
--- a/scp.c
+++ b/scp.c
@@ -1,6 +1,6 @@
 /*
  *  scp.c  -  Scp (Secure Copy) client for PuTTY.
- *  Joris van Rantwijk, Aug 1999.
+ *  Joris van Rantwijk, Aug 1999, Nov 1999.
  *
  *  This is mainly based on ssh-1.2.26/scp.c by Timo Rinne & Tatu Ylonen.
  *  They, in turn, used stuff from BSD rcp.
@@ -27,6 +27,8 @@ static int recursive = 0;
 static int preserve = 0;
 static int targetshouldbedirectory = 0;
 static int statistics = 1;
+static int portnumber = 0;
+static char *password = NULL;
 static int errs = 0;
 static int connection_open = 0;
 
@@ -70,8 +72,14 @@ static void bump(char *fmt, ...)
 void ssh_get_password(char *prompt, char *str, int maxlen)
 {
     HANDLE hin, hout;
-    DWORD savemode;
-    int i;
+    DWORD savemode, i;
+
+    if (password) {
+       strncpy(str, password, maxlen);
+       str[maxlen-1] = '\0';
+       password = NULL;
+       return;
+    }
 
     hin = GetStdHandle(STD_INPUT_HANDLE);
     hout = GetStdHandle(STD_OUTPUT_HANDLE);
@@ -87,7 +95,7 @@ void ssh_get_password(char *prompt, char *str, int maxlen)
 
     SetConsoleMode(hin, savemode);
 
-    if (i > maxlen) i = maxlen-1; else i = i - 2;
+    if ((int)i > maxlen) i = maxlen-1; else i = i - 2;
     str[i] = '\0';
 
     WriteFile(hout, "\r\n", 2, &i, NULL);
@@ -116,7 +124,6 @@ static void do_cmd(char *host, char *user, char *cmd)
     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");
     }
@@ -124,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);
@@ -153,7 +163,7 @@ static void print_stats(char *name, unsigned long size, unsigned long done,
        eta = size - done;
     else
        eta = (unsigned long) ((size - done) / ratebs);
-    sprintf(etastr, "%02d:%02d:%02d",
+    sprintf(etastr, "%02ld:%02ld:%02ld",
            eta / 3600, (eta % 3600) / 60, eta % 60);
 
     pct = (int) (100.0 * (float) done / size);
@@ -260,16 +270,31 @@ static void source(char *src)
     time_t stat_starttime, stat_lasttime;
 
     attr = GetFileAttributes(src);
-    if (attr == -1) {
+    if (attr == (DWORD)-1) {
        run_err("%s: No such file or directory", src);
        return;
     }
 
     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;
     }
 
@@ -285,7 +310,7 @@ static void source(char *src)
     f = CreateFile(src, GENERIC_READ, FILE_SHARE_READ, NULL,
                   OPEN_EXISTING, 0, 0);
     if (f == INVALID_HANDLE_VALUE) {
-       run_err("%s: Cannot open file");
+       run_err("%s: Cannot open file", src);
        return;
     }
 
@@ -400,7 +425,7 @@ static void sink(char *targ)
     char namebuf[2048];
     char ch;
     int targisdir = 0;
-    int settime = 0;
+    int settime;
     int exists;
     DWORD attr;
     HANDLE f;
@@ -413,7 +438,7 @@ static void sink(char *targ)
     char *stat_name;
 
     attr = GetFileAttributes(targ);
-    if (attr != -1 && (attr & FILE_ATTRIBUTE_DIRECTORY) != 0)
+    if (attr != (DWORD)-1 && (attr & FILE_ATTRIBUTE_DIRECTORY) != 0)
        targisdir = 1;
 
     if (targetshouldbedirectory && !targisdir)
@@ -446,7 +471,7 @@ static void sink(char *targ)
            ssh_send("", 1);
            return;
          case 'T':
-           if (sscanf(buf, "T%d %*d %d %*d",
+           if (sscanf(buf, "T%ld %*d %ld %*d",
                       &mtime, &atime) == 2) {
                settime = 1;
                ssh_send("", 1);
@@ -460,7 +485,7 @@ static void sink(char *targ)
            bump("Protocol error: Expected control record");
        }
 
-       if (sscanf(buf+1, "%u %u %[^\n]", &mode, &size, namebuf) != 3)
+       if (sscanf(buf+1, "%u %lu %[^\n]", &mode, &size, namebuf) != 3)
            bump("Protocol error: Illegal file descriptor format");
        if (targisdir) {
            char t[2048];
@@ -473,7 +498,7 @@ static void sink(char *targ)
            strcpy(namebuf, targ);
        }
        attr = GetFileAttributes(namebuf);
-       exists = (attr != -1);
+       exists = (attr != (DWORD)-1);
 
        if (buf[0] == 'D') {
            if (exists && (attr & FILE_ATTRIBUTE_DIRECTORY) == 0) {
@@ -515,7 +540,7 @@ static void sink(char *targ)
 
        for (i = 0; i < size; i += 4096) {
            char transbuf[4096];
-           int j, k = 4096;
+           DWORD j, k = 4096;
            if (i + k > size) k = size - i;
            if (ssh_recv(transbuf, k) == 0)
                bump("Lost connection");
@@ -707,7 +732,7 @@ static void tolocal(int argc, char *argv[])
 /*
  *  Initialize the Win$ock driver.
  */
-static void init_winsock()
+static void init_winsock(void)
 {
     WORD winsock_ver;
     WSADATA wsadata;
@@ -723,13 +748,19 @@ static void init_winsock()
 /*
  *  Short description of parameters.
  */
-static void usage()
+static void usage(void)
 {
     printf("PuTTY Secure Copy client\n");
     printf("%s\n", ver);
-    printf("usage: scp [-p] [-q] [-r] [-v] [user@]host:source target\n");
-    printf("       scp [-p] [-q] [-r] [-v] source [source..]"
-          " [user@]host:target\n");
+    printf("Usage: scp [options] [user@]host:source target\n");
+    printf("       scp [options] source [source...] [user@]host:target\n");
+    printf("Options:\n");
+    printf("  -p        preserve file attributes\n");
+    printf("  -q        quiet, don't show statistics\n");
+    printf("  -r        copy directories recursively\n");
+    printf("  -v        show verbose messages\n");
+    printf("  -P port   connect to specified port\n");
+    printf("  -pw passw login with specified password\n");
     exit(1);
 }
 
@@ -756,6 +787,10 @@ int main(int argc, char *argv[])
        else if (strcmp(argv[i], "-h") == 0 ||
                 strcmp(argv[i], "-?") == 0)
            usage();
+       else if (strcmp(argv[i], "-P") == 0 && i+1 < argc)
+           portnumber = atoi(argv[++i]);
+       else if (strcmp(argv[i], "-pw") == 0 && i+1 < argc)
+           password = argv[++i];
        else if (strcmp(argv[i], "--") == 0)
        { i++; break; }
        else