Merge pull request #4866 from MichaelEischer/fix-ea-windows

Fix xattr backup on windows
This commit is contained in:
Michael Eischer 2024-06-26 20:46:24 +02:00 committed by GitHub
commit e37c11979a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 23 additions and 19 deletions

View File

@ -103,3 +103,24 @@ func ClearAttribute(path string, attribute uint32) error {
}
return nil
}
// OpenHandleForEA return a file handle for file or dir for setting/getting EAs
func OpenHandleForEA(nodeType, path string, writeAccess bool) (handle windows.Handle, err error) {
path = fixpath(path)
fileAccess := windows.FILE_READ_EA
if writeAccess {
fileAccess = fileAccess | windows.FILE_WRITE_EA
}
switch nodeType {
case "file":
utf16Path := windows.StringToUTF16Ptr(path)
handle, err = windows.CreateFile(utf16Path, uint32(fileAccess), 0, nil, windows.OPEN_EXISTING, windows.FILE_ATTRIBUTE_NORMAL, 0)
case "dir":
utf16Path := windows.StringToUTF16Ptr(path)
handle, err = windows.CreateFile(utf16Path, uint32(fileAccess), 0, nil, windows.OPEN_EXISTING, windows.FILE_ATTRIBUTE_NORMAL|windows.FILE_FLAG_BACKUP_SEMANTICS, 0)
default:
return 0, nil
}
return handle, err
}

View File

@ -88,7 +88,7 @@ func (node Node) restoreExtendedAttributes(path string) (err error) {
// fill extended attributes in the node. This also includes the Generic attributes for windows.
func (node *Node) fillExtendedAttributes(path string, _ bool) (err error) {
var fileHandle windows.Handle
if fileHandle, err = getFileHandleForEA(node.Type, path); fileHandle == 0 {
if fileHandle, err = fs.OpenHandleForEA(node.Type, path, false); fileHandle == 0 {
return nil
}
if err != nil {
@ -118,23 +118,6 @@ func (node *Node) fillExtendedAttributes(path string, _ bool) (err error) {
return nil
}
// Get file handle for file or dir for setting/getting EAs
func getFileHandleForEA(nodeType, path string) (handle windows.Handle, err error) {
switch nodeType {
case "file":
utf16Path := windows.StringToUTF16Ptr(path)
fileAccessRightReadWriteEA := (0x8 | 0x10)
handle, err = windows.CreateFile(utf16Path, uint32(fileAccessRightReadWriteEA), 0, nil, windows.OPEN_EXISTING, windows.FILE_ATTRIBUTE_NORMAL, 0)
case "dir":
utf16Path := windows.StringToUTF16Ptr(path)
fileAccessRightReadWriteEA := (0x8 | 0x10)
handle, err = windows.CreateFile(utf16Path, uint32(fileAccessRightReadWriteEA), 0, nil, windows.OPEN_EXISTING, windows.FILE_ATTRIBUTE_NORMAL|windows.FILE_FLAG_BACKUP_SEMANTICS, 0)
default:
return 0, nil
}
return handle, err
}
// closeFileHandle safely closes a file handle and logs any errors.
func closeFileHandle(fileHandle windows.Handle, path string) {
err := windows.CloseHandle(fileHandle)
@ -147,7 +130,7 @@ func closeFileHandle(fileHandle windows.Handle, path string) {
// The Windows API requires setting of all the Extended Attributes in one call.
func restoreExtendedAttributes(nodeType, path string, eas []fs.ExtendedAttribute) (err error) {
var fileHandle windows.Handle
if fileHandle, err = getFileHandleForEA(nodeType, path); fileHandle == 0 {
if fileHandle, err = fs.OpenHandleForEA(nodeType, path, true); fileHandle == 0 {
return nil
}
if err != nil {