lib9p

Go 9P library.
Log | Files | Refs

commit 0d53fe51b41876573d312291237c62b77ee3ea8a
parent 9acf5cc8d5846bb94635e80b98a324ae9913bca1
Author: Matsuda Kenji <info@mtkn.jp>
Date:   Tue, 24 Oct 2023 10:39:23 +0900

update *ClientFS.OpenFile() to support creation

Diffstat:
Mclient2.go | 44++++++++++++++++++++++++++++++++------------
Mfile.go | 4+---
2 files changed, 33 insertions(+), 15 deletions(-)

diff --git a/client2.go b/client2.go @@ -15,23 +15,43 @@ type ClientFS struct { } func (fsys *ClientFS) Open(name string) (File, error) { - rerturn fsys.OpenFile(name, OREAD, 0) + return fsys.OpenFile(name, OREAD, 0) } func (fsys *ClientFS) OpenFile(name string, omode OpenMode, perm fs.FileMode) (File, error) { + var ( + qid Qid + iounit uint32 + ) f, err := fsys.walkFile(name) if err != nil { - return nil, fmt.Errorf("walkFile: %v", err) - } - tag, err := fsys.tPool.add() - if err != nil { - return nil, err - } - qid, iounit, err := fsys.c.Open(context.TODO(), tag, f.fid.fid, omode) - fsys.tPool.delete(tag) - if err != nil { - f.Close() - return nil, fmt.Errorf("open: %v", err) + // File not found. Create. + f, err = fsys.walkFile(path.Dir(name)) + if err != nil { + return nil, fmt.Errorf("walk to %s: %v", name, err) + } + tag, err := fsys.tPool.add() + if err != nil { + return nil, err + } + qid, iounit, err = fsys.c.Create(context.TODO(), tag, f.fid.fid, path.Base(name), perm, omode) + fsys.tPool.delete(tag) + if err != nil { + f.Close() + return nil, fmt.Errorf("create: %v", err) + } + } else { + // File exists. Open it. + tag, err := fsys.tPool.add() + if err != nil { + return nil, err + } + qid, iounit, err = fsys.c.Open(context.TODO(), tag, f.fid.fid, omode) + fsys.tPool.delete(tag) + if err != nil { + f.Close() + return nil, fmt.Errorf("open: %v", err) + } } f.fid.omode = omode f.qid = qid diff --git a/file.go b/file.go @@ -19,7 +19,7 @@ type WriterFile interface { type CreaterFile interface { File - // Create creats a file named name in this directory. + // Create creates a file named name in this directory. // It sets the owner of newly created file to the specified uid, // and file mode to the specified perm. Create(name string, uid string, mode OpenMode, perm FileMode) (File, error) @@ -27,7 +27,6 @@ type CreaterFile interface { type WriterStatFile interface { File - // WStat sets file Stat to stat. // After successful call, the file's Stat() method should return // the same Stat as stat. @@ -37,7 +36,6 @@ type WriterStatFile interface { type RemoverFile interface { File - Remove() error }