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  }