Simplify windows-nat.c::get_module_name
[deliverable/binutils-gdb.git] / gold / dirsearch.cc
index a149db527d82475f6022a7351c3b5fc391e4cd58..a6114a442dbeb182ef4429b06359dcaa10d47fd4 100644 (file)
@@ -25,6 +25,7 @@
 #include <cerrno>
 #include <cstring>
 #include <sys/types.h>
+#include <sys/stat.h>
 #include <dirent.h>
 
 #include "debug.h"
@@ -66,8 +67,9 @@ Dir_cache::read_files()
   DIR* d = opendir(this->dirname_);
   if (d == NULL)
     {
-      // We ignore directories which do not exist.
-      if (errno != ENOENT)
+      // We ignore directories which do not exist or are actually file
+      // names.
+      if (errno != ENOENT && errno != ENOTDIR)
        gold::gold_error(_("%s: can not read directory: %s"),
                         this->dirname_, strerror(errno));
       return;
@@ -276,4 +278,28 @@ Dirsearch::find(const std::vector<std::string>& names,
   return std::string();
 }
 
+// Search for a file in a directory list.  This is a low-level function and
+// therefore can be used before options and parameters are set.
+
+std::string
+Dirsearch::find_file_in_dir_list(const std::string& name,
+                                 const General_options::Dir_list& directories,
+                                 const std::string& extra_search_dir)
+{
+  struct stat buf;
+  std::string extra_name = extra_search_dir + '/' + name;
+
+  if (stat(extra_name.c_str(), &buf) == 0)
+    return extra_name;
+  for (General_options::Dir_list::const_iterator dir = directories.begin();
+       dir != directories.end();
+       ++dir)
+    {
+      std::string full_name = dir->name() + '/' + name;
+      if (stat(full_name.c_str(), &buf) == 0)
+        return full_name;
+    }
+  return name;
+}
+
 } // End namespace gold.
This page took 0.052971 seconds and 4 git commands to generate.