diff --git a/docs/Lua API.rst b/docs/Lua API.rst index 5939f50cb..80fd0add6 100644 --- a/docs/Lua API.rst +++ b/docs/Lua API.rst @@ -2160,10 +2160,14 @@ unless otherwise noted. Changes the current directory to ``path``. Use with caution. -* ``dfhack.filesystem.restorecwd()`` +* ``dfhack.filesystem.restore_cwd()`` Restores the current working directory to what it was when DF started. +* ``dfhack.filesystem.get_initial_cwd()`` + + Returns the value of the working directory when DF was started. + * ``dfhack.filesystem.mkdir(path)`` Creates a new directory. Returns ``false`` if unsuccessful, including if ``path`` already exists. diff --git a/library/LuaApi.cpp b/library/LuaApi.cpp index d38cb31ba..431ab3ae5 100644 --- a/library/LuaApi.cpp +++ b/library/LuaApi.cpp @@ -2371,7 +2371,8 @@ static const luaL_Reg dfhack_screen_funcs[] = { static const LuaWrapper::FunctionReg dfhack_filesystem_module[] = { WRAPM(Filesystem, getcwd), - WRAPM(Filesystem, restorecwd), + WRAPM(Filesystem, restore_cwd), + WRAPM(Filesystem, get_initial_cwd), WRAPM(Filesystem, chdir), WRAPM(Filesystem, mkdir), WRAPM(Filesystem, mkdir_recursive), diff --git a/library/Process-linux.cpp b/library/Process-linux.cpp index 45e655948..be3ebb5df 100644 --- a/library/Process-linux.cpp +++ b/library/Process-linux.cpp @@ -22,29 +22,28 @@ must not be misrepresented as being the original software. distribution. */ -#include "Internal.h" - +#include +#include #include #include +#include +#include +#include #include #include #include - -#include #include -#include -#include -#include -#include -using namespace std; -#include +#include "Error.h" +#include "Internal.h" +#include "md5wrapper.h" #include "MemAccess.h" #include "Memory.h" -#include "VersionInfoFactory.h" +#include "modules/Filesystem.h" #include "VersionInfo.h" -#include "Error.h" -#include +#include "VersionInfoFactory.h" + +using namespace std; using namespace DFHack; Process::Process(const VersionInfoFactory& known_versions) : identified(false), my_pe(0) @@ -181,28 +180,7 @@ uint32_t Process::getTickCount() string Process::getPath() { - static string cached_path; - if (cached_path.empty()) - { - const char *exe_name = "/proc/self/exe"; - char exe_path[1024]; - int length = readlink(exe_name, exe_path, sizeof(exe_path)); - if (length > 0) - { - exe_path[length] = '\0'; - string path_string = exe_path; - // DF lives in libs, so move up a folder - cached_path = path_string.substr(0, path_string.find_last_of("/", path_string.find_last_of("/") - 1)); - } - else - { - perror("readlink(/proc/self/exe) failed"); - fprintf(stderr, " length=%i\n", length); - cached_path = "."; - } - fprintf(stderr, "Resolved DF root to %s\n", cached_path.c_str()); - } - return cached_path; + return Filesystem::get_initial_cwd(); } int Process::getPID() diff --git a/library/include/modules/Filesystem.h b/library/include/modules/Filesystem.h index eac8a1102..8e7bab9b2 100644 --- a/library/include/modules/Filesystem.h +++ b/library/include/modules/Filesystem.h @@ -149,7 +149,8 @@ namespace DFHack { DFHACK_EXPORT void init (); DFHACK_EXPORT bool chdir (std::string path); DFHACK_EXPORT std::string getcwd (); - DFHACK_EXPORT bool restorecwd (); + DFHACK_EXPORT bool restore_cwd (); + DFHACK_EXPORT std::string get_initial_cwd (); DFHACK_EXPORT bool mkdir (std::string path); // returns true on success or if directory already exists DFHACK_EXPORT bool mkdir_recursive (std::string path); diff --git a/library/modules/Filesystem.cpp b/library/modules/Filesystem.cpp index 7738bfd5e..e0d0bc8c2 100644 --- a/library/modules/Filesystem.cpp +++ b/library/modules/Filesystem.cpp @@ -66,6 +66,7 @@ void Filesystem::init () bool Filesystem::chdir (std::string path) { + Filesystem::init(); return ::chdir(path.c_str()) == 0; } @@ -83,11 +84,17 @@ std::string Filesystem::getcwd () return result; } -bool Filesystem::restorecwd () +bool Filesystem::restore_cwd () { return Filesystem::chdir(initial_cwd); } +std::string Filesystem::get_initial_cwd () +{ + Filesystem::init(); + return initial_cwd; +} + bool Filesystem::mkdir (std::string path) { int fail;