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:
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
}