From: Janne Blomqvist Date: Sun, 1 Aug 2010 11:22:18 +0000 (+0300) Subject: Use access(2) instead of stat(2) to test file existence. X-Git-Tag: releases/gcc-4.6.0~5297 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=47dad3ff97135ef8a26e0ecbc2170fba6c4e89be;p=thirdparty%2Fgcc.git Use access(2) instead of stat(2) to test file existence. From-SVN: r162798 --- diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog index 2b76a6655161..f11ede973f07 100644 --- a/libgfortran/ChangeLog +++ b/libgfortran/ChangeLog @@ -1,3 +1,9 @@ +2010-08-01 Janne Blomqvist + + * 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 * 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 PR libfortran/37077 diff --git a/libgfortran/io/unix.c b/libgfortran/io/unix.c index eea03ba7f819..a2903af1b559 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. */