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) #if defined(_WIN64) || defined(_WIN32)
{ {
char buf[PATH_MAX * 4]; char buf[PATH_MAX];
if (-1 != getpath(ptfs.rootdir, buf, sizeof buf)) if (-1 != getpath(ptfs.rootdir, buf, sizeof buf))
{ {
ptfs.rootlen = strlen(buf); ptfs.rootlen = strlen(buf);

View File

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