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,7 +143,10 @@ 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))
err = GetLastError();
else
{
if (L'\\' == ResultBufBgn[0] && L'\\' == ResultBufBgn[1]) if (L'\\' == ResultBufBgn[0] && L'\\' == ResultBufBgn[1])
{ {
ResultBufBgn = ResultBuf; ResultBufBgn = ResultBuf;
@ -163,8 +168,7 @@ char *realpath(const char *path, char *resolved)
} }
} }
} }
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,22 +225,33 @@ 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) if (0 < nchar)
buf[0] = 0; buf[0] = 0;
return 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) int statvfs(const char *path, struct fuse_statvfs *stbuf)
{ {
WCHAR root[PATH_MAX]; WCHAR root[PATH_MAX];

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,7 +143,10 @@ 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))
err = GetLastError();
else
{
if (L'\\' == ResultBufBgn[0] && L'\\' == ResultBufBgn[1]) if (L'\\' == ResultBufBgn[0] && L'\\' == ResultBufBgn[1])
{ {
ResultBufBgn = ResultBuf; ResultBufBgn = ResultBuf;
@ -163,8 +168,7 @@ char *realpath(const char *path, char *resolved)
} }
} }
} }
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,22 +225,33 @@ 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) if (0 < nchar)
buf[0] = 0; buf[0] = 0;
return 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) int statvfs(const char *path, struct fuse_statvfs *stbuf)
{ {
WCHAR root[PATH_MAX]; WCHAR root[PATH_MAX];