commit 07bf3cb5be98b01b9471c690d46fed42593dd8e1
parent 61e6fe997f7da54050d3ff5c23d4748ec64434a1
Author: Matsuda Kenji <info@mtkn.jp>
Date: Sat, 16 Sep 2023 06:45:24 +0900
fix wstat
Diffstat:
3 files changed, 17 insertions(+), 12 deletions(-)
diff --git a/diskfs/stat_unix.go b/diskfs/stat_unix.go
@@ -50,7 +50,7 @@ func fiStat(pool *QidPool, id fileID, info fs.FileInfo) *lib9p.Stat {
// TODO: when error occur, file stat should be restored.
func (f *File) WStat(s *lib9p.Stat) error {
- file, err := os.Open(path.Join(f.fs.rootPath, f.path))
+ file, err := os.OpenFile(path.Join(f.fs.rootPath, f.path), os.O_RDWR, 0)
if err != nil {
return err
}
@@ -72,6 +72,10 @@ func (f *File) WStat(s *lib9p.Stat) error {
if err := file.Truncate(s.Length); err != nil {
return fmt.Errorf("truncate: %v", err)
}
+ ret, err := file.Seek(0, 0)
+ if err != nil {
+ return fmt.Errorf("seek 0: %d, %w", ret, err)
+ }
}
if s.Mode != oldStat.Mode {
if err := file.Chmod(lib9p.Mode9ToFSMode(s.Mode)); err != nil {
diff --git a/server.go b/server.go
@@ -548,21 +548,20 @@ func rStat(r *Req, err error) {}
func sWStat(s *Server, r *Req) {
ifcall := r.ifcall.(*TWStat)
- fidNum := ifcall.Fid()
- fidStruct, ok := s.fPool.lookup(fidNum)
+ fid, ok := s.fPool.lookup(ifcall.Fid())
if !ok {
respond(r, ErrUnknownFid)
return
}
- wsfile, ok := fidStruct.File.(WriterStatFile)
+ wsfile, ok := fid.File.(WriterStatFile)
if !ok {
respond(r, ErrOperation)
return
}
wstat := ifcall.Stat()
- fi, err := fidStruct.File.Stat()
+ fi, err := fid.File.Stat()
if err != nil {
respond(r, fmt.Errorf("stat: %v", err))
return
@@ -578,12 +577,12 @@ func sWStat(s *Server, r *Req) {
}
if wstat.Name != "" {
- parent, err := fidStruct.File.Parent()
+ parent, err := fid.File.Parent()
if err != nil {
respond(r, fmt.Errorf("get parent: %v", err))
return
}
- if !hasPerm(parent, fidStruct.Uid, AWRITE) {
+ if !hasPerm(parent, fid.Uid, AWRITE) {
respond(r, ErrPerm)
return
}
@@ -607,7 +606,7 @@ func sWStat(s *Server, r *Req) {
}
if wstat.Length != ^int64(0) {
- if fi.IsDir() || !hasPerm(fidStruct.File, fidStruct.Uid, AWRITE) {
+ if fi.IsDir() || !hasPerm(fid.File, fid.Uid, AWRITE) {
respond(r, ErrPerm)
return
}
@@ -616,11 +615,11 @@ func sWStat(s *Server, r *Req) {
if wstat.Mode != FileMode(^uint32(0)) {
// the owner of the file or the group leader of the file's group.
- if wstat.Uid != newStat.Uid && wstat.Gid != newStat.Uid {
+ if fid.Uid != newStat.Uid && fid.Uid != newStat.Gid {
respond(r, ErrPerm)
return
}
- if (wstat.Mode^newStat.Mode)&DMDIR != 0 {
+ if wstat.Mode&DMDIR != newStat.Mode&DMDIR {
respond(r, ErrPerm)
return
}
@@ -629,7 +628,7 @@ func sWStat(s *Server, r *Req) {
if wstat.Mtime != ^uint32(0) {
// the owner of the file or the group leader of the file's group.
- if wstat.Uid != newStat.Uid && wstat.Gid != newStat.Uid {
+ if fid.Uid != newStat.Uid && fid.Uid != newStat.Gid {
respond(r, ErrPerm)
return
}
diff --git a/testdir/a b/testdir/a
@@ -1 +1,3 @@
-a
+#!/bin/sh
+echo unko
+