aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xscripts/test/cp.test4
-rw-r--r--toys/cp.c5
2 files changed, 6 insertions, 3 deletions
diff --git a/scripts/test/cp.test b/scripts/test/cp.test
index fcbab0e5..cd920de9 100755
--- a/scripts/test/cp.test
+++ b/scripts/test/cp.test
@@ -78,10 +78,12 @@ touch one/{six,seven,eight}
testing "cp -r /abspath dest" \
"cp -r \"$(readlink -f one)\" dir && diff -r one dir && echo yes" \
"yes\n" "" ""
+testing "cp -r dir again" "cp -r one/. dir && diff -r one dir && echo yes" \
+ "yes\n" "" ""
mkdir dir2
testing "cp -r dir1/* dir2" \
"cp -r one/* dir2 && diff -r one dir2 && echo yes" "yes\n" "" ""
-rm -rf one dir2
+rm -rf one dir dir2
# cp -r ../source destdir
# cp -r one/two/three missing
diff --git a/toys/cp.c b/toys/cp.c
index 13cb9672..d589f0ab 100644
--- a/toys/cp.c
+++ b/toys/cp.c
@@ -69,8 +69,9 @@ void cp_file(char *src, char *dst, struct stat *srcst)
// we created. The closest we can do to closing this is make sure
// that what we open _is_ a directory rather than something else.
- if (mkdir(dst, srcst->st_mode | 0200) || 0>(fdout=open(dst, 0))
- || fstat(fdout, &st2) || !S_ISDIR(st2.st_mode))
+ if ((mkdir(dst, srcst->st_mode | 0200) && errno != EEXIST)
+ || 0>(fdout=open(dst, 0)) || fstat(fdout, &st2)
+ || !S_ISDIR(st2.st_mode))
{
perror_exit("mkdir '%s'", dst);
}