diff options
| author | Ankush Patel | 2026-02-05 14:42:40 +1300 |
|---|---|---|
| committer | Ankush Patel | 2026-02-14 03:32:14 +1300 |
| commit | 903fc9d077a81d9224de4207d1672c0b1127cf42 (patch) | |
| tree | 05ae39d5ebbe41bb64d41d7e0f03df7dac596dae /internal/fusefrontend | |
| parent | 3191c18f67346c95e4dbdfd16b44256ddfe20b4f (diff) | |
Added basic support for FreeBSD.
Diffstat (limited to 'internal/fusefrontend')
| -rw-r--r-- | internal/fusefrontend/node_xattr_freebsd.go | 72 |
1 files changed, 72 insertions, 0 deletions
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 +} |
