forked from containerd/continuity
/
xattrs_darwin.go
136 lines (126 loc) · 3.59 KB
/
xattrs_darwin.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
package continuity
import (
"syscall"
"unsafe"
"golang.org/x/sys/unix"
)
// These functions were generated using golang.org/x/sys/unix package. They can be removed once the sys package gets xattr
// support on darwin. First, the following diff was applied to syscall_darwin.go:
//
// diff --git a/unix/syscall_darwin.go b/unix/syscall_darwin.go
// index 0d1771c..dd2f843 100644
// --- a/unix/syscall_darwin.go
// +++ b/unix/syscall_darwin.go
// @@ -352,6 +352,10 @@ func Kill(pid int, signum syscall.Signal) (err error) { return kill(pid, int(sig
// // Waitevent
// // Modwatch
// // Getxattr
// +//sys Getxattr(path string, attr string, dest []byte) (sz int, err error)
// +//sys Listxattr(path string, dest []byte, flags int) (sz int, err error)
// +//sys Removexattr(path string, attr string) (err error)
// +//sys Setxattr(path string, attr string, data []byte, flags int) (err error)
// // Fgetxattr
// // Setxattr
// // Fsetxattr
//
// The following command was run to generate the extra syscalls:
//
// $ GOOS=darwin GOARCH=amd64 ./mksyscall.pl syscall_bsd.go syscall_darwin.go syscall_darwin_amd64.go > zsyscall_darwin_amd64.go
//
// Once generated, these functions were manually dropped into this file.
func getxattr(path string, attr string, dest []byte) (sz int, err error) {
var _p0 *byte
_p0, err = unix.BytePtrFromString(path)
if err != nil {
return
}
var _p1 *byte
_p1, err = unix.BytePtrFromString(attr)
if err != nil {
return
}
var _p2 unsafe.Pointer
if len(dest) > 0 {
_p2 = unsafe.Pointer(&dest[0])
} else {
_p2 = unsafe.Pointer(&_zero)
}
r0, _, e1 := unix.Syscall6(unix.SYS_GETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0)
use(unsafe.Pointer(_p0))
use(unsafe.Pointer(_p1))
sz = int(r0)
if e1 != 0 {
err = syscall.Errno(e1)
}
return
}
func listxattr(path string, dest []byte, flags int) (sz int, err error) {
var _p0 *byte
_p0, err = unix.BytePtrFromString(path)
if err != nil {
return
}
var _p1 unsafe.Pointer
if len(dest) > 0 {
_p1 = unsafe.Pointer(&dest[0])
} else {
_p1 = unsafe.Pointer(&_zero)
}
r0, _, e1 := unix.Syscall6(unix.SYS_LISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest)), uintptr(flags), 0, 0)
use(unsafe.Pointer(_p0))
sz = int(r0)
if e1 != 0 {
err = syscall.Errno(e1)
}
return
}
func removexattr(path string, attr string) (err error) {
var _p0 *byte
_p0, err = unix.BytePtrFromString(path)
if err != nil {
return
}
var _p1 *byte
_p1, err = unix.BytePtrFromString(attr)
if err != nil {
return
}
_, _, e1 := unix.Syscall(unix.SYS_REMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0)
use(unsafe.Pointer(_p0))
use(unsafe.Pointer(_p1))
if e1 != 0 {
err = syscall.Errno(e1)
}
return
}
func setxattr(path string, attr string, data []byte, flags int) (err error) {
var _p0 *byte
_p0, err = unix.BytePtrFromString(path)
if err != nil {
return
}
var _p1 *byte
_p1, err = unix.BytePtrFromString(attr)
if err != nil {
return
}
var _p2 unsafe.Pointer
if len(data) > 0 {
_p2 = unsafe.Pointer(&data[0])
} else {
_p2 = unsafe.Pointer(&_zero)
}
_, _, e1 := unix.Syscall6(unix.SYS_SETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0)
use(unsafe.Pointer(_p0))
use(unsafe.Pointer(_p1))
if e1 != 0 {
err = syscall.Errno(e1)
}
return
}
// redefinitions from sys/unix below here.
var _zero uintptr
// use is a no-op, but the compiler cannot see that it is.
// Calling use(p) ensures that p is kept live until that point.
//go:noescape
func use(p unsafe.Pointer)