1
0
mirror of https://git.tartarus.org/simon/putty.git synced 2025-01-09 09:27:59 +00:00

Centralise stripslashes() and make it OS-sensitive.

I noticed that Unix PSCP was unwantedly renaming downloaded files
which had a backslash in their names, because pscp.c's stripslashes()
treated \ as a path component separator, since it hadn't been modified
since PSCP ran on Windows only.

It also turns out that pscp.c, psftp.c and winsftp.c all had a
stripslashes(), and they didn't all have quite the same prototype. So
now there's one in winsftp.c and one in uxsftp.c, with appropriate
OS-dependent behaviour, and the ones in pscp.c and psftp.c are gone.
This commit is contained in:
Simon Tatham 2015-09-24 17:47:10 +01:00
parent 13edf90e0a
commit 5c5ca116db
5 changed files with 37 additions and 64 deletions

29
pscp.c
View File

@ -605,35 +605,6 @@ static char *colon(char *str)
return (NULL);
}
/*
* Return a pointer to the portion of str that comes after the last
* slash (or backslash or colon, if `local' is TRUE).
*
* This function has the annoying strstr() property of taking a const
* char * and returning a char *. You should treat it as if it was a
* pair of overloaded functions, one mapping mutable->mutable and the
* other const->const :-(
*/
static char *stripslashes(const char *str, int local)
{
char *p;
if (local) {
p = strchr(str, ':');
if (p) str = p+1;
}
p = strrchr(str, '/');
if (p) str = p+1;
if (local) {
p = strrchr(str, '\\');
if (p) str = p+1;
}
return (char *)str;
}
/*
* Determine whether a string is entirely composed of dots.
*/

29
psftp.c
View File

@ -169,35 +169,6 @@ char *canonify(const char *name)
}
}
/*
* Return a pointer to the portion of str that comes after the last
* slash (or backslash or colon, if `local' is TRUE).
*
* This function has the annoying strstr() property of taking a const
* char * and returning a char *. You should treat it as if it was a
* pair of overloaded functions, one mapping mutable->mutable and the
* other const->const :-(
*/
static char *stripslashes(const char *str, int local)
{
char *p;
if (local) {
p = strchr(str, ':');
if (p) str = p+1;
}
p = strrchr(str, '/');
if (p) str = p+1;
if (local) {
p = strrchr(str, '\\');
if (p) str = p+1;
}
return (char *)str;
}
/*
* qsort comparison routine for fxp_name structures. Sorts by real
* file name.

17
psftp.h
View File

@ -177,4 +177,21 @@ int create_directory(const char *name);
*/
char *dir_file_cat(const char *dir, const char *file);
/*
* Return a pointer to the portion of str that comes after the last
* path component separator.
*
* If 'local' is false, path component separators are taken to just be
* '/', on the assumption that we're discussing the path syntax on the
* server. But if 'local' is true, the separators are whatever the
* local OS will treat that way - so that includes '\' and ':' on
* Windows.
*
* This function has the annoying strstr() property of taking a const
* char * and returning a char *. You should treat it as if it was a
* pair of overloaded functions, one mapping mutable->mutable and the
* other const->const :-(
*/
char *stripslashes(const char *str, int local);
#endif /* PUTTY_PSFTP_H */

View File

@ -413,6 +413,20 @@ void finish_wildcard_matching(WildcardMatcher *dir) {
sfree(dir);
}
char *stripslashes(const char *str, int local)
{
char *p;
/*
* On Unix, we do the same thing regardless of the 'local'
* parameter.
*/
p = strrchr(str, '/');
if (p) str = p+1;
return (char *)str;
}
int vet_filename(const char *name)
{
if (strchr(name, '/'))

View File

@ -340,14 +340,14 @@ struct WildcardMatcher {
char *srcpath;
};
/*
* Return a pointer to the portion of str that comes after the last
* slash (or backslash or colon, if `local' is TRUE).
*/
static char *stripslashes(char *str, int local)
char *stripslashes(const char *str, int local)
{
char *p;
/*
* On Windows, \ / : are all path component separators.
*/
if (local) {
p = strchr(str, ':');
if (p) str = p+1;
@ -361,7 +361,7 @@ static char *stripslashes(char *str, int local)
if (p) str = p+1;
}
return str;
return (char *)str;
}
WildcardMatcher *begin_wildcard_matching(const char *name)