]> Cypherpunks.ru repositories - goredo.git/blobdiff - inode.go
Less unnecessary Close()s
[goredo.git] / inode.go
index 82b61984ab0f37e05c14dd0e2034410ec0dfe4d2..2f2285d407de55eb3b1bfd3cdea1f8b53bbb44d4 100644 (file)
--- a/inode.go
+++ b/inode.go
@@ -1,6 +1,6 @@
 /*
 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
@@ -84,17 +84,7 @@ func (inode *Inode) RecfileFields() []recfile.Field {
        }
 }
 
-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()
@@ -103,7 +93,38 @@ func inodeFromFile(fd *os.File) (*Inode, error) {
                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) {