diff --git a/internal/fs/file_windows.go b/internal/fs/file_windows.go index 2f0969804..cadd69284 100644 --- a/internal/fs/file_windows.go +++ b/internal/fs/file_windows.go @@ -103,3 +103,21 @@ 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) (handle windows.Handle, err error) { + path = fixpath(path) + 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 +} diff --git a/internal/restic/node_windows.go b/internal/restic/node_windows.go index 0d96bdb98..0825992b1 100644 --- a/internal/restic/node_windows.go +++ b/internal/restic/node_windows.go @@ -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); 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); fileHandle == 0 { return nil } if err != nil {