40 lines
847 B
Go
40 lines
847 B
Go
//go:build unix && !openbsd && !solaris
|
|
|
|
package xattr
|
|
|
|
import (
|
|
"io/fs"
|
|
"strings"
|
|
|
|
"golang.org/x/sys/unix"
|
|
)
|
|
|
|
func List(p string) ([]string, error) {
|
|
sz, err := unix.Listxattr(p, nil)
|
|
if err != nil {
|
|
return nil, &fs.PathError{Op: "listxattr-get-size", Path: p, Err: err}
|
|
}
|
|
|
|
b := make([]byte, sz)
|
|
sz, err = unix.Listxattr(p, b)
|
|
if err != nil {
|
|
return nil, &fs.PathError{Op: "listxattr", Path: p, Err: err}
|
|
}
|
|
|
|
return strings.Split(strings.Trim(string(b[:sz]), "\000"), "\000"), nil
|
|
}
|
|
|
|
func Get(p string, attr string) ([]byte, error) {
|
|
sz, err := unix.Getxattr(p, attr, nil)
|
|
if err != nil {
|
|
return nil, &fs.PathError{Op: "getxattr-get-size", Path: p, Err: err}
|
|
}
|
|
|
|
b := make([]byte, sz)
|
|
sz, err = unix.Getxattr(p, attr, b)
|
|
if err != nil {
|
|
return nil, &fs.PathError{Op: "getxattr", Path: p, Err: err}
|
|
}
|
|
return b[:sz], nil
|
|
}
|