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. */
27 same_file_p (const_string filename1
, const_string filename2
)
30 intptr_t handle1
, handle2
;
32 BY_HANDLE_FILE_INFORMATION fileinfo1
, fileinfo2
;
34 f1
= fopen(filename1
, "r");
36 f2
= fopen(filename2
, "r");
42 handle1
= _get_osfhandle(fileno(f1
));
43 handle2
= _get_osfhandle(fileno(f2
));
45 if (!GetFileInformationByHandle((HANDLE
)handle1
, &fileinfo1
)) {
51 if (!GetFileInformationByHandle((HANDLE
)handle2
, &fileinfo2
)) {
60 if (fileinfo1
.dwVolumeSerialNumber
== fileinfo2
.dwVolumeSerialNumber
&&
61 fileinfo1
.nFileIndexHigh
== fileinfo2
.nFileIndexHigh
&&
62 fileinfo1
.nFileIndexLow
== fileinfo2
.nFileIndexLow
)
68 /* These are put in variables only so the results can be inspected
70 int r1
= stat (filename1
, &sb1
);
71 int r2
= stat (filename2
, &sb2
);
73 return r1
== 0 && r2
== 0 ? SAME_FILE_P (sb1
, sb2
) : false;