X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/blobdiff_plain/b65b8aaea82eb57b726e495b53f6c192d0601625..5a468ffb8516c6fc86cc577a86e7c122f8e8e3c3:/scp.c diff --git a/scp.c b/scp.c index 075b731b..d4446a77 100644 --- 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); @@ -164,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); @@ -271,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; } @@ -296,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; } @@ -411,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; @@ -424,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) @@ -457,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); @@ -471,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]; @@ -484,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) { @@ -526,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"); @@ -718,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; @@ -734,7 +748,7 @@ 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); @@ -800,6 +814,9 @@ int main(int argc, char *argv[]) ssh_send_eof(); ssh_recv(&ch, 1); } +#ifdef MSCRYPTOAPI + crypto_wrapup(); +#endif WSACleanup(); random_save_seed();