diff options
author | Francois-Xavier Coudert <coudert@clipper.ens.fr> | 2005-10-23 22:43:54 +0200 |
---|---|---|
committer | François-Xavier Coudert <fxcoudert@gcc.gnu.org> | 2005-10-23 20:43:54 +0000 |
commit | ad238e4ff7d574bf58d5345ca050949c866867d3 (patch) | |
tree | 5d5bd3e427e9311346a6f6558c309b3c7348fc9d /libgfortran/io | |
parent | 5f700e6de038a05c3068dac9199b21bbdc70c2e9 (diff) | |
download | gcc-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')
-rw-r--r-- | libgfortran/io/io.h | 2 | ||||
-rw-r--r-- | libgfortran/io/open.c | 2 | ||||
-rw-r--r-- | libgfortran/io/unix.c | 23 |
3 files changed, 21 insertions, 6 deletions
diff --git a/libgfortran/io/io.h b/libgfortran/io/io.h index 3cb98f4..5e3adbc 100644 --- a/libgfortran/io/io.h +++ b/libgfortran/io/io.h @@ -450,7 +450,7 @@ internal_proto(output_stream); extern stream *error_stream (void); internal_proto(error_stream); -extern int compare_file_filename (stream *, const char *, int); +extern int compare_file_filename (gfc_unit *, const char *, int); internal_proto(compare_file_filename); extern gfc_unit *find_file (void); diff --git a/libgfortran/io/open.c b/libgfortran/io/open.c index e1e42ad..203964b 100644 --- a/libgfortran/io/open.c +++ b/libgfortran/io/open.c @@ -415,7 +415,7 @@ already_open (gfc_unit * u, unit_flags * flags) /* If the file is connected to something else, close it and open a new unit. */ - if (!compare_file_filename (u->s, ioparm.file, ioparm.file_len)) + if (!compare_file_filename (u, ioparm.file, ioparm.file_len)) { if (close_unit (u)) { 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) |