xattrs.go 896 B

12345678910111213141516171819202122232425262728293031323334353637383940
  1. // +build selinux,linux
  2. package selinux
  3. import (
  4. "golang.org/x/sys/unix"
  5. )
  6. // lgetxattr returns a []byte slice containing the value of
  7. // an extended attribute attr set for path.
  8. func lgetxattr(path, attr string) ([]byte, error) {
  9. // Start with a 128 length byte array
  10. dest := make([]byte, 128)
  11. sz, errno := doLgetxattr(path, attr, dest)
  12. for errno == unix.ERANGE {
  13. // Buffer too small, use zero-sized buffer to get the actual size
  14. sz, errno = doLgetxattr(path, attr, []byte{})
  15. if errno != nil {
  16. return nil, errno
  17. }
  18. dest = make([]byte, sz)
  19. sz, errno = doLgetxattr(path, attr, dest)
  20. }
  21. if errno != nil {
  22. return nil, errno
  23. }
  24. return dest[:sz], nil
  25. }
  26. // doLgetxattr is a wrapper that retries on EINTR
  27. func doLgetxattr(path, attr string, dest []byte) (int, error) {
  28. for {
  29. sz, err := unix.Lgetxattr(path, attr, dest)
  30. if err != unix.EINTR {
  31. return sz, err
  32. }
  33. }
  34. }