commit ca0063c278bd0379f726fd36a8454eaed6f1b759
parent 0c2157f07221fb65ae9222cedf34cf559b2b3bbd
Author: Matsuda Kenji <info@mtkn.jp>
Date: Thu, 7 Sep 2023 10:07:25 +0900
update diskfs
Diffstat:
2 files changed, 32 insertions(+), 91 deletions(-)
diff --git a/diskfs/file.go b/diskfs/file.go
@@ -3,7 +3,6 @@ package diskfs
import (
"fmt"
"io/fs"
- "log"
"os"
"os/user"
"strconv"
@@ -32,104 +31,42 @@ func openFile(fsys *FS, fpath string) (*File, error) {
}
func (f *File) PathName() string { return f.path }
-func (f *File) Type() uint16 { return 0 }
-func (f *File) Dev() uint32 { return 0 }
-func (f *File) Qid() lib9p.Qid {
- qid, ok := f.fs.qidPool.lookup(f)
- if ok {
- return qid
- }
- qid, err := f.fs.qidPool.alloc(f)
- if err != nil {
- panic(fmt.Errorf("alloc qid: %v", err))
- return lib9p.Qid{}
- }
- return qid
-}
-
-func (f *File) Length() int64 {
- fi, err := f.file.Stat()
- if err != nil {
- log.Printf("stat: %v", err)
- return 0
- }
- return fi.Size()
-}
-func (f *File) Mode() lib9p.FileMode {
- fi, err := f.file.Stat()
- if err != nil {
- log.Printf("stat: %v", err)
- return 0
- }
- return lib9p.FSModeTo9Mode(fi.Mode())
-}
-func (f *File) Name() string {
- fi, err := f.file.Stat()
- if err != nil {
- log.Printf("stat: %v", err)
- return ""
- }
- return fi.Name()
-}
-
-func (f *File) Atime() uint32 {
- fi, err := f.file.Stat()
- if err != nil {
- log.Printf("stat error: %v", err)
- return 0 // TODO: error check?
- }
- sys := fi.Sys()
- return uint32(sys.(*syscall.Stat_t).Atim.Sec)
-}
-
-func (f *File) Mtime() uint32 {
- fi, err := f.file.Stat()
- if err != nil {
- log.Printf("stat error: %v", err)
- return 0 // TODO: error check?
- }
- sys := fi.Sys()
- return uint32(sys.(*syscall.Stat_t).Mtim.Sec)
-}
-
-func (f *File) Uid() string {
- info, err := f.file.Stat()
+func (f *File) Stat() (fs.FileInfo, error) {
+ fsfi, err := f.file.Stat()
if err != nil {
- log.Printf("stat %v: %v", f, err)
- return ""
+ return nil, fmt.Errorf("stat: %v", err)
}
- uid := info.Sys().(*syscall.Stat_t).Uid
- user, err := user.LookupId(strconv.Itoa(int(uid)))
- if err != nil {
- log.Printf("LookupId(%d): %v", uid, err)
- return ""
+ var stat lib9p.Stat
+ stat.Type = 0
+ stat.Dev = 0
+ qid, ok := f.fs.qidPool.lookup(f)
+ if !ok {
+ qid, err = f.fs.qidPool.alloc(f)
+ if err != nil {
+ panic(fmt.Errorf("alloc qid: %v", err))
+ }
}
- return user.Username
-}
-
-func (f *File) Gid() string {
- info, err := f.file.Stat()
+ stat.Qid = qid
+ stat.Length = fsfi.Size()
+ stat.Mode = lib9p.FSModeTo9Mode(fsfi.Mode())
+ stat.Name = fsfi.Name()
+ stat.Atime = uint32(fsfi.Sys().(*syscall.Stat_t).Atim.Sec)
+ stat.Mtime = uint32(fsfi.Sys().(*syscall.Stat_t).Mtim.Sec)
+ uid := fsfi.Sys().(*syscall.Stat_t).Uid
+ usr, err := user.LookupId(strconv.Itoa(int(uid)))
if err != nil {
- log.Printf("stat %v: %v", f, err)
- return ""
+ return nil, fmt.Errorf("LookupId(%d): %v", uid, err)
}
- gid := info.Sys().(*syscall.Stat_t).Gid
+ stat.Uid = usr.Username
+ gid := fsfi.Sys().(*syscall.Stat_t).Gid
group, err := user.LookupGroupId(strconv.Itoa(int(gid)))
if err != nil {
- log.Printf("LookupGroupId(%d): %v", gid, err)
- return ""
+ return nil, fmt.Errorf("LookupGroupId(%d): %v", gid, err)
}
- return group.Name
-}
-
-func (f *File) Muid() string {
- log.Printf("muid not implemented")
- return ""
-}
-
-func (f *File) Stat() (fs.FileInfo, error) {
- return &lib9p.FileInfo{Stat: *lib9p.StatFromFile(f)}, nil
+ stat.Gid = group.Name
+ stat.Muid = ""
+ return &lib9p.FileInfo{stat}, nil
}
func (f *File) Close() error {
diff --git a/diskfs/qid_unix.go b/diskfs/qid_unix.go
@@ -53,7 +53,11 @@ func (pool *QidPool) lookup(f *File) (lib9p.Qid, bool) {
if err != nil {
return lib9p.Qid{}, false
}
- return pool.lookupID(id, time.Unix(int64(f.Mtime()), 0))
+ fsfi, err := f.file.Stat()
+ if err != nil {
+ return lib9p.Qid{}, false
+ }
+ return pool.lookupID(id, fsfi.ModTime())
}
func (pool *QidPool) lookupID(id fileID, mtime time.Time) (lib9p.Qid, bool) {