summaryrefslogtreecommitdiffstats
path: root/back/cmd/authfs
diff options
context:
space:
mode:
Diffstat (limited to 'back/cmd/authfs')
-rw-r--r--back/cmd/authfs/authfs.go20
-rw-r--r--back/cmd/authfs/root.go38
-rw-r--r--back/cmd/authfs/rootdir.go112
3 files changed, 118 insertions, 52 deletions
diff --git a/back/cmd/authfs/authfs.go b/back/cmd/authfs/authfs.go
index da2637c..7d04179 100644
--- a/back/cmd/authfs/authfs.go
+++ b/back/cmd/authfs/authfs.go
@@ -29,23 +29,17 @@ type Dir interface {
// Authfs is the root p9.NineServer.
type Authfs struct {
*RootDir
- *UsersDir
- *SessionsDir
-
mu sync.Mutex // guards below
files map[p9.FID]File
}
func NewAuthfs(rootPath string) (*Authfs, error) {
- root := NewRootDir()
- users, err := NewUsersDir(rootPath, root.Version)
+ root, err := NewRootDir(rootPath)
if err != nil {
return nil, err
}
return &Authfs{
root,
- users,
- NewSessionsDir(root.Version),
sync.Mutex{},
make(map[p9.FID]File),
}, nil
@@ -53,8 +47,6 @@ func NewAuthfs(rootPath string) (*Authfs, error) {
func (fs *Authfs) Close() {
fs.RootDir.Close()
- fs.UsersDir.Close()
- fs.SessionsDir.Close()
}
func (fs *Authfs) Rversion(msize p9.MaxSize, version string) (p9.MaxSize, string, error) {
@@ -83,15 +75,15 @@ func (fs *Authfs) Rattach(fid, afid p9.FID, uname, aname string) (p9.QID, error)
case "":
f = fs.RootDir
case "users":
- f = fs.UsersDir
+ f = fs.RootDir.UsersDir
case "sessions":
- f = fs.SessionsDir
+ f = fs.RootDir.SessionsDir
default:
return p9.QID{}, ErrFileNotExist
}
case "/users/":
- f, err = fs.UsersDir.Walk(file)
+ f, err = fs.RootDir.UsersDir.Walk(file)
if err != nil {
return p9.QID{}, err
}
@@ -101,7 +93,7 @@ func (fs *Authfs) Rattach(fid, afid p9.FID, uname, aname string) (p9.QID, error)
if err != nil {
return p9.QID{}, err
}
- f, ok = fs.SessionsDir.Get(sessid)
+ f, ok = fs.RootDir.SessionsDir.Get(sessid)
if !ok {
return p9.QID{}, ErrFileNotExist
}
@@ -227,7 +219,7 @@ func (fs *Authfs) Rread(fid p9.FID, off p9.Offset, n p9.Count) ([]byte, error) {
func (fs *Authfs) Rwrite(fid p9.FID, off p9.Offset, b []byte) (p9.Count, error) {
f, ok := fs.getFile(fid)
if !ok {
- return nil, ErrFidNotExist
+ return 0, ErrFidNotExist
}
return f.Write(off, b)
}
diff --git a/back/cmd/authfs/root.go b/back/cmd/authfs/root.go
deleted file mode 100644
index 7a0fcbd..0000000
--- a/back/cmd/authfs/root.go
+++ /dev/null
@@ -1,38 +0,0 @@
-package main
-
-import (
- p9 "github.com/Harvey-OS/ninep/protocol"
-
- "git.samanthony.xyz/buth/back/qver"
-)
-
-type RootDir struct {
- *qver.Version
-}
-
-func NewRootDir() *RootDir {
- return &RootDir{qver.New()}
-}
-
-func (r *RootDir) Close() {
- r.Version.Close()
-}
-
-func (r *RootDir) Qid() (p9.QID, error) {
- ver, err := r.Version.Get()
- if err != nil {
- return p9.QID{}, err
- }
- return p9.QID{
- Type: p9.QTDIR,
- Version: ver,
- Path: rootQidPath,
- }, nil
-}
-
-func (r *RootDir) Open(mode p9.Mode) error {
- if mode != p9.OREAD {
- return ErrPerm
- }
- return nil
-}
diff --git a/back/cmd/authfs/rootdir.go b/back/cmd/authfs/rootdir.go
new file mode 100644
index 0000000..870a5a8
--- /dev/null
+++ b/back/cmd/authfs/rootdir.go
@@ -0,0 +1,112 @@
+package main
+
+import (
+ "bytes"
+
+ p9 "github.com/Harvey-OS/ninep/protocol"
+
+ "git.samanthony.xyz/buth/back/qver"
+)
+
+type RootDir struct {
+ *qver.Version
+ *UsersDir
+ *SessionsDir
+}
+
+func NewRootDir(path string) (*RootDir, error) {
+ ver := qver.New()
+ users, err := NewUsersDir(path, ver)
+ if err != nil {
+ ver.Close()
+ return nil, err
+ }
+ sessions := NewSessionsDir(ver)
+ return &RootDir{ver, users, sessions}, nil
+}
+
+func (r *RootDir) Close() {
+ r.Version.Close()
+ r.UsersDir.Close()
+ r.SessionsDir.Close()
+}
+
+func (r *RootDir) Qid() (p9.QID, error) {
+ ver, err := r.Version.Get()
+ if err != nil {
+ return p9.QID{}, err
+ }
+ return p9.QID{
+ Type: p9.QTDIR,
+ Version: ver,
+ Path: rootQidPath,
+ }, nil
+}
+
+func (r *RootDir) Stat() (p9.Dir, error) {
+ qid, err := r.Qid()
+ if err != nil {
+ return p9.Dir{}, err
+ }
+ return p9.Dir{
+ QID: qid,
+ Mode: p9.DMDIR | p9.DMREAD,
+ // TODO: atime, mtime
+ Name: "/",
+ }, nil
+}
+
+func (r *RootDir) Remove() error { return ErrPerm }
+
+func (r *RootDir) Open(mode p9.Mode) error {
+ if mode != p9.OREAD {
+ return ErrPerm
+ }
+ return nil
+}
+
+func (r *RootDir) Read(off p9.Offset, n p9.Count) ([]byte, error) {
+ userInfo, err := r.UsersDir.Stat()
+ if err != nil {
+ return nil, err
+ }
+ sessInfo, err := r.SessionsDir.Stat()
+ if err != nil {
+ return nil, err
+ }
+
+ buf := new(bytes.Buffer)
+ p9.Marshaldir(buf, userInfo)
+ p9.Marshaldir(buf, sessInfo)
+
+ b := buf.Bytes()
+ lenb := uint64(len(b))
+ lo := clamp(uint64(off), 0, lenb)
+ hi := clamp(lo+uint64(n), 0, lenb)
+ return b[lo:hi], nil
+}
+
+func (r *RootDir) Write(off p9.Offset, b []byte) (p9.Count, error) { return 0, ErrPerm }
+
+func (r *RootDir) Create(name string, perm p9.Perm, mode p9.Mode) (File, error) { return nil, ErrPerm }
+
+func (r *RootDir) Walk(name string) (File, error) {
+ switch name {
+ case "users":
+ return r.UsersDir, nil
+ case "sessions":
+ return r.SessionsDir, nil
+ default:
+ return nil, ErrFileNotExist
+ }
+}
+
+func clamp(x, min, max uint64) uint64 {
+ if x < min {
+ x = min
+ }
+ if x > max {
+ x = max
+ }
+ return x
+}