mirror of
https://github.com/vbatts/go-mtree.git
synced 2024-11-25 01:25:39 +00:00
xattr: simple wrapper for syscalls
Signed-off-by: Vincent Batts <vbatts@hashbangbash.com>
This commit is contained in:
parent
ec1977017d
commit
2d3aea8623
3 changed files with 86 additions and 0 deletions
35
xattr/xattr.go
Normal file
35
xattr/xattr.go
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
// +build linux
|
||||||
|
|
||||||
|
package xattr
|
||||||
|
|
||||||
|
import (
|
||||||
|
"strings"
|
||||||
|
"syscall"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Get returns the extended attributes (xattr) on file `path`, for the given `name`.
|
||||||
|
func Get(path, name string) ([]byte, error) {
|
||||||
|
dest := make([]byte, 1024)
|
||||||
|
i, err := syscall.Getxattr(path, name, dest)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return dest[:i], nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set sets the extended attributes (xattr) on file `path`, for the given `name` and `value`
|
||||||
|
func Set(path, name string, value []byte) error {
|
||||||
|
return syscall.Setxattr(path, name, value, 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
// List returns a list of all the extended attributes (xattr) for file `path`
|
||||||
|
func List(path string) ([]string, error) {
|
||||||
|
dest := make([]byte, 1024)
|
||||||
|
i, err := syscall.Listxattr(path, dest)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return strings.Split(strings.TrimRight(string(dest[:i]), nilByte), nilByte), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
const nilByte = "\x00"
|
38
xattr/xattr_test.go
Normal file
38
xattr/xattr_test.go
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
package xattr
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"io/ioutil"
|
||||||
|
"os"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestXattr(t *testing.T) {
|
||||||
|
fh, err := ioutil.TempFile(".", "xattr.")
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
defer os.Remove(fh.Name())
|
||||||
|
if err := fh.Close(); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
expected := []byte("1234")
|
||||||
|
if err := Set(fh.Name(), "user.testing", expected); err != nil {
|
||||||
|
t.Fatal(fh.Name(), err)
|
||||||
|
}
|
||||||
|
l, err := List(fh.Name())
|
||||||
|
if err != nil {
|
||||||
|
t.Error(fh.Name(), err)
|
||||||
|
}
|
||||||
|
if !(len(l) > 0) {
|
||||||
|
t.Errorf("%q: expected a list of at least 1; got %d", len(l))
|
||||||
|
}
|
||||||
|
got, err := Get(fh.Name(), "user.testing")
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(fh.Name(), err)
|
||||||
|
}
|
||||||
|
if !bytes.Equal(got, expected) {
|
||||||
|
t.Errorf("%q: expected %q; got %q", fh.Name(), expected, got)
|
||||||
|
}
|
||||||
|
}
|
13
xattr/xattr_unsupported.go
Normal file
13
xattr/xattr_unsupported.go
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
// +build !linux
|
||||||
|
|
||||||
|
package xattr
|
||||||
|
|
||||||
|
func Get(path, name string) ([]byte, error) {
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
func Set(path, name string, value []byte) error {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
func List(path string) ([]string, error) {
|
||||||
|
return nil, nil
|
||||||
|
}
|
Loading…
Reference in a new issue