commit 02e91e7befd7522bc0b1c0aab79b90525e1e05f4
parent d2c09a602202d600ef96b59287ec0ef7bd824760
Author: Matsuda Kenji <info@mtkn.jp>
Date: Sat, 23 Sep 2023 08:38:23 +0900
change API
Diffstat:
| M | fid.go | | | 2 | +- |
| M | file.go | | | 2 | ++ |
| M | fs.go | | | 2 | +- |
| M | server.go | | | 84 | +++++++++++++++++++++++++++----------------------------------------------------- |
4 files changed, 32 insertions(+), 58 deletions(-)
diff --git a/fid.go b/fid.go
@@ -23,7 +23,7 @@ type Fid struct {
OMode OpenMode /* -1 = not open */
File File
Uid string
- Qid Qid
+// Qid Qid
DirOffset int
}
diff --git a/file.go b/file.go
@@ -7,6 +7,8 @@ type File interface {
Child() ([]File, error) // Children
Stat() (*FileInfo, error)
+ Qid() Qid
+ Open(mode OpenMode) error
Close() error
Read(b []byte) (int, error)
}
diff --git a/fs.go b/fs.go
@@ -5,7 +5,7 @@ import (
)
type FS interface {
- Open(string) (File, error)
+ Root() File
}
func FSModeToQidType(fm fs.FileMode) QidType {
diff --git a/server.go b/server.go
@@ -183,27 +183,13 @@ func sAttach(s *Server, r *Req) {
}
}
- f, err := s.fs.Open(".") // TODO: open mode?
- if err != nil {
- log.Printf("open fs: %v", err)
- respond(r, fmt.Errorf("unable to open file tree"))
- return
- }
- fid.File = f
+ fid.File = s.fs.Root()
fid.Uid = ifcall.UName()
fid.OMode = -1 // TODO: right?
- info, err := fid.File.Stat()
- if err != nil {
- log.Printf("Stat %s, %v", fid.File, err)
- respond(r, fmt.Errorf("internal error"))
- return
- }
- fid.Qid = info.Qid()
-
r.ofcall = &RAttach{
- qid: fid.Qid,
+ qid: fid.File.Qid(),
}
respond(r, nil)
}
@@ -228,7 +214,7 @@ func sWalk(s *Server, r *Req) {
respond(r, fmt.Errorf("cannot clone open fid"))
return
}
- if ifcall.NWName() > 0 && oldFid.Qid.Type&QTDIR == 0 {
+ if ifcall.NWName() > 0 && oldFid.File.Qid().Type&QTDIR == 0 {
respond(r, fmt.Errorf("walk on non-dir"))
return
}
@@ -267,11 +253,6 @@ func sWalk(s *Server, r *Req) {
newFid.File = cwd
log.Printf("fPool: %p %v", s.fPool, s.fPool)
newFid.Uid = oldFid.Uid
- if n == 0 {
- newFid.Qid = oldFid.Qid
- } else {
- newFid.Qid = wqids[n-1]
- }
r.ofcall = &RWalk{
qid: wqids[:n],
@@ -311,7 +292,7 @@ func sOpen(s *Server, r *Req) {
// See open(5).
// In plan9 implementation, ifcall.Mode() is ANDed with ^ORCLOSE,
// but ORCLOSE is also prohibitted by the protocol...
- if r.fid.Qid.Type == QTDIR && ifcall.Mode() != OREAD {
+ if r.fid.File.Qid().Type == QTDIR && ifcall.Mode() != OREAD {
respond(r, fmt.Errorf("is a directory"))
return
}
@@ -331,7 +312,7 @@ func sOpen(s *Server, r *Req) {
if ifcall.Mode()&OTRUNC != 0 {
p |= AWRITE
}
- if r.fid.Qid.Type&QTDIR != 0 && p != AREAD {
+ if r.fid.File.Qid().Type&QTDIR != 0 && p != AREAD {
respond(r, ErrPerm)
return
}
@@ -355,7 +336,7 @@ func sOpen(s *Server, r *Req) {
}
r.ofcall = &ROpen{
- qid: r.fid.Qid,
+ qid: r.fid.File.Qid(),
iounit: s.mSize - IOHDRSZ,
}
respond(r, nil)
@@ -365,6 +346,9 @@ func rOpen(r *Req, err error) {
return
}
r.fid.OMode = r.ifcall.(*TOpen).Mode()
+ if err := r.fid.File.Open(r.fid.OMode); err != nil {
+ setError(r, err)
+ }
}
func sCreate(s *Server, r *Req) {
@@ -414,15 +398,11 @@ func sCreate(s *Server, r *Req) {
respond(r, fmt.Errorf("close: %v", err))
return
}
- fi, err := file.Stat()
- if err != nil {
- respond(r, fmt.Errorf("stat: %v", err))
- return
- }
+
r.fid.File = file
r.ofcall = &RCreate{
- qid: fi.Qid(),
+ qid: r.fid.File.Qid(),
iounit: s.mSize - IOHDRSZ,
}
respond(r, nil)
@@ -431,8 +411,10 @@ func rCreate(r *Req, err error) {
if err != nil {
return
}
- r.fid.Qid = r.ofcall.(*RCreate).Qid()
r.fid.OMode = r.ifcall.(*TCreate).Mode()
+ if err := r.fid.File.Open(r.fid.OMode); err != nil {
+ setError(r, err)
+ }
}
func sRead(s *Server, r *Req) {
@@ -793,42 +775,32 @@ func (s *Server) Serve() {
// or if err is not nil, with the Rerror with the error message.
// If r is nil, or both r.ofcall and err are nil it panics.
func respond(r *Req, err error) {
- if r == nil {
- panic("request and error are both nil")
- }
- switch r.ofcall.(type) {
+ switch r.ifcall.(type) {
default:
- if r.ofcall == nil {
- if err == nil {
- panic("neither ofcall nor err is set.")
- }
- setError(r, err)
- } else {
- panic(fmt.Errorf("unknown message type %v", r.ofcall.Type()))
- }
- case *RVersion:
+ panic("bug")
+ case *TVersion:
rVersion(r, err)
- case *RAuth:
+ case *TAuth:
rAuth(r, err)
- case *RAttach:
+ case *TAttach:
rAttach(r, err)
- case *RWalk:
+ case *TWalk:
rWalk(r, err)
- case *ROpen:
+ case *TOpen:
rOpen(r, err)
- case *RCreate:
+ case *TCreate:
rCreate(r, err)
- case *RRead:
+ case *TRead:
rRead(r, err)
- case *RWrite:
+ case *TWrite:
rWrite(r, err)
- case *RClunk:
+ case *TClunk:
rClunk(r, err)
- case *RRemove:
+ case *TRemove:
rRemove(r, err)
- case *RStat:
+ case *TStat:
rStat(r, err)
- case *RWStat:
+ case *TWStat:
rWStat(r, err)
}