summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--back/cmd/authfs/authfs.go67
-rw-r--r--back/cmd/authfs/err.go2
2 files changed, 41 insertions, 28 deletions
diff --git a/back/cmd/authfs/authfs.go b/back/cmd/authfs/authfs.go
index 5493606..f3756af 100644
--- a/back/cmd/authfs/authfs.go
+++ b/back/cmd/authfs/authfs.go
@@ -1,6 +1,7 @@
package main
import (
+ "bytes"
"fmt"
"path"
"sync"
@@ -122,9 +123,9 @@ func (fs *Authfs) Rattach(fid, afid p9.FID, uname, aname string) (p9.QID, error)
}
func (fs *Authfs) Rwalk(fid, newfid p9.FID, paths []string) ([]p9.QID, error) {
- f, err := fs.getFile(fid)
- if err != nil {
- return nil, err
+ f, ok := fs.getFile(fid)
+ if !ok {
+ return nil, ErrFidNotExist
}
var qids []p9.QID
@@ -133,6 +134,7 @@ func (fs *Authfs) Rwalk(fid, newfid p9.FID, paths []string) ([]p9.QID, error) {
if !ok {
return qids, ErrWalkNonDir
}
+ var err error
f, err = dir.Walk(paths[i])
if err != nil {
return qids, err
@@ -148,28 +150,17 @@ func (fs *Authfs) Rwalk(fid, newfid p9.FID, paths []string) ([]p9.QID, error) {
defer fs.mu.Unlock()
if newfid != fid {
if _, ok := fs.files[newfid]; ok {
- return nil, fmt.Errorf("newfid in use: walk to %v, fid %v, newfid %v", paths, fid, newfid)
+ return nil, ErrNewfidExist
}
}
fs.files[newfid] = f
return qids, nil
}
-func (fs *Authfs) Rclunk(fid p9.FID) error {
- fs.mu.Lock()
- defer fs.mu.Unlock()
-
- if _, exists := fs.files[fid]; !exists {
- return ErrFidNotExist
- }
- delete(fs.files, fid)
- return nil
-}
-
func (fs *Authfs) Ropen(fid p9.FID, mode p9.Mode) (p9.QID, p9.MaxSize, error) {
- f, err := fs.getFile(fid)
- if err != nil {
- return p9.QID{}, 0, err
+ f, ok := fs.getFile(fid)
+ if !ok {
+ return p9.QID{}, 0, ErrFidNotExist
}
if err := f.Open(mode); err != nil {
return p9.QID{}, 0, err
@@ -179,9 +170,9 @@ func (fs *Authfs) Ropen(fid p9.FID, mode p9.Mode) (p9.QID, p9.MaxSize, error) {
}
func (fs *Authfs) Rcreate(fid p9.FID, name string, perm p9.Perm, mode p9.Mode) (p9.QID, p9.MaxSize, error) {
- f, err := fs.getFile(fid)
- if err != nil {
- return p9.QID{}, 0, err
+ f, ok := fs.getFile(fid)
+ if !ok {
+ return p9.QID{}, 0, ErrFidNotExist
}
dir, ok := f.(Dir)
if !ok {
@@ -195,6 +186,31 @@ func (fs *Authfs) Rcreate(fid p9.FID, name string, perm p9.Perm, mode p9.Mode) (
return qid, 0, err
}
+func (fs *Authfs) Rstat(fid p9.FID) ([]byte, error) {
+ f, ok := fs.getFile(fid)
+ if !ok {
+ return nil, ErrFidNotExist
+ }
+ info, err := f.Stat()
+ if err != nil {
+ return nil, err
+ }
+ var buf bytes.Buffer
+ p9.Marshaldir(&buf, info)
+ return buf.Bytes(), nil
+}
+
+func (fs *Authfs) Rclunk(fid p9.FID) error {
+ fs.mu.Lock()
+ defer fs.mu.Unlock()
+
+ if _, exists := fs.files[fid]; !exists {
+ return ErrFidNotExist
+ }
+ delete(fs.files, fid)
+ return nil
+}
+
func (fs *Authfs) Rflush(o p9.Tag) error { return nil }
func (fs *Authfs) attach(fid p9.FID, f File) error {
@@ -207,12 +223,9 @@ func (fs *Authfs) attach(fid p9.FID, f File) error {
return nil
}
-func (fs *Authfs) getFile(fid p9.FID) (File, error) {
+func (fs *Authfs) getFile(fid p9.FID) (File, bool) {
fs.mu.Lock()
defer fs.mu.Unlock()
- f, exists := fs.files[fid]
- if !exists {
- return nil, ErrFidNotExist
- }
- return f, nil
+ f, ok := fs.files[fid]
+ return f, ok
}
diff --git a/back/cmd/authfs/err.go b/back/cmd/authfs/err.go
index 7c2b192..a1e62f8 100644
--- a/back/cmd/authfs/err.go
+++ b/back/cmd/authfs/err.go
@@ -8,7 +8,7 @@ var (
ErrFidNotExist = errors.New("fid does not exist")
ErrFileExist = errors.New("file already exists")
ErrFileNotExist = errors.New("file does not exist")
- ErrNewFidExist = errors.New("newfid already exists")
+ ErrNewfidExist = errors.New("newfid already exists")
ErrPerm = errors.New("permission denied")
ErrWalkNonDir = errors.New("cannot walk in non-directory")
)