diff options
Diffstat (limited to 'back')
| -rw-r--r-- | back/cmd/authfs/authfs.go | 20 | ||||
| -rw-r--r-- | back/cmd/authfs/root.go | 38 | ||||
| -rw-r--r-- | back/cmd/authfs/rootdir.go | 112 |
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 +} |