This commit is contained in:
zeho11 2023-01-31 19:13:10 +08:00
parent 69cc1820e1
commit 1f0fd4c280
3 changed files with 97 additions and 67 deletions

View File

@ -461,7 +461,7 @@ int main(int argc, char *argv[])
#if defined(_WIN64) || defined(_WIN32)
{
char buf[PATH_MAX * 4];
char buf[PATH_MAX];
if (-1 != getpath(ptfs.rootdir, buf, sizeof buf))
{
ptfs.rootlen = strlen(buf);

View File

@ -121,7 +121,7 @@ char *realpath(const char *path, char *resolved)
if (0 == resolved)
{
result = malloc(PATH_MAX * 4); /* sets errno */
result = malloc(PATH_MAX); /* sets errno */
if (0 == result)
return 0;
}
@ -132,7 +132,9 @@ char *realpath(const char *path, char *resolved)
WCHAR PathBuf[PATH_MAX];
WCHAR ResultBuf[PATH_MAX];
PWSTR ResultBufBgn = &ResultBuf[6];
if (0 < MultiByteToWideChar(CP_UTF8, 0, path, -1, PathBuf, PATH_MAX))
if (0 == MultiByteToWideChar(CP_UTF8, 0, path, -1, PathBuf, PATH_MAX))
err = GetLastError();
else
{
DWORD len = GetFullPathNameW(PathBuf, PATH_MAX - 6, ResultBufBgn, 0);
if (0 == len)
@ -141,30 +143,32 @@ char *realpath(const char *path, char *resolved)
err = ERROR_INVALID_PARAMETER;
else
{
WideCharToMultiByte(CP_UTF8, 0, ResultBufBgn, -1, result, PATH_MAX * 4, 0, 0);
if (L'\\' == ResultBufBgn[0] && L'\\' == ResultBufBgn[1])
{
ResultBufBgn = ResultBuf;
ResultBufBgn[0] = L'\\';
ResultBufBgn[1] = L'\\';
ResultBufBgn[2] = L'?';
ResultBufBgn[3] = L'\\';
ResultBufBgn[4] = L'U';
ResultBufBgn[5] = L'N';
ResultBufBgn[6] = L'C';
}
if (0 == WideCharToMultiByte(CP_UTF8, 0, ResultBufBgn, -1, result, PATH_MAX, 0, 0))
err = GetLastError();
else
{
ResultBufBgn = &ResultBuf[2];
ResultBufBgn[0] = L'\\';
ResultBufBgn[1] = L'\\';
ResultBufBgn[2] = L'?';
ResultBufBgn[3] = L'\\';
if (L'\\' == ResultBufBgn[0] && L'\\' == ResultBufBgn[1])
{
ResultBufBgn = ResultBuf;
ResultBufBgn[0] = L'\\';
ResultBufBgn[1] = L'\\';
ResultBufBgn[2] = L'?';
ResultBufBgn[3] = L'\\';
ResultBufBgn[4] = L'U';
ResultBufBgn[5] = L'N';
ResultBufBgn[6] = L'C';
}
else
{
ResultBufBgn = &ResultBuf[2];
ResultBufBgn[0] = L'\\';
ResultBufBgn[1] = L'\\';
ResultBufBgn[2] = L'?';
ResultBufBgn[3] = L'\\';
}
}
}
}
else
err = GetLastError();
if (0 == err)
{
@ -189,7 +193,7 @@ char *realpath(const char *path, char *resolved)
return result;
}
int uncpath(const char *path, WCHAR *buf, int nchar)
static int uncpath(const char *path, WCHAR *buf, int nchar)
{
PWSTR BufP = 0;
if ('\\' == path[0] && '\\' == path[1])
@ -221,20 +225,31 @@ int uncpath(const char *path, WCHAR *buf, int nchar)
}
}
if (BufP)
if (0 == BufP)
{
while (*BufP)
{
if (L'/' == *BufP)
*BufP = L'\\';
BufP++;
}
return 1;
if (0 < nchar)
buf[0] = 0;
return 0;
}
if (0 < nchar)
buf[0] = 0;
return 0;
PWSTR P = BufP;
while (*BufP)
{
if (L'/' == *BufP || L'\\' == *BufP)
{
while (L'/' == BufP[1] || L'\\' == BufP[1])
BufP++;
}
if (L'/' == *BufP)
*P = L'\\';
else if (P != BufP)
*P = *BufP;
BufP++;
P++;
}
if (P != BufP)
*P = 0;
return 1;
}
int statvfs(const char *path, struct fuse_statvfs *stbuf)

View File

@ -121,7 +121,7 @@ char *realpath(const char *path, char *resolved)
if (0 == resolved)
{
result = malloc(PATH_MAX * 4); /* sets errno */
result = malloc(PATH_MAX); /* sets errno */
if (0 == result)
return 0;
}
@ -132,7 +132,9 @@ char *realpath(const char *path, char *resolved)
WCHAR PathBuf[PATH_MAX];
WCHAR ResultBuf[PATH_MAX];
PWSTR ResultBufBgn = &ResultBuf[6];
if (0 < MultiByteToWideChar(CP_UTF8, 0, path, -1, PathBuf, PATH_MAX))
if (0 == MultiByteToWideChar(CP_UTF8, 0, path, -1, PathBuf, PATH_MAX))
err = GetLastError();
else
{
DWORD len = GetFullPathNameW(PathBuf, PATH_MAX - 6, ResultBufBgn, 0);
if (0 == len)
@ -141,30 +143,32 @@ char *realpath(const char *path, char *resolved)
err = ERROR_INVALID_PARAMETER;
else
{
WideCharToMultiByte(CP_UTF8, 0, ResultBufBgn, -1, result, PATH_MAX * 4, 0, 0);
if (L'\\' == ResultBufBgn[0] && L'\\' == ResultBufBgn[1])
{
ResultBufBgn = ResultBuf;
ResultBufBgn[0] = L'\\';
ResultBufBgn[1] = L'\\';
ResultBufBgn[2] = L'?';
ResultBufBgn[3] = L'\\';
ResultBufBgn[4] = L'U';
ResultBufBgn[5] = L'N';
ResultBufBgn[6] = L'C';
}
if (0 == WideCharToMultiByte(CP_UTF8, 0, ResultBufBgn, -1, result, PATH_MAX, 0, 0))
err = GetLastError();
else
{
ResultBufBgn = &ResultBuf[2];
ResultBufBgn[0] = L'\\';
ResultBufBgn[1] = L'\\';
ResultBufBgn[2] = L'?';
ResultBufBgn[3] = L'\\';
if (L'\\' == ResultBufBgn[0] && L'\\' == ResultBufBgn[1])
{
ResultBufBgn = ResultBuf;
ResultBufBgn[0] = L'\\';
ResultBufBgn[1] = L'\\';
ResultBufBgn[2] = L'?';
ResultBufBgn[3] = L'\\';
ResultBufBgn[4] = L'U';
ResultBufBgn[5] = L'N';
ResultBufBgn[6] = L'C';
}
else
{
ResultBufBgn = &ResultBuf[2];
ResultBufBgn[0] = L'\\';
ResultBufBgn[1] = L'\\';
ResultBufBgn[2] = L'?';
ResultBufBgn[3] = L'\\';
}
}
}
}
else
err = GetLastError();
if (0 == err)
{
@ -189,7 +193,7 @@ char *realpath(const char *path, char *resolved)
return result;
}
int uncpath(const char *path, WCHAR *buf, int nchar)
static int uncpath(const char *path, WCHAR *buf, int nchar)
{
PWSTR BufP = 0;
if ('\\' == path[0] && '\\' == path[1])
@ -221,20 +225,31 @@ int uncpath(const char *path, WCHAR *buf, int nchar)
}
}
if (BufP)
if (0 == BufP)
{
while (*BufP)
{
if (L'/' == *BufP)
*BufP = L'\\';
BufP++;
}
return 1;
if (0 < nchar)
buf[0] = 0;
return 0;
}
if (0 < nchar)
buf[0] = 0;
return 0;
PWSTR P = BufP;
while (*BufP)
{
if (L'/' == *BufP || L'\\' == *BufP)
{
while (L'/' == BufP[1] || L'\\' == BufP[1])
BufP++;
}
if (L'/' == *BufP)
*P = L'\\';
else if (P != BufP)
*P = *BufP;
BufP++;
P++;
}
if (P != BufP)
*P = 0;
return 1;
}
int statvfs(const char *path, struct fuse_statvfs *stbuf)