beta-0.89.2
[luatex.git] / source / texk / kpathsea / file-p.c
blobeb8955f08a3b68df0885b3ecd4cceb2179fa4632
1 /* file-p.c: file predicates.
3 Copyright 1992, 1993, 1994, 2008 Karl Berry.
5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public
7 License as published by the Free Software Foundation; either
8 version 2.1 of the License, or (at your option) any later version.
10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Lesser General Public License for more details.
15 You should have received a copy of the GNU Lesser General Public License
16 along with this library; if not, see <http://www.gnu.org/licenses/>. */
18 #include <kpathsea/config.h>
20 #include <kpathsea/xstat.h>
23 /* Test whether FILENAME1 and FILENAME2 are actually the same file. If
24 stat fails on either of the names, we return false, without error. */
26 boolean
27 same_file_p (const_string filename1, const_string filename2)
29 #ifdef _WIN32
30 intptr_t handle1, handle2;
31 FILE *f1, *f2;
32 BY_HANDLE_FILE_INFORMATION fileinfo1, fileinfo2;
34 f1 = fopen(filename1, "r");
35 if(!f1) return false;
36 f2 = fopen(filename2, "r");
37 if(!f2) {
38 fclose(f1);
39 return false;
42 handle1 = _get_osfhandle(fileno(f1));
43 handle2 = _get_osfhandle(fileno(f2));
45 if (!GetFileInformationByHandle((HANDLE)handle1, &fileinfo1)) {
46 fclose(f1);
47 fclose(f2);
48 return false;
51 if (!GetFileInformationByHandle((HANDLE)handle2, &fileinfo2)) {
52 fclose(f1);
53 fclose(f2);
54 return false;
57 fclose(f1);
58 fclose(f2);
60 if (fileinfo1.dwVolumeSerialNumber == fileinfo2.dwVolumeSerialNumber &&
61 fileinfo1.nFileIndexHigh == fileinfo2.nFileIndexHigh &&
62 fileinfo1.nFileIndexLow == fileinfo2.nFileIndexLow)
63 return true;
64 else
65 return false;
66 #else
67 struct stat sb1, sb2;
68 /* These are put in variables only so the results can be inspected
69 under gdb. */
70 int r1 = stat (filename1, &sb1);
71 int r2 = stat (filename2, &sb2);
73 return r1 == 0 && r2 == 0 ? SAME_FILE_P (sb1, sb2) : false;
74 #endif