lib9p

Go 9P library.
Log | Files | Refs

commit 02e91e7befd7522bc0b1c0aab79b90525e1e05f4
parent d2c09a602202d600ef96b59287ec0ef7bd824760
Author: Matsuda Kenji <info@mtkn.jp>
Date:   Sat, 23 Sep 2023 08:38:23 +0900

change API

Diffstat:
Mfid.go | 2+-
Mfile.go | 2++
Mfs.go | 2+-
Mserver.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) }