mirror of
https://github.com/winfsp/winfsp.git
synced 2025-04-22 16:33:02 -05:00
tst: memfs, memfs-dotnet: EaSize support
This commit is contained in:
parent
948254f083
commit
b619dbfe97
@ -463,7 +463,10 @@ namespace memfs
|
||||
|
||||
SortedDictionary<String, EaValueData> EaMap = FileNode.GetEaMap(false);
|
||||
if (null != EaMap)
|
||||
{
|
||||
EaMap.Clear();
|
||||
FileNode.FileInfo.EaSize = 0;
|
||||
}
|
||||
if (IntPtr.Zero != Ea)
|
||||
{
|
||||
Result = SetEa(FileNode, null, Ea, EaLength);
|
||||
@ -1116,15 +1119,21 @@ namespace memfs
|
||||
{
|
||||
FileNode FileNode = (FileNode)FileNode0;
|
||||
SortedDictionary<String, EaValueData> EaMap = FileNode.GetEaMap(true);
|
||||
EaValueData Data;
|
||||
UInt32 EaSizePlus = 0, EaSizeMinus = 0;
|
||||
if (null != EaValue)
|
||||
{
|
||||
EaValueData Data;
|
||||
Data.EaValue = EaValue;
|
||||
Data.NeedEa = NeedEa;
|
||||
EaMap[EaName] = Data;
|
||||
EaSizePlus = GetEaEntrySize(EaName, EaValue, NeedEa);
|
||||
}
|
||||
else
|
||||
else if (EaMap.TryGetValue(EaName, out Data))
|
||||
{
|
||||
EaSizeMinus = GetEaEntrySize(EaName, Data.EaValue, Data.NeedEa);
|
||||
EaMap.Remove(EaName);
|
||||
}
|
||||
FileNode.FileInfo.EaSize = FileNode.FileInfo.EaSize + EaSizePlus - EaSizeMinus;
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
|
@ -357,6 +357,7 @@ VOID MemfsFileNodeDeleteEaMap(MEMFS_FILE_NODE *FileNode)
|
||||
free(p->second);
|
||||
delete FileNode->EaMap;
|
||||
FileNode->EaMap = 0;
|
||||
FileNode->FileInfo.EaSize = 0;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
@ -441,6 +442,7 @@ NTSTATUS MemfsFileNodeSetEa(
|
||||
MEMFS_FILE_NODE_EA_MAP *EaMap;
|
||||
FILE_FULL_EA_INFORMATION *FileNodeEa = 0;
|
||||
MEMFS_FILE_NODE_EA_MAP::iterator p;
|
||||
ULONG EaSizePlus = 0, EaSizeMinus = 0;
|
||||
NTSTATUS Result;
|
||||
|
||||
Result = MemfsFileNodeGetEaMap(FileNode, &EaMap);
|
||||
@ -449,18 +451,20 @@ NTSTATUS MemfsFileNodeSetEa(
|
||||
|
||||
if (0 != Ea->EaValueLength)
|
||||
{
|
||||
FileNodeEa = (FILE_FULL_EA_INFORMATION *)malloc(
|
||||
FIELD_OFFSET(FILE_FULL_EA_INFORMATION, EaName) + Ea->EaNameLength + 1 + Ea->EaValueLength);
|
||||
EaSizePlus = FIELD_OFFSET(FILE_FULL_EA_INFORMATION, EaName) +
|
||||
Ea->EaNameLength + 1 + Ea->EaValueLength;
|
||||
FileNodeEa = (FILE_FULL_EA_INFORMATION *)malloc(EaSizePlus);
|
||||
if (0 == FileNodeEa)
|
||||
return STATUS_INSUFFICIENT_RESOURCES;
|
||||
memcpy(FileNodeEa, Ea,
|
||||
FIELD_OFFSET(FILE_FULL_EA_INFORMATION, EaName) + Ea->EaNameLength + 1 + Ea->EaValueLength);
|
||||
memcpy(FileNodeEa, Ea, EaSizePlus);
|
||||
FileNodeEa->NextEntryOffset = 0;
|
||||
}
|
||||
|
||||
p = EaMap->find(Ea->EaName);
|
||||
if (p != EaMap->end())
|
||||
{
|
||||
EaSizeMinus = FIELD_OFFSET(FILE_FULL_EA_INFORMATION, EaName) +
|
||||
p->second->EaNameLength + 1 + p->second->EaValueLength;
|
||||
free(p->second);
|
||||
EaMap->erase(p);
|
||||
}
|
||||
@ -470,7 +474,6 @@ NTSTATUS MemfsFileNodeSetEa(
|
||||
try
|
||||
{
|
||||
EaMap->insert(MEMFS_FILE_NODE_EA_MAP::value_type(FileNodeEa->EaName, FileNodeEa));
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
@ -479,6 +482,10 @@ NTSTATUS MemfsFileNodeSetEa(
|
||||
}
|
||||
}
|
||||
|
||||
FileNode->FileInfo.EaSize = FileNode->FileInfo.EaSize
|
||||
+ FSP_FSCTL_ALIGN_UP(EaSizePlus, sizeof(ULONG))
|
||||
- FSP_FSCTL_ALIGN_UP(EaSizeMinus, sizeof(ULONG));
|
||||
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user