"encoding/base64"
"encoding/binary"
"os"
-
- "golang.org/x/sys/unix"
)
-func ctimeETag(fd *os.File) (string, error) {
- var stat unix.Stat_t
- err := unix.Fstat(int(fd.Fd()), &stat)
+func mtimeETag(fd *os.File) (string, error) {
+ fi, err := fd.Stat()
if err != nil {
return "", err
}
- sec, nsec := stat.Ctim.Unix()
- buf := make([]byte, 8*2)
- binary.BigEndian.PutUint64(buf[:8], uint64(sec))
- binary.BigEndian.PutUint64(buf[8:], uint64(nsec))
+ mtime := fi.ModTime()
+ buf := make([]byte, 8*3)
+ binary.BigEndian.PutUint64(buf[:8], uint64(fi.Size()))
+ binary.BigEndian.PutUint64(buf[8:16], uint64(mtime.Unix()))
+ binary.BigEndian.PutUint64(buf[16:], uint64(mtime.Nanosecond()))
return `"` + base64.RawURLEncoding.EncodeToString(buf) + `"`, nil
}