Use initial working directory as process path on Linux, and expose to Lua

develop
lethosor 2020-11-12 19:07:51 -05:00
parent 23b230495e
commit 913d860ae4
No known key found for this signature in database
GPG Key ID: 76A269552F4F58C1
5 changed files with 30 additions and 39 deletions

@ -2160,10 +2160,14 @@ unless otherwise noted.
Changes the current directory to ``path``. Use with caution. 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. 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)`` * ``dfhack.filesystem.mkdir(path)``
Creates a new directory. Returns ``false`` if unsuccessful, including if ``path`` already exists. Creates a new directory. Returns ``false`` if unsuccessful, including if ``path`` already exists.

@ -2371,7 +2371,8 @@ static const luaL_Reg dfhack_screen_funcs[] = {
static const LuaWrapper::FunctionReg dfhack_filesystem_module[] = { static const LuaWrapper::FunctionReg dfhack_filesystem_module[] = {
WRAPM(Filesystem, getcwd), WRAPM(Filesystem, getcwd),
WRAPM(Filesystem, restorecwd), WRAPM(Filesystem, restore_cwd),
WRAPM(Filesystem, get_initial_cwd),
WRAPM(Filesystem, chdir), WRAPM(Filesystem, chdir),
WRAPM(Filesystem, mkdir), WRAPM(Filesystem, mkdir),
WRAPM(Filesystem, mkdir_recursive), WRAPM(Filesystem, mkdir_recursive),

@ -22,29 +22,28 @@ must not be misrepresented as being the original software.
distribution. distribution.
*/ */
#include "Internal.h" #include <cstdio>
#include <cstring>
#include <dirent.h> #include <dirent.h>
#include <errno.h> #include <errno.h>
#include <map>
#include <set>
#include <string>
#include <sys/mman.h> #include <sys/mman.h>
#include <sys/time.h> #include <sys/time.h>
#include <unistd.h> #include <unistd.h>
#include <string>
#include <vector> #include <vector>
#include <map>
#include <set>
#include <cstdio>
#include <cstring>
using namespace std;
#include <md5wrapper.h> #include "Error.h"
#include "Internal.h"
#include "md5wrapper.h"
#include "MemAccess.h" #include "MemAccess.h"
#include "Memory.h" #include "Memory.h"
#include "VersionInfoFactory.h" #include "modules/Filesystem.h"
#include "VersionInfo.h" #include "VersionInfo.h"
#include "Error.h" #include "VersionInfoFactory.h"
#include <string.h>
using namespace std;
using namespace DFHack; using namespace DFHack;
Process::Process(const VersionInfoFactory& known_versions) : identified(false), my_pe(0) Process::Process(const VersionInfoFactory& known_versions) : identified(false), my_pe(0)
@ -181,28 +180,7 @@ uint32_t Process::getTickCount()
string Process::getPath() string Process::getPath()
{ {
static string cached_path; return Filesystem::get_initial_cwd();
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;
} }
int Process::getPID() int Process::getPID()

@ -149,7 +149,8 @@ namespace DFHack {
DFHACK_EXPORT void init (); DFHACK_EXPORT void init ();
DFHACK_EXPORT bool chdir (std::string path); DFHACK_EXPORT bool chdir (std::string path);
DFHACK_EXPORT std::string getcwd (); 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); DFHACK_EXPORT bool mkdir (std::string path);
// returns true on success or if directory already exists // returns true on success or if directory already exists
DFHACK_EXPORT bool mkdir_recursive (std::string path); DFHACK_EXPORT bool mkdir_recursive (std::string path);

@ -66,6 +66,7 @@ void Filesystem::init ()
bool Filesystem::chdir (std::string path) bool Filesystem::chdir (std::string path)
{ {
Filesystem::init();
return ::chdir(path.c_str()) == 0; return ::chdir(path.c_str()) == 0;
} }
@ -83,11 +84,17 @@ std::string Filesystem::getcwd ()
return result; return result;
} }
bool Filesystem::restorecwd () bool Filesystem::restore_cwd ()
{ {
return Filesystem::chdir(initial_cwd); return Filesystem::chdir(initial_cwd);
} }
std::string Filesystem::get_initial_cwd ()
{
Filesystem::init();
return initial_cwd;
}
bool Filesystem::mkdir (std::string path) bool Filesystem::mkdir (std::string path)
{ {
int fail; int fail;