diff options
-rw-r--r-- | editors/diff.c | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/editors/diff.c b/editors/diff.c index ca4a4eae7..3719bb49f 100644 --- a/editors/diff.c +++ b/editors/diff.c | |||
@@ -952,6 +952,31 @@ int diff_main(int argc UNUSED_PARAM, char **argv) | |||
952 | if (gotstdin && (S_ISDIR(stb[0].st_mode) || S_ISDIR(stb[1].st_mode))) | 952 | if (gotstdin && (S_ISDIR(stb[0].st_mode) || S_ISDIR(stb[1].st_mode))) |
953 | bb_error_msg_and_die("can't compare stdin to a directory"); | 953 | bb_error_msg_and_die("can't compare stdin to a directory"); |
954 | 954 | ||
955 | /* Compare metadata to check if the files are the same physical file. | ||
956 | * | ||
957 | * Comment from diffutils source says: | ||
958 | * POSIX says that two files are identical if st_ino and st_dev are | ||
959 | * the same, but many file systems incorrectly assign the same (device, | ||
960 | * inode) pair to two distinct files, including: | ||
961 | * GNU/Linux NFS servers that export all local file systems as a | ||
962 | * single NFS file system, if a local device number (st_dev) exceeds | ||
963 | * 255, or if a local inode number (st_ino) exceeds 16777215. | ||
964 | */ | ||
965 | if (ENABLE_DESKTOP | ||
966 | && stb[0].st_ino == stb[1].st_ino | ||
967 | && stb[0].st_dev == stb[1].st_dev | ||
968 | && stb[0].st_size == stb[1].st_size | ||
969 | && stb[0].st_mtime == stb[1].st_mtime | ||
970 | && stb[0].st_ctime == stb[1].st_ctime | ||
971 | && stb[0].st_mode == stb[1].st_mode | ||
972 | && stb[0].st_nlink == stb[1].st_nlink | ||
973 | && stb[0].st_uid == stb[1].st_uid | ||
974 | && stb[0].st_gid == stb[1].st_gid | ||
975 | ) { | ||
976 | /* files are physically the same; no need to compare them */ | ||
977 | return STATUS_SAME; | ||
978 | } | ||
979 | |||
955 | if (S_ISDIR(stb[0].st_mode) && S_ISDIR(stb[1].st_mode)) { | 980 | if (S_ISDIR(stb[0].st_mode) && S_ISDIR(stb[1].st_mode)) { |
956 | #if ENABLE_FEATURE_DIFF_DIR | 981 | #if ENABLE_FEATURE_DIFF_DIR |
957 | diffdir(file, s_start); | 982 | diffdir(file, s_start); |