package restic import ( "syscall" "github.com/restic/restic/internal/errors" ) // mknod is not supported on Windows. func mknod(path string, mode uint32, dev uint64) (err error) { return errors.New("device nodes cannot be created on windows") } // Windows doesn't need lchown func lchown(path string, uid int, gid int) (err error) { return nil } func (node Node) restoreSymlinkTimestamps(path string, utimes [2]syscall.Timespec) error { // tweaked version of UtimesNano from go/src/syscall/syscall_windows.go pathp, e := syscall.UTF16PtrFromString(path) if e != nil { return e } h, e := syscall.CreateFile(pathp, syscall.FILE_WRITE_ATTRIBUTES, syscall.FILE_SHARE_WRITE, nil, syscall.OPEN_EXISTING, syscall.FILE_FLAG_BACKUP_SEMANTICS|syscall.FILE_FLAG_OPEN_REPARSE_POINT, 0) if e != nil { return e } defer syscall.Close(h) a := syscall.NsecToFiletime(syscall.TimespecToNsec(utimes[0])) w := syscall.NsecToFiletime(syscall.TimespecToNsec(utimes[1])) return syscall.SetFileTime(h, nil, &a, &w) } // Getxattr retrieves extended attribute data associated with path. func Getxattr(path, name string) ([]byte, error) { return nil, nil } // Listxattr retrieves a list of names of extended attributes associated with the // given path in the file system. func Listxattr(path string) ([]string, error) { return nil, nil } // Setxattr associates name and data together as an attribute of path. func Setxattr(path, name string, data []byte) error { return nil } type statT syscall.Win32FileAttributeData func toStatT(i interface{}) (*statT, bool) { s, ok := i.(*syscall.Win32FileAttributeData) if ok && s != nil { return (*statT)(s), true } return nil, false } func (s statT) dev() uint64 { return 0 } func (s statT) ino() uint64 { return 0 } func (s statT) nlink() uint64 { return 0 } func (s statT) uid() uint32 { return 0 } func (s statT) gid() uint32 { return 0 } func (s statT) rdev() uint64 { return 0 } func (s statT) size() int64 { return int64(s.FileSizeLow) | (int64(s.FileSizeHigh) << 32) } func (s statT) atim() syscall.Timespec { return syscall.NsecToTimespec(s.LastAccessTime.Nanoseconds()) } func (s statT) mtim() syscall.Timespec { return syscall.NsecToTimespec(s.LastWriteTime.Nanoseconds()) } func (s statT) ctim() syscall.Timespec { // Windows does not have the concept of a "change time" in the sense Unix uses it, so we're using the LastWriteTime here. return syscall.NsecToTimespec(s.LastWriteTime.Nanoseconds()) }