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.
* ``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.

@ -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),

@ -22,29 +22,28 @@ must not be misrepresented as being the original software.
distribution.
*/
#include "Internal.h"
#include <cstdio>
#include <cstring>
#include <dirent.h>
#include <errno.h>
#include <map>
#include <set>
#include <string>
#include <sys/mman.h>
#include <sys/time.h>
#include <unistd.h>
#include <string>
#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 "Memory.h"
#include "VersionInfoFactory.h"
#include "modules/Filesystem.h"
#include "VersionInfo.h"
#include "Error.h"
#include <string.h>
#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()

@ -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);

@ -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;