mirror of
https://git.FreeBSD.org/src.git
synced 2024-12-08 09:39:38 +00:00
Trailing slash fixes.
Fix the case: cp file nonexistent/ which create nonextstent as file while trailing slash clearly indicates that nonexistent must be a directory. Also fix the case: cp file1 file2/ which should produce error.
This commit is contained in:
parent
5fab96cfa4
commit
27d3ae3587
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=96808
14
bin/cp/cp.c
14
bin/cp/cp.c
@ -99,8 +99,8 @@ main(int argc, char *argv[])
|
|||||||
{
|
{
|
||||||
struct stat to_stat, tmp_stat;
|
struct stat to_stat, tmp_stat;
|
||||||
enum op type;
|
enum op type;
|
||||||
int Hflag, Lflag, Pflag, ch, fts_options, r;
|
int Hflag, Lflag, Pflag, ch, fts_options, r, have_trailing_slash;
|
||||||
char *target;
|
char *target, *s;
|
||||||
|
|
||||||
Hflag = Lflag = Pflag = 0;
|
Hflag = Lflag = Pflag = 0;
|
||||||
while ((ch = getopt(argc, argv, "HLPRfiprv")) != -1)
|
while ((ch = getopt(argc, argv, "HLPRfiprv")) != -1)
|
||||||
@ -179,6 +179,8 @@ main(int argc, char *argv[])
|
|||||||
*to.p_end++ = '.';
|
*to.p_end++ = '.';
|
||||||
*to.p_end = 0;
|
*to.p_end = 0;
|
||||||
}
|
}
|
||||||
|
have_trailing_slash =
|
||||||
|
((s = strrchr(to.p_path, '/')) != NULL && s[1] == '\0');
|
||||||
STRIP_TRAILING_SLASH(to);
|
STRIP_TRAILING_SLASH(to);
|
||||||
to.target_end = to.p_end;
|
to.target_end = to.p_end;
|
||||||
|
|
||||||
@ -229,6 +231,14 @@ main(int argc, char *argv[])
|
|||||||
type = FILE_TO_FILE;
|
type = FILE_TO_FILE;
|
||||||
} else
|
} else
|
||||||
type = FILE_TO_FILE;
|
type = FILE_TO_FILE;
|
||||||
|
|
||||||
|
if (have_trailing_slash && type == FILE_TO_FILE) {
|
||||||
|
if (r == -1)
|
||||||
|
errx(1, "directory %s does not exist",
|
||||||
|
to.p_path);
|
||||||
|
else
|
||||||
|
errx(1, "%s is not a directory", to.p_path);
|
||||||
|
}
|
||||||
} else
|
} else
|
||||||
/*
|
/*
|
||||||
* Case (2). Target is a directory.
|
* Case (2). Target is a directory.
|
||||||
|
Loading…
Reference in New Issue
Block a user