lib9p

Go 9P library.
Log | Files | Refs

commit e02cbb498335d20ede00a4487e12b9e0a5d5c75c
parent 989969061ad0ed64f5c58dd09f686b33a8fc9df3
Author: Matsuda Kenji <info@mtkn.jp>
Date:   Thu,  7 Sep 2023 09:44:27 +0900

change File interface

Diffstat:
Mfile.go | 14+-------------
Mstat.go | 66++++++++++++++++++++++++++----------------------------------------
2 files changed, 27 insertions(+), 53 deletions(-)

diff --git a/file.go b/file.go @@ -6,19 +6,7 @@ import ( type File interface { fs.File - PathName() string // path from the root of the fs which this file belongs to. - - Type() uint16 - Dev() uint32 - Qid() Qid - Mode() FileMode - Atime() uint32 - Mtime() uint32 - Length() int64 - Name() string - Uid() string - Gid() string - Muid() string +// PathName() string // path from the root of the fs which this file belongs to. } type ReadDirFile interface { diff --git a/stat.go b/stat.go @@ -15,7 +15,7 @@ const ( DMTMP = 0x04000000 ) -func (m FileMode)PermString() string { +func (m FileMode) PermString() string { s := "" for i := 6; i >= 0; i -= 3 { p := m >> i @@ -58,54 +58,38 @@ type Stat struct { Muid string } -func StatFromFile(f File) *Stat { - return &Stat{ - Type: f.Type(), - Dev: f.Dev(), - Qid: f.Qid(), - Mode: f.Mode(), - Atime: f.Atime(), - Mtime: f.Mtime(), - Length: f.Length(), - Name: f.Name(), - Uid: f.Uid(), - Gid: f.Gid(), - Muid: f.Muid(), - } -} - func newStat(b []byte) *Stat { stat := new(Stat) cur := 2 // ignore size field - stat.Type = gbit16(b[cur:cur+2]) + stat.Type = gbit16(b[cur : cur+2]) cur += 2 - stat.Dev = gbit32(b[cur:cur+4]) + stat.Dev = gbit32(b[cur : cur+4]) cur += 4 - stat.Qid = unmarshalQid(b[cur:cur+13]) + stat.Qid = unmarshalQid(b[cur : cur+13]) cur += 13 - stat.Mode = FileMode(gbit32(b[cur:cur+4])) + stat.Mode = FileMode(gbit32(b[cur : cur+4])) cur += 4 - stat.Atime = gbit32(b[cur:cur+4]) + stat.Atime = gbit32(b[cur : cur+4]) cur += 4 - stat.Mtime = gbit32(b[cur:cur+4]) + stat.Mtime = gbit32(b[cur : cur+4]) cur += 4 - stat.Length = int64(gbit64(b[cur:cur+8])) + stat.Length = int64(gbit64(b[cur : cur+8])) cur += 8 - nameSize := int(gbit16(b[cur:cur+2])) + nameSize := int(gbit16(b[cur : cur+2])) cur += 2 - stat.Name = string(b[cur:cur+nameSize]) + stat.Name = string(b[cur : cur+nameSize]) cur += nameSize - uidSize := int(gbit16(b[cur:cur+2])) + uidSize := int(gbit16(b[cur : cur+2])) cur += 2 - stat.Uid = string(b[cur:cur+uidSize]) + stat.Uid = string(b[cur : cur+uidSize]) cur += uidSize - gidSize := int(gbit16(b[cur:cur+2])) + gidSize := int(gbit16(b[cur : cur+2])) cur += 2 - stat.Gid = string(b[cur:cur+gidSize]) + stat.Gid = string(b[cur : cur+gidSize]) cur += gidSize - muidSize := int(gbit16(b[cur:cur+2])) + muidSize := int(gbit16(b[cur : cur+2])) cur += 2 - stat.Muid = string(b[cur:cur+muidSize]) + stat.Muid = string(b[cur : cur+muidSize]) cur += muidSize if cur != len(b) { panic("length and cursor position don't match") @@ -185,18 +169,20 @@ func (s *Stat) String() string { s.Atime, s.Mtime, s.Length, s.Type, s.Dev) } - type FileInfo struct { Stat Stat + Path string + Fsys FS } -func (fi *FileInfo) Name() string { return fi.Stat.Name } -func (fi *FileInfo) Size() int64 { return fi.Stat.Length } -func (fi *FileInfo) Mode() fs.FileMode { return Mode9ToFSMode(fi.Stat.Mode) } -func (fi *FileInfo) ModTime() time.Time { return time.Unix(int64(fi.Stat.Mtime), 0) } -func (fi *FileInfo) IsDir() bool { return fi.Stat.Mode&DMDIR != 0 } -func (fi *FileInfo) Sys() any { return &fi.Stat } -func (fi *FileInfo) Qid() Qid { return fi.Stat.Qid } +func (fi *FileInfo) Name() string { return fi.Stat.Name } +func (fi *FileInfo) Size() int64 { return fi.Stat.Length } +func (fi *FileInfo) Mode() fs.FileMode { return Mode9ToFSMode(fi.Stat.Mode) } +func (fi *FileInfo) ModTime() time.Time { return time.Unix(int64(fi.Stat.Mtime), 0) } +func (fi *FileInfo) IsDir() bool { return fi.Stat.Mode&DMDIR != 0 } +func (fi *FileInfo) Sys() any { return &fi.Stat } +func (fi *FileInfo) Qid() Qid { return fi.Stat.Qid } +func (fi *FileInfo) File() (File, error) { return fi.Fsys.Open(fi.Path) } type DirEntry = FileInfo