>From 36f26c15551d5c32d3197b3f0008a96fe3440240 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Svoboda?= Date: Sun, 21 Sep 2014 18:06:38 +0200 Subject: [PATCH] diff: compare major, minor numbers of block/character special files This deals with situation such as File dev1/block1 is a block special file while file dev2/block1 is a block special file in case the major and minor numbers are identical. If stat.st_rdev does not match, a message is given: Block special files dev1/block1 and dev2/block1 differ: 1,2 (3,2) --- src/diff.c | 23 +++++++++++++++++++++++ src/diff.h | 1 + src/util.c | 9 +++++++++ 3 files changed, 33 insertions(+) diff --git a/src/diff.c b/src/diff.c index 9bc1d96..110b8e1 100644 --- a/src/diff.c +++ b/src/diff.c @@ -1318,6 +1318,29 @@ compare_files (struct comparison const *parent, status = EXIT_FAILURE; } } + else if ((S_ISBLK (cmp.file[0].stat.st_mode) + && S_ISBLK (cmp.file[1].stat.st_mode)) + || (S_ISCHR (cmp.file[0].stat.st_mode) + && S_ISCHR (cmp.file[1].stat.st_mode))) + { + if (cmp.file[0].stat.st_rdev != cmp.file[1].stat.st_rdev) + { + char major_minor0[20], major_minor1[20]; + format_major_minor (major_minor0, cmp.file[0].stat.st_rdev); + format_major_minor (major_minor1, cmp.file[1].stat.st_rdev); + + const char *message = S_ISBLK (cmp.file[0].stat.st_mode) ? + "Block special files %s and %s differ: %s (%s)\n" : + "Character special files %s and %s differ: %s (%s)\n"; + message5 (message, + file_label[0] ? file_label[0] : cmp.file[0].name, + file_label[1] ? file_label[1] : cmp.file[1].name, + major_minor0, major_minor1); + + /* This is a difference. */ + status = EXIT_FAILURE; + } + } else { /* We have two files that are not to be compared. */ diff --git a/src/diff.h b/src/diff.h index 0983e7c..12ed085 100644 --- a/src/diff.h +++ b/src/diff.h @@ -391,6 +391,7 @@ extern void begin_output (void); extern void debug_script (struct change *); extern void fatal (char const *) __attribute__((noreturn)); extern void finish_output (void); +extern void format_major_minor (char *buffer, const dev_t st_rdev); extern void message (char const *, char const *, char const *); extern void message5 (char const *, char const *, char const *, char const *, char const *); diff --git a/src/util.c b/src/util.c index d7b8925..85a47d3 100644 --- a/src/util.c +++ b/src/util.c @@ -26,6 +26,7 @@ #include #include "xvasprintf.h" #include +#include /* Use SA_NOCLDSTOP as a proxy for whether the sigaction machinery is present. */ @@ -1577,3 +1578,11 @@ debug_script (struct change *sp) fflush (stderr); } + +/* Format a device number as major,minor. */ + +void +format_major_minor (char *buffer, const dev_t st_rdev) +{ + sprintf (buffer, "%u,%u", (major (st_rdev)), (minor (st_rdev))); +} -- 2.7.2