commit e02cbb498335d20ede00a4487e12b9e0a5d5c75c
parent 989969061ad0ed64f5c58dd09f686b33a8fc9df3
Author: Matsuda Kenji <info@mtkn.jp>
Date: Thu, 7 Sep 2023 09:44:27 +0900
change File interface
Diffstat:
| M | file.go | | | 14 | +------------- |
| M | stat.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