diff --git a/src/globals.cc b/src/globals.cc index bbbd8d8d..5d55d0b5 100644 --- a/src/globals.cc +++ b/src/globals.cc @@ -2,6 +2,28 @@ #include "globals.h" +#include + rpc::ip_table_list ip_tables; Control* control{}; + +std::string +expand_path(const std::string& path) { + if (path.empty()) + return std::string(); + + if (path[0] == '~') { + if (path.size() < 2 || path[1] != '/') + throw torrent::input_error("Could not expand ~ in session path, only ~/ is supported."); + + const char* home = std::getenv("HOME"); + + if (home == nullptr || *home == '\0') + throw torrent::input_error("Could not expand ~ in session path, HOME environment variable not set."); + + return home + path.substr(1); + } + + return path; +} diff --git a/src/globals.h b/src/globals.h index 86db4f75..1bd42a9f 100644 --- a/src/globals.h +++ b/src/globals.h @@ -8,8 +8,9 @@ class Control; extern rpc::ip_table_list ip_tables; +extern Control* control; -extern Control* control; +std::string expand_path(const std::string& path); namespace rpc { class SCgi; diff --git a/src/session/session_manager.cc b/src/session/session_manager.cc index f95f728c..1e69e2f0 100644 --- a/src/session/session_manager.cc +++ b/src/session/session_manager.cc @@ -3,6 +3,7 @@ #include "session/session_manager.h" #include +#include #include #include @@ -23,12 +24,14 @@ SessionManager::SessionManager(torrent::utils::Thread* thread) SessionManager::~SessionManager() = default; void -SessionManager::set_path(const std::string& path) { +SessionManager::set_path(std::string path) { assert(torrent::this_thread::thread() == torrent::main_thread::thread()); if (m_freeze_info) throw torrent::input_error("Session path cannot be changed after startup."); + path = expand_path(path); + if (path.empty() || path.back() == '/') m_path = path; else diff --git a/src/session/session_manager.h b/src/session/session_manager.h index 82c4d1bc..1d9eb9d2 100644 --- a/src/session/session_manager.h +++ b/src/session/session_manager.h @@ -50,7 +50,7 @@ public: bool is_used() const; std::string path() const; - void set_path(const std::string& path); + void set_path(std::string path); bool use_fsyncdisk() const; void set_use_fsyncdisk(bool use_fsyncdisk);