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) +} | 
