mirror of
https://github.com/restic/restic.git
synced 2024-12-21 23:33:03 +00:00
8f20d5dcd5
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.
21 lines
436 B
Go
21 lines
436 B
Go
//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),
|
|
})
|
|
}
|