From 903fc9d077a81d9224de4207d1672c0b1127cf42 Mon Sep 17 00:00:00 2001 From: Ankush Patel Date: Thu, 5 Feb 2026 14:42:40 +1300 Subject: Added basic support for FreeBSD. --- internal/fusefrontend/node_xattr_freebsd.go | 72 +++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 internal/fusefrontend/node_xattr_freebsd.go (limited to 'internal/fusefrontend') diff --git a/internal/fusefrontend/node_xattr_freebsd.go b/internal/fusefrontend/node_xattr_freebsd.go new file mode 100644 index 0000000..770bb95 --- /dev/null +++ b/internal/fusefrontend/node_xattr_freebsd.go @@ -0,0 +1,72 @@ +package fusefrontend + +import ( + "fmt" + + "golang.org/x/sys/unix" + + "github.com/hanwen/go-fuse/v2/fs" + "github.com/hanwen/go-fuse/v2/fuse" + + "github.com/rfjakob/gocryptfs/v2/internal/syscallcompat" +) + +// On FreeBSD, ENODATA is returned when an attribute is not found. +const noSuchAttributeError = unix.ENOATTR + +func filterXattrSetFlags(flags int) int { + return flags +} + +func (n *Node) getXAttr(cAttr string) (out []byte, errno unix.Errno) { + dirfd, cName, errno := n.prepareAtSyscallMyself() + if errno != 0 { + return + } + defer unix.Close(dirfd) + + procPath := fmt.Sprintf("/proc/self/fd/%d/%s", dirfd, cName) + cData, err := syscallcompat.Lgetxattr(procPath, cAttr) + if err != nil { + return nil, fs.ToErrno(err) + } + return cData, 0 +} + +func (n *Node) setXAttr(context *fuse.Context, cAttr string, cData []byte, flags uint32) (errno unix.Errno) { + dirfd, cName, errno := n.prepareAtSyscallMyself() + if errno != 0 { + return + } + defer unix.Close(dirfd) + + procPath := fmt.Sprintf("/proc/self/fd/%d/%s", dirfd, cName) + + return fs.ToErrno(syscallcompat.LsetxattrUser(procPath, cAttr, cData, int(flags), context)) +} + +func (n *Node) removeXAttr(cAttr string) (errno unix.Errno) { + dirfd, cName, errno := n.prepareAtSyscallMyself() + if errno != 0 { + return + } + defer unix.Close(dirfd) + + procPath := fmt.Sprintf("/proc/self/fd/%d/%s", dirfd, cName) + return fs.ToErrno(unix.Lremovexattr(procPath, cAttr)) +} + +func (n *Node) listXAttr() (out []string, errno unix.Errno) { + dirfd, cName, errno := n.prepareAtSyscallMyself() + if errno != 0 { + return + } + defer unix.Close(dirfd) + + procPath := fmt.Sprintf("/proc/self/fd/%d/%s", dirfd, cName) + cNames, err := syscallcompat.Llistxattr(procPath) + if err != nil { + return nil, fs.ToErrno(err) + } + return cNames, 0 +} -- cgit v1.2.3