commit a65b8e19365e83970ee05585c3673a05931710b0
parent 3fb48abcd6be71abec1059c4789228b6092550a8
Author: Matsuda Kenji <info@mtkn.jp>
Date: Fri, 15 Sep 2023 06:57:03 +0900
implement remove
Diffstat:
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