commit a18138e77f5a6b6346df1e2002ae444778ac8e04
parent 5864dedab4c71643268b3d27b18d371697a35f21
Author: Matsuda Kenji <info@mtkn.jp>
Date: Fri, 1 Sep 2023 10:43:05 +0900
change Qid from pointer to value
Diffstat:
7 files changed, 38 insertions(+), 50 deletions(-)
diff --git a/cmd/numfs.go b/cmd/numfs.go
@@ -61,21 +61,7 @@ type numFile struct {
}
func (f *numFile) Stat() (fs.FileInfo, error) {
- qid := f.Qid()
- return &FileInfo{
- Stat: &lib9p.Stat{
- Type: f.Type(),
- Dev: f.Dev(),
- Qid: &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(),
- }}, nil
+ return &FileInfo{Stat:lib9p.StatFromFile(f)}, nil
}
func (f *numFile) Read(p []byte) (int, error) {
if f.id == -1 {
@@ -166,7 +152,7 @@ func (fi *FileInfo) Mode() fs.FileMode { return lib9p.Mode9ToFSMode(fi.Stat.Mod
func (fi *FileInfo) ModTime() time.Time { return time.Unix(int64(fi.Stat.Mtime), 0) }
func (fi *FileInfo) IsDir() bool { return fi.Stat.Mode&lib9p.DMDIR != 0 }
func (fi *FileInfo) Sys() any { return fi.Stat }
-func (fi *FileInfo) Qid() *lib9p.Qid { return fi.Stat.Qid }
+func (fi *FileInfo) Qid() lib9p.Qid { return fi.Stat.Qid }
var dFlag = flag.Bool("D", false, "Prints chatty message to the stderr.")
diff --git a/fcall.go b/fcall.go
@@ -343,14 +343,14 @@ func (msg TAttach) String() string {
type RAttach struct {
tag uint16
- qid *Qid
+ qid Qid
}
func newRAttach(buf []byte) *RAttach { panic("not implemented") }
func (msg RAttach) Size() uint32 { return 4 + 1 + 2 + 13 }
func (msg RAttach) Type() MsgType { return Rattach }
func (msg RAttach) Tag() uint16 { return msg.tag }
-func (msg RAttach) Qid() *Qid { return msg.qid }
+func (msg RAttach) Qid() Qid { return msg.qid }
func (msg RAttach) marshal() []byte {
cur := 0
buf := make([]byte, msg.Size())
@@ -586,7 +586,7 @@ func (msg *TOpen) String() string {
type ROpen struct {
tag uint16
- qid *Qid
+ qid Qid
iounit uint32
}
@@ -596,7 +596,7 @@ func (msg *ROpen) Size() uint32 {
}
func (msg *ROpen) Type() MsgType { return Ropen }
func (msg *ROpen) Tag() uint16 { return msg.tag }
-func (msg *ROpen) Qid() *Qid { return msg.qid }
+func (msg *ROpen) Qid() Qid { return msg.qid }
func (msg *ROpen) IoUnit() uint32 { return msg.iounit }
func (msg *ROpen) marshal() []byte {
cur := 0
diff --git a/fid.go b/fid.go
@@ -21,7 +21,7 @@ type Fid struct {
OMode OpenMode /* -1 = not open */
File File
Uid string
- Qid *Qid
+ Qid Qid
}
const NOFID = ^uint32(0)
diff --git a/iofs/file.go b/iofs/file.go
@@ -102,21 +102,7 @@ func (f *File) Muid() string {
}
func (f *File) Stat() (fs.FileInfo, error) {
- qid := f.Qid()
- fi := &FileInfo{
- Stat: &lib9p.Stat{
- Qid: &qid,
- 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
+ return &FileInfo{Stat: lib9p.StatFromFile(f)}, nil
}
func (f *File) Close() error {
diff --git a/iofs/stat.go b/iofs/stat.go
@@ -17,7 +17,7 @@ func (fi *FileInfo) Mode() fs.FileMode { return lib9p.Mode9ToFSMode(fi.Stat.Mod
func (fi *FileInfo) ModTime() time.Time { return time.Unix(int64(fi.Stat.Mtime), 0) }
func (fi *FileInfo) IsDir() bool { return fi.Stat.Mode&lib9p.DMDIR != 0 }
func (fi *FileInfo) Sys() any { return fi.Stat }
-func (fi *FileInfo) Qid() *lib9p.Qid { return fi.Sys().(*lib9p.Stat).Qid }
+func (fi *FileInfo) Qid() lib9p.Qid { return fi.Sys().(*lib9p.Stat).Qid }
func fiType(fi fs.FileInfo) uint16 { return 0 }
func fiDev(fi fs.FileInfo) uint32 { return 0 }
@@ -30,10 +30,10 @@ func fiUid(fi fs.FileInfo) string { return "" }
func fiGid(fi fs.FileInfo) string { return "" }
func fiMuid(fi fs.FileInfo) string { return "" }
-func fiQid(pool *QidPool, id fileID, fi fs.FileInfo) (*lib9p.Qid, error) {
+func fiQid(pool *QidPool, id fileID, fi fs.FileInfo) (lib9p.Qid, error) {
qid, ok := pool.m[id]
if ok {
- return &qid, nil
+ return qid, nil
}
qtype := lib9p.FSModeToQidType(fi.Mode())
qid = lib9p.Qid{
@@ -42,7 +42,7 @@ func fiQid(pool *QidPool, id fileID, fi fs.FileInfo) (*lib9p.Qid, error) {
}
pool.m[id] = qid
pool.nextQid++
- return &qid, nil
+ return qid, nil
}
func fiStat(pool *QidPool, id fileID, fi fs.FileInfo) *lib9p.Stat {
diff --git a/qid.go b/qid.go
@@ -32,27 +32,27 @@ func newQid(b []byte) *Qid {
}
}
/*
-func (q *Qid) Type() QidType { return q.Type }
-func (q *Qid) SetType(t QidType) { q.t = t }
-func (q *Qid) Vers() uint32 { return q.vers }
-func (q *Qid) SetVers(v uint32) { q.vers = v }
-func (q *Qid) Path() uint64 { return q.path }
-func (q *Qid) SetPath(p uint64) { q.path = p }
+func (q Qid) Type() QidType { return q.Type }
+func (q Qid) SetType(t QidType) { q.t = t }
+func (q Qid) Vers() uint32 { return q.vers }
+func (q Qid) SetVers(v uint32) { q.vers = v }
+func (q Qid) Path() uint64 { return q.path }
+func (q Qid) SetPath(p uint64) { q.path = p }
*/
-func (q *Qid) marshal() []byte {
+func (q Qid) marshal() []byte {
buf := make([]byte, 13)
buf[0] = uint8(q.Type)
pbit32(buf[1:5], q.Vers)
pbit64(buf[5:13], q.Path)
return buf
}
-func (q *Qid) String() string {
+func (q Qid) String() string {
return fmt.Sprintf("(%016d %d %s)", q.Path, q.Vers, q.typeStr())
}
// TypeStr returns the q.Type() as string for debugging information.
-func (q *Qid) typeStr() string {
+func (q Qid) typeStr() string {
var s string
t := q.Type
if t&QTDIR != 0 {
diff --git a/stat.go b/stat.go
@@ -23,7 +23,7 @@ const (
type Stat struct {
Type uint16
Dev uint32
- Qid *Qid
+ Qid Qid
Mode FileMode
Atime uint32
Mtime uint32
@@ -34,6 +34,22 @@ 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 (s *Stat) size() uint16 {
// type + dev + qid + mode + atime + mtime + length
return uint16(2 + 4 + 13 + 4 + 4 + 4 + 8 +