]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/fileutils.cpp
Convert the ISO 8859-2 nationalchars files to codepage configs.
[user/henk/code/inspircd.git] / src / fileutils.cpp
index ee89cca1c80d9bb9892a739d1d1c797af3da044c..8f78745fa7b0000b15b9f3e6dc6905f3a3de82fb 100644 (file)
@@ -1,7 +1,8 @@
 /*
  * InspIRCd -- Internet Relay Chat Daemon
  *
- *   Copyright (C) 2013 Peter Powell <petpow@saberuk.com>
+ *   Copyright (C) 2013, 2019-2020 Sadie Powell <sadie@witchery.services>
+ *   Copyright (C) 2013 Attila Molnar <attilamolnar@hush.com>
  *
  * This file is part of InspIRCd.  InspIRCd is free software: you can
  * redistribute it and/or modify it under the terms of the GNU General Public
 
 #include <fstream>
 
+#ifndef _WIN32
+# include <dirent.h>
+#endif
+
 FileReader::FileReader(const std::string& filename)
 {
        Load(filename);
@@ -29,14 +34,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());
@@ -71,6 +76,14 @@ std::string FileSystem::ExpandPath(const std::string& base, const std::string& f
        if (fragment[0] == '/' || FileSystem::StartsWithWindowsDriveLetter(fragment))
                return fragment;
 
+       // The fragment is relative to a home directory, expand that.
+       if (!fragment.compare(0, 2, "~/", 2))
+       {
+               const char* homedir = getenv("HOME");
+               if (homedir && *homedir)
+                       return std::string(homedir) + '/' + fragment.substr(2);
+       }
+
        return base + '/' + fragment;
 }
 
@@ -86,12 +99,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);
 }