diff options
author | Janne Blomqvist <jb@gcc.gnu.org> | 2010-08-01 14:22:18 +0300 |
---|---|---|
committer | Janne Blomqvist <jb@gcc.gnu.org> | 2010-08-01 14:22:18 +0300 |
commit | 47dad3ff97135ef8a26e0ecbc2170fba6c4e89be (patch) | |
tree | 9d55d4053f91dc21cfcd5a77b3e7e616eeaa2059 /libgfortran | |
parent | 22db1fbca9fb5ec31b41180a8696ed5fef081c19 (diff) | |
download | gcc-47dad3ff97135ef8a26e0ecbc2170fba6c4e89be.zip gcc-47dad3ff97135ef8a26e0ecbc2170fba6c4e89be.tar.gz gcc-47dad3ff97135ef8a26e0ecbc2170fba6c4e89be.tar.bz2 |
Use access(2) instead of stat(2) to test file existence.
From-SVN: r162798
Diffstat (limited to 'libgfortran')
-rw-r--r-- | libgfortran/ChangeLog | 8 | ||||
-rw-r--r-- | libgfortran/io/unix.c | 76 |
2 files changed, 48 insertions, 36 deletions
diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog index 2b76a66..f11ede9 100644 --- a/libgfortran/ChangeLog +++ b/libgfortran/ChangeLog @@ -1,3 +1,9 @@ +2010-08-01 Janne Blomqvist <jb@gcc.gnu.org> + + * io/unix.c (file_exists): Use access(2) instead of stat(2) to + test file existence. + (fallback_access): Move up in file, implement F_OK. + 2010-07-31 David Edelsohn <edelsohn@gnu.org> * io/inquire.c: Include io.h before string.h. @@ -36,7 +42,7 @@ * write_float.def (output_float): Use a gfc_char4_t pointer and update memset4 and memcpy calls. (write_infnan): Likewise. (output_float_FMT_G_): Likewise. - + 2010-07-16 Jerry DeLisle <jvdelisle@gcc.gnu.org> PR libfortran/37077 diff --git a/libgfortran/io/unix.c b/libgfortran/io/unix.c index eea03ba..a2903af 100644 --- a/libgfortran/io/unix.c +++ b/libgfortran/io/unix.c @@ -131,6 +131,46 @@ typedef struct stat gfstat_t; #endif +#ifndef HAVE_ACCESS + +#ifndef W_OK +#define W_OK 2 +#endif + +#ifndef R_OK +#define R_OK 4 +#endif + +#ifndef F_OK +#define F_OK 0 +#endif + +/* Fallback implementation of access() on systems that don't have it. + Only modes R_OK, W_OK and F_OK are used in this file. */ + +static int +fallback_access (const char *path, int mode) +{ + if ((mode & R_OK) && open (path, O_RDONLY) < 0) + return -1; + + if ((mode & W_OK) && open (path, O_WRONLY) < 0) + return -1; + + if (mode == F_OK) + { + gfstat_t st; + return stat (path, &st); + } + + return 0; +} + +#undef access +#define access fallback_access +#endif + + /* Unix and internal stream I/O module */ static const int BUFFER_SIZE = 8192; @@ -1580,15 +1620,11 @@ int file_exists (const char *file, gfc_charlen_type file_len) { char path[PATH_MAX + 1]; - gfstat_t statbuf; if (unpack_filename (path, file, file_len)) return 0; - if (stat (path, &statbuf) < 0) - return 0; - - return 1; + return !(access (path, F_OK)); } @@ -1695,36 +1731,6 @@ inquire_unformatted (const char *string, int len) } -#ifndef HAVE_ACCESS - -#ifndef W_OK -#define W_OK 2 -#endif - -#ifndef R_OK -#define R_OK 4 -#endif - -/* Fallback implementation of access() on systems that don't have it. - Only modes R_OK and W_OK are used in this file. */ - -static int -fallback_access (const char *path, int mode) -{ - if ((mode & R_OK) && open (path, O_RDONLY) < 0) - return -1; - - if ((mode & W_OK) && open (path, O_WRONLY) < 0) - return -1; - - return 0; -} - -#undef access -#define access fallback_access -#endif - - /* inquire_access()-- Given a fortran string, determine if the file is * suitable for access. */ |