diff -urpN mc-4.6.1.org/src/file.c mc-4.6.1.cp/src/file.c --- mc-4.6.1.org/src/file.c 2005-05-27 16:19:18.000000000 +0200 +++ mc-4.6.1.cp/src/file.c 2007-05-18 16:00:23.000000000 +0200 @@ -458,6 +458,25 @@ enum { DEST_FULL /* Created, fully copied */ }; +static int warn_same_file(const char *fmt, const char *a, const char *b) +{ + char *msg; + /* We don't expect %d etc, just %s, so strlen(fmt) should be ok */ + int n = strlen(fmt) + strlen(a) + strlen(b) + 1; + + msg = malloc(n); + if (msg) { + snprintf(msg, n, fmt, a, b); + n = query_dialog (MSG_ERROR, msg, + D_ERROR, 2, _("&Skip"), _("&Abort")); + free(msg); + do_refresh (); + if (n) /* 1 == Abort */ + return FILE_ABORT; + } + return FILE_SKIP; +} + int copy_file_file (FileOpContext *ctx, const char *src_path, const char *dst_path, int ask_overwrite, off_t *progress_count, @@ -512,12 +531,9 @@ copy_file_file (FileOpContext *ctx, cons if (dst_exists) { /* Destination already exists */ - if (sb.st_dev == sb2.st_dev && sb.st_ino == sb2.st_ino) { - message (1, MSG_ERROR, - _(" `%s' and `%s' are the same file "), src_path, dst_path); - do_refresh (); - return FILE_SKIP; - } + if (sb.st_dev == sb2.st_dev && sb.st_ino == sb2.st_ino) + return warn_same_file(_(" `%s' and `%s' are the same file "), + src_path, dst_path); /* Should we replace destination? */ if (ask_overwrite) { @@ -1043,22 +1059,8 @@ move_file_file (FileOpContext *ctx, cons if (mc_lstat (d, &dst_stats) == 0) { if (src_stats.st_dev == dst_stats.st_dev - && src_stats.st_ino == dst_stats.st_ino) { - int msize = COLS - 36; - char st[MC_MAXPATHLEN]; - char dt[MC_MAXPATHLEN]; - - if (msize < 0) - msize = 40; - msize /= 2; - - strcpy (st, path_trunc (s, msize)); - strcpy (dt, path_trunc (d, msize)); - message (1, MSG_ERROR, - _(" `%s' and `%s' are the same file "), st, dt); - do_refresh (); - return FILE_SKIP; - } + && src_stats.st_ino == dst_stats.st_ino) + return warn_same_file(_(" `%s' and `%s' are the same file "), s, d); if (S_ISDIR (dst_stats.st_mode)) { message (1, MSG_ERROR, @@ -1161,22 +1163,8 @@ move_dir_dir (FileOpContext *ctx, const } else destdir = concat_dir_and_file (d, x_basename (s)); - if (sbuf.st_dev == dbuf.st_dev && sbuf.st_ino == dbuf.st_ino) { - int msize = COLS - 36; - char st[MC_MAXPATHLEN]; - char dt[MC_MAXPATHLEN]; - - if (msize < 0) - msize = 40; - msize /= 2; - - strcpy (st, path_trunc (s, msize)); - strcpy (dt, path_trunc (d, msize)); - message (1, MSG_ERROR, - _(" `%s' and `%s' are the same directory "), st, dt); - do_refresh (); - return FILE_SKIP; - } + if (sbuf.st_dev == dbuf.st_dev && sbuf.st_ino == dbuf.st_ino) + return warn_same_file(_(" `%s' and `%s' are the same directory "), s, d); /* Check if the user inputted an existing dir */ retry_dst_stat: