Chris Larson (kergoth) writes:
No binary (build failed)
—
(log yok)
| @@ -65,28 +65,12 @@ int copy_file(const char *source, const char *dest, int flags) | |
| DIR *dp; | |
| struct dirent *d; | |
| mode_t saved_umask = 0; | |
| - | char *dstparent; |
| - | struct stat dstparent_stat; |
| if (!(flags & FILEUTILS_RECUR)) { | |
| bb_error_msg("%s: omitting directory", source); | |
| 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. */ | |
| if (dest_exists) { | |
| 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); | |
| } | |
| + | add_to_ino_dev_hashtable(&dest_stat, source); |
| + | |
| /* Recursively copy files in SOURCE. */ | |
| if ((dp = opendir(source)) == NULL) { | |
| 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); | |
| if(new_source == NULL) | |
| 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); | |
| if (copy_file(new_source, new_dest, flags) < 0) | |
| status = -1; | |