diff options
author | Jakob Unterwurzacher | 2020-08-01 19:26:42 +0200 |
---|---|---|
committer | Jakob Unterwurzacher | 2020-08-01 19:26:42 +0200 |
commit | 1867fdaef4b0b602e24c7a6bc070dd21c05526d8 (patch) | |
tree | 4ab30766ee0e6324a7e54fd476adaca5308a31e6 /internal/fusefrontend/node_helpers.go | |
parent | 8afbbc86d170c49bbbdd801f43cd77774bcde13e (diff) |
v2api: move helpers from node.go to node_helpers.go
Diffstat (limited to 'internal/fusefrontend/node_helpers.go')
-rw-r--r-- | internal/fusefrontend/node_helpers.go | 52 |
1 files changed, 52 insertions, 0 deletions
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) +} |