]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/fileutils.cpp
Ignore clients on ulined servers when reporting stats in LUSERS.
[user/henk/code/inspircd.git] / src / fileutils.cpp
index ee89cca1c80d9bb9892a739d1d1c797af3da044c..6c98ba30071893a3a201639f78a15a176caa489a 100644 (file)
 
 #include <fstream>
 
+#ifndef _WIN32
+# include <dirent.h>
+#endif
+
 FileReader::FileReader(const std::string& filename)
 {
        Load(filename);
@@ -29,14 +33,14 @@ FileReader::FileReader(const std::string& filename)
 void FileReader::Load(const std::string& filename)
 {
        // If the file is stored in the file cache then we used that version instead.
-       std::string realName = ServerInstance->Config->Paths.PrependConfig(filename);
-       ConfigFileCache::iterator it = ServerInstance->Config->Files.find(realName);
+       ConfigFileCache::const_iterator it = ServerInstance->Config->Files.find(filename);
        if (it != ServerInstance->Config->Files.end())
        {
                this->lines = it->second;
        }
        else
        {
+               const std::string realName = ServerInstance->Config->Paths.PrependConfig(filename);
                lines.clear();
 
                std::ifstream stream(realName.c_str());
@@ -86,12 +90,46 @@ bool FileSystem::FileExists(const std::string& file)
        return !access(file.c_str(), F_OK);
 }
 
+bool FileSystem::GetFileList(const std::string& directory, std::vector<std::string>& entries, const std::string& match)
+{
+#ifdef _WIN32
+       const std::string search_path = directory + "\\" + match;
+
+       WIN32_FIND_DATAA wfd;
+       HANDLE fh = FindFirstFileA(search_path.c_str(), &wfd);
+       if (fh == INVALID_HANDLE_VALUE)
+               return false;
+
+       do
+       {
+               entries.push_back(wfd.cFileName);
+       } while (FindNextFile(fh, &wfd) != 0);
+
+       FindClose(fh);
+       return true;
+#else
+       DIR* library = opendir(directory.c_str());
+       if (!library)
+               return false;
+
+       dirent* entry = NULL;
+       while ((entry = readdir(library)))
+       {
+               if (InspIRCd::Match(entry->d_name, match, ascii_case_insensitive_map))
+                       entries.push_back(entry->d_name);
+       }
+       closedir(library);
+       return true;
+#endif
+}
+
+
 std::string FileSystem::GetFileName(const std::string& name)
 {
 #ifdef _WIN32
        size_t pos = name.find_last_of("\\/");
 #else
-       size_t pos = name.rfind('/');   
+       size_t pos = name.rfind('/');
 #endif
        return pos == std::string::npos ? name : name.substr(++pos);
 }