Commit cf06b9aa authored by Clément Chigot's avatar Clément Chigot Committed by Ian Lance Taylor

[release-branch.go1.12] syscall: on AIX use nsendmsg and nrecvmsg, define SockaddrDatalink

This commit changes sendmsg, recvmsg to use nsendmsg, nrecvmsg on AIX.
These syscalls support the new msghdr structure (with Control
and Controllen) which is needed for golang.org/x/net.
Also define SockaddrDataLink.

Fixes #33982

Change-Id: I233fbd24f9eb86648e0d4d50c2b56da3626292d0
Reviewed-on: https://go-review.googlesource.com/c/go/+/170537
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: default avatarTobias Klauser <tobias.klauser@gmail.com>
(cherry picked from commit e014184c)
Reviewed-on: https://go-review.googlesource.com/c/go/+/193608Reviewed-by: default avatarBrad Fitzpatrick <bradfitz@golang.org>
parent 61a5d114
...@@ -217,8 +217,11 @@ func Wait4(pid int, wstatus *WaitStatus, options int, rusage *Rusage) (wpid int, ...@@ -217,8 +217,11 @@ func Wait4(pid int, wstatus *WaitStatus, options int, rusage *Rusage) (wpid int,
//sys recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) //sys recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error)
//sys sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) //sys sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error)
//sys Shutdown(s int, how int) (err error) //sys Shutdown(s int, how int) (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) // In order to use msghdr structure with Control, Controllen in golang.org/x/net,
// nrecvmsg and nsendmsg must be used.
//sys recvmsg(s int, msg *Msghdr, flags int) (n int, err error) = nrecvmsg
//sys sendmsg(s int, msg *Msghdr, flags int) (n int, err error) = nsendmsg
func (sa *SockaddrInet4) sockaddr() (unsafe.Pointer, _Socklen, error) { func (sa *SockaddrInet4) sockaddr() (unsafe.Pointer, _Socklen, error) {
if sa.Port < 0 || sa.Port > 0xFFFF { if sa.Port < 0 || sa.Port > 0xFFFF {
...@@ -434,6 +437,18 @@ func anyToSockaddr(rsa *RawSockaddrAny) (Sockaddr, error) { ...@@ -434,6 +437,18 @@ func anyToSockaddr(rsa *RawSockaddrAny) (Sockaddr, error) {
return nil, EAFNOSUPPORT return nil, EAFNOSUPPORT
} }
type SockaddrDatalink struct {
Len uint8
Family uint8
Index uint16
Type uint8
Nlen uint8
Alen uint8
Slen uint8
Data [120]uint8
raw RawSockaddrDatalink
}
/* /*
* Wait * Wait
*/ */
......
...@@ -23,6 +23,7 @@ package syscall ...@@ -23,6 +23,7 @@ package syscall
#include <sys/statfs.h> #include <sys/statfs.h>
#include <net/if.h> #include <net/if.h>
#include <net/if_dl.h>
#include <netinet/in.h> #include <netinet/in.h>
#include <netinet/icmp6.h> #include <netinet/icmp6.h>
...@@ -112,6 +113,8 @@ type RawSockaddrInet6 C.struct_sockaddr_in6 ...@@ -112,6 +113,8 @@ type RawSockaddrInet6 C.struct_sockaddr_in6
type RawSockaddrUnix C.struct_sockaddr_un type RawSockaddrUnix C.struct_sockaddr_un
type RawSockaddrDatalink C.struct_sockaddr_dl
type RawSockaddr C.struct_sockaddr type RawSockaddr C.struct_sockaddr
type RawSockaddrAny C.struct_sockaddr_any type RawSockaddrAny C.struct_sockaddr_any
...@@ -133,16 +136,17 @@ type Linger C.struct_linger ...@@ -133,16 +136,17 @@ type Linger C.struct_linger
type Msghdr C.struct_msghdr type Msghdr C.struct_msghdr
const ( const (
SizeofSockaddrInet4 = C.sizeof_struct_sockaddr_in SizeofSockaddrInet4 = C.sizeof_struct_sockaddr_in
SizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 SizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6
SizeofSockaddrAny = C.sizeof_struct_sockaddr_any SizeofSockaddrAny = C.sizeof_struct_sockaddr_any
SizeofSockaddrUnix = C.sizeof_struct_sockaddr_un SizeofSockaddrUnix = C.sizeof_struct_sockaddr_un
SizeofLinger = C.sizeof_struct_linger SizeofSockaddrDatalink = C.sizeof_struct_sockaddr_dl
SizeofIPMreq = C.sizeof_struct_ip_mreq SizeofLinger = C.sizeof_struct_linger
SizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq SizeofIPMreq = C.sizeof_struct_ip_mreq
SizeofMsghdr = C.sizeof_struct_msghdr SizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq
SizeofCmsghdr = C.sizeof_struct_cmsghdr SizeofMsghdr = C.sizeof_struct_msghdr
SizeofICMPv6Filter = C.sizeof_struct_icmp6_filter SizeofCmsghdr = C.sizeof_struct_cmsghdr
SizeofICMPv6Filter = C.sizeof_struct_icmp6_filter
) )
// Ptrace requests // Ptrace requests
......
...@@ -32,8 +32,8 @@ import "unsafe" ...@@ -32,8 +32,8 @@ import "unsafe"
//go:cgo_import_dynamic libc_recvfrom recvfrom "libc.a/shr_64.o" //go:cgo_import_dynamic libc_recvfrom recvfrom "libc.a/shr_64.o"
//go:cgo_import_dynamic libc_sendto sendto "libc.a/shr_64.o" //go:cgo_import_dynamic libc_sendto sendto "libc.a/shr_64.o"
//go:cgo_import_dynamic libc_Shutdown shutdown "libc.a/shr_64.o" //go:cgo_import_dynamic libc_Shutdown shutdown "libc.a/shr_64.o"
//go:cgo_import_dynamic libc_recvmsg recvmsg "libc.a/shr_64.o" //go:cgo_import_dynamic libc_nrecvmsg nrecvmsg "libc.a/shr_64.o"
//go:cgo_import_dynamic libc_sendmsg sendmsg "libc.a/shr_64.o" //go:cgo_import_dynamic libc_nsendmsg nsendmsg "libc.a/shr_64.o"
//go:cgo_import_dynamic libc_accept accept "libc.a/shr_64.o" //go:cgo_import_dynamic libc_accept accept "libc.a/shr_64.o"
//go:cgo_import_dynamic libc_Openat openat "libc.a/shr_64.o" //go:cgo_import_dynamic libc_Openat openat "libc.a/shr_64.o"
//go:cgo_import_dynamic libc_ptrace64 ptrace64 "libc.a/shr_64.o" //go:cgo_import_dynamic libc_ptrace64 ptrace64 "libc.a/shr_64.o"
...@@ -120,8 +120,8 @@ import "unsafe" ...@@ -120,8 +120,8 @@ import "unsafe"
//go:linkname libc_recvfrom libc_recvfrom //go:linkname libc_recvfrom libc_recvfrom
//go:linkname libc_sendto libc_sendto //go:linkname libc_sendto libc_sendto
//go:linkname libc_Shutdown libc_Shutdown //go:linkname libc_Shutdown libc_Shutdown
//go:linkname libc_recvmsg libc_recvmsg //go:linkname libc_nrecvmsg libc_nrecvmsg
//go:linkname libc_sendmsg libc_sendmsg //go:linkname libc_nsendmsg libc_nsendmsg
//go:linkname libc_accept libc_accept //go:linkname libc_accept libc_accept
//go:linkname libc_Openat libc_Openat //go:linkname libc_Openat libc_Openat
//go:linkname libc_ptrace64 libc_ptrace64 //go:linkname libc_ptrace64 libc_ptrace64
...@@ -211,8 +211,8 @@ var ( ...@@ -211,8 +211,8 @@ var (
libc_recvfrom, libc_recvfrom,
libc_sendto, libc_sendto,
libc_Shutdown, libc_Shutdown,
libc_recvmsg, libc_nrecvmsg,
libc_sendmsg, libc_nsendmsg,
libc_accept, libc_accept,
libc_Openat, libc_Openat,
libc_ptrace64, libc_ptrace64,
...@@ -573,7 +573,7 @@ func Shutdown(s int, how int) (err error) { ...@@ -573,7 +573,7 @@ func Shutdown(s int, how int) (err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) {
r0, _, e1 := syscall6(uintptr(unsafe.Pointer(&libc_recvmsg)), 3, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags), 0, 0, 0) r0, _, e1 := syscall6(uintptr(unsafe.Pointer(&libc_nrecvmsg)), 3, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags), 0, 0, 0)
n = int(r0) n = int(r0)
if e1 != 0 { if e1 != 0 {
err = errnoErr(e1) err = errnoErr(e1)
...@@ -584,7 +584,7 @@ func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { ...@@ -584,7 +584,7 @@ func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) {
r0, _, e1 := syscall6(uintptr(unsafe.Pointer(&libc_sendmsg)), 3, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags), 0, 0, 0) r0, _, e1 := syscall6(uintptr(unsafe.Pointer(&libc_nsendmsg)), 3, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags), 0, 0, 0)
n = int(r0) n = int(r0)
if e1 != 0 { if e1 != 0 {
err = errnoErr(e1) err = errnoErr(e1)
......
...@@ -168,6 +168,17 @@ type RawSockaddrUnix struct { ...@@ -168,6 +168,17 @@ type RawSockaddrUnix struct {
Path [1023]uint8 Path [1023]uint8
} }
type RawSockaddrDatalink struct {
Len uint8
Family uint8
Index uint16
Type uint8
Nlen uint8
Alen uint8
Slen uint8
Data [120]uint8
}
type RawSockaddr struct { type RawSockaddr struct {
Len uint8 Len uint8
Family uint8 Family uint8
...@@ -224,16 +235,17 @@ type Msghdr struct { ...@@ -224,16 +235,17 @@ type Msghdr struct {
} }
const ( const (
SizeofSockaddrInet4 = 0x10 SizeofSockaddrInet4 = 0x10
SizeofSockaddrInet6 = 0x1c SizeofSockaddrInet6 = 0x1c
SizeofSockaddrAny = 0x404 SizeofSockaddrAny = 0x404
SizeofSockaddrUnix = 0x401 SizeofSockaddrUnix = 0x401
SizeofLinger = 0x8 SizeofSockaddrDatalink = 0x80
SizeofIPMreq = 0x8 SizeofLinger = 0x8
SizeofIPv6Mreq = 0x14 SizeofIPMreq = 0x8
SizeofMsghdr = 0x30 SizeofIPv6Mreq = 0x14
SizeofCmsghdr = 0xc SizeofMsghdr = 0x30
SizeofICMPv6Filter = 0x20 SizeofCmsghdr = 0xc
SizeofICMPv6Filter = 0x20
) )
const ( const (
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment