1 // Copyright 2016 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.
10 _SYS_setgroups = SYS_SETGROUPS
15 //sys Dup2(oldfd int, newfd int) (err error)
16 //sys EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error)
17 //sys Fchown(fd int, uid int, gid int) (err error)
18 //sys Fstat(fd int, stat *Stat_t) (err error)
19 //sys fstatat(dirfd int, path string, stat *Stat_t, flags int) (err error) = SYS_NEWFSTATAT
20 //sys Fstatfs(fd int, buf *Statfs_t) (err error)
21 //sys Ftruncate(fd int, length int64) (err error)
22 //sysnb Getegid() (egid int)
23 //sysnb Geteuid() (euid int)
24 //sysnb Getgid() (gid int)
25 //sysnb Getrlimit(resource int, rlim *Rlimit) (err error) = SYS_GETRLIMIT
26 //sysnb Getuid() (uid int)
27 //sysnb InotifyInit() (fd int, err error)
28 //sys Lchown(path string, uid int, gid int) (err error)
29 //sys Lstat(path string, stat *Stat_t) (err error)
30 //sys Pause() (err error)
31 //sys pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64
32 //sys pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64
33 //sys Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error)
34 //sys Seek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK
35 //sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error)
36 //sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error)
37 //sys Setfsgid(gid int) (err error)
38 //sys Setfsuid(uid int) (err error)
39 //sysnb setrlimit(resource int, rlim *Rlimit) (err error) = SYS_SETRLIMIT
40 //sys Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error)
41 //sys Stat(path string, stat *Stat_t) (err error)
42 //sys Statfs(path string, buf *Statfs_t) (err error)
43 //sys SyncFileRange(fd int, off int64, n int64, flags int) (err error) = SYS_SYNC_FILE_RANGE
44 //sys Truncate(path string, length int64) (err error)
45 //sys Ustat(dev int, ubuf *Ustat_t) (err error)
46 //sysnb getgroups(n int, list *_Gid_t) (nn int, err error)
48 //sys futimesat(dirfd int, path string, times *[2]Timeval) (err error)
49 //sysnb Gettimeofday(tv *Timeval) (err error)
51 func Time(t *Time_t) (tt Time_t, err error) {
53 err = Gettimeofday(&tv)
60 return Time_t(tv.Sec), nil
63 //sys Utime(path string, buf *Utimbuf) (err error)
64 //sys utimes(path string, times *[2]Timeval) (err error)
66 func setTimespec(sec, nsec int64) Timespec {
67 return Timespec{Sec: sec, Nsec: nsec}
70 func setTimeval(sec, usec int64) Timeval {
71 return Timeval{Sec: sec, Usec: usec}
74 // Linux on s390x uses the old mmap interface, which requires arguments to be passed in a struct.
75 // mmap2 also requires arguments to be passed in a struct; it is currently not exposed in <asm/unistd.h>.
76 func mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) {
77 mmap_args := [6]uintptr{addr, length, uintptr(prot), uintptr(flags), uintptr(fd), uintptr(offset)}
78 r0, _, e1 := Syscall(SYS_MMAP, uintptr(unsafe.Pointer(&mmap_args[0])), 0, 0)
86 // On s390x Linux, all the socket calls go through an extra indirection.
87 // The arguments to the underlying system call are the number below
88 // and a pointer to an array of uintptr. We hide the pointer in the
89 // socketcall assembly to avoid allocation on every system call.
115 func socketcall(call int, a0, a1, a2, a3, a4, a5 uintptr) (n int, err Errno)
116 func rawsocketcall(call int, a0, a1, a2, a3, a4, a5 uintptr) (n int, err Errno)
118 func accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) {
119 fd, e := socketcall(_ACCEPT4, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0)
126 func getsockname(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) {
127 _, e := rawsocketcall(_GETSOCKNAME, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), 0, 0, 0)
134 func getpeername(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) {
135 _, e := rawsocketcall(_GETPEERNAME, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), 0, 0, 0)
142 func socketpair(domain int, typ int, flags int, fd *[2]int32) (err error) {
143 _, e := rawsocketcall(_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(flags), uintptr(unsafe.Pointer(fd)), 0, 0)
150 func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) {
151 _, e := socketcall(_BIND, uintptr(s), uintptr(addr), uintptr(addrlen), 0, 0, 0)
158 func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) {
159 _, e := socketcall(_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen), 0, 0, 0)
166 func socket(domain int, typ int, proto int) (fd int, err error) {
167 fd, e := rawsocketcall(_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto), 0, 0, 0)
174 func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) {
175 _, e := socketcall(_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0)
182 func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) {
183 _, e := socketcall(_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), vallen, 0)
190 func recvfrom(s int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) {
193 base = uintptr(unsafe.Pointer(&p[0]))
195 n, e := socketcall(_RECVFROM, uintptr(s), base, uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen)))
202 func sendto(s int, p []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) {
205 base = uintptr(unsafe.Pointer(&p[0]))
207 _, e := socketcall(_SENDTO, uintptr(s), base, uintptr(len(p)), uintptr(flags), uintptr(to), uintptr(addrlen))
214 func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) {
215 n, e := socketcall(_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags), 0, 0, 0)
222 func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) {
223 n, e := socketcall(_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags), 0, 0, 0)
230 func Listen(s int, n int) (err error) {
231 _, e := socketcall(_LISTEN, uintptr(s), uintptr(n), 0, 0, 0, 0)
238 func Shutdown(s, how int) (err error) {
239 _, e := socketcall(_SHUTDOWN, uintptr(s), uintptr(how), 0, 0, 0, 0)
247 func rawSetrlimit(resource int, rlim *Rlimit) Errno {
248 _, _, errno := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0)
252 func (r *PtraceRegs) PC() uint64 { return r.Psw.Addr }
254 func (r *PtraceRegs) SetPC(pc uint64) { r.Psw.Addr = pc }
256 func (iov *Iovec) SetLen(length int) {
257 iov.Len = uint64(length)
260 func (msghdr *Msghdr) SetControllen(length int) {
261 msghdr.Controllen = uint64(length)
264 func (cmsg *Cmsghdr) SetLen(length int) {
265 cmsg.Len = uint64(length)