annotate vendor/golang.org/x/sys/unix/xattr_bsd.go @ 67:4edfa07d5fe0 draft

bfchroma turned out to be a hassle Signed-off-by: Izuru Yakumo <yakumo.izuru@chaotic.ninja>
author yakumo.izuru
date Thu, 07 Sep 2023 16:52:43 +0000
parents 787b5ee0289d
children 4b79810863f6
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
66
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1 // Copyright 2018 The Go Authors. All rights reserved.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
2 // Use of this source code is governed by a BSD-style
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
3 // license that can be found in the LICENSE file.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
4
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
5 //go:build freebsd || netbsd
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
6 // +build freebsd netbsd
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
7
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
8 package unix
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
9
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
10 import (
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
11 "strings"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
12 "unsafe"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
13 )
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
14
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
15 // Derive extattr namespace and attribute name
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
16
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
17 func xattrnamespace(fullattr string) (ns int, attr string, err error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
18 s := strings.IndexByte(fullattr, '.')
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
19 if s == -1 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
20 return -1, "", ENOATTR
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
21 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
22
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
23 namespace := fullattr[0:s]
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
24 attr = fullattr[s+1:]
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
25
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
26 switch namespace {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
27 case "user":
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
28 return EXTATTR_NAMESPACE_USER, attr, nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
29 case "system":
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
30 return EXTATTR_NAMESPACE_SYSTEM, attr, nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
31 default:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
32 return -1, "", ENOATTR
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
33 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
34 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
35
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
36 func initxattrdest(dest []byte, idx int) (d unsafe.Pointer) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
37 if len(dest) > idx {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
38 return unsafe.Pointer(&dest[idx])
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
39 } else {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
40 return unsafe.Pointer(_zero)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
41 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
42 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
43
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
44 // FreeBSD and NetBSD implement their own syscalls to handle extended attributes
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
45
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
46 func Getxattr(file string, attr string, dest []byte) (sz int, err error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
47 d := initxattrdest(dest, 0)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
48 destsize := len(dest)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
49
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
50 nsid, a, err := xattrnamespace(attr)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
51 if err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
52 return -1, err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
53 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
54
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
55 return ExtattrGetFile(file, nsid, a, uintptr(d), destsize)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
56 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
57
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
58 func Fgetxattr(fd int, attr string, dest []byte) (sz int, err error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
59 d := initxattrdest(dest, 0)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
60 destsize := len(dest)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
61
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
62 nsid, a, err := xattrnamespace(attr)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
63 if err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
64 return -1, err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
65 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
66
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
67 return ExtattrGetFd(fd, nsid, a, uintptr(d), destsize)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
68 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
69
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
70 func Lgetxattr(link string, attr string, dest []byte) (sz int, err error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
71 d := initxattrdest(dest, 0)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
72 destsize := len(dest)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
73
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
74 nsid, a, err := xattrnamespace(attr)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
75 if err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
76 return -1, err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
77 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
78
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
79 return ExtattrGetLink(link, nsid, a, uintptr(d), destsize)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
80 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
81
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
82 // flags are unused on FreeBSD
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
83
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
84 func Fsetxattr(fd int, attr string, data []byte, flags int) (err error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
85 var d unsafe.Pointer
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
86 if len(data) > 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
87 d = unsafe.Pointer(&data[0])
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
88 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
89 datasiz := len(data)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
90
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
91 nsid, a, err := xattrnamespace(attr)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
92 if err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
93 return
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
94 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
95
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
96 _, err = ExtattrSetFd(fd, nsid, a, uintptr(d), datasiz)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
97 return
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
98 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
99
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
100 func Setxattr(file string, attr string, data []byte, flags int) (err error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
101 var d unsafe.Pointer
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
102 if len(data) > 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
103 d = unsafe.Pointer(&data[0])
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
104 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
105 datasiz := len(data)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
106
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
107 nsid, a, err := xattrnamespace(attr)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
108 if err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
109 return
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
110 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
111
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
112 _, err = ExtattrSetFile(file, nsid, a, uintptr(d), datasiz)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
113 return
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
114 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
115
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
116 func Lsetxattr(link string, attr string, data []byte, flags int) (err error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
117 var d unsafe.Pointer
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
118 if len(data) > 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
119 d = unsafe.Pointer(&data[0])
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
120 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
121 datasiz := len(data)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
122
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
123 nsid, a, err := xattrnamespace(attr)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
124 if err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
125 return
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
126 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
127
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
128 _, err = ExtattrSetLink(link, nsid, a, uintptr(d), datasiz)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
129 return
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
130 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
131
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
132 func Removexattr(file string, attr string) (err error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
133 nsid, a, err := xattrnamespace(attr)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
134 if err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
135 return
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
136 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
137
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
138 err = ExtattrDeleteFile(file, nsid, a)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
139 return
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
140 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
141
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
142 func Fremovexattr(fd int, attr string) (err error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
143 nsid, a, err := xattrnamespace(attr)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
144 if err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
145 return
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
146 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
147
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
148 err = ExtattrDeleteFd(fd, nsid, a)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
149 return
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
150 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
151
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
152 func Lremovexattr(link string, attr string) (err error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
153 nsid, a, err := xattrnamespace(attr)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
154 if err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
155 return
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
156 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
157
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
158 err = ExtattrDeleteLink(link, nsid, a)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
159 return
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
160 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
161
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
162 func Listxattr(file string, dest []byte) (sz int, err error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
163 d := initxattrdest(dest, 0)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
164 destsiz := len(dest)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
165
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
166 // FreeBSD won't allow you to list xattrs from multiple namespaces
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
167 s := 0
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
168 for _, nsid := range [...]int{EXTATTR_NAMESPACE_USER, EXTATTR_NAMESPACE_SYSTEM} {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
169 stmp, e := ExtattrListFile(file, nsid, uintptr(d), destsiz)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
170
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
171 /* Errors accessing system attrs are ignored so that
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
172 * we can implement the Linux-like behavior of omitting errors that
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
173 * we don't have read permissions on
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
174 *
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
175 * Linux will still error if we ask for user attributes on a file that
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
176 * we don't have read permissions on, so don't ignore those errors
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
177 */
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
178 if e != nil && e == EPERM && nsid != EXTATTR_NAMESPACE_USER {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
179 continue
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
180 } else if e != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
181 return s, e
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
182 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
183
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
184 s += stmp
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
185 destsiz -= s
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
186 if destsiz < 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
187 destsiz = 0
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
188 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
189 d = initxattrdest(dest, s)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
190 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
191
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
192 return s, nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
193 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
194
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
195 func Flistxattr(fd int, dest []byte) (sz int, err error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
196 d := initxattrdest(dest, 0)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
197 destsiz := len(dest)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
198
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
199 s := 0
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
200 for _, nsid := range [...]int{EXTATTR_NAMESPACE_USER, EXTATTR_NAMESPACE_SYSTEM} {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
201 stmp, e := ExtattrListFd(fd, nsid, uintptr(d), destsiz)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
202 if e != nil && e == EPERM && nsid != EXTATTR_NAMESPACE_USER {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
203 continue
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
204 } else if e != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
205 return s, e
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
206 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
207
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
208 s += stmp
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
209 destsiz -= s
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
210 if destsiz < 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
211 destsiz = 0
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
212 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
213 d = initxattrdest(dest, s)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
214 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
215
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
216 return s, nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
217 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
218
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
219 func Llistxattr(link string, dest []byte) (sz int, err error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
220 d := initxattrdest(dest, 0)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
221 destsiz := len(dest)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
222
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
223 s := 0
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
224 for _, nsid := range [...]int{EXTATTR_NAMESPACE_USER, EXTATTR_NAMESPACE_SYSTEM} {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
225 stmp, e := ExtattrListLink(link, nsid, uintptr(d), destsiz)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
226 if e != nil && e == EPERM && nsid != EXTATTR_NAMESPACE_USER {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
227 continue
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
228 } else if e != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
229 return s, e
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
230 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
231
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
232 s += stmp
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
233 destsiz -= s
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
234 if destsiz < 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
235 destsiz = 0
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
236 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
237 d = initxattrdest(dest, s)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
238 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
239
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
240 return s, nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
241 }