+
+ do {
+ dest = concat_path_file(last, bb_get_last_path_component(*argv));
+
+ if ((dest_exists = cp_mv_stat(dest, &dest_stat)) < 0) {
+ goto RET_1;
+ }
+
+DO_MOVE:
+
+ if (dest_exists && !(flags & OPT_FILEUTILS_FORCE) &&
+ ((access(dest, W_OK) < 0 && isatty(0)) ||
+ (flags & OPT_FILEUTILS_INTERACTIVE))) {
+ if (fprintf(stderr, "mv: overwrite `%s'? ", dest) < 0) {
+ goto RET_1; /* Ouch! fprintf failed! */
+ }
+ if (!bb_ask_confirmation()) {
+ goto RET_0;
+ }
+ }
+ if (rename(*argv, dest) < 0) {
+ struct stat source_stat;
+ int source_exists;
+
+ if (errno != EXDEV) {
+ bb_perror_msg("unable to rename `%s'", *argv);
+ }
+ else if ((source_exists = cp_mv_stat(*argv, &source_stat)) >= 0) {
+ if (dest_exists) {
+ if (dest_exists == 3) {
+ if (source_exists != 3) {
+ bb_error_msg(fmt, "", "non-");
+ goto RET_1;
+ }
+ } else {
+ if (source_exists == 3) {
+ bb_error_msg(fmt, "non-", "");
+ goto RET_1;
+ }
+ }
+ if (unlink(dest) < 0) {
+ bb_perror_msg("cannot remove `%s'", dest);
+ goto RET_1;
+ }
+ }
+ if ((copy_file(*argv, dest,
+ FILEUTILS_RECUR | FILEUTILS_PRESERVE_STATUS) >= 0) &&
+ (remove_file(*argv, FILEUTILS_RECUR | FILEUTILS_FORCE) >= 0)) {
+ goto RET_0;
+ }
+ }
+RET_1:
+ status = 1;
+ }
+RET_0:
+ if (dest != last) {
+ free((void *) dest);
+ }
+ } while (*++argv != last);
+
+ return (status);