A recursive copy will fail if another process creates one of the
destination directories between the stat(2) call and the the mkdir(2)
call. The relevant code is in copy.c, copy_internal():
if (new_dst || !S_ISDIR (dst_sb.st_mode))
{
/* Create the new directory writable and searchable, so
we can create new entries in it. */
if (mkdir (dst_name, (src_mode & x->umask_kill) | S_IRWXU) != 0)
{
error (0, errno, _("cannot create directory %s"),
quote (dst_name));
goto un_backup;
}
While this implemention appears to follow the letter of the POSIX
specification, it does not seem to follow the intent and at any rate
causes problems for the end user.
I believe that the correct behavior on EEXIST is to start the function over.
_______________________________________________
Bug-coreutils mailing list
[email protected]
http://lists.gnu.org/mailman/listinfo/bug-coreutils