aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGuy Harris <guy@alum.mit.edu>2006-02-08 02:06:09 +0000
committerGuy Harris <guy@alum.mit.edu>2006-02-08 02:06:09 +0000
commit4d86160203ffa892aee2c6b64fd948d7a15a655f (patch)
treee755d068f86f27d242221778871211ecf73b30c8
parent83d8a24e228cbe3e1a9d782a529e673bede81ded (diff)
Clean up the comments for files_identical(), and fix up the UNIX
implementation to check whether the stat calls succeed and to check not only that the files have the same inumber but that they also are on the same file system. svn path=/trunk/; revision=17213
-rw-r--r--epan/filesystem.c53
1 files changed, 26 insertions, 27 deletions
diff --git a/epan/filesystem.c b/epan/filesystem.c
index 1180973c3c..3acc140537 100644
--- a/epan/filesystem.c
+++ b/epan/filesystem.c
@@ -780,20 +780,32 @@ file_exists(const char *fname)
}
-
+/*
+ * Check that the from file is not the same as to file
+ * We do it here so we catch all cases ...
+ * Unfortunately, the file requester gives us an absolute file
+ * name and the read file name may be relative (if supplied on
+ * the command line), so we can't just compare paths. From Joerg Mayer.
+ */
gboolean
files_identical(const char *fname1, const char *fname2)
{
/* Two different implementations, because:
* - _fullpath is not available on unix
- * - the stat inode will not work as expected on Win32, so two different implementations.
+ * - the stat inode will not work as expected on Win32,
+ * so two different implementations.
*
* XXX - will _fullpath work with UNC?
*/
#ifdef _WIN32
char full1[MAX_PATH], full2[MAX_PATH];
-
+ /*
+ * Get the absolute full paths of the file and compare them.
+ * That won't work if you have hard links, which aren't
+ * much used on Windows, even though NTFS supports them.
+ * We can't use st_ino on Windows, as it's not supported on FAT.
+ */
if( _fullpath( full1, fname1, MAX_PATH ) == NULL ) {
return FALSE;
}
@@ -808,30 +820,17 @@ files_identical(const char *fname1, const char *fname2)
return FALSE;
}
#else
- struct stat infile, outfile;
-
- /*
- * Check that the from file is not the same as to file
- * We do it here so we catch all cases ...
- * Unfortunately, the file requester gives us an absolute file
- * name and the read file name may be relative (if supplied on
- * the command line). From Joerg Mayer.
- *
- * This is a bit tricky on win32. The st_ino field is documented as:
- * "The inode, and therefore st_ino, has no meaning in the FAT, ..."
- * but it *is* set to zero if stat() returns without an error,
- * so this is not working, as it only checks if both files existing. ULFL
- */
- infile.st_ino = 1; /* These prevent us from getting equality */
- outfile.st_ino = 2; /* If one or other of the files is not accessible */
- eth_stat(fname1, &infile);
- eth_stat(fname2, &outfile);
- if (infile.st_ino == outfile.st_ino) {
- return TRUE;
- } else {
- return FALSE;
- }
-
+ struct stat filestat1, filestat2;
+
+ /*
+ * Compare st_dev and st_ino.
+ */
+ if (eth_stat(fname1, &filestat1) == -1)
+ return FALSE; /* can't get info about the first file */
+ if (eth_stat(fname2, &filestat2) == -1)
+ return FALSE; /* can't get info about the second file */
+ return (filestat1.st_dev == filestat2.st_dev &&
+ filestat1.st_ino == filestat2.st_ino);
#endif
}