annotate vendor/golang.org/x/sys/unix/xattr_bsd.go @ 68:4b79810863f6 draft

Ready to release 0.6.0 Signed-off-by: Izuru Yakumo <yakumo.izuru@chaotic.ninja>
author yakumo.izuru
date Wed, 13 Sep 2023 10:49:50 +0000
parents 787b5ee0289d
children
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 destsiz := len(dest)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
164
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
165 // FreeBSD won't allow you to list xattrs from multiple namespaces
68
4b79810863f6 Ready to release 0.6.0
yakumo.izuru
parents: 66
diff changeset
166 s, pos := 0, 0
66
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
167 for _, nsid := range [...]int{EXTATTR_NAMESPACE_USER, EXTATTR_NAMESPACE_SYSTEM} {
68
4b79810863f6 Ready to release 0.6.0
yakumo.izuru
parents: 66
diff changeset
168 stmp, e := ListxattrNS(file, nsid, dest[pos:])
66
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
169
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
170 /* Errors accessing system attrs are ignored so that
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
171 * we can implement the Linux-like behavior of omitting errors that
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
172 * we don't have read permissions on
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
173 *
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
174 * Linux will still error if we ask for user attributes on a file that
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
175 * we don't have read permissions on, so don't ignore those errors
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
176 */
68
4b79810863f6 Ready to release 0.6.0
yakumo.izuru
parents: 66
diff changeset
177 if e != nil {
4b79810863f6 Ready to release 0.6.0
yakumo.izuru
parents: 66
diff changeset
178 if e == EPERM && nsid != EXTATTR_NAMESPACE_USER {
4b79810863f6 Ready to release 0.6.0
yakumo.izuru
parents: 66
diff changeset
179 continue
4b79810863f6 Ready to release 0.6.0
yakumo.izuru
parents: 66
diff changeset
180 }
66
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
68
4b79810863f6 Ready to release 0.6.0
yakumo.izuru
parents: 66
diff changeset
185 pos = s
4b79810863f6 Ready to release 0.6.0
yakumo.izuru
parents: 66
diff changeset
186 if pos > destsiz {
4b79810863f6 Ready to release 0.6.0
yakumo.izuru
parents: 66
diff changeset
187 pos = destsiz
66
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
188 }
68
4b79810863f6 Ready to release 0.6.0
yakumo.izuru
parents: 66
diff changeset
189 }
4b79810863f6 Ready to release 0.6.0
yakumo.izuru
parents: 66
diff changeset
190
4b79810863f6 Ready to release 0.6.0
yakumo.izuru
parents: 66
diff changeset
191 return s, nil
4b79810863f6 Ready to release 0.6.0
yakumo.izuru
parents: 66
diff changeset
192 }
4b79810863f6 Ready to release 0.6.0
yakumo.izuru
parents: 66
diff changeset
193
4b79810863f6 Ready to release 0.6.0
yakumo.izuru
parents: 66
diff changeset
194 func ListxattrNS(file string, nsid int, dest []byte) (sz int, err error) {
4b79810863f6 Ready to release 0.6.0
yakumo.izuru
parents: 66
diff changeset
195 d := initxattrdest(dest, 0)
4b79810863f6 Ready to release 0.6.0
yakumo.izuru
parents: 66
diff changeset
196 destsiz := len(dest)
4b79810863f6 Ready to release 0.6.0
yakumo.izuru
parents: 66
diff changeset
197
4b79810863f6 Ready to release 0.6.0
yakumo.izuru
parents: 66
diff changeset
198 s, e := ExtattrListFile(file, nsid, uintptr(d), destsiz)
4b79810863f6 Ready to release 0.6.0
yakumo.izuru
parents: 66
diff changeset
199 if e != nil {
4b79810863f6 Ready to release 0.6.0
yakumo.izuru
parents: 66
diff changeset
200 return 0, err
66
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
201 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
202
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
203 return s, nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
204 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
205
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
206 func Flistxattr(fd int, dest []byte) (sz int, err error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
207 destsiz := len(dest)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
208
68
4b79810863f6 Ready to release 0.6.0
yakumo.izuru
parents: 66
diff changeset
209 s, pos := 0, 0
66
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
210 for _, nsid := range [...]int{EXTATTR_NAMESPACE_USER, EXTATTR_NAMESPACE_SYSTEM} {
68
4b79810863f6 Ready to release 0.6.0
yakumo.izuru
parents: 66
diff changeset
211 stmp, e := FlistxattrNS(fd, nsid, dest[pos:])
4b79810863f6 Ready to release 0.6.0
yakumo.izuru
parents: 66
diff changeset
212
4b79810863f6 Ready to release 0.6.0
yakumo.izuru
parents: 66
diff changeset
213 if e != nil {
4b79810863f6 Ready to release 0.6.0
yakumo.izuru
parents: 66
diff changeset
214 if e == EPERM && nsid != EXTATTR_NAMESPACE_USER {
4b79810863f6 Ready to release 0.6.0
yakumo.izuru
parents: 66
diff changeset
215 continue
4b79810863f6 Ready to release 0.6.0
yakumo.izuru
parents: 66
diff changeset
216 }
66
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
217 return s, e
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
218 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
219
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
220 s += stmp
68
4b79810863f6 Ready to release 0.6.0
yakumo.izuru
parents: 66
diff changeset
221 pos = s
4b79810863f6 Ready to release 0.6.0
yakumo.izuru
parents: 66
diff changeset
222 if pos > destsiz {
4b79810863f6 Ready to release 0.6.0
yakumo.izuru
parents: 66
diff changeset
223 pos = destsiz
66
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
224 }
68
4b79810863f6 Ready to release 0.6.0
yakumo.izuru
parents: 66
diff changeset
225 }
4b79810863f6 Ready to release 0.6.0
yakumo.izuru
parents: 66
diff changeset
226
4b79810863f6 Ready to release 0.6.0
yakumo.izuru
parents: 66
diff changeset
227 return s, nil
4b79810863f6 Ready to release 0.6.0
yakumo.izuru
parents: 66
diff changeset
228 }
4b79810863f6 Ready to release 0.6.0
yakumo.izuru
parents: 66
diff changeset
229
4b79810863f6 Ready to release 0.6.0
yakumo.izuru
parents: 66
diff changeset
230 func FlistxattrNS(fd int, nsid int, dest []byte) (sz int, err error) {
4b79810863f6 Ready to release 0.6.0
yakumo.izuru
parents: 66
diff changeset
231 d := initxattrdest(dest, 0)
4b79810863f6 Ready to release 0.6.0
yakumo.izuru
parents: 66
diff changeset
232 destsiz := len(dest)
4b79810863f6 Ready to release 0.6.0
yakumo.izuru
parents: 66
diff changeset
233
4b79810863f6 Ready to release 0.6.0
yakumo.izuru
parents: 66
diff changeset
234 s, e := ExtattrListFd(fd, nsid, uintptr(d), destsiz)
4b79810863f6 Ready to release 0.6.0
yakumo.izuru
parents: 66
diff changeset
235 if e != nil {
4b79810863f6 Ready to release 0.6.0
yakumo.izuru
parents: 66
diff changeset
236 return 0, err
66
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
237 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
238
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
239 return s, nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
240 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
241
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
242 func Llistxattr(link string, dest []byte) (sz int, err error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
243 destsiz := len(dest)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
244
68
4b79810863f6 Ready to release 0.6.0
yakumo.izuru
parents: 66
diff changeset
245 s, pos := 0, 0
66
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
246 for _, nsid := range [...]int{EXTATTR_NAMESPACE_USER, EXTATTR_NAMESPACE_SYSTEM} {
68
4b79810863f6 Ready to release 0.6.0
yakumo.izuru
parents: 66
diff changeset
247 stmp, e := LlistxattrNS(link, nsid, dest[pos:])
4b79810863f6 Ready to release 0.6.0
yakumo.izuru
parents: 66
diff changeset
248
4b79810863f6 Ready to release 0.6.0
yakumo.izuru
parents: 66
diff changeset
249 if e != nil {
4b79810863f6 Ready to release 0.6.0
yakumo.izuru
parents: 66
diff changeset
250 if e == EPERM && nsid != EXTATTR_NAMESPACE_USER {
4b79810863f6 Ready to release 0.6.0
yakumo.izuru
parents: 66
diff changeset
251 continue
4b79810863f6 Ready to release 0.6.0
yakumo.izuru
parents: 66
diff changeset
252 }
66
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
253 return s, e
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
254 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
255
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
256 s += stmp
68
4b79810863f6 Ready to release 0.6.0
yakumo.izuru
parents: 66
diff changeset
257 pos = s
4b79810863f6 Ready to release 0.6.0
yakumo.izuru
parents: 66
diff changeset
258 if pos > destsiz {
4b79810863f6 Ready to release 0.6.0
yakumo.izuru
parents: 66
diff changeset
259 pos = destsiz
66
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
260 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
261 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
262
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
263 return s, nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
264 }
68
4b79810863f6 Ready to release 0.6.0
yakumo.izuru
parents: 66
diff changeset
265
4b79810863f6 Ready to release 0.6.0
yakumo.izuru
parents: 66
diff changeset
266 func LlistxattrNS(link string, nsid int, dest []byte) (sz int, err error) {
4b79810863f6 Ready to release 0.6.0
yakumo.izuru
parents: 66
diff changeset
267 d := initxattrdest(dest, 0)
4b79810863f6 Ready to release 0.6.0
yakumo.izuru
parents: 66
diff changeset
268 destsiz := len(dest)
4b79810863f6 Ready to release 0.6.0
yakumo.izuru
parents: 66
diff changeset
269
4b79810863f6 Ready to release 0.6.0
yakumo.izuru
parents: 66
diff changeset
270 s, e := ExtattrListLink(link, nsid, uintptr(d), destsiz)
4b79810863f6 Ready to release 0.6.0
yakumo.izuru
parents: 66
diff changeset
271 if e != nil {
4b79810863f6 Ready to release 0.6.0
yakumo.izuru
parents: 66
diff changeset
272 return 0, err
4b79810863f6 Ready to release 0.6.0
yakumo.izuru
parents: 66
diff changeset
273 }
4b79810863f6 Ready to release 0.6.0
yakumo.izuru
parents: 66
diff changeset
274
4b79810863f6 Ready to release 0.6.0
yakumo.izuru
parents: 66
diff changeset
275 return s, nil
4b79810863f6 Ready to release 0.6.0
yakumo.izuru
parents: 66
diff changeset
276 }