projects
/
u
/
mdw
/
putty
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Add the names of major contributors to the copyright statement. I've
[u/mdw/putty]
/
scp.c
diff --git
a/scp.c
b/scp.c
index
250e229
..
aca1cf3
100644
(file)
--- a/
scp.c
+++ b/
scp.c
@@
-22,9
+22,6
@@
#include <limits.h>
#include <time.h>
#include <assert.h>
#include <limits.h>
#include <time.h>
#include <assert.h>
-/* GUI Adaptation - Sept 2000 */
-#include <winuser.h>
-#include <winbase.h>
#define PUTTY_DO_GLOBALS
#include "putty.h"
#define PUTTY_DO_GLOBALS
#include "putty.h"
@@
-652,7
+649,7
@@
static void print_stats(char *name, unsigned long size, unsigned long done,
sprintf(etastr, "%02ld:%02ld:%02ld",
eta / 3600, (eta % 3600) / 60, eta % 60);
sprintf(etastr, "%02ld:%02ld:%02ld",
eta / 3600, (eta % 3600) / 60, eta % 60);
- pct = (int) (100
.0 * (float) done / size
);
+ pct = (int) (100
* (done * 1.0 / size)
);
len = printf("\r%-25.25s | %10ld kB | %5.1f kB/s | ETA: %8s | %3d%%",
name, done / 1024, ratebs / 1024.0, etastr, pct);
len = printf("\r%-25.25s | %10ld kB | %5.1f kB/s | ETA: %8s | %3d%%",
name, done / 1024, ratebs / 1024.0, etastr, pct);
@@
-686,12
+683,17
@@
static char *colon(char *str)
/*
* Return a pointer to the portion of str that comes after the last
/*
* Return a pointer to the portion of str that comes after the last
- * slash (or backslash, if `local' is TRUE).
+ * slash (or backslash
or colon
, if `local' is TRUE).
*/
static char *stripslashes(char *str, int local)
{
char *p;
*/
static char *stripslashes(char *str, int local)
{
char *p;
+ if (local) {
+ p = strchr(str, ':');
+ if (p) str = p+1;
+ }
+
p = strrchr(str, '/');
if (p) str = p+1;
p = strrchr(str, '/');
if (p) str = p+1;
@@
-836,6
+838,7
@@
static struct scp_sftp_dirstack {
int namepos, namelen;
char *dirpath;
char *wildcard;
int namepos, namelen;
char *dirpath;
char *wildcard;
+ int matched_something; /* wildcard match set was non-empty */
} *scp_sftp_dirstack_head;
static char *scp_sftp_remotepath, *scp_sftp_currentname;
static char *scp_sftp_wildcard;
} *scp_sftp_dirstack_head;
static char *scp_sftp_remotepath, *scp_sftp_currentname;
static char *scp_sftp_wildcard;
@@
-1196,6
+1199,7
@@
int scp_get_sink_action(struct scp_sink_action *act)
head->names[head->namepos].filename))))
head->namepos++; /* skip . and .. */
if (head->namepos < head->namelen) {
head->names[head->namepos].filename))))
head->namepos++; /* skip . and .. */
if (head->namepos < head->namelen) {
+ head->matched_something = 1;
fname = dupcat(head->dirpath, "/",
head->names[head->namepos++].filename,
NULL);
fname = dupcat(head->dirpath, "/",
head->names[head->namepos++].filename,
NULL);
@@
-1208,7
+1212,13
@@
int scp_get_sink_action(struct scp_sink_action *act)
*/
if (head->wildcard) {
act->action = SCP_SINK_RETRY;
*/
if (head->wildcard) {
act->action = SCP_SINK_RETRY;
+ if (!head->matched_something) {
+ tell_user(stderr, "pscp: wildcard '%s' matched "
+ "no files", head->wildcard);
+ errs++;
+ }
sfree(head->wildcard);
sfree(head->wildcard);
+
} else {
act->action = SCP_SINK_ENDDIR;
}
} else {
act->action = SCP_SINK_ENDDIR;
}
@@
-1329,6
+1339,7
@@
int scp_get_sink_action(struct scp_sink_action *act)
newitem->dirpath = dupstr(fname);
if (scp_sftp_wildcard) {
newitem->wildcard = scp_sftp_wildcard;
newitem->dirpath = dupstr(fname);
if (scp_sftp_wildcard) {
newitem->wildcard = scp_sftp_wildcard;
+ newitem->matched_something = 0;
scp_sftp_wildcard = NULL;
} else {
newitem->wildcard = NULL;
scp_sftp_wildcard = NULL;
} else {
newitem->wildcard = NULL;
@@
-1722,9
+1733,10
@@
static void sink(char *targ, char *src)
* Prevent the remote side from maliciously writing to
* files outside the target area by sending a filename
* containing `../'. In fact, it shouldn't be sending
* Prevent the remote side from maliciously writing to
* files outside the target area by sending a filename
* containing `../'. In fact, it shouldn't be sending
- * filenames with any slashes in at all; so we'll find
- * the last slash or backslash in the filename and use
- * only the part after that. (And warn!)
+ * filenames with any slashes or colons in at all; so
+ * we'll find the last slash, backslash or colon in the
+ * filename and use only the part after that. (And
+ * warn!)
*
* In addition, we also ensure here that if we're
* copying a single file and the target is a directory
*
* In addition, we also ensure here that if we're
* copying a single file and the target is a directory
@@
-1752,7
+1764,9
@@
static void sink(char *targ, char *src)
striptarget = stripslashes(act.name, 1);
if (striptarget != act.name) {
tell_user(stderr, "warning: remote host sent a compound"
striptarget = stripslashes(act.name, 1);
if (striptarget != act.name) {
tell_user(stderr, "warning: remote host sent a compound"
- " pathname - possibly malicious! (ignored)");
+ " pathname '%s'", act.name);
+ tell_user(stderr, " renaming local file to '%s'",
+ striptarget);
}
/*
}
/*
@@
-1875,7
+1889,7
@@
static void sink(char *targ, char *src)
}
(void) scp_finish_filerecv();
sfree(destfname);
}
(void) scp_finish_filerecv();
sfree(destfname);
- sfree(act.
name
);
+ sfree(act.
buf
);
}
}
}
}
@@
-1956,13
+1970,6
@@
static void toremote(int argc, char *argv[])
*/
srcpath = dupstr(src);
last = stripslashes(srcpath, 1);
*/
srcpath = dupstr(src);
last = stripslashes(srcpath, 1);
- if (last == srcpath) {
- last = strchr(srcpath, ':');
- if (last)
- last++;
- else
- last = srcpath;
- }
*last = '\0';
dir = FindFirstFile(src, &fdat);
*last = '\0';
dir = FindFirstFile(src, &fdat);