diff options
Diffstat (limited to 'pkg/osutil')
| -rw-r--r-- | pkg/osutil/osutil.go | 7 | ||||
| -rw-r--r-- | pkg/osutil/osutil_linux.go | 17 | ||||
| -rw-r--r-- | pkg/osutil/osutil_nonlinux.go | 10 |
3 files changed, 25 insertions, 9 deletions
diff --git a/pkg/osutil/osutil.go b/pkg/osutil/osutil.go index fa963a3fb..d56682732 100644 --- a/pkg/osutil/osutil.go +++ b/pkg/osutil/osutil.go @@ -351,10 +351,9 @@ func Abs(path string) string { return filepath.Clean(path) } -// CreationTime returns file creation time. -// May return zero time, if not known. -func CreationTime(fi os.FileInfo) time.Time { - return creationTime(fi) +// FileTimes returns file creation and modification times. +func FileTimes(file string) (time.Time, time.Time, error) { + return fileTimes(file) } // MonotonicNano returns monotonic time in nanoseconds from some unspecified point in time. diff --git a/pkg/osutil/osutil_linux.go b/pkg/osutil/osutil_linux.go index 50be9b047..5ab639280 100644 --- a/pkg/osutil/osutil_linux.go +++ b/pkg/osutil/osutil_linux.go @@ -18,9 +18,20 @@ import ( "golang.org/x/sys/unix" ) -func creationTime(fi os.FileInfo) time.Time { - st := fi.Sys().(*syscall.Stat_t) - return time.Unix(int64(st.Ctim.Sec), int64(st.Ctim.Nsec)) // nolint: unconvert +func fileTimes(file string) (time.Time, time.Time, error) { + // Btime stands for "birth" time, which is creation time. + var statx unix.Statx_t + err := unix.Statx(unix.AT_FDCWD, file, unix.AT_SYMLINK_NOFOLLOW, unix.STATX_BTIME|unix.STATX_MTIME, &statx) + if err != nil { + return time.Time{}, time.Time{}, err + } + modTime := time.Unix(statx.Mtime.Sec, int64(statx.Mtime.Nsec)) + // Some filesystems may not store the birth time. + creationTime := modTime + if statx.Mask&unix.STATX_BTIME != 0 { + creationTime = time.Unix(statx.Btime.Sec, int64(statx.Btime.Nsec)) + } + return creationTime, modTime, nil } // RemoveAll is similar to os.RemoveAll, but can handle more cases. diff --git a/pkg/osutil/osutil_nonlinux.go b/pkg/osutil/osutil_nonlinux.go index 1d3ee8b82..bc696d3fc 100644 --- a/pkg/osutil/osutil_nonlinux.go +++ b/pkg/osutil/osutil_nonlinux.go @@ -12,8 +12,14 @@ import ( "time" ) -func creationTime(fi os.FileInfo) time.Time { - return time.Time{} +func fileTimes(file string) (time.Time, time.Time, error) { + stat, err := os.Stat(file) + if err != nil { + return time.Time{}, time.Time{}, err + } + // Creation time is not present in stat, so we use modification time for both. + modTime := stat.ModTime() + return modTime, modTime, nil } func RemoveAll(dir string) error { |
