mirror of
https://github.com/decompals/wibo.git
synced 2025-10-15 22:55:11 +00:00
Resolve own absolute path for subprocess spawn
This commit is contained in:
parent
195f6c1408
commit
4a2ba45620
4
common.h
4
common.h
@ -102,8 +102,8 @@ namespace wibo {
|
|||||||
extern uint32_t lastError;
|
extern uint32_t lastError;
|
||||||
extern char **argv;
|
extern char **argv;
|
||||||
extern int argc;
|
extern int argc;
|
||||||
extern char *executableName;
|
extern std::string executableName;
|
||||||
extern char *commandLine;
|
extern std::string commandLine;
|
||||||
extern std::vector<uint16_t> commandLineW;
|
extern std::vector<uint16_t> commandLineW;
|
||||||
extern bool debugEnabled;
|
extern bool debugEnabled;
|
||||||
extern unsigned int debugIndent;
|
extern unsigned int debugIndent;
|
||||||
|
@ -1068,7 +1068,7 @@ namespace kernel32 {
|
|||||||
*/
|
*/
|
||||||
LPSTR WIN_FUNC GetCommandLineA() {
|
LPSTR WIN_FUNC GetCommandLineA() {
|
||||||
DEBUG_LOG("GetCommandLineA\n");
|
DEBUG_LOG("GetCommandLineA\n");
|
||||||
return wibo::commandLine;
|
return const_cast<LPSTR>(wibo::commandLine.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
LPWSTR WIN_FUNC GetCommandLineW() {
|
LPWSTR WIN_FUNC GetCommandLineW() {
|
||||||
|
24
main.cpp
24
main.cpp
@ -17,8 +17,8 @@
|
|||||||
uint32_t wibo::lastError = 0;
|
uint32_t wibo::lastError = 0;
|
||||||
char** wibo::argv;
|
char** wibo::argv;
|
||||||
int wibo::argc;
|
int wibo::argc;
|
||||||
char *wibo::executableName;
|
std::string wibo::executableName;
|
||||||
char *wibo::commandLine;
|
std::string wibo::commandLine;
|
||||||
std::vector<uint16_t> wibo::commandLineW;
|
std::vector<uint16_t> wibo::commandLineW;
|
||||||
wibo::Executable *wibo::mainModule = 0;
|
wibo::Executable *wibo::mainModule = 0;
|
||||||
bool wibo::debugEnabled = false;
|
bool wibo::debugEnabled = false;
|
||||||
@ -254,6 +254,18 @@ int main(int argc, char **argv) {
|
|||||||
return argc <= 1 ? 0 : 1;
|
return argc <= 1 ? 0 : 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Try to resolve our own executable path
|
||||||
|
std::error_code ec;
|
||||||
|
auto resolved = std::filesystem::read_symlink("/proc/self/exe", ec);
|
||||||
|
std::string executablePath;
|
||||||
|
if (!ec) {
|
||||||
|
executablePath = resolved.string();
|
||||||
|
} else {
|
||||||
|
const char *selfArg = argv[0] ? argv[0] : "";
|
||||||
|
auto absCandidate = std::filesystem::absolute(selfArg, ec);
|
||||||
|
executablePath = ec ? std::string(selfArg) : absCandidate.string();
|
||||||
|
}
|
||||||
|
|
||||||
if (!chdirPath.empty()) {
|
if (!chdirPath.empty()) {
|
||||||
if (chdir(chdirPath.c_str()) != 0) {
|
if (chdir(chdirPath.c_str()) != 0) {
|
||||||
std::string message = std::string("Failed to chdir to ") + chdirPath;
|
std::string message = std::string("Failed to chdir to ") + chdirPath;
|
||||||
@ -340,11 +352,11 @@ int main(int argc, char **argv) {
|
|||||||
}
|
}
|
||||||
cmdLine += '\0';
|
cmdLine += '\0';
|
||||||
|
|
||||||
wibo::commandLine = cmdLine.data();
|
wibo::commandLine = cmdLine;
|
||||||
wibo::commandLineW = stringToWideString(wibo::commandLine);
|
wibo::commandLineW = stringToWideString(wibo::commandLine.c_str());
|
||||||
DEBUG_LOG("Command line: %s\n", wibo::commandLine);
|
DEBUG_LOG("Command line: %s\n", wibo::commandLine.c_str());
|
||||||
|
|
||||||
wibo::executableName = argv[0];
|
wibo::executableName = executablePath;
|
||||||
wibo::argv = guestArgv;
|
wibo::argv = guestArgv;
|
||||||
wibo::argc = guestArgc;
|
wibo::argc = guestArgc;
|
||||||
|
|
||||||
|
@ -192,9 +192,9 @@ namespace processes {
|
|||||||
|
|
||||||
std::vector<char *> nativeArgs;
|
std::vector<char *> nativeArgs;
|
||||||
nativeArgs.reserve(storage.size() + 2);
|
nativeArgs.reserve(storage.size() + 2);
|
||||||
nativeArgs.push_back(wibo::executableName);
|
nativeArgs.push_back(const_cast<char *>(wibo::executableName.c_str()));
|
||||||
for (auto &entry : storage) {
|
for (auto &entry : storage) {
|
||||||
nativeArgs.push_back(entry.data());
|
nativeArgs.push_back(const_cast<char *>(entry.c_str()));
|
||||||
}
|
}
|
||||||
nativeArgs.push_back(nullptr);
|
nativeArgs.push_back(nullptr);
|
||||||
|
|
||||||
@ -205,7 +205,7 @@ namespace processes {
|
|||||||
setenv("WIBO_DEBUG_INDENT", indent.c_str(), 1);
|
setenv("WIBO_DEBUG_INDENT", indent.c_str(), 1);
|
||||||
|
|
||||||
pid_t pid = -1;
|
pid_t pid = -1;
|
||||||
int spawnResult = posix_spawn(&pid, wibo::executableName, &actions, nullptr, nativeArgs.data(), environ);
|
int spawnResult = posix_spawn(&pid, wibo::executableName.c_str(), &actions, nullptr, nativeArgs.data(), environ);
|
||||||
posix_spawn_file_actions_destroy(&actions);
|
posix_spawn_file_actions_destroy(&actions);
|
||||||
if (spawnResult != 0) {
|
if (spawnResult != 0) {
|
||||||
return spawnResult;
|
return spawnResult;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user