|
|
@@ -176,9 +176,7 @@ func Getfsstat(buf []Statfs_t, flags int) (n int, err error) {
|
|
|
return
|
|
|
}
|
|
|
|
|
|
-//sys getxattr(path string, attr string, dest *byte, size int, position uint32, options int) (sz int, err error)
|
|
|
-
|
|
|
-func Getxattr(path string, attr string, dest []byte) (sz int, err error) {
|
|
|
+func xattrPointer(dest []byte) *byte {
|
|
|
// It's only when dest is set to NULL that the OS X implementations of
|
|
|
// getxattr() and listxattr() return the current sizes of the named attributes.
|
|
|
// An empty byte array is not sufficient. To maintain the same behaviour as the
|
|
|
@@ -188,7 +186,17 @@ func Getxattr(path string, attr string, dest []byte) (sz int, err error) {
|
|
|
if len(dest) > 0 {
|
|
|
destp = &dest[0]
|
|
|
}
|
|
|
- return getxattr(path, attr, destp, len(dest), 0, 0)
|
|
|
+ return destp
|
|
|
+}
|
|
|
+
|
|
|
+//sys getxattr(path string, attr string, dest *byte, size int, position uint32, options int) (sz int, err error)
|
|
|
+
|
|
|
+func Getxattr(path string, attr string, dest []byte) (sz int, err error) {
|
|
|
+ return getxattr(path, attr, xattrPointer(dest), len(dest), 0, 0)
|
|
|
+}
|
|
|
+
|
|
|
+func Lgetxattr(link string, attr string, dest []byte) (sz int, err error) {
|
|
|
+ return getxattr(link, attr, xattrPointer(dest), len(dest), 0, XATTR_NOFOLLOW)
|
|
|
}
|
|
|
|
|
|
//sys setxattr(path string, attr string, data *byte, size int, position uint32, options int) (err error)
|
|
|
@@ -220,11 +228,11 @@ func Setxattr(path string, attr string, data []byte, flags int) (err error) {
|
|
|
// current implementation, only the resource fork extended attribute makes
|
|
|
// use of this argument. For all others, position is reserved. We simply
|
|
|
// default to setting it to zero.
|
|
|
- var datap *byte
|
|
|
- if len(data) > 0 {
|
|
|
- datap = &data[0]
|
|
|
- }
|
|
|
- return setxattr(path, attr, datap, len(data), 0, flags)
|
|
|
+ return setxattr(path, attr, xattrPointer(data), len(data), 0, flags)
|
|
|
+}
|
|
|
+
|
|
|
+func Lsetxattr(link string, attr string, data []byte, flags int) (err error) {
|
|
|
+ return setxattr(link, attr, xattrPointer(data), len(data), 0, flags|XATTR_NOFOLLOW)
|
|
|
}
|
|
|
|
|
|
//sys removexattr(path string, attr string, options int) (err error)
|
|
|
@@ -236,15 +244,18 @@ func Removexattr(path string, attr string) (err error) {
|
|
|
return removexattr(path, attr, 0)
|
|
|
}
|
|
|
|
|
|
+func Lremovexattr(link string, attr string) (err error) {
|
|
|
+ return removexattr(link, attr, XATTR_NOFOLLOW)
|
|
|
+}
|
|
|
+
|
|
|
//sys listxattr(path string, dest *byte, size int, options int) (sz int, err error)
|
|
|
|
|
|
func Listxattr(path string, dest []byte) (sz int, err error) {
|
|
|
- // See comment in Getxattr for as to why Listxattr is implemented as such.
|
|
|
- var destp *byte
|
|
|
- if len(dest) > 0 {
|
|
|
- destp = &dest[0]
|
|
|
- }
|
|
|
- return listxattr(path, destp, len(dest), 0)
|
|
|
+ return listxattr(path, xattrPointer(dest), len(dest), 0)
|
|
|
+}
|
|
|
+
|
|
|
+func Llistxattr(link string, dest []byte) (sz int, err error) {
|
|
|
+ return listxattr(link, xattrPointer(dest), len(dest), XATTR_NOFOLLOW)
|
|
|
}
|
|
|
|
|
|
func setattrlistTimes(path string, times []Timespec, flags int) error {
|