/
afs_darwin.go
74 lines (61 loc) · 1.15 KB
/
afs_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
// +build darwin
package goafs
import (
"github.com/paypal/gatt/linux/gioctl"
"syscall"
"unsafe"
)
const intSize = 32 + int(^uintptr(0)>>63<<5)
type afsprocdata32 struct {
syscall uintptr
param1 uintptr
param2 uintptr
param3 uintptr
param4 uintptr
param5 uintptr
param6 uintptr
retval uintptr
}
type afsprocdata64 struct {
param1 uintptr
param2 uintptr
param3 uintptr
param4 uintptr
param5 uintptr
param6 uintptr
syscall int32
retval int32
}
func afs_syscall(call uintptr, param1 uintptr, param2 uintptr, param3 uintptr, param4 uintptr) error {
fd, err := syscall.Open("/dev/openafs_ioctl", syscall.O_RDWR, 0)
if err != nil {
return err
}
if intSize == 32 {
data := afsprocdata32{
call,
param1,
param2,
param3,
param4,
0,
0,
0,
}
err = gioctl.Ioctl(uintptr(fd), gioctl.IoW(67, 1, unsafe.Sizeof(uintptr(0))), uintptr(unsafe.Pointer(&data)))
} else {
data := afsprocdata64{
param1,
param2,
param3,
param4,
0,
0,
int32(call),
0,
}
err = gioctl.Ioctl(uintptr(fd), gioctl.IoW(67, 2, unsafe.Sizeof(uintptr(0))), uintptr(unsafe.Pointer(&data)))
}
syscall.Close(fd)
return err
}