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
f01e902944
commit
c711b20bf2
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;
|
||||
enum op type;
|
||||
int Hflag, Lflag, Pflag, ch, fts_options, r;
|
||||
char *target;
|
||||
int Hflag, Lflag, Pflag, ch, fts_options, r, have_trailing_slash;
|
||||
char *target, *s;
|
||||
|
||||
Hflag = Lflag = Pflag = 0;
|
||||
while ((ch = getopt(argc, argv, "HLPRfiprv")) != -1)
|
||||
@ -179,6 +179,8 @@ main(int argc, char *argv[])
|
||||
*to.p_end++ = '.';
|
||||
*to.p_end = 0;
|
||||
}
|
||||
have_trailing_slash =
|
||||
((s = strrchr(to.p_path, '/')) != NULL && s[1] == '\0');
|
||||
STRIP_TRAILING_SLASH(to);
|
||||
to.target_end = to.p_end;
|
||||
|
||||
@ -229,6 +231,14 @@ main(int argc, char *argv[])
|
||||
type = FILE_TO_FILE;
|
||||
} else
|
||||
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
|
||||
/*
|
||||
* Case (2). Target is a directory.
|
||||
|
Loading…
Reference in New Issue
Block a user