mirror of
https://github.com/decompals/wibo.git
synced 2025-10-16 07:05:11 +00:00
implement _wfullpath
This commit is contained in:
parent
6b4f27a888
commit
9a98c29a59
@ -5,6 +5,7 @@
|
|||||||
#include <cwchar>
|
#include <cwchar>
|
||||||
#include <cwctype>
|
#include <cwctype>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
#include <limits.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string>
|
#include <string>
|
||||||
@ -185,8 +186,8 @@ namespace msvcrt {
|
|||||||
|
|
||||||
for(uint16_t** env = __winitenv; env && *env; ++env){
|
for(uint16_t** env = __winitenv; env && *env; ++env){
|
||||||
uint16_t* cur = *env;
|
uint16_t* cur = *env;
|
||||||
std::string cur_str = wideStringToString(cur);
|
// std::string cur_str = wideStringToString(cur);
|
||||||
DEBUG_LOG("\tCur env var: %s\n", cur_str.c_str());
|
// DEBUG_LOG("\tCur env var: %s\n", cur_str.c_str());
|
||||||
if(wstrncmp(cur, varname, varnamelen) == 0 && cur[varnamelen] == L'='){
|
if(wstrncmp(cur, varname, varnamelen) == 0 && cur[varnamelen] == L'='){
|
||||||
uint16_t* value = cur + varnamelen + 1;
|
uint16_t* value = cur + varnamelen + 1;
|
||||||
size_t value_len = wstrlen(value);
|
size_t value_len = wstrlen(value);
|
||||||
@ -509,6 +510,51 @@ namespace msvcrt {
|
|||||||
return unlink(str.c_str());
|
return unlink(str.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint16_t* WIN_ENTRY _wfullpath(uint16_t* absPath, const uint16_t* relPath, size_t maxLength){
|
||||||
|
std::string relPathStr = wideStringToString(relPath);
|
||||||
|
DEBUG_LOG("_wfullpath, relpath %s\n", relPathStr.c_str());
|
||||||
|
if(!relPath) return nullptr;
|
||||||
|
|
||||||
|
char resolved[PATH_MAX];
|
||||||
|
char* realpathResult = realpath(relPathStr.c_str(), resolved);
|
||||||
|
std::string finalPath;
|
||||||
|
|
||||||
|
if(realpathResult){
|
||||||
|
finalPath = resolved;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
DEBUG_LOG("\tcould not find realpath, trying cwd...\n");
|
||||||
|
char cwd[PATH_MAX];
|
||||||
|
if(!getcwd(cwd, sizeof(cwd))){
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
finalPath = std::string(cwd) + "/" + relPathStr;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<uint16_t> wResolved = stringToWideString(finalPath.c_str());
|
||||||
|
// If caller provided a buffer, check size
|
||||||
|
if (absPath) {
|
||||||
|
if (wResolved.size() + 1 > maxLength) {
|
||||||
|
return nullptr; // too small
|
||||||
|
}
|
||||||
|
std::copy(wResolved.begin(), wResolved.end(), absPath);
|
||||||
|
absPath[wResolved.size()] = 0;
|
||||||
|
|
||||||
|
std::string absPathStr = wideStringToString(absPath);
|
||||||
|
DEBUG_LOG("\t-> abspath %s\n", absPathStr.c_str());
|
||||||
|
return absPath;
|
||||||
|
} else {
|
||||||
|
// Windows behavior: if absPath == NULL, allocate new
|
||||||
|
uint16_t* newBuf = new uint16_t[wResolved.size() + 1];
|
||||||
|
std::copy(wResolved.begin(), wResolved.end(), newBuf);
|
||||||
|
newBuf[wResolved.size()] = 0;
|
||||||
|
|
||||||
|
std::string absPathStr = wideStringToString(newBuf);
|
||||||
|
DEBUG_LOG("\t-> abspath %s\n", absPathStr.c_str());
|
||||||
|
return newBuf;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -560,6 +606,7 @@ static void *resolveByName(const char *name) {
|
|||||||
if (strcmp(name, "_errno") == 0) return (void*)msvcrt::_errno;
|
if (strcmp(name, "_errno") == 0) return (void*)msvcrt::_errno;
|
||||||
if (strcmp(name, "_wspawnvp") == 0) return (void*)msvcrt::_wspawnvp;
|
if (strcmp(name, "_wspawnvp") == 0) return (void*)msvcrt::_wspawnvp;
|
||||||
if (strcmp(name, "_wunlink") == 0) return (void*)msvcrt::_wunlink;
|
if (strcmp(name, "_wunlink") == 0) return (void*)msvcrt::_wunlink;
|
||||||
|
if (strcmp(name, "_wfullpath") == 0) return (void*)msvcrt::_wfullpath;
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user