Merge branch 'js/mingw-getcwd'
The way the Windows port figures out the current directory has been improved. * js/mingw-getcwd: mingw: fix getcwd when the parent directory cannot be queried mingw: ensure `getcwd()` reports the correct case
This commit is contained in:
commit
cc6748720f
@ -203,6 +203,31 @@ static int ask_yes_no_if_possible(const char *format, ...)
|
||||
}
|
||||
}
|
||||
|
||||
/* Normalizes NT paths as returned by some low-level APIs. */
|
||||
static wchar_t *normalize_ntpath(wchar_t *wbuf)
|
||||
{
|
||||
int i;
|
||||
/* fix absolute path prefixes */
|
||||
if (wbuf[0] == '\\') {
|
||||
/* strip NT namespace prefixes */
|
||||
if (!wcsncmp(wbuf, L"\\??\\", 4) ||
|
||||
!wcsncmp(wbuf, L"\\\\?\\", 4))
|
||||
wbuf += 4;
|
||||
else if (!wcsnicmp(wbuf, L"\\DosDevices\\", 12))
|
||||
wbuf += 12;
|
||||
/* replace remaining '...UNC\' with '\\' */
|
||||
if (!wcsnicmp(wbuf, L"UNC\\", 4)) {
|
||||
wbuf += 2;
|
||||
*wbuf = '\\';
|
||||
}
|
||||
}
|
||||
/* convert backslashes to slashes */
|
||||
for (i = 0; wbuf[i]; i++)
|
||||
if (wbuf[i] == '\\')
|
||||
wbuf[i] = '/';
|
||||
return wbuf;
|
||||
}
|
||||
|
||||
int mingw_unlink(const char *pathname)
|
||||
{
|
||||
int ret, tries = 0;
|
||||
@ -918,8 +943,29 @@ struct tm *localtime_r(const time_t *timep, struct tm *result)
|
||||
|
||||
char *mingw_getcwd(char *pointer, int len)
|
||||
{
|
||||
wchar_t wpointer[MAX_PATH];
|
||||
if (!_wgetcwd(wpointer, ARRAY_SIZE(wpointer)))
|
||||
wchar_t cwd[MAX_PATH], wpointer[MAX_PATH];
|
||||
DWORD ret = GetCurrentDirectoryW(ARRAY_SIZE(cwd), cwd);
|
||||
|
||||
if (!ret || ret >= ARRAY_SIZE(cwd)) {
|
||||
errno = ret ? ENAMETOOLONG : err_win_to_posix(GetLastError());
|
||||
return NULL;
|
||||
}
|
||||
ret = GetLongPathNameW(cwd, wpointer, ARRAY_SIZE(wpointer));
|
||||
if (!ret && GetLastError() == ERROR_ACCESS_DENIED) {
|
||||
HANDLE hnd = CreateFileW(cwd, 0,
|
||||
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL,
|
||||
OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);
|
||||
if (hnd == INVALID_HANDLE_VALUE)
|
||||
return NULL;
|
||||
ret = GetFinalPathNameByHandleW(hnd, wpointer, ARRAY_SIZE(wpointer), 0);
|
||||
CloseHandle(hnd);
|
||||
if (!ret || ret >= ARRAY_SIZE(wpointer))
|
||||
return NULL;
|
||||
if (xwcstoutf(pointer, normalize_ntpath(wpointer), len) < 0)
|
||||
return NULL;
|
||||
return pointer;
|
||||
}
|
||||
if (!ret || ret >= ARRAY_SIZE(wpointer))
|
||||
return NULL;
|
||||
if (xwcstoutf(pointer, wpointer, len) < 0)
|
||||
return NULL;
|
||||
|
Loading…
Reference in New Issue
Block a user