Another cp -r fix, another test case...
authorRob Landley <rob@landley.net>
Wed, 26 Mar 2008 05:54:56 +0000 (00:54 -0500)
committerRob Landley <rob@landley.net>
Wed, 26 Mar 2008 05:54:56 +0000 (00:54 -0500)
scripts/test/cp.test
toys/cp.c

index fcbab0e..cd920de 100755 (executable)
@@ -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
index 13cb967..d589f0a 100644 (file)
--- 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);
                }