package syscall
import
func (, , , uintptr) (, uintptr)
func ( string, uint32) ( error) {
return Faccessat(_AT_FDCWD, , , 0)
}
func ( string, uint32) ( error) {
return Fchmodat(_AT_FDCWD, , , 0)
}
func ( string, int, int) ( error) {
return Fchownat(_AT_FDCWD, , , , 0)
}
func ( string, uint32) ( int, error) {
return Open(, O_CREAT|O_WRONLY|O_TRUNC, )
}
func ( int) bool {
, := Getgroups()
if != nil {
return false
}
for , := range {
if == {
return true
}
}
return false
}
func ( int, string, uint32, int) ( error) {
if & ^(_AT_SYMLINK_NOFOLLOW|_AT_EACCESS) != 0 {
return EINVAL
}
if == 0 {
return faccessat(, , )
}
var Stat_t
if := fstatat(, , &, &_AT_SYMLINK_NOFOLLOW); != nil {
return
}
&= 7
if == 0 {
return nil
}
var int
if &_AT_EACCESS != 0 {
= Geteuid()
} else {
= Getuid()
}
if == 0 {
if &1 == 0 {
return nil
}
if .Mode&0111 != 0 {
return nil
}
return EACCES
}
var uint32
if uint32() == .Uid {
= (.Mode >> 6) & 7
} else {
var int
if &_AT_EACCESS != 0 {
= Getegid()
} else {
= Getgid()
}
if uint32() == .Gid || isGroupMember() {
= (.Mode >> 3) & 7
} else {
= .Mode & 7
}
}
if & == {
return nil
}
return EACCES
}
func ( int, string, uint32, int) ( error) {
if &^_AT_SYMLINK_NOFOLLOW != 0 {
return EINVAL
} else if &_AT_SYMLINK_NOFOLLOW != 0 {
return EOPNOTSUPP
}
return fchmodat(, , )
}
func ( string, string) ( error) {
return linkat(_AT_FDCWD, , _AT_FDCWD, , 0)
}
func ( string, uint32) ( error) {
return Mkdirat(_AT_FDCWD, , )
}
func ( string, uint32, int) ( error) {
return Mknodat(_AT_FDCWD, , , )
}
func ( string, int, uint32) ( int, error) {
return openat(_AT_FDCWD, , |O_LARGEFILE, )
}
func ( int, string, int, uint32) ( int, error) {
return openat(, , |O_LARGEFILE, )
}
func ( string, []byte) ( int, error) {
return readlinkat(_AT_FDCWD, , )
}
func ( string, string) ( error) {
return Renameat(_AT_FDCWD, , _AT_FDCWD, )
}
func ( string) error {
return unlinkat(_AT_FDCWD, , _AT_REMOVEDIR)
}
func ( string, string) ( error) {
return symlinkat(, _AT_FDCWD, )
}
func ( string) error {
return unlinkat(_AT_FDCWD, , 0)
}
func ( int, string) error {
return unlinkat(, , 0)
}
func ( string, []Timeval) ( error) {
if len() != 2 {
return EINVAL
}
return utimes(, (*[2]Timeval)(unsafe.Pointer(&[0])))
}
func ( string, []Timespec) ( error) {
if len() != 2 {
return EINVAL
}
= utimensat(_AT_FDCWD, , (*[2]Timespec)(unsafe.Pointer(&[0])), 0)
if != ENOSYS {
return
}
var [2]Timeval
for := 0; < 2; ++ {
[].Sec = [].Sec
[].Usec = [].Nsec / 1000
}
return utimes(, (*[2]Timeval)(unsafe.Pointer(&[0])))
}
func ( int, string, []Timeval) ( error) {
if len() != 2 {
return EINVAL
}
return futimesat(, , (*[2]Timeval)(unsafe.Pointer(&[0])))
}
func ( int, []Timeval) ( error) {
return Utimes("/proc/self/fd/"+itoa(), )
}
const ImplementsGetwd = true
func () ( string, error) {
var [PathMax]byte
, := Getcwd([0:])
if != nil {
return "",
}
if < 1 || > len() || [-1] != 0 {
return "", EINVAL
}
return string([0 : -1]), nil
}
func () ( []int, error) {
, := getgroups(0, nil)
if != nil {
return nil,
}
if == 0 {
return nil, nil
}
if < 0 || > 1<<20 {
return nil, EINVAL
}
:= make([]_Gid_t, )
, = getgroups(, &[0])
if != nil {
return nil,
}
= make([]int, )
for , := range [0:] {
[] = int()
}
return
}
var cgo_libc_setgroups unsafe.Pointer
func ( []int) ( error) {
:= uintptr(len())
if == 0 {
if cgo_libc_setgroups == nil {
if , , := AllThreadsSyscall(_SYS_setgroups, 0, 0, 0); != 0 {
= errnoErr()
}
return
}
if := cgocaller(cgo_libc_setgroups, 0, 0); != 0 {
= errnoErr(Errno())
}
return
}
:= make([]_Gid_t, len())
for , := range {
[] = _Gid_t()
}
if cgo_libc_setgroups == nil {
if , , := AllThreadsSyscall(_SYS_setgroups, , uintptr(unsafe.Pointer(&[0])), 0); != 0 {
= errnoErr()
}
return
}
if := cgocaller(cgo_libc_setgroups, , uintptr(unsafe.Pointer(&[0]))); != 0 {
= errnoErr(Errno())
}
return
}
type WaitStatus uint32
const (
mask = 0x7F
core = 0x80
exited = 0x00
stopped = 0x7F
shift = 8
)
func ( WaitStatus) () bool { return &mask == exited }
func ( WaitStatus) () bool { return &mask != stopped && &mask != exited }
func ( WaitStatus) () bool { return &0xFF == stopped }
func ( WaitStatus) () bool { return == 0xFFFF }
func ( WaitStatus) () bool { return .Signaled() && &core != 0 }
func ( WaitStatus) () int {
if !.Exited() {
return -1
}
return int(>>shift) & 0xFF
}
func ( WaitStatus) () Signal {
if !.Signaled() {
return -1
}
return Signal( & mask)
}
func ( WaitStatus) () Signal {
if !.Stopped() {
return -1
}
return Signal(>>shift) & 0xFF
}
func ( WaitStatus) () int {
if .StopSignal() != SIGTRAP {
return -1
}
return int(>>shift) >> 8
}
func ( int, *WaitStatus, int, *Rusage) ( int, error) {
var _C_int
, = wait4(, &, , )
if != nil {
* = WaitStatus()
}
return
}
func ( string, uint32) ( error) {
return Mknod(, |S_IFIFO, 0)
}
func ( *SockaddrInet4) () (unsafe.Pointer, _Socklen, error) {
if .Port < 0 || .Port > 0xFFFF {
return nil, 0, EINVAL
}
.raw.Family = AF_INET
:= (*[2]byte)(unsafe.Pointer(&.raw.Port))
[0] = byte(.Port >> 8)
[1] = byte(.Port)
for := 0; < len(.Addr); ++ {
.raw.Addr[] = .Addr[]
}
return unsafe.Pointer(&.raw), SizeofSockaddrInet4, nil
}
func ( *SockaddrInet6) () (unsafe.Pointer, _Socklen, error) {
if .Port < 0 || .Port > 0xFFFF {
return nil, 0, EINVAL
}
.raw.Family = AF_INET6
:= (*[2]byte)(unsafe.Pointer(&.raw.Port))
[0] = byte(.Port >> 8)
[1] = byte(.Port)
.raw.Scope_id = .ZoneId
for := 0; < len(.Addr); ++ {
.raw.Addr[] = .Addr[]
}
return unsafe.Pointer(&.raw), SizeofSockaddrInet6, nil
}
func ( *SockaddrUnix) () (unsafe.Pointer, _Socklen, error) {
:= .Name
:= len()
if > len(.raw.Path) {
return nil, 0, EINVAL
}
if == len(.raw.Path) && [0] != '@' {
return nil, 0, EINVAL
}
.raw.Family = AF_UNIX
for := 0; < ; ++ {
.raw.Path[] = int8([])
}
:= _Socklen(2)
if > 0 {
+= _Socklen() + 1
}
if .raw.Path[0] == '@' {
.raw.Path[0] = 0
--
}
return unsafe.Pointer(&.raw), , nil
}
type SockaddrLinklayer struct {
Protocol uint16
Ifindex int
Hatype uint16
Pkttype uint8
Halen uint8
Addr [8]byte
raw RawSockaddrLinklayer
}
func ( *SockaddrLinklayer) () (unsafe.Pointer, _Socklen, error) {
if .Ifindex < 0 || .Ifindex > 0x7fffffff {
return nil, 0, EINVAL
}
.raw.Family = AF_PACKET
.raw.Protocol = .Protocol
.raw.Ifindex = int32(.Ifindex)
.raw.Hatype = .Hatype
.raw.Pkttype = .Pkttype
.raw.Halen = .Halen
for := 0; < len(.Addr); ++ {
.raw.Addr[] = .Addr[]
}
return unsafe.Pointer(&.raw), SizeofSockaddrLinklayer, nil
}
type SockaddrNetlink struct {
Family uint16
Pad uint16
Pid uint32
Groups uint32
raw RawSockaddrNetlink
}
func ( *SockaddrNetlink) () (unsafe.Pointer, _Socklen, error) {
.raw.Family = AF_NETLINK
.raw.Pad = .Pad
.raw.Pid = .Pid
.raw.Groups = .Groups
return unsafe.Pointer(&.raw), SizeofSockaddrNetlink, nil
}
func ( *RawSockaddrAny) (Sockaddr, error) {
switch .Addr.Family {
case AF_NETLINK:
:= (*RawSockaddrNetlink)(unsafe.Pointer())
:= new(SockaddrNetlink)
.Family = .Family
.Pad = .Pad
.Pid = .Pid
.Groups = .Groups
return , nil
case AF_PACKET:
:= (*RawSockaddrLinklayer)(unsafe.Pointer())
:= new(SockaddrLinklayer)
.Protocol = .Protocol
.Ifindex = int(.Ifindex)
.Hatype = .Hatype
.Pkttype = .Pkttype
.Halen = .Halen
for := 0; < len(.Addr); ++ {
.Addr[] = .Addr[]
}
return , nil
case AF_UNIX:
:= (*RawSockaddrUnix)(unsafe.Pointer())
:= new(SockaddrUnix)
if .Path[0] == 0 {
.Path[0] = '@'
}
:= 0
for < len(.Path) && .Path[] != 0 {
++
}
:= (*[len(.Path)]byte)(unsafe.Pointer(&.Path[0]))[0:]
.Name = string()
return , nil
case AF_INET:
:= (*RawSockaddrInet4)(unsafe.Pointer())
:= new(SockaddrInet4)
:= (*[2]byte)(unsafe.Pointer(&.Port))
.Port = int([0])<<8 + int([1])
for := 0; < len(.Addr); ++ {
.Addr[] = .Addr[]
}
return , nil
case AF_INET6:
:= (*RawSockaddrInet6)(unsafe.Pointer())
:= new(SockaddrInet6)
:= (*[2]byte)(unsafe.Pointer(&.Port))
.Port = int([0])<<8 + int([1])
.ZoneId = .Scope_id
for := 0; < len(.Addr); ++ {
.Addr[] = .Addr[]
}
return , nil
}
return nil, EAFNOSUPPORT
}
func ( int) ( int, Sockaddr, error) {
var RawSockaddrAny
var _Socklen = SizeofSockaddrAny
, = accept(, &, &)
if != nil {
return
}
, = anyToSockaddr(&)
if != nil {
Close()
= 0
}
return
}
func ( int, int) ( int, Sockaddr, error) {
var RawSockaddrAny
var _Socklen = SizeofSockaddrAny
, = accept4(, &, &, )
if != nil {
return
}
if > SizeofSockaddrAny {
panic("RawSockaddrAny too small")
}
, = anyToSockaddr(&)
if != nil {
Close()
= 0
}
return
}
func ( int) ( Sockaddr, error) {
var RawSockaddrAny
var _Socklen = SizeofSockaddrAny
if = getsockname(, &, &); != nil {
return
}
return anyToSockaddr(&)
}
func (, , int) ( [4]byte, error) {
:= _Socklen(4)
= getsockopt(, , , unsafe.Pointer(&[0]), &)
return ,
}
func (, , int) (*IPMreq, error) {
var IPMreq
:= _Socklen(SizeofIPMreq)
:= getsockopt(, , , unsafe.Pointer(&), &)
return &,
}
func (, , int) (*IPMreqn, error) {
var IPMreqn
:= _Socklen(SizeofIPMreqn)
:= getsockopt(, , , unsafe.Pointer(&), &)
return &,
}
func (, , int) (*IPv6Mreq, error) {
var IPv6Mreq
:= _Socklen(SizeofIPv6Mreq)
:= getsockopt(, , , unsafe.Pointer(&), &)
return &,
}
func (, , int) (*IPv6MTUInfo, error) {
var IPv6MTUInfo
:= _Socklen(SizeofIPv6MTUInfo)
:= getsockopt(, , , unsafe.Pointer(&), &)
return &,
}
func (, , int) (*ICMPv6Filter, error) {
var ICMPv6Filter
:= _Socklen(SizeofICMPv6Filter)
:= getsockopt(, , , unsafe.Pointer(&), &)
return &,
}
func (, , int) (*Ucred, error) {
var Ucred
:= _Socklen(SizeofUcred)
:= getsockopt(, , , unsafe.Pointer(&), &)
return &,
}
func (, , int, *IPMreqn) ( error) {
return setsockopt(, , , unsafe.Pointer(), unsafe.Sizeof(*))
}
func ( int, , []byte, int) (, int, int, Sockaddr, error) {
var Msghdr
var RawSockaddrAny
.Name = (*byte)(unsafe.Pointer(&))
.Namelen = uint32(SizeofSockaddrAny)
var Iovec
if len() > 0 {
.Base = &[0]
.SetLen(len())
}
var byte
if len() > 0 {
if len() == 0 {
var int
, = GetsockoptInt(, SOL_SOCKET, SO_TYPE)
if != nil {
return
}
if != SOCK_DGRAM {
.Base = &
.SetLen(1)
}
}
.Control = &[0]
.SetControllen(len())
}
.Iov = &
.Iovlen = 1
if , = recvmsg(, &, ); != nil {
return
}
= int(.Controllen)
= int(.Flags)
if .Addr.Family != AF_UNSPEC {
, = anyToSockaddr(&)
}
return
}
func ( int, , []byte, Sockaddr, int) ( error) {
_, = SendmsgN(, , , , )
return
}
func ( int, , []byte, Sockaddr, int) ( int, error) {
var unsafe.Pointer
var _Socklen
if != nil {
var error
, , = .sockaddr()
if != nil {
return 0,
}
}
var Msghdr
.Name = (*byte)()
.Namelen = uint32()
var Iovec
if len() > 0 {
.Base = &[0]
.SetLen(len())
}
var byte
if len() > 0 {
if len() == 0 {
var int
, = GetsockoptInt(, SOL_SOCKET, SO_TYPE)
if != nil {
return 0,
}
if != SOCK_DGRAM {
.Base = &
.SetLen(1)
}
}
.Control = &[0]
.SetControllen(len())
}
.Iov = &
.Iovlen = 1
if , = sendmsg(, &, ); != nil {
return 0,
}
if len() > 0 && len() == 0 {
= 0
}
return , nil
}
func ( int, string) ( error) {
return SetsockoptString(, SOL_SOCKET, SO_BINDTODEVICE, )
}
func ( int, int, uintptr, []byte) ( int, error) {
var [sizeofPtr]byte
:= 0
if %sizeofPtr != 0 {
= ptrace(, , -%sizeofPtr, uintptr(unsafe.Pointer(&[0])))
if != nil {
return 0,
}
+= copy(, [%sizeofPtr:])
= [:]
}
for len() > 0 {
= ptrace(, , +uintptr(), uintptr(unsafe.Pointer(&[0])))
if != nil {
return ,
}
:= copy(, [0:])
+=
= [:]
}
return , nil
}
func ( int, uintptr, []byte) ( int, error) {
return ptracePeek(PTRACE_PEEKTEXT, , , )
}
func ( int, uintptr, []byte) ( int, error) {
return ptracePeek(PTRACE_PEEKDATA, , , )
}
func ( int, int, int, uintptr, []byte) ( int, error) {
:= 0
if %sizeofPtr != 0 {
var [sizeofPtr]byte
= ptrace(, , -%sizeofPtr, uintptr(unsafe.Pointer(&[0])))
if != nil {
return 0,
}
+= copy([%sizeofPtr:], )
:= *((*uintptr)(unsafe.Pointer(&[0])))
= ptrace(, , -%sizeofPtr, )
if != nil {
return 0,
}
= [:]
}
for len() > sizeofPtr {
:= *((*uintptr)(unsafe.Pointer(&[0])))
= ptrace(, , +uintptr(), )
if != nil {
return ,
}
+= sizeofPtr
= [sizeofPtr:]
}
if len() > 0 {
var [sizeofPtr]byte
= ptrace(, , +uintptr(), uintptr(unsafe.Pointer(&[0])))
if != nil {
return ,
}
copy([0:], )
:= *((*uintptr)(unsafe.Pointer(&[0])))
= ptrace(, , +uintptr(), )
if != nil {
return ,
}
+= len()
}
return , nil
}
func ( int, uintptr, []byte) ( int, error) {
return ptracePoke(PTRACE_POKETEXT, PTRACE_PEEKTEXT, , , )
}
func ( int, uintptr, []byte) ( int, error) {
return ptracePoke(PTRACE_POKEDATA, PTRACE_PEEKDATA, , , )
}
func ( int, *PtraceRegs) ( error) {
return ptrace(PTRACE_GETREGS, , 0, uintptr(unsafe.Pointer()))
}
func ( int, *PtraceRegs) ( error) {
return ptrace(PTRACE_SETREGS, , 0, uintptr(unsafe.Pointer()))
}
func ( int, int) ( error) {
return ptrace(PTRACE_SETOPTIONS, , 0, uintptr())
}
func ( int) ( uint, error) {
var _C_long
= ptrace(PTRACE_GETEVENTMSG, , 0, uintptr(unsafe.Pointer(&)))
= uint()
return
}
func ( int, int) ( error) {
return ptrace(PTRACE_CONT, , 0, uintptr())
}
func ( int, int) ( error) {
return ptrace(PTRACE_SYSCALL, , 0, uintptr())
}
func ( int) ( error) { return ptrace(PTRACE_SINGLESTEP, , 0, 0) }
func ( int) ( error) { return ptrace(PTRACE_ATTACH, , 0, 0) }
func ( int) ( error) { return ptrace(PTRACE_DETACH, , 0, 0) }
func ( int) ( error) {
return reboot(LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2, , "")
}
func ( int, []byte) ( int, error) {
return Getdents(, )
}
func ( []byte) (uint64, bool) {
return readInt(, unsafe.Offsetof(Dirent{}.Ino), unsafe.Sizeof(Dirent{}.Ino))
}
func ( []byte) (uint64, bool) {
return readInt(, unsafe.Offsetof(Dirent{}.Reclen), unsafe.Sizeof(Dirent{}.Reclen))
}
func ( []byte) (uint64, bool) {
, := direntReclen()
if ! {
return 0, false
}
return - uint64(unsafe.Offsetof(Dirent{}.Name)), true
}
func ( string, string, string, uintptr, string) ( error) {
if == "" {
return mount(, , , , nil)
}
, := BytePtrFromString()
if != nil {
return
}
return mount(, , , , )
}
func () ( int) {
, _ = Getpgid(0)
return
}
type allThreadsCaller struct {
trap, a1, a2, a3, a4, a5, a6 uintptr
r1, r2 uintptr
err Errno
}
func ( *allThreadsCaller) ( bool) bool {
, , := RawSyscall(.trap, .a1, .a2, .a3)
if {
.r1 =
.r2 =
.err =
} else if .r1 != || (archHonorsR2 && .r2 != ) || .err != {
print("trap:", .trap, ", a123=[", .a1, ",", .a2, ",", .a3, "]\n")
print("results: got {r1=", , ",r2=", , ",err=", , "}, want {r1=", .r1, ",r2=", .r2, ",r3=", .err, "}\n")
panic("AllThreadsSyscall results differ between threads; runtime corrupted")
}
return == 0
}
func ( *allThreadsCaller) ( bool) bool {
, , := RawSyscall6(.trap, .a1, .a2, .a3, .a4, .a5, .a6)
if {
.r1 =
.r2 =
.err =
} else if .r1 != || (archHonorsR2 && .r2 != ) || .err != {
print("trap:", .trap, ", a123456=[", .a1, ",", .a2, ",", .a3, ",", .a4, ",", .a5, ",", .a6, "]\n")
print("results: got {r1=", , ",r2=", , ",err=", , "}, want {r1=", .r1, ",r2=", .r2, ",r3=", .err, "}\n")
panic("AllThreadsSyscall6 results differ between threads; runtime corrupted")
}
return == 0
}
func ( func(bool) bool)
func (, , , uintptr) (, uintptr, Errno) {
if cgo_libc_setegid != nil {
return minus1, minus1, ENOTSUP
}
:= &allThreadsCaller{
trap: ,
a1: ,
a2: ,
a3: ,
}
runtime_doAllThreadsSyscall(.doSyscall)
= .r1
= .r2
= .err
return
}
func (, , , , , , uintptr) (, uintptr, Errno) {
if cgo_libc_setegid != nil {
return minus1, minus1, ENOTSUP
}
:= &allThreadsCaller{
trap: ,
a1: ,
a2: ,
a3: ,
a4: ,
a5: ,
a6: ,
}
runtime_doAllThreadsSyscall(.doSyscall6)
= .r1
= .r2
= .err
return
}
func (unsafe.Pointer, ...uintptr) uintptr
var cgo_libc_setegid unsafe.Pointer
const minus1 = ^uintptr(0)
func ( int) ( error) {
if cgo_libc_setegid == nil {
if , , := AllThreadsSyscall(SYS_SETRESGID, minus1, uintptr(), minus1); != 0 {
= errnoErr()
}
} else if := cgocaller(cgo_libc_setegid, uintptr()); != 0 {
= errnoErr(Errno())
}
return
}
var cgo_libc_seteuid unsafe.Pointer
func ( int) ( error) {
if cgo_libc_seteuid == nil {
if , , := AllThreadsSyscall(SYS_SETRESUID, minus1, uintptr(), minus1); != 0 {
= errnoErr()
}
} else if := cgocaller(cgo_libc_seteuid, uintptr()); != 0 {
= errnoErr(Errno())
}
return
}
var cgo_libc_setgid unsafe.Pointer
func ( int) ( error) {
if cgo_libc_setgid == nil {
if , , := AllThreadsSyscall(sys_SETGID, uintptr(), 0, 0); != 0 {
= errnoErr()
}
} else if := cgocaller(cgo_libc_setgid, uintptr()); != 0 {
= errnoErr(Errno())
}
return
}
var cgo_libc_setregid unsafe.Pointer
func (, int) ( error) {
if cgo_libc_setregid == nil {
if , , := AllThreadsSyscall(sys_SETREGID, uintptr(), uintptr(), 0); != 0 {
= errnoErr()
}
} else if := cgocaller(cgo_libc_setregid, uintptr(), uintptr()); != 0 {
= errnoErr(Errno())
}
return
}
var cgo_libc_setresgid unsafe.Pointer
func (, , int) ( error) {
if cgo_libc_setresgid == nil {
if , , := AllThreadsSyscall(sys_SETRESGID, uintptr(), uintptr(), uintptr()); != 0 {
= errnoErr()
}
} else if := cgocaller(cgo_libc_setresgid, uintptr(), uintptr(), uintptr()); != 0 {
= errnoErr(Errno())
}
return
}
var cgo_libc_setresuid unsafe.Pointer
func (, , int) ( error) {
if cgo_libc_setresuid == nil {
if , , := AllThreadsSyscall(sys_SETRESUID, uintptr(), uintptr(), uintptr()); != 0 {
= errnoErr()
}
} else if := cgocaller(cgo_libc_setresuid, uintptr(), uintptr(), uintptr()); != 0 {
= errnoErr(Errno())
}
return
}
var cgo_libc_setreuid unsafe.Pointer
func (, int) ( error) {
if cgo_libc_setreuid == nil {
if , , := AllThreadsSyscall(sys_SETREUID, uintptr(), uintptr(), 0); != 0 {
= errnoErr()
}
} else if := cgocaller(cgo_libc_setreuid, uintptr(), uintptr()); != 0 {
= errnoErr(Errno())
}
return
}
var cgo_libc_setuid unsafe.Pointer
func ( int) ( error) {
if cgo_libc_setuid == nil {
if , , := AllThreadsSyscall(sys_SETUID, uintptr(), 0, 0); != 0 {
= errnoErr()
}
} else if := cgocaller(cgo_libc_setuid, uintptr()); != 0 {
= errnoErr(Errno())
}
return
}
var mapper = &mmapper{
active: make(map[*byte][]byte),
mmap: mmap,
munmap: munmap,
}
func ( int, int64, int, int, int) ( []byte, error) {
return mapper.Mmap(, , , , )
}
func ( []byte) ( error) {
return mapper.Munmap()
}