Use access(2) instead of stat(2) to test file existence.
authorJanne Blomqvist <jb@gcc.gnu.org>
Sun, 1 Aug 2010 11:22:18 +0000 (14:22 +0300)
committerJanne Blomqvist <jb@gcc.gnu.org>
Sun, 1 Aug 2010 11:22:18 +0000 (14:22 +0300)
From-SVN: r162798

libgfortran/ChangeLog
libgfortran/io/unix.c

index 2b76a66..f11ede9 100644 (file)
@@ -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
index eea03ba..a2903af 100644 (file)
@@ -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. */