/*
goredo -- djb's redo implementation on pure Go
-Copyright (C) 2020-2022 Sergey Matveev <stargrave@stargrave.org>
+Copyright (C) 2020-2023 Sergey Matveev <stargrave@stargrave.org>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
}
}
-func inodeFromFile(fd *os.File) (*Inode, error) {
- var fi os.FileInfo
- fi, err := fd.Stat()
- if err != nil {
- return nil, err
- }
- var stat unix.Stat_t
- err = unix.Fstat(int(fd.Fd()), &stat)
- if err != nil {
- return nil, err
- }
+func inodeFromFileStat(fi os.FileInfo, stat unix.Stat_t) *Inode {
ctimeSec, ctimeNsec := stat.Ctim.Unix()
mtimeSec := fi.ModTime().Unix()
mtimeNsec := fi.ModTime().UnixNano()
InodeNum: uint64(stat.Ino),
CtimeSec: ctimeSec, CtimeNsec: ctimeNsec,
MtimeSec: mtimeSec, MtimeNsec: mtimeNsec,
- }, nil
+ }
+}
+
+func inodeFromFileByFd(fd *os.File) (inode *Inode, isDir bool, err error) {
+ fi, err := fd.Stat()
+ if err != nil {
+ return
+ }
+ if fi.IsDir() {
+ isDir = true
+ return
+ }
+ var stat unix.Stat_t
+ err = unix.Fstat(int(fd.Fd()), &stat)
+ if err != nil {
+ return
+ }
+ inode = inodeFromFileStat(fi, stat)
+ return
+}
+
+func inodeFromFileByPath(p string) (*Inode, error) {
+ fi, err := os.Stat(p)
+ if err != nil {
+ return nil, err
+ }
+ var stat unix.Stat_t
+ err = unix.Stat(p, &stat)
+ if err != nil {
+ return nil, err
+ }
+ return inodeFromFileStat(fi, stat), nil
}
func inodeFromRec(m map[string]string) (*Inode, error) {