Chris Larson (kergoth) writes:

As Manuel points out, this is a flawed fix, and doesnt fix the
following:

mkdir -p cpa cpb cpc
cp -a cpa cpa/cpb/cpc

Attached what appears to be a more sane fix.  Apply on top of previous.
Please confirm sanity.
This commit is contained in:
Eric Andersen 2004-02-19 01:52:29 +00:00
parent e0cbe48637
commit e7d244cc96

View File

@ -65,28 +65,12 @@ int copy_file(const char *source, const char *dest, int flags)
DIR *dp; DIR *dp;
struct dirent *d; struct dirent *d;
mode_t saved_umask = 0; mode_t saved_umask = 0;
char *dstparent;
struct stat dstparent_stat;
if (!(flags & FILEUTILS_RECUR)) { if (!(flags & FILEUTILS_RECUR)) {
bb_error_msg("%s: omitting directory", source); bb_error_msg("%s: omitting directory", source);
return -1; return -1;
} }
dstparent = dirname(bb_xstrdup(dest));
if (lstat(dstparent, &dstparent_stat) < 0) {
bb_perror_msg("unable to stat `%s'", dstparent);
free(dstparent);
return -1;
}
free(dstparent);
if (source_stat.st_dev == dstparent_stat.st_dev &&
source_stat.st_ino == dstparent_stat.st_ino) {
bb_error_msg("cannot copy a directory, `%s', into itself, `%s'", source, dest);
return -1;
}
/* Create DEST. */ /* Create DEST. */
if (dest_exists) { if (dest_exists) {
if (!S_ISDIR(dest_stat.st_mode)) { if (!S_ISDIR(dest_stat.st_mode)) {
@ -111,6 +95,8 @@ int copy_file(const char *source, const char *dest, int flags)
umask(saved_umask); umask(saved_umask);
} }
add_to_ino_dev_hashtable(&dest_stat, source);
/* Recursively copy files in SOURCE. */ /* Recursively copy files in SOURCE. */
if ((dp = opendir(source)) == NULL) { if ((dp = opendir(source)) == NULL) {
bb_perror_msg("unable to open directory `%s'", source); bb_perror_msg("unable to open directory `%s'", source);
@ -124,6 +110,10 @@ int copy_file(const char *source, const char *dest, int flags)
new_source = concat_subpath_file(source, d->d_name); new_source = concat_subpath_file(source, d->d_name);
if(new_source == NULL) if(new_source == NULL)
continue; continue;
if (is_in_ino_dev_hashtable(&dest_stat, &new_source)) {
bb_error_msg("cannot copy a directory, `%s', into itself, `%s'", new_source, dest);
continue;
}
new_dest = concat_path_file(dest, d->d_name); new_dest = concat_path_file(dest, d->d_name);
if (copy_file(new_source, new_dest, flags) < 0) if (copy_file(new_source, new_dest, flags) < 0)
status = -1; status = -1;