diff --git a/unix/syscall_linux.go b/unix/syscall_linux.go index e54d20a4d..c9eddcbfb 100644 --- a/unix/syscall_linux.go +++ b/unix/syscall_linux.go @@ -1617,6 +1617,87 @@ func sendmsgN(fd int, iov []Iovec, oob []byte, ptr unsafe.Pointer, salen _Sockle return n, nil } +// RecvmmsgData holds the per-message buffers and results for [Recvmmsg]. +// A RecvmmsgData slice can be pre-allocated and reused across calls without +// any per-call allocation. +type RecvmmsgData struct { + Data [][]byte // payload buffers; each entry is a separate iovec + OOB []byte // control buffer + N int // set on return: payload bytes received into Data + OOBN int // set on return: OOB bytes received into OOB; interpret with [ParseSocketControlMessage] + Flags int // set on return: per-message flags + From RawSockaddrAny // set on return: raw sender address; zero (AF_UNSPEC) for connected sockets +} + +// Recvmmsg receives multiple messages from a socket using the recvmmsg system +// call. msgs is a caller-provided slice, one entry per message slot. Data and +// OOB in each entry must be pre-allocated; the call writes N, OOBN, Flags, +// and From back into each entry. n is the number of messages received. +// +// To convert From to a [Sockaddr], call [AnyToSockaddr]. +func Recvmmsg(fd int, msgs []RecvmmsgData, flags int) (n int, err error) { + vlen := len(msgs) + if vlen == 0 { + return 0, EINVAL + } + + totalIovecs := 0 + for i := range msgs { + totalIovecs += len(msgs[i].Data) + } + + msghdrs := make([]Mmsghdr, vlen) + var iovecs []Iovec + if totalIovecs > 0 { + iovecs = make([]Iovec, totalIovecs) + } + + iovIdx := 0 + for i := range vlen { + m := &msgs[i] + // clear stale address from previous call on reuse + m.From = RawSockaddrAny{} + if len(m.Data) > 0 { + startIdx := iovIdx + for _, b := range m.Data { + if len(b) > 0 { + iovecs[iovIdx].Base = &b[0] + iovecs[iovIdx].SetLen(len(b)) + } else { + iovecs[iovIdx].Base = (*byte)(unsafe.Pointer(&_zero)) + } + iovIdx++ + } + msghdrs[i].Hdr.Iov = &iovecs[startIdx] + msghdrs[i].Hdr.SetIovlen(len(m.Data)) + } + if len(m.OOB) > 0 { + msghdrs[i].Hdr.Control = &m.OOB[0] + msghdrs[i].Hdr.SetControllen(len(m.OOB)) + } + msghdrs[i].Hdr.Name = (*byte)(unsafe.Pointer(&m.From)) + msghdrs[i].Hdr.Namelen = uint32(SizeofSockaddrAny) + } + + n, err = recvmmsg(fd, &msghdrs[0], vlen, flags, nil) + if err != nil { + return 0, err + } + + for i := range n { + msgs[i].N = int(msghdrs[i].Len) + msgs[i].OOBN = int(msghdrs[i].Hdr.Controllen) + msgs[i].Flags = int(msghdrs[i].Hdr.Flags) + } + + return +} + +// AnyToSockaddr converts a raw socket address to a [Sockaddr] interface. +func AnyToSockaddr(fd int, rsa *RawSockaddrAny) (Sockaddr, error) { + return anyToSockaddr(fd, rsa) +} + // BindToDevice binds the socket associated with fd to device. func BindToDevice(fd int, device string) (err error) { return SetsockoptString(fd, SOL_SOCKET, SO_BINDTODEVICE, device) diff --git a/unix/syscall_linux_386.go b/unix/syscall_linux_386.go index 210d545c9..6e29ef62c 100644 --- a/unix/syscall_linux_386.go +++ b/unix/syscall_linux_386.go @@ -252,6 +252,14 @@ func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { return } +func recvmmsg(s int, mmsg *Mmsghdr, vlen int, flags int, timeout *Timespec) (n int, err error) { + n, e := socketcall(_RECVMMSG, uintptr(s), uintptr(unsafe.Pointer(mmsg)), uintptr(vlen), uintptr(flags), uintptr(unsafe.Pointer(timeout)), 0) + if e != 0 { + err = e + } + return +} + func Listen(s int, n int) (err error) { _, e := socketcall(_LISTEN, uintptr(s), uintptr(n), 0, 0, 0, 0) if e != 0 { diff --git a/unix/syscall_linux_amd64.go b/unix/syscall_linux_amd64.go index a9a52f231..4de6dda19 100644 --- a/unix/syscall_linux_amd64.go +++ b/unix/syscall_linux_amd64.go @@ -71,6 +71,7 @@ func Stat(path string, stat *Stat_t) (err error) { //sys sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) //sys recvmsg(s int, msg *Msghdr, flags int) (n int, err error) //sys sendmsg(s int, msg *Msghdr, flags int) (n int, err error) +//sys recvmmsg(s int, mmsg *Mmsghdr, vlen int, flags int, timeout *Timespec) (n int, err error) //sys mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) //sys futimesat(dirfd int, path string, times *[2]Timeval) (err error) diff --git a/unix/syscall_linux_arm.go b/unix/syscall_linux_arm.go index 54474c20f..4d641504e 100644 --- a/unix/syscall_linux_arm.go +++ b/unix/syscall_linux_arm.go @@ -41,6 +41,7 @@ func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { //sysnb socketpair(domain int, typ int, flags int, fd *[2]int32) (err error) //sys recvmsg(s int, msg *Msghdr, flags int) (n int, err error) //sys sendmsg(s int, msg *Msghdr, flags int) (n int, err error) +//sys recvmmsg(s int, mmsg *Mmsghdr, vlen int, flags int, timeout *Timespec) (n int, err error) // 64-bit file system and 32-bit uid calls // (16-bit uid calls are not always supported in newer kernels) diff --git a/unix/syscall_linux_arm64.go b/unix/syscall_linux_arm64.go index e9f30db97..e0e2482cb 100644 --- a/unix/syscall_linux_arm64.go +++ b/unix/syscall_linux_arm64.go @@ -75,6 +75,7 @@ func Ustat(dev int, ubuf *Ustat_t) (err error) { //sys sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) //sys recvmsg(s int, msg *Msghdr, flags int) (n int, err error) //sys sendmsg(s int, msg *Msghdr, flags int) (n int, err error) +//sys recvmmsg(s int, mmsg *Mmsghdr, vlen int, flags int, timeout *Timespec) (n int, err error) //sys mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) //sysnb Gettimeofday(tv *Timeval) (err error) diff --git a/unix/syscall_linux_loong64.go b/unix/syscall_linux_loong64.go index 6f09ca200..fcf094fd4 100644 --- a/unix/syscall_linux_loong64.go +++ b/unix/syscall_linux_loong64.go @@ -107,6 +107,7 @@ func Ustat(dev int, ubuf *Ustat_t) (err error) { //sys sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) //sys recvmsg(s int, msg *Msghdr, flags int) (n int, err error) //sys sendmsg(s int, msg *Msghdr, flags int) (n int, err error) +//sys recvmmsg(s int, mmsg *Mmsghdr, vlen int, flags int, timeout *Timespec) (n int, err error) //sys mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) //sysnb Gettimeofday(tv *Timeval) (err error) diff --git a/unix/syscall_linux_mips64x.go b/unix/syscall_linux_mips64x.go index ca3b56597..6d4e9a07f 100644 --- a/unix/syscall_linux_mips64x.go +++ b/unix/syscall_linux_mips64x.go @@ -55,6 +55,7 @@ func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err //sys sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) //sys recvmsg(s int, msg *Msghdr, flags int) (n int, err error) //sys sendmsg(s int, msg *Msghdr, flags int) (n int, err error) +//sys recvmmsg(s int, mmsg *Mmsghdr, vlen int, flags int, timeout *Timespec) (n int, err error) //sys mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) //sys futimesat(dirfd int, path string, times *[2]Timeval) (err error) diff --git a/unix/syscall_linux_mipsx.go b/unix/syscall_linux_mipsx.go index 54ba667b1..b11dfcf4e 100644 --- a/unix/syscall_linux_mipsx.go +++ b/unix/syscall_linux_mipsx.go @@ -49,6 +49,7 @@ func Syscall9(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, //sys sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) //sys recvmsg(s int, msg *Msghdr, flags int) (n int, err error) //sys sendmsg(s int, msg *Msghdr, flags int) (n int, err error) +//sys recvmmsg(s int, mmsg *Mmsghdr, vlen int, flags int, timeout *Timespec) (n int, err error) //sys Ioperm(from int, num int, on int) (err error) //sys Iopl(level int) (err error) diff --git a/unix/syscall_linux_ppc.go b/unix/syscall_linux_ppc.go index ce4628590..62f00a744 100644 --- a/unix/syscall_linux_ppc.go +++ b/unix/syscall_linux_ppc.go @@ -52,6 +52,7 @@ import ( //sys sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) //sys recvmsg(s int, msg *Msghdr, flags int) (n int, err error) //sys sendmsg(s int, msg *Msghdr, flags int) (n int, err error) +//sys recvmmsg(s int, mmsg *Mmsghdr, vlen int, flags int, timeout *Timespec) (n int, err error) //sys futimesat(dirfd int, path string, times *[2]Timeval) (err error) //sysnb Gettimeofday(tv *Timeval) (err error) diff --git a/unix/syscall_linux_ppc64x.go b/unix/syscall_linux_ppc64x.go index 33f7af380..fb8fc2383 100644 --- a/unix/syscall_linux_ppc64x.go +++ b/unix/syscall_linux_ppc64x.go @@ -52,6 +52,7 @@ package unix //sys sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) //sys recvmsg(s int, msg *Msghdr, flags int) (n int, err error) //sys sendmsg(s int, msg *Msghdr, flags int) (n int, err error) +//sys recvmmsg(s int, mmsg *Mmsghdr, vlen int, flags int, timeout *Timespec) (n int, err error) //sys mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) //sys futimesat(dirfd int, path string, times *[2]Timeval) (err error) diff --git a/unix/syscall_linux_riscv64.go b/unix/syscall_linux_riscv64.go index c658871e3..924ff6507 100644 --- a/unix/syscall_linux_riscv64.go +++ b/unix/syscall_linux_riscv64.go @@ -74,6 +74,7 @@ func Ustat(dev int, ubuf *Ustat_t) (err error) { //sys sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) //sys recvmsg(s int, msg *Msghdr, flags int) (n int, err error) //sys sendmsg(s int, msg *Msghdr, flags int) (n int, err error) +//sys recvmmsg(s int, mmsg *Mmsghdr, vlen int, flags int, timeout *Timespec) (n int, err error) //sys mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) //sysnb Gettimeofday(tv *Timeval) (err error) diff --git a/unix/syscall_linux_sparc64.go b/unix/syscall_linux_sparc64.go index cd50715c9..33a676306 100644 --- a/unix/syscall_linux_sparc64.go +++ b/unix/syscall_linux_sparc64.go @@ -50,6 +50,7 @@ package unix //sys sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) //sys recvmsg(s int, msg *Msghdr, flags int) (n int, err error) //sys sendmsg(s int, msg *Msghdr, flags int) (n int, err error) +//sys recvmmsg(s int, mmsg *Mmsghdr, vlen int, flags int, timeout *Timespec) (n int, err error) //sys mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) func Ioperm(from int, num int, on int) (err error) { diff --git a/unix/syscall_linux_test.go b/unix/syscall_linux_test.go index 03f3ebf83..764e714d4 100644 --- a/unix/syscall_linux_test.go +++ b/unix/syscall_linux_test.go @@ -1479,3 +1479,190 @@ func TestSockaddrALG(t *testing.T) { t.Fatalf("got: %q, want: %q", got, exp) } } + +func TestRecvmmsg(t *testing.T) { + tests := []struct { + name string + messages int + batchSize int + }{ + { + name: "equal_messages_and_batch", + messages: 3, + batchSize: 3, + }, + { + name: "fewer_messages_than_batch", + messages: 2, + batchSize: 6, + }, + { + name: "more_messages_than_batch", + messages: 5, + batchSize: 2, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + fds, err := unix.Socketpair(unix.AF_UNIX, unix.SOCK_DGRAM, 0) + if err != nil { + t.Fatal(err) + } + defer unix.Close(fds[0]) + defer unix.Close(fds[1]) + + for i := 0; i < tt.messages; i++ { + msg := fmt.Sprintf("msg%d", i+1) + if _, err := unix.Write(fds[1], []byte(msg)); err != nil { + t.Fatalf("Write: %v", err) + } + } + + msgs := make([]unix.RecvmmsgData, tt.batchSize) + for i := range msgs { + msgs[i].Data = [][]byte{make([]byte, 64)} + } + + read := 0 + for read < tt.messages { + n, err := unix.Recvmmsg(fds[0], msgs, unix.MSG_DONTWAIT) + if err != nil { + if errors.Is(err, unix.ENOSYS) { + t.Skipf("recvmmsg not available: %v", err) + } + t.Fatalf("Recvmmsg: %v", err) + } + + wantBatchSize := min(tt.messages-read, tt.batchSize) + if n != wantBatchSize { + t.Fatalf("Recvmmsg: got %d messages, want %d", n, wantBatchSize) + } + + for i := range n { + got := string(msgs[i].Data[0][:msgs[i].N]) + want := fmt.Sprintf("msg%d", read+i+1) + if got != want { + t.Errorf("message %d: got %q, want %q", i, got, want) + } + if msgs[i].N != len(want) { + t.Errorf("message %d: got N=%d, want %d", i, msgs[i].N, len(want)) + } + if msgs[i].OOBN != 0 { + t.Errorf("message %d: got OOBN=%d, want 0", i, msgs[i].OOBN) + } + if msgs[i].Flags != 0 { + t.Errorf("message %d: got Flags=%#x, want 0", i, msgs[i].Flags) + } + // socketpair is connected; kernel does not fill sender address + if msgs[i].From.Addr.Family != unix.AF_UNSPEC { + t.Errorf("message %d: got From.Addr.Family=%d, want AF_UNSPEC", i, msgs[i].From.Addr.Family) + } + } + + read += n + } + }) + } +} + +func TestRecvmmsgScatterGather(t *testing.T) { + fds, err := unix.Socketpair(unix.AF_UNIX, unix.SOCK_DGRAM, 0) + if err != nil { + t.Fatal(err) + } + defer unix.Close(fds[0]) + defer unix.Close(fds[1]) + + // Send two messages; each will be received into two separate buffers. + for i := range 2 { + msg := fmt.Sprintf("abcd%d", i) + if _, err := unix.Write(fds[1], []byte(msg)); err != nil { + t.Fatalf("Write: %v", err) + } + } + + msgs := []unix.RecvmmsgData{ + {Data: [][]byte{make([]byte, 2), make([]byte, 3)}}, + {Data: [][]byte{make([]byte, 2), make([]byte, 3)}}, + } + n, err := unix.Recvmmsg(fds[0], msgs, unix.MSG_DONTWAIT) + if err != nil { + if errors.Is(err, unix.ENOSYS) { + t.Skipf("recvmmsg not available: %v", err) + } + t.Fatalf("Recvmmsg: %v", err) + } + if n != 2 { + t.Fatalf("got %d messages, want 2", n) + } + for i := range n { + want := fmt.Sprintf("abcd%d", i) + // N is total bytes across both scatter buffers. + if msgs[i].N != len(want) { + t.Errorf("message %d: got N=%d, want %d", i, msgs[i].N, len(want)) + } + got := string(msgs[i].Data[0]) + string(msgs[i].Data[1][:msgs[i].N-len(msgs[i].Data[0])]) + if got != want { + t.Errorf("message %d: got %q, want %q", i, got, want) + } + } +} + +func TestRecvmmsgFrom(t *testing.T) { + // Use an unconnected UDP socket so the kernel fills in the sender address. + srv, err := unix.Socket(unix.AF_INET, unix.SOCK_DGRAM, 0) + if err != nil { + t.Fatal(err) + } + defer unix.Close(srv) + addr := unix.SockaddrInet4{Port: 0, Addr: [4]byte{127, 0, 0, 1}} + if err := unix.Bind(srv, &addr); err != nil { + t.Fatal(err) + } + sa, err := unix.Getsockname(srv) + if err != nil { + t.Fatal(err) + } + port := sa.(*unix.SockaddrInet4).Port + + cli, err := unix.Socket(unix.AF_INET, unix.SOCK_DGRAM, 0) + if err != nil { + t.Fatal(err) + } + defer unix.Close(cli) + + dst := &unix.SockaddrInet4{Port: port, Addr: [4]byte{127, 0, 0, 1}} + if err := unix.Sendto(cli, []byte("hello"), 0, dst); err != nil { + t.Fatal(err) + } + + msgs := []unix.RecvmmsgData{{Data: [][]byte{make([]byte, 16)}}} + n, err := unix.Recvmmsg(srv, msgs, unix.MSG_DONTWAIT) + if err != nil { + if errors.Is(err, unix.ENOSYS) { + t.Skipf("recvmmsg not available: %v", err) + } + t.Fatal(err) + } + if n != 1 { + t.Fatalf("got %d messages, want 1", n) + } + if string(msgs[0].Data[0][:msgs[0].N]) != "hello" { + t.Errorf("got payload %q, want %q", msgs[0].Data[0][:msgs[0].N], "hello") + } + if msgs[0].From.Addr.Family == unix.AF_UNSPEC { + t.Fatal("From is AF_UNSPEC; expected sender address") + } + from, err := unix.AnyToSockaddr(srv, &msgs[0].From) + if err != nil { + t.Fatalf("AnyToSockaddr: %v", err) + } + fromInet, ok := from.(*unix.SockaddrInet4) + if !ok { + t.Fatalf("expected *SockaddrInet4, got %T", from) + } + if fromInet.Addr != ([4]byte{127, 0, 0, 1}) { + t.Errorf("got sender addr %v, want 127.0.0.1", fromInet.Addr) + } +} diff --git a/unix/zsyscall_linux_amd64.go b/unix/zsyscall_linux_amd64.go index 27c05db1a..8717f421b 100644 --- a/unix/zsyscall_linux_amd64.go +++ b/unix/zsyscall_linux_amd64.go @@ -555,6 +555,17 @@ func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func recvmmsg(s int, mmsg *Mmsghdr, vlen int, flags int, timeout *Timespec) (n int, err error) { + r0, _, e1 := Syscall6(SYS_RECVMMSG, uintptr(s), uintptr(unsafe.Pointer(mmsg)), uintptr(vlen), uintptr(flags), uintptr(unsafe.Pointer(timeout)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) { r0, _, e1 := Syscall6(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flags), uintptr(fd), uintptr(offset)) xaddr = uintptr(r0) diff --git a/unix/zsyscall_linux_arm.go b/unix/zsyscall_linux_arm.go index 840d85bfc..f3cf88e94 100644 --- a/unix/zsyscall_linux_arm.go +++ b/unix/zsyscall_linux_arm.go @@ -213,6 +213,17 @@ func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func recvmmsg(s int, mmsg *Mmsghdr, vlen int, flags int, timeout *Timespec) (n int, err error) { + r0, _, e1 := Syscall6(SYS_RECVMMSG, uintptr(s), uintptr(unsafe.Pointer(mmsg)), uintptr(vlen), uintptr(flags), uintptr(unsafe.Pointer(timeout)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Fchown(fd int, uid int, gid int) (err error) { _, _, e1 := Syscall(SYS_FCHOWN32, uintptr(fd), uintptr(uid), uintptr(gid)) if e1 != 0 { diff --git a/unix/zsyscall_linux_arm64.go b/unix/zsyscall_linux_arm64.go index fe414498b..f8a6334c2 100644 --- a/unix/zsyscall_linux_arm64.go +++ b/unix/zsyscall_linux_arm64.go @@ -500,6 +500,17 @@ func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func recvmmsg(s int, mmsg *Mmsghdr, vlen int, flags int, timeout *Timespec) (n int, err error) { + r0, _, e1 := Syscall6(SYS_RECVMMSG, uintptr(s), uintptr(unsafe.Pointer(mmsg)), uintptr(vlen), uintptr(flags), uintptr(unsafe.Pointer(timeout)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) { r0, _, e1 := Syscall6(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flags), uintptr(fd), uintptr(offset)) xaddr = uintptr(r0) diff --git a/unix/zsyscall_linux_loong64.go b/unix/zsyscall_linux_loong64.go index eb358ce05..dc07703e0 100644 --- a/unix/zsyscall_linux_loong64.go +++ b/unix/zsyscall_linux_loong64.go @@ -434,6 +434,17 @@ func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func recvmmsg(s int, mmsg *Mmsghdr, vlen int, flags int, timeout *Timespec) (n int, err error) { + r0, _, e1 := Syscall6(SYS_RECVMMSG, uintptr(s), uintptr(unsafe.Pointer(mmsg)), uintptr(vlen), uintptr(flags), uintptr(unsafe.Pointer(timeout)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) { r0, _, e1 := Syscall6(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flags), uintptr(fd), uintptr(offset)) xaddr = uintptr(r0) diff --git a/unix/zsyscall_linux_mips.go b/unix/zsyscall_linux_mips.go index c437622f1..76b38575e 100644 --- a/unix/zsyscall_linux_mips.go +++ b/unix/zsyscall_linux_mips.go @@ -454,6 +454,17 @@ func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func recvmmsg(s int, mmsg *Mmsghdr, vlen int, flags int, timeout *Timespec) (n int, err error) { + r0, _, e1 := Syscall6(SYS_RECVMMSG, uintptr(s), uintptr(unsafe.Pointer(mmsg)), uintptr(vlen), uintptr(flags), uintptr(unsafe.Pointer(timeout)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Ioperm(from int, num int, on int) (err error) { _, _, e1 := Syscall(SYS_IOPERM, uintptr(from), uintptr(num), uintptr(on)) if e1 != 0 { diff --git a/unix/zsyscall_linux_mips64.go b/unix/zsyscall_linux_mips64.go index bc4ca2558..e90cb73ae 100644 --- a/unix/zsyscall_linux_mips64.go +++ b/unix/zsyscall_linux_mips64.go @@ -499,6 +499,17 @@ func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func recvmmsg(s int, mmsg *Mmsghdr, vlen int, flags int, timeout *Timespec) (n int, err error) { + r0, _, e1 := Syscall6(SYS_RECVMMSG, uintptr(s), uintptr(unsafe.Pointer(mmsg)), uintptr(vlen), uintptr(flags), uintptr(unsafe.Pointer(timeout)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) { r0, _, e1 := Syscall6(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flags), uintptr(fd), uintptr(offset)) xaddr = uintptr(r0) diff --git a/unix/zsyscall_linux_mips64le.go b/unix/zsyscall_linux_mips64le.go index 5051435ce..458d4a3d1 100644 --- a/unix/zsyscall_linux_mips64le.go +++ b/unix/zsyscall_linux_mips64le.go @@ -499,6 +499,17 @@ func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func recvmmsg(s int, mmsg *Mmsghdr, vlen int, flags int, timeout *Timespec) (n int, err error) { + r0, _, e1 := Syscall6(SYS_RECVMMSG, uintptr(s), uintptr(unsafe.Pointer(mmsg)), uintptr(vlen), uintptr(flags), uintptr(unsafe.Pointer(timeout)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) { r0, _, e1 := Syscall6(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flags), uintptr(fd), uintptr(offset)) xaddr = uintptr(r0) diff --git a/unix/zsyscall_linux_mipsle.go b/unix/zsyscall_linux_mipsle.go index 33aa5418a..4470940d8 100644 --- a/unix/zsyscall_linux_mipsle.go +++ b/unix/zsyscall_linux_mipsle.go @@ -454,6 +454,17 @@ func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func recvmmsg(s int, mmsg *Mmsghdr, vlen int, flags int, timeout *Timespec) (n int, err error) { + r0, _, e1 := Syscall6(SYS_RECVMMSG, uintptr(s), uintptr(unsafe.Pointer(mmsg)), uintptr(vlen), uintptr(flags), uintptr(unsafe.Pointer(timeout)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Ioperm(from int, num int, on int) (err error) { _, _, e1 := Syscall(SYS_IOPERM, uintptr(from), uintptr(num), uintptr(on)) if e1 != 0 { diff --git a/unix/zsyscall_linux_ppc.go b/unix/zsyscall_linux_ppc.go index 3bef8ef1d..129385cfa 100644 --- a/unix/zsyscall_linux_ppc.go +++ b/unix/zsyscall_linux_ppc.go @@ -519,6 +519,17 @@ func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func recvmmsg(s int, mmsg *Mmsghdr, vlen int, flags int, timeout *Timespec) (n int, err error) { + r0, _, e1 := Syscall6(SYS_RECVMMSG, uintptr(s), uintptr(unsafe.Pointer(mmsg)), uintptr(vlen), uintptr(flags), uintptr(unsafe.Pointer(timeout)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func futimesat(dirfd int, path string, times *[2]Timeval) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) diff --git a/unix/zsyscall_linux_ppc64.go b/unix/zsyscall_linux_ppc64.go index fc1bd4e2c..89babe072 100644 --- a/unix/zsyscall_linux_ppc64.go +++ b/unix/zsyscall_linux_ppc64.go @@ -575,6 +575,17 @@ func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func recvmmsg(s int, mmsg *Mmsghdr, vlen int, flags int, timeout *Timespec) (n int, err error) { + r0, _, e1 := Syscall6(SYS_RECVMMSG, uintptr(s), uintptr(unsafe.Pointer(mmsg)), uintptr(vlen), uintptr(flags), uintptr(unsafe.Pointer(timeout)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) { r0, _, e1 := Syscall6(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flags), uintptr(fd), uintptr(offset)) xaddr = uintptr(r0) diff --git a/unix/zsyscall_linux_ppc64le.go b/unix/zsyscall_linux_ppc64le.go index d78fe7dab..b88322f7f 100644 --- a/unix/zsyscall_linux_ppc64le.go +++ b/unix/zsyscall_linux_ppc64le.go @@ -575,6 +575,17 @@ func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func recvmmsg(s int, mmsg *Mmsghdr, vlen int, flags int, timeout *Timespec) (n int, err error) { + r0, _, e1 := Syscall6(SYS_RECVMMSG, uintptr(s), uintptr(unsafe.Pointer(mmsg)), uintptr(vlen), uintptr(flags), uintptr(unsafe.Pointer(timeout)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) { r0, _, e1 := Syscall6(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flags), uintptr(fd), uintptr(offset)) xaddr = uintptr(r0) diff --git a/unix/zsyscall_linux_riscv64.go b/unix/zsyscall_linux_riscv64.go index 76dcf87d0..b0f9f500b 100644 --- a/unix/zsyscall_linux_riscv64.go +++ b/unix/zsyscall_linux_riscv64.go @@ -480,6 +480,17 @@ func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func recvmmsg(s int, mmsg *Mmsghdr, vlen int, flags int, timeout *Timespec) (n int, err error) { + r0, _, e1 := Syscall6(SYS_RECVMMSG, uintptr(s), uintptr(unsafe.Pointer(mmsg)), uintptr(vlen), uintptr(flags), uintptr(unsafe.Pointer(timeout)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) { r0, _, e1 := Syscall6(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flags), uintptr(fd), uintptr(offset)) xaddr = uintptr(r0) diff --git a/unix/zsyscall_linux_sparc64.go b/unix/zsyscall_linux_sparc64.go index b7aca5459..93331ecaa 100644 --- a/unix/zsyscall_linux_sparc64.go +++ b/unix/zsyscall_linux_sparc64.go @@ -555,6 +555,17 @@ func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func recvmmsg(s int, mmsg *Mmsghdr, vlen int, flags int, timeout *Timespec) (n int, err error) { + r0, _, e1 := Syscall6(SYS_RECVMMSG, uintptr(s), uintptr(unsafe.Pointer(mmsg)), uintptr(vlen), uintptr(flags), uintptr(unsafe.Pointer(timeout)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) { r0, _, e1 := Syscall6(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flags), uintptr(fd), uintptr(offset)) xaddr = uintptr(r0)