1
2
3
4
5
6
7 package unix
8
9 import (
10 "syscall"
11 "unsafe"
12 )
13
14 func Unlinkat(dirfd int, path string, flags int) error {
15 p, err := syscall.BytePtrFromString(path)
16 if err != nil {
17 return err
18 }
19
20 _, _, errno := syscall.Syscall(unlinkatTrap, uintptr(dirfd), uintptr(unsafe.Pointer(p)), uintptr(flags))
21 if errno != 0 {
22 return errno
23 }
24
25 return nil
26 }
27
28 func Openat(dirfd int, path string, flags int, perm uint32) (int, error) {
29 p, err := syscall.BytePtrFromString(path)
30 if err != nil {
31 return 0, err
32 }
33
34 fd, _, errno := syscall.Syscall6(openatTrap, uintptr(dirfd), uintptr(unsafe.Pointer(p)), uintptr(flags), uintptr(perm), 0, 0)
35 if errno != 0 {
36 return 0, errno
37 }
38
39 return int(fd), nil
40 }
41
42 func Readlinkat(dirfd int, path string, buf []byte) (int, error) {
43 p0, err := syscall.BytePtrFromString(path)
44 if err != nil {
45 return 0, err
46 }
47 var p1 unsafe.Pointer
48 if len(buf) > 0 {
49 p1 = unsafe.Pointer(&buf[0])
50 } else {
51 p1 = unsafe.Pointer(&_zero)
52 }
53 n, _, errno := syscall.Syscall6(readlinkatTrap,
54 uintptr(dirfd),
55 uintptr(unsafe.Pointer(p0)),
56 uintptr(p1),
57 uintptr(len(buf)),
58 0, 0)
59 if errno != 0 {
60 return 0, errno
61 }
62
63 return int(n), nil
64 }
65
66 func Mkdirat(dirfd int, path string, mode uint32) error {
67 p, err := syscall.BytePtrFromString(path)
68 if err != nil {
69 return err
70 }
71
72 _, _, errno := syscall.Syscall6(mkdiratTrap,
73 uintptr(dirfd),
74 uintptr(unsafe.Pointer(p)),
75 uintptr(mode),
76 0, 0, 0)
77 if errno != 0 {
78 return errno
79 }
80 return nil
81 }
82
83 func Fchownat(dirfd int, path string, uid, gid int, flags int) error {
84 p, err := syscall.BytePtrFromString(path)
85 if err != nil {
86 return err
87 }
88 _, _, errno := syscall.Syscall6(fchownatTrap,
89 uintptr(dirfd),
90 uintptr(unsafe.Pointer(p)),
91 uintptr(uid),
92 uintptr(gid),
93 uintptr(flags),
94 0)
95 if errno != 0 {
96 return errno
97 }
98 return nil
99 }
100
101 func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) error {
102 oldp, err := syscall.BytePtrFromString(oldpath)
103 if err != nil {
104 return err
105 }
106 newp, err := syscall.BytePtrFromString(newpath)
107 if err != nil {
108 return err
109 }
110 _, _, errno := syscall.Syscall6(renameatTrap,
111 uintptr(olddirfd),
112 uintptr(unsafe.Pointer(oldp)),
113 uintptr(newdirfd),
114 uintptr(unsafe.Pointer(newp)),
115 0,
116 0)
117 if errno != 0 {
118 return errno
119 }
120 return nil
121 }
122
123 func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flag int) error {
124 oldp, err := syscall.BytePtrFromString(oldpath)
125 if err != nil {
126 return err
127 }
128 newp, err := syscall.BytePtrFromString(newpath)
129 if err != nil {
130 return err
131 }
132 _, _, errno := syscall.Syscall6(linkatTrap,
133 uintptr(olddirfd),
134 uintptr(unsafe.Pointer(oldp)),
135 uintptr(newdirfd),
136 uintptr(unsafe.Pointer(newp)),
137 uintptr(flag),
138 0)
139 if errno != 0 {
140 return errno
141 }
142 return nil
143 }
144
145 func Symlinkat(oldpath string, newdirfd int, newpath string) error {
146 oldp, err := syscall.BytePtrFromString(oldpath)
147 if err != nil {
148 return err
149 }
150 newp, err := syscall.BytePtrFromString(newpath)
151 if err != nil {
152 return err
153 }
154 _, _, errno := syscall.Syscall(symlinkatTrap,
155 uintptr(unsafe.Pointer(oldp)),
156 uintptr(newdirfd),
157 uintptr(unsafe.Pointer(newp)))
158 if errno != 0 {
159 return errno
160 }
161 return nil
162 }
163
View as plain text