mirror of
https://github.com/winfsp/winfsp.git
synced 2025-04-22 16:33:02 -05:00
tst: memfs: MemfsFileNameHasPrefix: work to support named streams
This commit is contained in:
parent
495fc7a5dc
commit
a46c0610c4
@ -48,9 +48,14 @@ int MemfsFileNameCompare(PWSTR a, PWSTR b)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static inline
|
static inline
|
||||||
BOOLEAN MemfsFileNameHasPrefix(PWSTR a, PWSTR b)
|
BOOLEAN MemfsFileNameHasPrefix(PWSTR a, PWSTR b, BOOLEAN AllowStreams)
|
||||||
{
|
{
|
||||||
return 0 == wcsncmp(a, b, wcslen(b));
|
size_t alen = wcslen(a);
|
||||||
|
size_t blen = wcslen(b);
|
||||||
|
|
||||||
|
return alen >= blen && 0 == memcmp(a, b, blen * sizeof(WCHAR)) &&
|
||||||
|
(alen == blen || (1 == blen && L'\\' == b[0]) ||
|
||||||
|
(L'\\' == a[blen] || (AllowStreams && L':' == a[blen])));
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef struct _MEMFS_FILE_NODE
|
typedef struct _MEMFS_FILE_NODE
|
||||||
@ -242,15 +247,17 @@ BOOLEAN MemfsFileNodeMapEnumerateChildren(MEMFS_FILE_NODE_MAP *FileNodeMap, MEMF
|
|||||||
WCHAR Root[2] = L"\\";
|
WCHAR Root[2] = L"\\";
|
||||||
PWSTR Remain, Suffix;
|
PWSTR Remain, Suffix;
|
||||||
MEMFS_FILE_NODE_MAP::iterator iter = FileNodeMap->upper_bound(FileNode->FileName);
|
MEMFS_FILE_NODE_MAP::iterator iter = FileNodeMap->upper_bound(FileNode->FileName);
|
||||||
BOOLEAN Equal;
|
BOOLEAN IsDirectoryChild;
|
||||||
for (; FileNodeMap->end() != iter; ++iter)
|
for (; FileNodeMap->end() != iter; ++iter)
|
||||||
{
|
{
|
||||||
if (!MemfsFileNameHasPrefix(iter->second->FileName, FileNode->FileName))
|
if (!MemfsFileNameHasPrefix(iter->second->FileName, FileNode->FileName, FALSE))
|
||||||
break;
|
break;
|
||||||
FspPathSuffix(iter->second->FileName, &Remain, &Suffix, Root);
|
FspPathSuffix(iter->second->FileName, &Remain, &Suffix, Root);
|
||||||
Equal = 0 == MemfsFileNameCompare(Remain, FileNode->FileName);
|
IsDirectoryChild =
|
||||||
|
0 == MemfsFileNameCompare(Remain, FileNode->FileName) &&
|
||||||
|
0 == wcschr(Suffix, L':');
|
||||||
FspPathCombine(iter->second->FileName, Suffix);
|
FspPathCombine(iter->second->FileName, Suffix);
|
||||||
if (Equal)
|
if (IsDirectoryChild)
|
||||||
{
|
{
|
||||||
if (!EnumFn(iter->second, Context))
|
if (!EnumFn(iter->second, Context))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
@ -267,7 +274,7 @@ BOOLEAN MemfsFileNodeMapEnumerateDescendants(MEMFS_FILE_NODE_MAP *FileNodeMap, M
|
|||||||
MEMFS_FILE_NODE_MAP::iterator iter = FileNodeMap->lower_bound(FileNode->FileName);
|
MEMFS_FILE_NODE_MAP::iterator iter = FileNodeMap->lower_bound(FileNode->FileName);
|
||||||
for (; FileNodeMap->end() != iter; ++iter)
|
for (; FileNodeMap->end() != iter; ++iter)
|
||||||
{
|
{
|
||||||
if (!MemfsFileNameHasPrefix(iter->second->FileName, FileNode->FileName))
|
if (!MemfsFileNameHasPrefix(iter->second->FileName, FileNode->FileName, TRUE))
|
||||||
break;
|
break;
|
||||||
if (!EnumFn(iter->second, Context))
|
if (!EnumFn(iter->second, Context))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
@ -762,7 +769,7 @@ static NTSTATUS Rename(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
for (Index = 0; Context.Count > Index; Index++)
|
for (Index = 0; Context.Count > Index; Index++)
|
||||||
{
|
{
|
||||||
DescendantFileNode = Context.FileNodes[Index];
|
DescendantFileNode = Context.FileNodes[Index];
|
||||||
assert(MemfsFileNameHasPrefix(DescendantFileNode->FileName, FileNode->FileName));
|
assert(MemfsFileNameHasPrefix(DescendantFileNode->FileName, FileNode->FileName, TRUE));
|
||||||
if (MAX_PATH <= wcslen(DescendantFileNode->FileName) - FileNameLen + NewFileNameLen)
|
if (MAX_PATH <= wcslen(DescendantFileNode->FileName) - FileNameLen + NewFileNameLen)
|
||||||
{
|
{
|
||||||
Result = STATUS_OBJECT_NAME_INVALID;
|
Result = STATUS_OBJECT_NAME_INVALID;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user