lib9p

Go 9P library.
Log | Files | Refs

commit a65b8e19365e83970ee05585c3673a05931710b0
parent 3fb48abcd6be71abec1059c4789228b6092550a8
Author: Matsuda Kenji <info@mtkn.jp>
Date:   Fri, 15 Sep 2023 06:57:03 +0900

implement remove

Diffstat:
Mdiskfs/file.go | 6++++++
Mfile.go | 6++++++
Mserver.go | 41++++++++++++++++++++++++++++++++++++++++-
Dtestdir/e | 1-
Dtestdir/f | 1-
5 files changed, 52 insertions(+), 3 deletions(-)

diff --git a/diskfs/file.go b/diskfs/file.go @@ -225,3 +225,8 @@ func (f *File) Create(name string, uid string, return file, nil } + +func (f *File) Remove() error { + ospath := path.Join(f.fs.rootPath, f.path) + return os.Remove(ospath) +} +\ No newline at end of file diff --git a/file.go b/file.go @@ -29,6 +29,12 @@ type WriterStatFile interface { WStat(stat *Stat) error } +type RemoverFile interface { + File + + Remove() error +} + // Walkfile walks file tree starting at f, following path specified by name. // It returns the destination File and nil, or nil with non-nil error. func walkfile(f File, name string) (File, error) { diff --git a/server.go b/server.go @@ -480,7 +480,42 @@ func sClunk(s *Server, r *Req) { func rClunk(r *Req, err error) {} -func sRemove(s *Server, r *Req) {} +func sRemove(s *Server, r *Req) { + ifcall := r.ifcall.(*TRemove) + fid, ok := s.fPool.lookup(ifcall.Fid()) + if !ok { + respond(r, fmt.Errorf("unknown fid")) + return + } + + // TODO: need lock? + defer s.fPool.delete(ifcall.Fid()) + + parent, err := fid.File.Parent() + if err != nil { + respond(r, fmt.Errorf("open parent: %v", err)) + return + } + + if !hasPerm(parent, fid.Uid, AWRITE) { + respond(r, fmt.Errorf("permission denied")) + return + } + + rfile, ok := fid.File.(RemoverFile) + if !ok { + respond(r, fmt.Errorf("operation not supported")) + return + } + + if err := rfile.Remove(); err != nil { + respond(r, fmt.Errorf("remove: %v", err)) + return + } + + r.ofcall = &RRemove{tag: ifcall.Tag()} + respond(r, nil) +} func rRemove(r *Req, err error) {} func sStat(s *Server, r *Req) { @@ -656,6 +691,8 @@ func (s *Server) Serve() { sWrite(s, r) case *TClunk: sClunk(s, r) + case *TRemove: + sRemove(s, r) case *TStat: sStat(s, r) case *TWStat: @@ -699,6 +736,8 @@ func respond(r *Req, err error) { rWrite(r, err) case *RClunk: rClunk(r, err) + case *RRemove: + rRemove(r, err) case *RStat: rStat(r, err) case *RWStat: diff --git a/testdir/e b/testdir/e @@ -1 +0,0 @@ -unko diff --git a/testdir/f b/testdir/f @@ -1 +0,0 @@ -f