diff options
Diffstat (limited to 'internal/fusefrontend')
-rw-r--r-- | internal/fusefrontend/node.go | 52 | ||||
-rw-r--r-- | internal/fusefrontend/node_helpers.go | 52 |
2 files changed, 52 insertions, 52 deletions
diff --git a/internal/fusefrontend/node.go b/internal/fusefrontend/node.go index 7505f92..fb38362 100644 --- a/internal/fusefrontend/node.go +++ b/internal/fusefrontend/node.go @@ -3,7 +3,6 @@ package fusefrontend import ( "context" "os" - "path/filepath" "syscall" "golang.org/x/sys/unix" @@ -22,40 +21,6 @@ type Node struct { fs.Inode } -// Path returns the relative plaintext path of this node -func (n *Node) Path() string { - return n.Inode.Path(n.Root()) -} - -// rootNode returns the Root Node of the filesystem. -func (n *Node) rootNode() *RootNode { - return n.Root().Operations().(*RootNode) -} - -// prepareAtSyscall returns a (dirfd, cName) pair that can be used -// with the "___at" family of system calls (openat, fstatat, unlinkat...) to -// access the backing encrypted directory. -// -// If you pass a `child` file name, the (dirfd, cName) pair will refer to -// a child of this node. -// If `child` is empty, the (dirfd, cName) pair refers to this node itself. -func (n *Node) prepareAtSyscall(child string) (dirfd int, cName string, errno syscall.Errno) { - p := n.Path() - if child != "" { - p = filepath.Join(p, child) - } - rn := n.rootNode() - if rn.isFiltered(p) { - errno = syscall.EPERM - return - } - dirfd, cName, err := rn.openBackingDir(p) - if err != nil { - errno = fs.ToErrno(err) - } - return -} - // Lookup - FUSE call for discovering a file. func (n *Node) Lookup(ctx context.Context, name string, out *fuse.EntryOut) (ch *fs.Inode, errno syscall.Errno) { dirfd, cName, errno := n.prepareAtSyscall(name) @@ -113,23 +78,6 @@ func (n *Node) Getattr(ctx context.Context, f fs.FileHandle, out *fuse.AttrOut) return 0 } -// newChild attaches a new child inode to n. -// The passed-in `st` will be modified to get a unique inode number. -func (n *Node) newChild(ctx context.Context, st *syscall.Stat_t, out *fuse.EntryOut) *fs.Inode { - // Get unique inode number - rn := n.rootNode() - rn.inoMap.TranslateStat(st) - out.Attr.FromStat(st) - // Create child node - id := fs.StableAttr{ - Mode: uint32(st.Mode), - Gen: 1, - Ino: st.Ino, - } - node := &Node{} - return n.NewInode(ctx, node, id) -} - // Create - FUSE call. Creates a new file. // // Symlink-safe through the use of Openat(). diff --git a/internal/fusefrontend/node_helpers.go b/internal/fusefrontend/node_helpers.go index a31a41d..ad92043 100644 --- a/internal/fusefrontend/node_helpers.go +++ b/internal/fusefrontend/node_helpers.go @@ -2,6 +2,7 @@ package fusefrontend import ( "context" + "path/filepath" "syscall" "github.com/hanwen/go-fuse/v2/fs" @@ -63,3 +64,54 @@ func (n *Node) translateSize(dirfd int, cName string, out *fuse.Attr) { out.Size = uint64(len(target)) } } + +// Path returns the relative plaintext path of this node +func (n *Node) Path() string { + return n.Inode.Path(n.Root()) +} + +// rootNode returns the Root Node of the filesystem. +func (n *Node) rootNode() *RootNode { + return n.Root().Operations().(*RootNode) +} + +// prepareAtSyscall returns a (dirfd, cName) pair that can be used +// with the "___at" family of system calls (openat, fstatat, unlinkat...) to +// access the backing encrypted directory. +// +// If you pass a `child` file name, the (dirfd, cName) pair will refer to +// a child of this node. +// If `child` is empty, the (dirfd, cName) pair refers to this node itself. +func (n *Node) prepareAtSyscall(child string) (dirfd int, cName string, errno syscall.Errno) { + p := n.Path() + if child != "" { + p = filepath.Join(p, child) + } + rn := n.rootNode() + if rn.isFiltered(p) { + errno = syscall.EPERM + return + } + dirfd, cName, err := rn.openBackingDir(p) + if err != nil { + errno = fs.ToErrno(err) + } + return +} + +// newChild attaches a new child inode to n. +// The passed-in `st` will be modified to get a unique inode number. +func (n *Node) newChild(ctx context.Context, st *syscall.Stat_t, out *fuse.EntryOut) *fs.Inode { + // Get unique inode number + rn := n.rootNode() + rn.inoMap.TranslateStat(st) + out.Attr.FromStat(st) + // Create child node + id := fs.StableAttr{ + Mode: uint32(st.Mode), + Gen: 1, + Ino: st.Ino, + } + node := &Node{} + return n.NewInode(ctx, node, id) +} |