diff options
Diffstat (limited to 'src/pkg/syscall/syscall_linux_386.go')
-rw-r--r-- | src/pkg/syscall/syscall_linux_386.go | 50 |
1 files changed, 33 insertions, 17 deletions
diff --git a/src/pkg/syscall/syscall_linux_386.go b/src/pkg/syscall/syscall_linux_386.go index 5bd3406de..2b6bdebf8 100644 --- a/src/pkg/syscall/syscall_linux_386.go +++ b/src/pkg/syscall/syscall_linux_386.go @@ -31,10 +31,10 @@ func NsecToTimeval(nsec int64) (tv Timeval) { //sys Fchown(fd int, uid int, gid int) (errno int) = SYS_FCHOWN32 //sys Fstat(fd int, stat *Stat_t) (errno int) = SYS_FSTAT64 //sys Ftruncate(fd int, length int64) (errno int) = SYS_FTRUNCATE64 -//sys Getegid() (egid int) = SYS_GETEGID32 -//sys Geteuid() (euid int) = SYS_GETEUID32 -//sys Getgid() (gid int) = SYS_GETGID32 -//sys Getuid() (uid int) = SYS_GETUID32 +//sysnb Getegid() (egid int) = SYS_GETEGID32 +//sysnb Geteuid() (euid int) = SYS_GETEUID32 +//sysnb Getgid() (gid int) = SYS_GETGID32 +//sysnb Getuid() (uid int) = SYS_GETUID32 //sys Ioperm(from int, num int, on int) (errno int) //sys Iopl(level int) (errno int) //sys Lchown(path string, uid int, gid int) (errno int) = SYS_LCHOWN32 @@ -43,26 +43,36 @@ func NsecToTimeval(nsec int64) (tv Timeval) { //sys Pwrite(fd int, p []byte, offset int64) (n int, errno int) = SYS_PWRITE64 //sys Setfsgid(gid int) (errno int) = SYS_SETFSGID32 //sys Setfsuid(uid int) (errno int) = SYS_SETFSUID32 -//sys Setgid(gid int) (errno int) = SYS_SETGID32 -//sys Setregid(rgid int, egid int) (errno int) = SYS_SETREGID32 -//sys Setresgid(rgid int, egid int, sgid int) (errno int) = SYS_SETRESGID32 -//sys Setresuid(ruid int, euid int, suid int) (errno int) = SYS_SETRESUID32 -//sys Setreuid(ruid int, euid int) (errno int) = SYS_SETREUID32 +//sysnb Setgid(gid int) (errno int) = SYS_SETGID32 +//sysnb Setregid(rgid int, egid int) (errno int) = SYS_SETREGID32 +//sysnb Setresgid(rgid int, egid int, sgid int) (errno int) = SYS_SETRESGID32 +//sysnb Setresuid(ruid int, euid int, suid int) (errno int) = SYS_SETRESUID32 +//sysnb Setreuid(ruid int, euid int) (errno int) = SYS_SETREUID32 //sys Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, errno int) //sys Stat(path string, stat *Stat_t) (errno int) = SYS_STAT64 //sys SyncFileRange(fd int, off int64, n int64, flags int) (errno int) //sys Truncate(path string, length int64) (errno int) = SYS_TRUNCATE64 -//sys getgroups(n int, list *_Gid_t) (nn int, errno int) = SYS_GETGROUPS32 -//sys setgroups(n int, list *_Gid_t) (errno int) = SYS_SETGROUPS32 +//sysnb getgroups(n int, list *_Gid_t) (nn int, errno int) = SYS_GETGROUPS32 +//sysnb setgroups(n int, list *_Gid_t) (errno int) = SYS_SETGROUPS32 //sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, errno int) = SYS__NEWSELECT +//sys mmap2(addr uintptr, length uintptr, prot int, flags int, fd int, pageOffset uintptr) (xaddr uintptr, errno int) + +func mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, errno int) { + page := uintptr(offset / 4096) + if offset != int64(page)*4096 { + return 0, EINVAL + } + return mmap2(addr, length, prot, flags, fd, page) +} + // Underlying system call writes to newoffset via pointer. // Implemented in assembly to avoid allocation. func Seek(fd int, offset int64, whence int) (newoffset int64, errno int) // Vsyscalls on amd64. -//sys Gettimeofday(tv *Timeval) (errno int) -//sys Time(t *Time_t) (tt Time_t, errno int) +//sysnb Gettimeofday(tv *Timeval) (errno int) +//sysnb Time(t *Time_t) (tt Time_t, errno int) // On x86 Linux, all the socket calls go through an extra indirection, // I think because the 5-register system call interface can't handle @@ -93,6 +103,7 @@ const ( ) func socketcall(call int, a0, a1, a2, a3, a4, a5 uintptr) (n int, errno int) +func rawsocketcall(call int, a0, a1, a2, a3, a4, a5 uintptr) (n int, errno int) func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, errno int) { fd, errno = socketcall(_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), 0, 0, 0) @@ -100,17 +111,17 @@ func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, errno int) { } func getsockname(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (errno int) { - _, errno = socketcall(_GETSOCKNAME, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), 0, 0, 0) + _, errno = rawsocketcall(_GETSOCKNAME, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), 0, 0, 0) return } func getpeername(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (errno int) { - _, errno = socketcall(_GETPEERNAME, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), 0, 0, 0) + _, errno = rawsocketcall(_GETPEERNAME, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), 0, 0, 0) return } func socketpair(domain int, typ int, flags int, fd *[2]int) (errno int) { - _, errno = socketcall(_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(flags), uintptr(unsafe.Pointer(fd)), 0, 0) + _, errno = rawsocketcall(_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(flags), uintptr(unsafe.Pointer(fd)), 0, 0) return } @@ -125,7 +136,12 @@ func connect(s int, addr uintptr, addrlen _Socklen) (errno int) { } func socket(domain int, typ int, proto int) (fd int, errno int) { - fd, errno = socketcall(_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto), 0, 0, 0) + fd, errno = rawsocketcall(_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto), 0, 0, 0) + return +} + +func getsockopt(s int, level int, name int, val uintptr, vallen *_Socklen) (errno int) { + _, errno = socketcall(_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) return } |