mirror of
				https://github.com/winfsp/winfsp.git
				synced 2025-10-29 19:18:39 -05:00 
			
		
		
		
	sys: create: overwrite EA support
This commit is contained in:
		| @@ -1171,8 +1171,16 @@ NTSTATUS FspFsvolCreateComplete( | |||||||
|         if (0 == FileNode->MainFileNode) |         if (0 == FileNode->MainFileNode) | ||||||
|             FspFileNodeOverwriteStreams(FileNode); |             FspFileNodeOverwriteStreams(FileNode); | ||||||
|         FspFileNodeSetFileInfo(FileNode, FileObject, &Response->Rsp.Overwrite.FileInfo, TRUE); |         FspFileNodeSetFileInfo(FileNode, FileObject, &Response->Rsp.Overwrite.FileInfo, TRUE); | ||||||
|  |         if (0 == FileNode->MainFileNode && FsvolDeviceExtension->VolumeParams.ExtendedAttributes) | ||||||
|  |         { | ||||||
|  |             /* invalidate any existing EA and increment the EA change count */ | ||||||
|  |             FspFileNodeSetEa(FileNode, 0, 0); | ||||||
|  |             FileNode->EaChangeCount++; | ||||||
|  |         } | ||||||
|         FspFileNodeNotifyChange(FileNode, |         FspFileNodeNotifyChange(FileNode, | ||||||
|             FILE_NOTIFY_CHANGE_LAST_WRITE | FILE_NOTIFY_CHANGE_ATTRIBUTES | FILE_NOTIFY_CHANGE_SIZE, |             FILE_NOTIFY_CHANGE_LAST_WRITE | FILE_NOTIFY_CHANGE_ATTRIBUTES | FILE_NOTIFY_CHANGE_SIZE | | ||||||
|  |                 (0 == FileNode->MainFileNode && FsvolDeviceExtension->VolumeParams.ExtendedAttributes ? | ||||||
|  |                     FILE_NOTIFY_CHANGE_EA : 0), | ||||||
|             FILE_ACTION_MODIFIED, |             FILE_ACTION_MODIFIED, | ||||||
|             FALSE); |             FALSE); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -460,6 +460,9 @@ namespace memfs | |||||||
|                     FileNodeMap.Remove(StreamNode); |                     FileNodeMap.Remove(StreamNode); | ||||||
|             } |             } | ||||||
|  |  | ||||||
|  |             SortedDictionary<String, EaValueData> EaMap = FileNode.GetEaMap(false); | ||||||
|  |             if (null != EaMap) | ||||||
|  |                 EaMap.Clear(); | ||||||
|             if (IntPtr.Zero != Ea) |             if (IntPtr.Zero != Ea) | ||||||
|             { |             { | ||||||
|                 Result = SetEa(FileNode, null, Ea, EaLength); |                 Result = SetEa(FileNode, null, Ea, EaLength); | ||||||
|   | |||||||
| @@ -346,10 +346,10 @@ NTSTATUS MemfsFileNodeCreate(PWSTR FileName, MEMFS_FILE_NODE **PFileNode) | |||||||
|     return STATUS_SUCCESS; |     return STATUS_SUCCESS; | ||||||
| } | } | ||||||
|  |  | ||||||
| static inline |  | ||||||
| VOID MemfsFileNodeDelete(MEMFS_FILE_NODE *FileNode) |  | ||||||
| { |  | ||||||
| #if defined(MEMFS_EA) | #if defined(MEMFS_EA) | ||||||
|  | static inline | ||||||
|  | VOID MemfsFileNodeDeleteAllEa(MEMFS_FILE_NODE *FileNode) | ||||||
|  | { | ||||||
|     if (0 != FileNode->EaMap) |     if (0 != FileNode->EaMap) | ||||||
|     { |     { | ||||||
|         for (MEMFS_FILE_NODE_EA_MAP::iterator p = FileNode->EaMap->begin(), q = FileNode->EaMap->end(); |         for (MEMFS_FILE_NODE_EA_MAP::iterator p = FileNode->EaMap->begin(), q = FileNode->EaMap->end(); | ||||||
| @@ -357,6 +357,14 @@ VOID MemfsFileNodeDelete(MEMFS_FILE_NODE *FileNode) | |||||||
|             free(p->second); |             free(p->second); | ||||||
|         delete FileNode->EaMap; |         delete FileNode->EaMap; | ||||||
|     } |     } | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | static inline | ||||||
|  | VOID MemfsFileNodeDelete(MEMFS_FILE_NODE *FileNode) | ||||||
|  | { | ||||||
|  | #if defined(MEMFS_EA) | ||||||
|  |     MemfsFileNodeDeleteAllEa(FileNode); | ||||||
| #endif | #endif | ||||||
| #if defined(MEMFS_REPARSE_POINTS) | #if defined(MEMFS_REPARSE_POINTS) | ||||||
|     free(FileNode->ReparseData); |     free(FileNode->ReparseData); | ||||||
| @@ -1244,6 +1252,7 @@ static NTSTATUS Overwrite(FSP_FILE_SYSTEM *FileSystem, | |||||||
| #endif | #endif | ||||||
|  |  | ||||||
| #if defined(MEMFS_EA) | #if defined(MEMFS_EA) | ||||||
|  |     MemfsFileNodeDeleteAllEa(FileNode); | ||||||
|     if (0 != Ea) |     if (0 != Ea) | ||||||
|     { |     { | ||||||
|         Result = FspFileSystemEnumerateEa(FileSystem, MemfsFileNodeSetEa, FileNode, Ea, EaLength); |         Result = FspFileSystemEnumerateEa(FileSystem, MemfsFileNodeSetEa, FileNode, Ea, EaLength); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user