diff options
Diffstat (limited to 'test/fuse_integration/xattr_darwin.go')
| -rw-r--r-- | test/fuse_integration/xattr_darwin.go | 125 |
1 files changed, 125 insertions, 0 deletions
diff --git a/test/fuse_integration/xattr_darwin.go b/test/fuse_integration/xattr_darwin.go new file mode 100644 index 000000000..6bd6f2a90 --- /dev/null +++ b/test/fuse_integration/xattr_darwin.go @@ -0,0 +1,125 @@ +//go:build darwin + +package fuse + +import ( + "syscall" + "unsafe" +) + +// Extended attributes support for macOS + +const ( + // macOS-specific flags + XATTR_NOFOLLOW = 0x0001 + XATTR_CREATE = 0x0002 + XATTR_REPLACE = 0x0004 +) + +func setXattr(path, name string, value []byte, flags int) error { + pathBytes, err := syscall.BytePtrFromString(path) + if err != nil { + return err + } + nameBytes, err := syscall.BytePtrFromString(name) + if err != nil { + return err + } + + var valuePtr unsafe.Pointer + if len(value) > 0 { + valuePtr = unsafe.Pointer(&value[0]) + } + + _, _, errno := syscall.Syscall6(syscall.SYS_SETXATTR, + uintptr(unsafe.Pointer(pathBytes)), + uintptr(unsafe.Pointer(nameBytes)), + uintptr(valuePtr), + uintptr(len(value)), + uintptr(0), // position (not used for regular files) + uintptr(flags)) + + if errno != 0 { + return errno + } + return nil +} + +func getXattr(path, name string, value []byte) (int, error) { + pathBytes, err := syscall.BytePtrFromString(path) + if err != nil { + return 0, err + } + nameBytes, err := syscall.BytePtrFromString(name) + if err != nil { + return 0, err + } + + var valuePtr unsafe.Pointer + if len(value) > 0 { + valuePtr = unsafe.Pointer(&value[0]) + } + + size, _, errno := syscall.Syscall6(syscall.SYS_GETXATTR, + uintptr(unsafe.Pointer(pathBytes)), + uintptr(unsafe.Pointer(nameBytes)), + uintptr(valuePtr), + uintptr(len(value)), + uintptr(0), // position + uintptr(0)) // options + + if errno != 0 { + return 0, errno + } + return int(size), nil +} + +func listXattr(path string, list []byte) (int, error) { + pathBytes, err := syscall.BytePtrFromString(path) + if err != nil { + return 0, err + } + + var listPtr unsafe.Pointer + if len(list) > 0 { + listPtr = unsafe.Pointer(&list[0]) + } + + size, _, errno := syscall.Syscall6(syscall.SYS_LISTXATTR, + uintptr(unsafe.Pointer(pathBytes)), + uintptr(listPtr), + uintptr(len(list)), + uintptr(0), // options + 0, 0) + + if errno != 0 { + return 0, errno + } + return int(size), nil +} + +func removeXattr(path, name string) error { + pathBytes, err := syscall.BytePtrFromString(path) + if err != nil { + return err + } + nameBytes, err := syscall.BytePtrFromString(name) + if err != nil { + return err + } + + _, _, errno := syscall.Syscall6(syscall.SYS_REMOVEXATTR, + uintptr(unsafe.Pointer(pathBytes)), + uintptr(unsafe.Pointer(nameBytes)), + uintptr(0), // options + 0, 0, 0) + + if errno != 0 { + return errno + } + return nil +} + +func isXattrSupported() bool { + return true +} |
