forked from osmocom/wireshark
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
This commit is contained in:
parent
83d8a24e22
commit
4d86160203
|
@ -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
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue