aboutsummaryrefslogtreecommitdiffstats
path: root/vendor/golang.org/x/sys/unix/syscall_aix.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/golang.org/x/sys/unix/syscall_aix.go')
-rw-r--r--vendor/golang.org/x/sys/unix/syscall_aix.go582
1 files changed, 582 insertions, 0 deletions
diff --git a/vendor/golang.org/x/sys/unix/syscall_aix.go b/vendor/golang.org/x/sys/unix/syscall_aix.go
new file mode 100644
index 0000000..67ce6ce
--- /dev/null
+++ b/vendor/golang.org/x/sys/unix/syscall_aix.go
@@ -0,0 +1,582 @@
1// Copyright 2018 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5//go:build aix
6
7// Aix system calls.
8// This file is compiled as ordinary Go code,
9// but it is also input to mksyscall,
10// which parses the //sys lines and generates system call stubs.
11// Note that sometimes we use a lowercase //sys name and
12// wrap it in our own nicer implementation.
13
14package unix
15
16import "unsafe"
17
18/*
19 * Wrapped
20 */
21
22func Access(path string, mode uint32) (err error) {
23 return Faccessat(AT_FDCWD, path, mode, 0)
24}
25
26func Chmod(path string, mode uint32) (err error) {
27 return Fchmodat(AT_FDCWD, path, mode, 0)
28}
29
30func Chown(path string, uid int, gid int) (err error) {
31 return Fchownat(AT_FDCWD, path, uid, gid, 0)
32}
33
34func Creat(path string, mode uint32) (fd int, err error) {
35 return Open(path, O_CREAT|O_WRONLY|O_TRUNC, mode)
36}
37
38//sys utimes(path string, times *[2]Timeval) (err error)
39
40func Utimes(path string, tv []Timeval) error {
41 if len(tv) != 2 {
42 return EINVAL
43 }
44 return utimes(path, (*[2]Timeval)(unsafe.Pointer(&tv[0])))
45}
46
47//sys utimensat(dirfd int, path string, times *[2]Timespec, flag int) (err error)
48
49func UtimesNano(path string, ts []Timespec) error {
50 if len(ts) != 2 {
51 return EINVAL
52 }
53 return utimensat(AT_FDCWD, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), 0)
54}
55
56func UtimesNanoAt(dirfd int, path string, ts []Timespec, flags int) error {
57 if ts == nil {
58 return utimensat(dirfd, path, nil, flags)
59 }
60 if len(ts) != 2 {
61 return EINVAL
62 }
63 return utimensat(dirfd, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), flags)
64}
65
66func (sa *SockaddrInet4) sockaddr() (unsafe.Pointer, _Socklen, error) {
67 if sa.Port < 0 || sa.Port > 0xFFFF {
68 return nil, 0, EINVAL
69 }
70 sa.raw.Family = AF_INET
71 p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port))
72 p[0] = byte(sa.Port >> 8)
73 p[1] = byte(sa.Port)
74 sa.raw.Addr = sa.Addr
75 return unsafe.Pointer(&sa.raw), SizeofSockaddrInet4, nil
76}
77
78func (sa *SockaddrInet6) sockaddr() (unsafe.Pointer, _Socklen, error) {
79 if sa.Port < 0 || sa.Port > 0xFFFF {
80 return nil, 0, EINVAL
81 }
82 sa.raw.Family = AF_INET6
83 p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port))
84 p[0] = byte(sa.Port >> 8)
85 p[1] = byte(sa.Port)
86 sa.raw.Scope_id = sa.ZoneId
87 sa.raw.Addr = sa.Addr
88 return unsafe.Pointer(&sa.raw), SizeofSockaddrInet6, nil
89}
90
91func (sa *SockaddrUnix) sockaddr() (unsafe.Pointer, _Socklen, error) {
92 name := sa.Name
93 n := len(name)
94 if n > len(sa.raw.Path) {
95 return nil, 0, EINVAL
96 }
97 if n == len(sa.raw.Path) && name[0] != '@' {
98 return nil, 0, EINVAL
99 }
100 sa.raw.Family = AF_UNIX
101 for i := 0; i < n; i++ {
102 sa.raw.Path[i] = uint8(name[i])
103 }
104 // length is family (uint16), name, NUL.
105 sl := _Socklen(2)
106 if n > 0 {
107 sl += _Socklen(n) + 1
108 }
109 if sa.raw.Path[0] == '@' || (sa.raw.Path[0] == 0 && sl > 3) {
110 // Check sl > 3 so we don't change unnamed socket behavior.
111 sa.raw.Path[0] = 0
112 // Don't count trailing NUL for abstract address.
113 sl--
114 }
115
116 return unsafe.Pointer(&sa.raw), sl, nil
117}
118
119func Getsockname(fd int) (sa Sockaddr, err error) {
120 var rsa RawSockaddrAny
121 var len _Socklen = SizeofSockaddrAny
122 if err = getsockname(fd, &rsa, &len); err != nil {
123 return
124 }
125 return anyToSockaddr(fd, &rsa)
126}
127
128//sys getcwd(buf []byte) (err error)
129
130const ImplementsGetwd = true
131
132func Getwd() (ret string, err error) {
133 for len := uint64(4096); ; len *= 2 {
134 b := make([]byte, len)
135 err := getcwd(b)
136 if err == nil {
137 i := 0
138 for b[i] != 0 {
139 i++
140 }
141 return string(b[0:i]), nil
142 }
143 if err != ERANGE {
144 return "", err
145 }
146 }
147}
148
149func Getcwd(buf []byte) (n int, err error) {
150 err = getcwd(buf)
151 if err == nil {
152 i := 0
153 for buf[i] != 0 {
154 i++
155 }
156 n = i + 1
157 }
158 return
159}
160
161func Getgroups() (gids []int, err error) {
162 n, err := getgroups(0, nil)
163 if err != nil {
164 return nil, err
165 }
166 if n == 0 {
167 return nil, nil
168 }
169
170 // Sanity check group count. Max is 16 on BSD.
171 if n < 0 || n > 1000 {
172 return nil, EINVAL
173 }
174
175 a := make([]_Gid_t, n)
176 n, err = getgroups(n, &a[0])
177 if err != nil {
178 return nil, err
179 }
180 gids = make([]int, n)
181 for i, v := range a[0:n] {
182 gids[i] = int(v)
183 }
184 return
185}
186
187func Setgroups(gids []int) (err error) {
188 if len(gids) == 0 {
189 return setgroups(0, nil)
190 }
191
192 a := make([]_Gid_t, len(gids))
193 for i, v := range gids {
194 a[i] = _Gid_t(v)
195 }
196 return setgroups(len(a), &a[0])
197}
198
199/*
200 * Socket
201 */
202
203//sys accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error)
204
205func Accept(fd int) (nfd int, sa Sockaddr, err error) {
206 var rsa RawSockaddrAny
207 var len _Socklen = SizeofSockaddrAny
208 nfd, err = accept(fd, &rsa, &len)
209 if nfd == -1 {
210 return
211 }
212 sa, err = anyToSockaddr(fd, &rsa)
213 if err != nil {
214 Close(nfd)
215 nfd = 0
216 }
217 return
218}
219
220func recvmsgRaw(fd int, iov []Iovec, oob []byte, flags int, rsa *RawSockaddrAny) (n, oobn int, recvflags int, err error) {
221 var msg Msghdr
222 msg.Name = (*byte)(unsafe.Pointer(rsa))
223 msg.Namelen = uint32(SizeofSockaddrAny)
224 var dummy byte
225 if len(oob) > 0 {
226 // receive at least one normal byte
227 if emptyIovecs(iov) {
228 var iova [1]Iovec
229 iova[0].Base = &dummy
230 iova[0].SetLen(1)
231 iov = iova[:]
232 }
233 msg.Control = (*byte)(unsafe.Pointer(&oob[0]))
234 msg.SetControllen(len(oob))
235 }
236 if len(iov) > 0 {
237 msg.Iov = &iov[0]
238 msg.SetIovlen(len(iov))
239 }
240 if n, err = recvmsg(fd, &msg, flags); n == -1 {
241 return
242 }
243 oobn = int(msg.Controllen)
244 recvflags = int(msg.Flags)
245 return
246}
247
248func sendmsgN(fd int, iov []Iovec, oob []byte, ptr unsafe.Pointer, salen _Socklen, flags int) (n int, err error) {
249 var msg Msghdr
250 msg.Name = (*byte)(unsafe.Pointer(ptr))
251 msg.Namelen = uint32(salen)
252 var dummy byte
253 var empty bool
254 if len(oob) > 0 {
255 // send at least one normal byte
256 empty = emptyIovecs(iov)
257 if empty {
258 var iova [1]Iovec
259 iova[0].Base = &dummy
260 iova[0].SetLen(1)
261 iov = iova[:]
262 }
263 msg.Control = (*byte)(unsafe.Pointer(&oob[0]))
264 msg.SetControllen(len(oob))
265 }
266 if len(iov) > 0 {
267 msg.Iov = &iov[0]
268 msg.SetIovlen(len(iov))
269 }
270 if n, err = sendmsg(fd, &msg, flags); err != nil {
271 return 0, err
272 }
273 if len(oob) > 0 && empty {
274 n = 0
275 }
276 return n, nil
277}
278
279func anyToSockaddr(fd int, rsa *RawSockaddrAny) (Sockaddr, error) {
280 switch rsa.Addr.Family {
281
282 case AF_UNIX:
283 pp := (*RawSockaddrUnix)(unsafe.Pointer(rsa))
284 sa := new(SockaddrUnix)
285
286 // Some versions of AIX have a bug in getsockname (see IV78655).
287 // We can't rely on sa.Len being set correctly.
288 n := SizeofSockaddrUnix - 3 // subtract leading Family, Len, terminating NUL.
289 for i := 0; i < n; i++ {
290 if pp.Path[i] == 0 {
291 n = i
292 break
293 }
294 }
295 sa.Name = string(unsafe.Slice((*byte)(unsafe.Pointer(&pp.Path[0])), n))
296 return sa, nil
297
298 case AF_INET:
299 pp := (*RawSockaddrInet4)(unsafe.Pointer(rsa))
300 sa := new(SockaddrInet4)
301 p := (*[2]byte)(unsafe.Pointer(&pp.Port))
302 sa.Port = int(p[0])<<8 + int(p[1])
303 sa.Addr = pp.Addr
304 return sa, nil
305
306 case AF_INET6:
307 pp := (*RawSockaddrInet6)(unsafe.Pointer(rsa))
308 sa := new(SockaddrInet6)
309 p := (*[2]byte)(unsafe.Pointer(&pp.Port))
310 sa.Port = int(p[0])<<8 + int(p[1])
311 sa.ZoneId = pp.Scope_id
312 sa.Addr = pp.Addr
313 return sa, nil
314 }
315 return nil, EAFNOSUPPORT
316}
317
318func Gettimeofday(tv *Timeval) (err error) {
319 err = gettimeofday(tv, nil)
320 return
321}
322
323func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) {
324 if raceenabled {
325 raceReleaseMerge(unsafe.Pointer(&ioSync))
326 }
327 return sendfile(outfd, infd, offset, count)
328}
329
330// TODO
331func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) {
332 return -1, ENOSYS
333}
334
335func direntIno(buf []byte) (uint64, bool) {
336 return readInt(buf, unsafe.Offsetof(Dirent{}.Ino), unsafe.Sizeof(Dirent{}.Ino))
337}
338
339func direntReclen(buf []byte) (uint64, bool) {
340 return readInt(buf, unsafe.Offsetof(Dirent{}.Reclen), unsafe.Sizeof(Dirent{}.Reclen))
341}
342
343func direntNamlen(buf []byte) (uint64, bool) {
344 reclen, ok := direntReclen(buf)
345 if !ok {
346 return 0, false
347 }
348 return reclen - uint64(unsafe.Offsetof(Dirent{}.Name)), true
349}
350
351//sys getdirent(fd int, buf []byte) (n int, err error)
352
353func Getdents(fd int, buf []byte) (n int, err error) {
354 return getdirent(fd, buf)
355}
356
357//sys wait4(pid Pid_t, status *_C_int, options int, rusage *Rusage) (wpid Pid_t, err error)
358
359func Wait4(pid int, wstatus *WaitStatus, options int, rusage *Rusage) (wpid int, err error) {
360 var status _C_int
361 var r Pid_t
362 err = ERESTART
363 // AIX wait4 may return with ERESTART errno, while the processus is still
364 // active.
365 for err == ERESTART {
366 r, err = wait4(Pid_t(pid), &status, options, rusage)
367 }
368 wpid = int(r)
369 if wstatus != nil {
370 *wstatus = WaitStatus(status)
371 }
372 return
373}
374
375/*
376 * Wait
377 */
378
379type WaitStatus uint32
380
381func (w WaitStatus) Stopped() bool { return w&0x40 != 0 }
382func (w WaitStatus) StopSignal() Signal {
383 if !w.Stopped() {
384 return -1
385 }
386 return Signal(w>>8) & 0xFF
387}
388
389func (w WaitStatus) Exited() bool { return w&0xFF == 0 }
390func (w WaitStatus) ExitStatus() int {
391 if !w.Exited() {
392 return -1
393 }
394 return int((w >> 8) & 0xFF)
395}
396
397func (w WaitStatus) Signaled() bool { return w&0x40 == 0 && w&0xFF != 0 }
398func (w WaitStatus) Signal() Signal {
399 if !w.Signaled() {
400 return -1
401 }
402 return Signal(w>>16) & 0xFF
403}
404
405func (w WaitStatus) Continued() bool { return w&0x01000000 != 0 }
406
407func (w WaitStatus) CoreDump() bool { return w&0x80 == 0x80 }
408
409func (w WaitStatus) TrapCause() int { return -1 }
410
411//sys ioctl(fd int, req int, arg uintptr) (err error)
412//sys ioctlPtr(fd int, req int, arg unsafe.Pointer) (err error) = ioctl
413
414// fcntl must never be called with cmd=F_DUP2FD because it doesn't work on AIX
415// There is no way to create a custom fcntl and to keep //sys fcntl easily,
416// Therefore, the programmer must call dup2 instead of fcntl in this case.
417
418// FcntlInt performs a fcntl syscall on fd with the provided command and argument.
419//sys FcntlInt(fd uintptr, cmd int, arg int) (r int,err error) = fcntl
420
421// FcntlFlock performs a fcntl syscall for the F_GETLK, F_SETLK or F_SETLKW command.
422//sys FcntlFlock(fd uintptr, cmd int, lk *Flock_t) (err error) = fcntl
423
424//sys fcntl(fd int, cmd int, arg int) (val int, err error)
425
426//sys fsyncRange(fd int, how int, start int64, length int64) (err error) = fsync_range
427
428func Fsync(fd int) error {
429 return fsyncRange(fd, O_SYNC, 0, 0)
430}
431
432/*
433 * Direct access
434 */
435
436//sys Acct(path string) (err error)
437//sys Chdir(path string) (err error)
438//sys Chroot(path string) (err error)
439//sys Close(fd int) (err error)
440//sys Dup(oldfd int) (fd int, err error)
441//sys Exit(code int)
442//sys Faccessat(dirfd int, path string, mode uint32, flags int) (err error)
443//sys Fchdir(fd int) (err error)
444//sys Fchmod(fd int, mode uint32) (err error)
445//sys Fchmodat(dirfd int, path string, mode uint32, flags int) (err error)
446//sys Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error)
447//sys Fdatasync(fd int) (err error)
448// readdir_r
449//sysnb Getpgid(pid int) (pgid int, err error)
450
451//sys Getpgrp() (pid int)
452
453//sysnb Getpid() (pid int)
454//sysnb Getppid() (ppid int)
455//sys Getpriority(which int, who int) (prio int, err error)
456//sysnb Getrusage(who int, rusage *Rusage) (err error)
457//sysnb Getsid(pid int) (sid int, err error)
458//sysnb Kill(pid int, sig Signal) (err error)
459//sys Klogctl(typ int, buf []byte) (n int, err error) = syslog
460//sys Mkdir(dirfd int, path string, mode uint32) (err error)
461//sys Mkdirat(dirfd int, path string, mode uint32) (err error)
462//sys Mkfifo(path string, mode uint32) (err error)
463//sys Mknod(path string, mode uint32, dev int) (err error)
464//sys Mknodat(dirfd int, path string, mode uint32, dev int) (err error)
465//sys Nanosleep(time *Timespec, leftover *Timespec) (err error)
466//sys Open(path string, mode int, perm uint32) (fd int, err error) = open64
467//sys Openat(dirfd int, path string, flags int, mode uint32) (fd int, err error)
468//sys read(fd int, p []byte) (n int, err error)
469//sys Readlink(path string, buf []byte) (n int, err error)
470//sys Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error)
471//sys Setdomainname(p []byte) (err error)
472//sys Sethostname(p []byte) (err error)
473//sysnb Setpgid(pid int, pgid int) (err error)
474//sysnb Setsid() (pid int, err error)
475//sysnb Settimeofday(tv *Timeval) (err error)
476
477//sys Setuid(uid int) (err error)
478//sys Setgid(uid int) (err error)
479
480//sys Setpriority(which int, who int, prio int) (err error)
481//sys Statx(dirfd int, path string, flags int, mask int, stat *Statx_t) (err error)
482//sys Sync()
483//sysnb Times(tms *Tms) (ticks uintptr, err error)
484//sysnb Umask(mask int) (oldmask int)
485//sysnb Uname(buf *Utsname) (err error)
486//sys Unlink(path string) (err error)
487//sys Unlinkat(dirfd int, path string, flags int) (err error)
488//sys Ustat(dev int, ubuf *Ustat_t) (err error)
489//sys write(fd int, p []byte) (n int, err error)
490
491//sys Dup2(oldfd int, newfd int) (err error)
492//sys Fadvise(fd int, offset int64, length int64, advice int) (err error) = posix_fadvise64
493//sys Fchown(fd int, uid int, gid int) (err error)
494//sys fstat(fd int, stat *Stat_t) (err error)
495//sys fstatat(dirfd int, path string, stat *Stat_t, flags int) (err error) = fstatat
496//sys Fstatfs(fd int, buf *Statfs_t) (err error)
497//sys Ftruncate(fd int, length int64) (err error)
498//sysnb Getegid() (egid int)
499//sysnb Geteuid() (euid int)
500//sysnb Getgid() (gid int)
501//sysnb Getuid() (uid int)
502//sys Lchown(path string, uid int, gid int) (err error)
503//sys Listen(s int, n int) (err error)
504//sys lstat(path string, stat *Stat_t) (err error)
505//sys Pause() (err error)
506//sys pread(fd int, p []byte, offset int64) (n int, err error) = pread64
507//sys pwrite(fd int, p []byte, offset int64) (n int, err error) = pwrite64
508//sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error)
509//sys Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error)
510//sysnb Setregid(rgid int, egid int) (err error)
511//sysnb Setreuid(ruid int, euid int) (err error)
512//sys Shutdown(fd int, how int) (err error)
513//sys Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error)
514//sys stat(path string, statptr *Stat_t) (err error)
515//sys Statfs(path string, buf *Statfs_t) (err error)
516//sys Truncate(path string, length int64) (err error)
517
518//sys bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error)
519//sys connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error)
520//sysnb getgroups(n int, list *_Gid_t) (nn int, err error)
521//sysnb setgroups(n int, list *_Gid_t) (err error)
522//sys getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error)
523//sys setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error)
524//sysnb socket(domain int, typ int, proto int) (fd int, err error)
525//sysnb socketpair(domain int, typ int, proto int, fd *[2]int32) (err error)
526//sysnb getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error)
527//sysnb getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error)
528//sys recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error)
529//sys sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error)
530
531// In order to use msghdr structure with Control, Controllen, nrecvmsg and nsendmsg must be used.
532//sys recvmsg(s int, msg *Msghdr, flags int) (n int, err error) = nrecvmsg
533//sys sendmsg(s int, msg *Msghdr, flags int) (n int, err error) = nsendmsg
534
535//sys munmap(addr uintptr, length uintptr) (err error)
536//sys Madvise(b []byte, advice int) (err error)
537//sys Mprotect(b []byte, prot int) (err error)
538//sys Mlock(b []byte) (err error)
539//sys Mlockall(flags int) (err error)
540//sys Msync(b []byte, flags int) (err error)
541//sys Munlock(b []byte) (err error)
542//sys Munlockall() (err error)
543
544//sysnb pipe(p *[2]_C_int) (err error)
545
546func Pipe(p []int) (err error) {
547 if len(p) != 2 {
548 return EINVAL
549 }
550 var pp [2]_C_int
551 err = pipe(&pp)
552 if err == nil {
553 p[0] = int(pp[0])
554 p[1] = int(pp[1])
555 }
556 return
557}
558
559//sys poll(fds *PollFd, nfds int, timeout int) (n int, err error)
560
561func Poll(fds []PollFd, timeout int) (n int, err error) {
562 if len(fds) == 0 {
563 return poll(nil, 0, timeout)
564 }
565 return poll(&fds[0], len(fds), timeout)
566}
567
568//sys gettimeofday(tv *Timeval, tzp *Timezone) (err error)
569//sysnb Time(t *Time_t) (tt Time_t, err error)
570//sys Utime(path string, buf *Utimbuf) (err error)
571
572//sys Getsystemcfg(label int) (n uint64)
573
574//sys umount(target string) (err error)
575
576func Unmount(target string, flags int) (err error) {
577 if flags != 0 {
578 // AIX doesn't have any flags for umount.
579 return ENOSYS
580 }
581 return umount(target)
582}