/*
* 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.
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;
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);
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);
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");
}
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);
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);
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;
}
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;
}
char namebuf[2048];
char ch;
int targisdir = 0;
- int settime = 0;
+ int settime;
int exists;
DWORD attr;
HANDLE f;
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)
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);
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];
strcpy(namebuf, targ);
}
attr = GetFileAttributes(namebuf);
- exists = (attr != -1);
+ exists = (attr != (DWORD)-1);
if (buf[0] == 'D') {
if (exists && (attr & FILE_ATTRIBUTE_DIRECTORY) == 0) {
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");
/*
* Initialize the Win$ock driver.
*/
-static void init_winsock()
+static void init_winsock(void)
{
WORD winsock_ver;
WSADATA wsadata;
/*
* 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);
}
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