1 package selinux
2
3 import (
4 "golang.org/x/sys/unix"
5 )
6
7
8
9 func lgetxattr(path, attr string) ([]byte, error) {
10
11 dest := make([]byte, 128)
12 sz, errno := doLgetxattr(path, attr, dest)
13 for errno == unix.ERANGE {
14
15 sz, errno = doLgetxattr(path, attr, []byte{})
16 if errno != nil {
17 return nil, errno
18 }
19
20 dest = make([]byte, sz)
21 sz, errno = doLgetxattr(path, attr, dest)
22 }
23 if errno != nil {
24 return nil, errno
25 }
26
27 return dest[:sz], nil
28 }
29
30
31 func doLgetxattr(path, attr string, dest []byte) (int, error) {
32 for {
33 sz, err := unix.Lgetxattr(path, attr, dest)
34 if err != unix.EINTR {
35 return sz, err
36 }
37 }
38 }
39
40
41
42 func getxattr(path, attr string) ([]byte, error) {
43
44 dest := make([]byte, 128)
45 sz, errno := dogetxattr(path, attr, dest)
46 for errno == unix.ERANGE {
47
48 sz, errno = dogetxattr(path, attr, []byte{})
49 if errno != nil {
50 return nil, errno
51 }
52
53 dest = make([]byte, sz)
54 sz, errno = dogetxattr(path, attr, dest)
55 }
56 if errno != nil {
57 return nil, errno
58 }
59
60 return dest[:sz], nil
61 }
62
63
64 func dogetxattr(path, attr string, dest []byte) (int, error) {
65 for {
66 sz, err := unix.Getxattr(path, attr, dest)
67 if err != unix.EINTR {
68 return sz, err
69 }
70 }
71 }
72
View as plain text