1
2
3
4
5
6
7 package unix
8
9 import (
10 "syscall"
11 "unsafe"
12 )
13
14
15
16
17
18
19
20
21
22
23
24
25 var (
26 procFstatat,
27 procOpenat,
28 procUnlinkat,
29 procReadlinkat,
30 procMkdirat,
31 procFchmodat,
32 procFchownat,
33 procRenameat,
34 procLinkat,
35 procSymlinkat uintptr
36 )
37
38 func Unlinkat(dirfd int, path string, flags int) error {
39 p, err := syscall.BytePtrFromString(path)
40 if err != nil {
41 return err
42 }
43
44 _, _, errno := syscall6(uintptr(unsafe.Pointer(&procUnlinkat)), 3,
45 uintptr(dirfd),
46 uintptr(unsafe.Pointer(p)),
47 uintptr(flags),
48 0, 0, 0)
49 if errno != 0 {
50 return errno
51 }
52
53 return nil
54 }
55
56 func Openat(dirfd int, path string, flags int, perm uint32) (int, error) {
57 p, err := syscall.BytePtrFromString(path)
58 if err != nil {
59 return 0, err
60 }
61
62 fd, _, errno := syscall6(uintptr(unsafe.Pointer(&procOpenat)), 4,
63 uintptr(dirfd),
64 uintptr(unsafe.Pointer(p)),
65 uintptr(flags),
66 uintptr(perm),
67 0, 0)
68 if errno != 0 {
69 return 0, errno
70 }
71
72 return int(fd), nil
73 }
74
75 func Fstatat(dirfd int, path string, stat *syscall.Stat_t, flags int) error {
76 p, err := syscall.BytePtrFromString(path)
77 if err != nil {
78 return err
79 }
80
81 _, _, errno := syscall6(uintptr(unsafe.Pointer(&procFstatat)), 4,
82 uintptr(dirfd),
83 uintptr(unsafe.Pointer(p)),
84 uintptr(unsafe.Pointer(stat)),
85 uintptr(flags),
86 0, 0)
87 if errno != 0 {
88 return errno
89 }
90
91 return nil
92 }
93
94 func Readlinkat(dirfd int, path string, buf []byte) (int, error) {
95 p0, err := syscall.BytePtrFromString(path)
96 if err != nil {
97 return 0, err
98 }
99 var p1 unsafe.Pointer
100 if len(buf) > 0 {
101 p1 = unsafe.Pointer(&buf[0])
102 } else {
103 p1 = unsafe.Pointer(&_zero)
104 }
105 n, _, errno := syscall6(uintptr(unsafe.Pointer(&procReadlinkat)), 4,
106 uintptr(dirfd),
107 uintptr(unsafe.Pointer(p0)),
108 uintptr(p1),
109 uintptr(len(buf)),
110 0, 0)
111 if errno != 0 {
112 return 0, errno
113 }
114
115 return int(n), nil
116 }
117
118 func Mkdirat(dirfd int, path string, mode uint32) error {
119 p, err := syscall.BytePtrFromString(path)
120 if err != nil {
121 return err
122 }
123
124 _, _, errno := syscall6(uintptr(unsafe.Pointer(&procMkdirat)), 3,
125 uintptr(dirfd),
126 uintptr(unsafe.Pointer(p)),
127 uintptr(mode),
128 0, 0, 0)
129 if errno != 0 {
130 return errno
131 }
132 return nil
133 }
134
135 func Fchmodat(dirfd int, path string, mode uint32, flags int) error {
136 p, err := syscall.BytePtrFromString(path)
137 if err != nil {
138 return err
139 }
140 _, _, errno := syscall6(uintptr(unsafe.Pointer(&procFchmodat)), 4,
141 uintptr(dirfd),
142 uintptr(unsafe.Pointer(p)),
143 uintptr(mode),
144 uintptr(flags),
145 0, 0)
146 if errno != 0 {
147 return errno
148 }
149 return nil
150 }
151
152 func Fchownat(dirfd int, path string, uid, gid int, flags int) error {
153 p, err := syscall.BytePtrFromString(path)
154 if err != nil {
155 return err
156 }
157 _, _, errno := syscall6(uintptr(unsafe.Pointer(&procFchownat)), 5,
158 uintptr(dirfd),
159 uintptr(unsafe.Pointer(p)),
160 uintptr(uid),
161 uintptr(gid),
162 uintptr(flags),
163 0)
164 if errno != 0 {
165 return errno
166 }
167 return nil
168 }
169
170 func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) error {
171 oldp, err := syscall.BytePtrFromString(oldpath)
172 if err != nil {
173 return err
174 }
175 newp, err := syscall.BytePtrFromString(newpath)
176 if err != nil {
177 return err
178 }
179 _, _, errno := syscall6(uintptr(unsafe.Pointer(&procRenameat)), 4,
180 uintptr(olddirfd),
181 uintptr(unsafe.Pointer(oldp)),
182 uintptr(newdirfd),
183 uintptr(unsafe.Pointer(newp)),
184 0,
185 0)
186 if errno != 0 {
187 return errno
188 }
189 return nil
190 }
191
192 func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flag int) error {
193 oldp, err := syscall.BytePtrFromString(oldpath)
194 if err != nil {
195 return err
196 }
197 newp, err := syscall.BytePtrFromString(newpath)
198 if err != nil {
199 return err
200 }
201 _, _, errno := syscall6(uintptr(unsafe.Pointer(&procLinkat)), 5,
202 uintptr(olddirfd),
203 uintptr(unsafe.Pointer(oldp)),
204 uintptr(newdirfd),
205 uintptr(unsafe.Pointer(newp)),
206 uintptr(flag),
207 0)
208 if errno != 0 {
209 return errno
210 }
211 return nil
212 }
213
214 func Symlinkat(oldpath string, newdirfd int, newpath string) error {
215 oldp, err := syscall.BytePtrFromString(oldpath)
216 if err != nil {
217 return err
218 }
219 newp, err := syscall.BytePtrFromString(newpath)
220 if err != nil {
221 return err
222 }
223 _, _, errno := syscall6(uintptr(unsafe.Pointer(&procSymlinkat)), 3,
224 uintptr(unsafe.Pointer(oldp)),
225 uintptr(newdirfd),
226 uintptr(unsafe.Pointer(newp)),
227 0, 0, 0)
228 if errno != 0 {
229 return errno
230 }
231 return nil
232 }
233
View as plain text