Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 1 addition & 3 deletions pkg/manager/crash.go
Original file line number Diff line number Diff line change
Expand Up @@ -235,7 +235,7 @@ func (cs *CrashStore) BugInfo(id string, full bool) (*BugInfo, error) {
if err != nil {
return nil, err
}
stat, err := os.Stat(filepath.Join(dir, "description"))
ret.FirstTime, ret.LastTime, err = osutil.FileTimes(filepath.Join(dir, "description"))
if err != nil {
return nil, err
}
Expand All @@ -250,8 +250,6 @@ func (cs *CrashStore) BugInfo(id string, full bool) (*BugInfo, error) {
}
}

ret.FirstTime = osutil.CreationTime(stat)
ret.LastTime = stat.ModTime()
files, err := osutil.ListDir(dir)
if err != nil {
return nil, err
Expand Down
7 changes: 3 additions & 4 deletions pkg/osutil/osutil.go
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
17 changes: 14 additions & 3 deletions pkg/osutil/osutil_linux.go
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
10 changes: 8 additions & 2 deletions pkg/osutil/osutil_nonlinux.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
Loading