changeset 272:a5652aa22f38

Another cp -r fix, another test case...
author Rob Landley <rob@landley.net>
date Wed, 26 Mar 2008 00:54:56 -0500
parents 7d625cbdde25
children e589555d6416
files scripts/test/cp.test toys/cp.c
diffstat 2 files changed, 6 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/scripts/test/cp.test	Tue Mar 25 17:09:40 2008 -0500
+++ b/scripts/test/cp.test	Wed Mar 26 00:54:56 2008 -0500
@@ -78,10 +78,12 @@
 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
--- a/toys/cp.c	Tue Mar 25 17:09:40 2008 -0500
+++ b/toys/cp.c	Wed Mar 26 00:54:56 2008 -0500
@@ -69,8 +69,9 @@
 		// 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);
 		}