]> 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 731e4ea01a9dd74268532fc1dee39f54b21e1409..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);
@@ -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,6 +99,40 @@ 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