lib9p

Go 9P library.
Log | Files | Refs

commit ca0063c278bd0379f726fd36a8454eaed6f1b759
parent 0c2157f07221fb65ae9222cedf34cf559b2b3bbd
Author: Matsuda Kenji <info@mtkn.jp>
Date:   Thu,  7 Sep 2023 10:07:25 +0900

update diskfs

Diffstat:
Mdiskfs/file.go | 117+++++++++++++++++++-------------------------------------------------------------
Mdiskfs/qid_unix.go | 6+++++-
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) {