diff options
author | ache <ache@FreeBSD.org> | 2002-05-17 11:52:48 +0000 |
---|---|---|
committer | ache <ache@FreeBSD.org> | 2002-05-17 11:52:48 +0000 |
commit | c711b20bf2a1c36b066d8fe91da0ee31d5877883 (patch) | |
tree | c163ae39d53c21b1829b4cd78a7cd09df402c9bd /bin/cp | |
parent | f01e90294486b3921674f6f5ab7773ac3b5b0a3a (diff) | |
download | FreeBSD-src-c711b20bf2a1c36b066d8fe91da0ee31d5877883.zip FreeBSD-src-c711b20bf2a1c36b066d8fe91da0ee31d5877883.tar.gz |
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.
Diffstat (limited to 'bin/cp')
-rw-r--r-- | bin/cp/cp.c | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/bin/cp/cp.c b/bin/cp/cp.c index 935388d..e803e82 100644 --- a/bin/cp/cp.c +++ b/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. |