lib9p

Go 9P library.
Log | Files | Refs

commit de1de7109091f0c33411539197ff0615f2689f68
parent dc65cf4dbc3aa623b7f8dc10a433e136c318ceb6
Author: Matsuda Kenji <info@mtkn.jp>
Date:   Tue, 29 Aug 2023 17:06:22 +0900

delete fs.FileInfo from FileInfo

Diffstat:
Mdiskfs/file.go | 35++++++++++++++---------------------
Mfile.go | 26+++++++++++++++-----------
Mfs.go | 17+++++++++++++++++
3 files changed, 46 insertions(+), 32 deletions(-)

diff --git a/diskfs/file.go b/diskfs/file.go @@ -58,15 +58,15 @@ func (f *File) Length() int64 { return fi.Size() } func (f *File) Mode() lib9p.FileMode { - fi, err := f.Stat() + fi, err := f.file.Stat() if err != nil { log.Printf("stat: %v", err) return 0 } - return fi.Sys().(*lib9p.Stat).Mode + return lib9p.FSModeTo9Mode(fi.Mode()) } func (f *File) Name() string { - fi, err := f.Stat() + fi, err := f.file.Stat() if err != nil { log.Printf("stat: %v", err) return "" @@ -81,7 +81,7 @@ func (f *File) Atime() uint32 { return 0 // TODO: error check? } sys := fi.Sys() - return uint32(sys.(syscall.Stat_t).Atim.Sec) + return uint32(sys.(*syscall.Stat_t).Atim.Sec) } func (f *File) Mtime() uint32 { @@ -91,7 +91,7 @@ func (f *File) Mtime() uint32 { return 0 // TODO: error check? } sys := fi.Sys() - return uint32(sys.(syscall.Stat_t).Mtim.Sec) + return uint32(sys.(*syscall.Stat_t).Mtim.Sec) } func (f *File) Uid() string { @@ -130,27 +130,20 @@ func (f *File) Muid() string { } func (f *File) Stat() (fs.FileInfo, error) { - fsfi, err := f.file.Stat() - if err != nil { - return nil, fmt.Errorf("stat file: %v, %v", f, err) - } qid := f.Qid() - uid := f.Uid() - gid := f.Gid() - muid := f.Muid() fi := &lib9p.FileInfo{ - Info: fsfi, + //Info: fsfi, Stat: &lib9p.Stat{ Qid: &qid, - Name: fsfi.Name(), - Mode: lib9p.FSModeTo9Mode(fsfi.Mode()), - Atime: uint32(fsfi.ModTime().Unix()), - Mtime: uint32(fsfi.ModTime().Unix()), - Length: fsfi.Size(), - Uid: uid, - Gid: gid, - Muid: muid, + Name: f.Name(), + Mode: f.Mode(), + Atime: f.Atime(), + Mtime: f.Mtime(), + Length: f.Length(), + Uid: f.Uid(), + Gid: f.Gid(), + Muid: f.Muid(), }, } return fi, nil diff --git a/file.go b/file.go @@ -136,22 +136,26 @@ func (s *Stat) String() string { } /* - fs.FileInfo +fs.FileInfo */ type FileInfo struct { - Info fs.FileInfo Stat *Stat } -func (fi *FileInfo) Name() string { return fi.Info.Name() } -func (fi *FileInfo) Size() int64 { return fi.Info.Size() } -func (fi *FileInfo) Mode() fs.FileMode { return fi.Info.Mode() } -func (fi *FileInfo) ModTime() time.Time { return fi.Info.ModTime() } -func (fi *FileInfo) IsDir() bool { return fi.Info.IsDir() } +/* +func fiFromStat(s *Stat) FileInfo { + +} +*/ + +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.Sys().(*Stat).Qid } - type File interface { fs.File PathName() string @@ -175,9 +179,9 @@ type ReadDirFile interface { } type DirEntry struct { - DirEnt fs.DirEntry // underlying fs.DirEntry - FileInfo *FileInfo - File File + DirEnt fs.DirEntry // underlying fs.DirEntry + FileInfo *FileInfo + File File } func (e *DirEntry) Name() string { return e.DirEnt.Name() } diff --git a/fs.go b/fs.go @@ -64,3 +64,20 @@ func FSModeTo9Mode(mode fs.FileMode) FileMode { } return mode9 } + +func Mode9ToFSMode(mode FileMode) fs.FileMode { + fsmode := fs.FileMode(mode) & fs.ModePerm + if mode&DMDIR != 0 { + fsmode |= fs.ModeDir + } + if mode&DMAPPEND != 0 { + fsmode |= fs.ModeAppend + } + if mode&DMEXCL != 0 { + fsmode |= fs.ModeExclusive + } + if mode&DMTMP != 0 { + fsmode |= fs.ModeTemporary + } + return fsmode +}