fs: Refactor UtimesNano replacements
Previously, nodeRestoreTimestamps would do something like if node.Type == restic.NodeTypeSymlink { return nodeRestoreSymlinkTimestamps(...) } return syscall.UtimesNano(...) where nodeRestoreSymlinkTimestamps was either a no-op or a reimplementation of syscall.UtimesNano that handles symlinks, with some repeated converting between timestamp types. The Linux implementation was a bit clumsy, requiring three syscalls to set the timestamps. In this new setup, there is a function utimesNano that has three implementations: * on Linux, it's a modified syscall.UtimesNano that uses AT_SYMLINK_NOFOLLOW and AT_FDCWD so it can handle any type in a single call; * on other Unix platforms, it just calls the syscall function after skipping symlinks; * on Windows, it's the modified UtimesNano that was previously called nodeRestoreSymlinkTimestamps, except with different arguments.
This commit is contained in:
parent
f967a33ccc
commit
8f20d5dcd5
10 changed files with 57 additions and 65 deletions
21
internal/fs/node_unix_notlinux.go
Normal file
21
internal/fs/node_unix_notlinux.go
Normal file
|
@ -0,0 +1,21 @@
|
|||
//go:build !linux && unix
|
||||
|
||||
package fs
|
||||
|
||||
import (
|
||||
"syscall"
|
||||
|
||||
"github.com/restic/restic/internal/restic"
|
||||
)
|
||||
|
||||
// utimesNano is like syscall.UtimesNano, except that it skips symlinks.
|
||||
func utimesNano(path string, atime, mtime int64, typ restic.NodeType) error {
|
||||
if typ == restic.NodeTypeSymlink {
|
||||
return nil
|
||||
}
|
||||
|
||||
return syscall.UtimesNano(path, []syscall.Timespec{
|
||||
syscall.NsecToTimespec(atime),
|
||||
syscall.NsecToTimespec(mtime),
|
||||
})
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue