* source.c (is_regular_file): New function.
authorJoel Brobecker <brobecker@gnat.com>
Tue, 23 Apr 2002 11:09:10 +0000 (11:09 +0000)
committerJoel Brobecker <brobecker@gnat.com>
Tue, 23 Apr 2002 11:09:10 +0000 (11:09 +0000)
        (openp): Check wether file to open is a regular file
        to avoid opening directories.

gdb/ChangeLog
gdb/source.c

index 3aea36249e6e52c496f716dd4079facc36861cc6..2f3fec9317d10c7e2dbee79e957c8cd3f7090a3d 100644 (file)
@@ -1,3 +1,9 @@
+2002-04-23  J. Brobecker  <brobecker@gnat.com>
+
+       * source.c (is_regular_file): New function.
+       (openp): Check wether file to open is a regular file
+       to avoid opening directories.
+
 2002-04-22  Jason Thorpe  <thorpej@wasabisystems.com>
 
        * findvar.c (extract_signed_integer): Cast printf argument
index cf8ceab4862ecd1f01bf074673d26b23d728b056..ac74372405819de41b139f8838d2169a5aeca16b 100644 (file)
@@ -503,6 +503,23 @@ source_info (char *ignore, int from_tty)
 }
 \f
 
+/* Return True if the file NAME exists and is a regular file */
+static int
+is_regular_file (const char *name)
+{
+  struct stat st;
+  const int status = stat (name, &st);
+
+  /* Stat should never fail except when the file does not exist.
+     If stat fails, analyze the source of error and return True
+     unless the file does not exist, to avoid returning false results
+     on obscure systems where stat does not work as expected.
+   */
+  if (status != 0)
+    return (errno != ENOENT);
+
+  return S_ISREG (st.st_mode);
+}
 
 /* Open a file named STRING, searching path PATH (dir names sep by some char)
    using mode MODE and protection bits PROT in the calls to open.
@@ -543,7 +560,7 @@ openp (const char *path, int try_cwd_first, const char *string,
   mode |= O_BINARY;
 #endif
 
-  if (try_cwd_first || IS_ABSOLUTE_PATH (string))
+  if ((try_cwd_first || IS_ABSOLUTE_PATH (string)) && is_regular_file (string))
     {
       int i;
       filename = alloca (strlen (string) + 1);
@@ -601,9 +618,12 @@ openp (const char *path, int try_cwd_first, const char *string,
       strcat (filename + len, SLASH_STRING);
       strcat (filename, string);
 
-      fd = open (filename, mode);
-      if (fd >= 0)
-       break;
+      if (is_regular_file (filename))
+      {
+        fd = open (filename, mode);
+        if (fd >= 0)
+          break;
+      }
     }
 
 done: