-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmc_samefile_abort.diff
95 lines (88 loc) · 2.86 KB
/
mc_samefile_abort.diff
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
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: