forked from TrueCloudLab/restic
restic: also fix file path when reading windows xattrs
This commit is contained in:
parent
267cd62ae4
commit
20a6c526e5
2 changed files with 20 additions and 19 deletions
|
@ -103,3 +103,21 @@ func ClearAttribute(path string, attribute uint32) error {
|
||||||
}
|
}
|
||||||
return nil
|
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
|
||||||
|
}
|
||||||
|
|
|
@ -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.
|
// fill extended attributes in the node. This also includes the Generic attributes for windows.
|
||||||
func (node *Node) fillExtendedAttributes(path string, _ bool) (err error) {
|
func (node *Node) fillExtendedAttributes(path string, _ bool) (err error) {
|
||||||
var fileHandle windows.Handle
|
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
|
return nil
|
||||||
}
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -118,23 +118,6 @@ func (node *Node) fillExtendedAttributes(path string, _ bool) (err error) {
|
||||||
return nil
|
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.
|
// closeFileHandle safely closes a file handle and logs any errors.
|
||||||
func closeFileHandle(fileHandle windows.Handle, path string) {
|
func closeFileHandle(fileHandle windows.Handle, path string) {
|
||||||
err := windows.CloseHandle(fileHandle)
|
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.
|
// The Windows API requires setting of all the Extended Attributes in one call.
|
||||||
func restoreExtendedAttributes(nodeType, path string, eas []fs.ExtendedAttribute) (err error) {
|
func restoreExtendedAttributes(nodeType, path string, eas []fs.ExtendedAttribute) (err error) {
|
||||||
var fileHandle windows.Handle
|
var fileHandle windows.Handle
|
||||||
if fileHandle, err = getFileHandleForEA(nodeType, path); fileHandle == 0 {
|
if fileHandle, err = fs.OpenHandleForEA(nodeType, path); fileHandle == 0 {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
Loading…
Reference in a new issue