lib9p

Go 9P library.
Log | Files | Refs

commit 07bf3cb5be98b01b9471c690d46fed42593dd8e1
parent 61e6fe997f7da54050d3ff5c23d4748ec64434a1
Author: Matsuda Kenji <info@mtkn.jp>
Date:   Sat, 16 Sep 2023 06:45:24 +0900

fix wstat

Diffstat:
Mdiskfs/stat_unix.go | 6+++++-
Mserver.go | 19+++++++++----------
Mtestdir/a | 4+++-
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 +