mirror of
https://git.tartarus.org/simon/putty.git
synced 2025-01-10 01:48:00 +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:
parent
13edf90e0a
commit
5c5ca116db
29
pscp.c
29
pscp.c
@ -605,35 +605,6 @@ static char *colon(char *str)
|
|||||||
return (NULL);
|
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.
|
* Determine whether a string is entirely composed of dots.
|
||||||
*/
|
*/
|
||||||
|
29
psftp.c
29
psftp.c
@ -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
|
* qsort comparison routine for fxp_name structures. Sorts by real
|
||||||
* file name.
|
* file name.
|
||||||
|
17
psftp.h
17
psftp.h
@ -177,4 +177,21 @@ int create_directory(const char *name);
|
|||||||
*/
|
*/
|
||||||
char *dir_file_cat(const char *dir, const char *file);
|
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 */
|
#endif /* PUTTY_PSFTP_H */
|
||||||
|
@ -413,6 +413,20 @@ void finish_wildcard_matching(WildcardMatcher *dir) {
|
|||||||
sfree(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)
|
int vet_filename(const char *name)
|
||||||
{
|
{
|
||||||
if (strchr(name, '/'))
|
if (strchr(name, '/'))
|
||||||
|
@ -340,14 +340,14 @@ struct WildcardMatcher {
|
|||||||
char *srcpath;
|
char *srcpath;
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
char *stripslashes(const char *str, int local)
|
||||||
* 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 *p;
|
char *p;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* On Windows, \ / : are all path component separators.
|
||||||
|
*/
|
||||||
|
|
||||||
if (local) {
|
if (local) {
|
||||||
p = strchr(str, ':');
|
p = strchr(str, ':');
|
||||||
if (p) str = p+1;
|
if (p) str = p+1;
|
||||||
@ -361,7 +361,7 @@ static char *stripslashes(char *str, int local)
|
|||||||
if (p) str = p+1;
|
if (p) str = p+1;
|
||||||
}
|
}
|
||||||
|
|
||||||
return str;
|
return (char *)str;
|
||||||
}
|
}
|
||||||
|
|
||||||
WildcardMatcher *begin_wildcard_matching(const char *name)
|
WildcardMatcher *begin_wildcard_matching(const char *name)
|
||||||
|
Loading…
Reference in New Issue
Block a user