github.com/artpar/rclone@v1.67.3/backend/local/metadata_unix.go (about) 1 //go:build openbsd || solaris 2 3 package local 4 5 import ( 6 "fmt" 7 "os" 8 "syscall" 9 "time" 10 11 "github.com/artpar/rclone/fs" 12 ) 13 14 // Read the time specified from the os.FileInfo 15 func readTime(t timeType, fi os.FileInfo) time.Time { 16 stat, ok := fi.Sys().(*syscall.Stat_t) 17 if !ok { 18 fs.Debugf(nil, "didn't return Stat_t as expected") 19 return fi.ModTime() 20 } 21 switch t { 22 case aTime: 23 return time.Unix(stat.Atim.Unix()) 24 case cTime: 25 return time.Unix(stat.Ctim.Unix()) 26 } 27 return fi.ModTime() 28 } 29 30 // Read the metadata from the file into metadata where possible 31 func (o *Object) readMetadataFromFile(m *fs.Metadata) (err error) { 32 info, err := o.fs.lstat(o.path) 33 if err != nil { 34 return err 35 } 36 stat, ok := info.Sys().(*syscall.Stat_t) 37 if !ok { 38 fs.Debugf(o, "didn't return Stat_t as expected") 39 return nil 40 } 41 m.Set("mode", fmt.Sprintf("%0o", stat.Mode)) 42 m.Set("uid", fmt.Sprintf("%d", stat.Uid)) 43 m.Set("gid", fmt.Sprintf("%d", stat.Gid)) 44 if stat.Rdev != 0 { 45 m.Set("rdev", fmt.Sprintf("%x", stat.Rdev)) 46 } 47 setTime := func(key string, t syscall.Timespec) { 48 m.Set(key, time.Unix(t.Unix()).Format(metadataTimeFormat)) 49 } 50 setTime("atime", stat.Atim) 51 setTime("mtime", stat.Mtim) 52 return nil 53 }