From 27d3ae358753b8e77b8aa5887d67b45b01d920ff Mon Sep 17 00:00:00 2001 From: "Andrey A. Chernov" Date: Fri, 17 May 2002 11:52:48 +0000 Subject: [PATCH] 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. --- bin/cp/cp.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/bin/cp/cp.c b/bin/cp/cp.c index 935388df1ff9..e803e8274a62 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.