diff options
author | memchr <[email protected]> | 2023-09-14 11:07:31 +0000 |
---|---|---|
committer | GitHub <[email protected]> | 2023-09-14 12:07:31 +0100 |
commit | db2b72adee6e76cf25edac0eb9e69387c8dd5ee6 (patch) | |
tree | 3d7b8f246e0cfeea05e6ee3f0bd6e7724f9d739a | |
parent | 0dc8289b0292d3c3c35a06fdecbe41cd57a1a918 (diff) | |
download | Hyprland-db2b72adee6e76cf25edac0eb9e69387c8dd5ee6.tar.gz Hyprland-db2b72adee6e76cf25edac0eb9e69387c8dd5ee6.zip |
config: fix relative path resolution (#3308)
-rw-r--r-- | src/config/ConfigManager.cpp | 5 | ||||
-rw-r--r-- | src/helpers/MiscFunctions.cpp | 24 |
2 files changed, 16 insertions, 13 deletions
diff --git a/src/config/ConfigManager.cpp b/src/config/ConfigManager.cpp index 08971318..7893cefa 100644 --- a/src/config/ConfigManager.cpp +++ b/src/config/ConfigManager.cpp @@ -1203,8 +1203,9 @@ void CConfigManager::handleSource(const std::string& command, const std::string& std::unique_ptr<glob_t, void (*)(glob_t*)> glob_buf{new glob_t, [](glob_t* g) { globfree(g); }}; memset(glob_buf.get(), 0, sizeof(glob_t)); - if (glob(rawpath.c_str(), GLOB_TILDE, nullptr, glob_buf.get()) != 0) { - Debug::log(ERR, "source= globbing error"); + if (auto r = glob(absolutePath(rawpath, configCurrentPath).c_str(), GLOB_TILDE, nullptr, glob_buf.get()); r != 0) { + parseError = std::format("source= globbing error: {}", r == GLOB_NOMATCH ? "found no match" : GLOB_ABORTED ? "read error" : "out of memory"); + Debug::log(ERR, parseError); return; } diff --git a/src/helpers/MiscFunctions.cpp b/src/helpers/MiscFunctions.cpp index 9000eff2..218c2332 100644 --- a/src/helpers/MiscFunctions.cpp +++ b/src/helpers/MiscFunctions.cpp @@ -126,20 +126,22 @@ static const float transforms[][9] = { std::string absolutePath(const std::string& rawpath, const std::string& currentPath) { auto value = rawpath; - if (value[0] == '.') { - auto currentDir = currentPath.substr(0, currentPath.find_last_of('/')); - - if (value[1] == '.') { - auto parentDir = currentDir.substr(0, currentDir.find_last_of('/')); - value.replace(0, 2 + currentPath.empty(), parentDir); - } else { - value.replace(0, 1 + currentPath.empty(), currentDir); - } - } - if (value[0] == '~') { static const char* const ENVHOME = getenv("HOME"); value.replace(0, 1, std::string(ENVHOME)); + } else if (value[0] != '/') { + auto currentDir = currentPath.substr(0, currentPath.find_last_of('/')); + + if (value[0] == '.') { + if (value[1] == '.' && value[2] == '/') { + auto parentDir = currentDir.substr(0, currentDir.find_last_of('/')); + value.replace(0, 2 + currentPath.empty(), parentDir); + } else if (value[1] == '/') + value.replace(0, 1 + currentPath.empty(), currentDir); + else + value = currentDir + '/' + value; + } else + value = currentDir + '/' + value; } return value; |