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:
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
+}