aboutsummaryrefslogtreecommitdiff
path: root/libgfortran/io/unix.c
diff options
context:
space:
mode:
authorFrancois-Xavier Coudert <coudert@clipper.ens.fr>2005-10-23 22:43:54 +0200
committerFrançois-Xavier Coudert <fxcoudert@gcc.gnu.org>2005-10-23 20:43:54 +0000
commitad238e4ff7d574bf58d5345ca050949c866867d3 (patch)
tree5d5bd3e427e9311346a6f6558c309b3c7348fc9d /libgfortran/io/unix.c
parent5f700e6de038a05c3068dac9199b21bbdc70c2e9 (diff)
downloadgcc-ad238e4ff7d574bf58d5345ca050949c866867d3.zip
gcc-ad238e4ff7d574bf58d5345ca050949c866867d3.tar.gz
gcc-ad238e4ff7d574bf58d5345ca050949c866867d3.tar.bz2
re PR libfortran/23272 ([mingw32] inquire via filename fails)
PR libfortran/23272 * acinclude.m4 (LIBGFOR_CHECK_WORKING_STAT): New check. * configure.ac: Use LIBGFOR_CHECK_WORKING_STAT. * Makefile.in: Regenerate. * aclocal.m4: Regenerate. * config.h.in: Regenerate. * configure: Regenerate. * io/unix.c (compare_file_filename): Add fallback case for systems without working stat. * io/open.c (already_open): Correct call to compare_file_filename. * io/io.h: Correct proto for compare_file_filename. From-SVN: r105824
Diffstat (limited to 'libgfortran/io/unix.c')
-rw-r--r--libgfortran/io/unix.c23
1 files changed, 19 insertions, 4 deletions
diff --git a/libgfortran/io/unix.c b/libgfortran/io/unix.c
index 91a7a47..2026a36 100644
--- a/libgfortran/io/unix.c
+++ b/libgfortran/io/unix.c
@@ -1287,10 +1287,13 @@ init_error_stream (void)
* filename. */
int
-compare_file_filename (stream * s, const char *name, int len)
+compare_file_filename (gfc_unit *u, const char *name, int len)
{
char path[PATH_MAX + 1];
- struct stat st1, st2;
+ struct stat st1;
+#ifdef HAVE_WORKING_STAT
+ struct stat st2;
+#endif
if (unpack_filename (path, name, len))
return 0; /* Can't be the same */
@@ -1301,9 +1304,14 @@ compare_file_filename (stream * s, const char *name, int len)
if (stat (path, &st1) < 0)
return 0;
- fstat (((unix_stream *) s)->fd, &st2);
-
+#ifdef HAVE_WORKING_STAT
+ fstat (((unix_stream *) (u->s))->fd, &st2);
return (st1.st_dev == st2.st_dev) && (st1.st_ino == st2.st_ino);
+#else
+ if (len != u->file_len)
+ return 0;
+ return (memcmp(path, u->file, len) == 0);
+#endif
}
@@ -1312,15 +1320,22 @@ compare_file_filename (stream * s, const char *name, int len)
static gfc_unit *
find_file0 (gfc_unit * u, struct stat *st1)
{
+#ifdef HAVE_WORKING_STAT
struct stat st2;
+#endif
gfc_unit *v;
if (u == NULL)
return NULL;
+#ifdef HAVE_WORKING_STAT
if (fstat (((unix_stream *) u->s)->fd, &st2) >= 0 &&
st1->st_dev == st2.st_dev && st1->st_ino == st2.st_ino)
return u;
+#else
+ if (compare_string(u->file_len, u->file, ioparm.file_len, ioparm.file) == 0)
+ return u;
+#endif
v = find_file0 (u->left, st1);
if (v != NULL)