This patch adds some Getsockopt functions to the syscall package. These functions exist in the master library, but never made it into gccgo's syscall package. This fixes GCC PR 69966. Bootstrapped and ran Go testsuite on x86_64-pc-linux-gnu. Committed to mainline.
Ian
Index: gcc/go/gofrontend/MERGE =================================================================== --- gcc/go/gofrontend/MERGE (revision 233670) +++ gcc/go/gofrontend/MERGE (working copy) @@ -1,4 +1,4 @@ -156f5f0152797ac2afe5f23803aeb3c7b8f8418e +3de822d11255d439fac9717897b017aae2de18c2 The first line of this file holds the git revision number of the last merge done from the gofrontend repository. Index: libgo/go/syscall/socket.go =================================================================== --- libgo/go/syscall/socket.go (revision 232239) +++ libgo/go/syscall/socket.go (working copy) @@ -251,6 +251,13 @@ func GetsockoptIPv6Mreq(fd, level, opt i return &value, err } +func GetsockoptICMPv6Filter(fd, level, opt int) (*ICMPv6Filter, error) { + var value ICMPv6Filter + vallen := Socklen_t(SizeofICMPv6Filter) + err := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen) + return &value, err +} + //sys setsockopt(s int, level int, name int, val unsafe.Pointer, vallen Socklen_t) (err error) //setsockopt(s _C_int, level _C_int, optname _C_int, val *byte, vallen Socklen_t) _C_int Index: libgo/go/syscall/socket_bsd.go =================================================================== --- libgo/go/syscall/socket_bsd.go (revision 232239) +++ libgo/go/syscall/socket_bsd.go (working copy) @@ -80,3 +80,10 @@ func BindToDevice(fd int, device string) func anyToSockaddrOS(rsa *RawSockaddrAny) (Sockaddr, error) { return nil, EAFNOSUPPORT } + +func GetsockoptIPv6MTUInfo(fd, level, opt int) (*IPv6MTUInfo, error) { + var value IPv6MTUInfo + vallen := Socklen_t(SizeofIPv6MTUInfo) + err := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen) + return &value, err +} Index: libgo/go/syscall/socket_linux.go =================================================================== --- libgo/go/syscall/socket_linux.go (revision 232239) +++ libgo/go/syscall/socket_linux.go (working copy) @@ -168,6 +168,20 @@ func anyToSockaddrOS(rsa *RawSockaddrAny return nil, EAFNOSUPPORT } +func GetsockoptIPv6MTUInfo(fd, level, opt int) (*IPv6MTUInfo, error) { + var value IPv6MTUInfo + vallen := Socklen_t(SizeofIPv6MTUInfo) + err := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen) + return &value, err +} + +func GetsockoptUcred(fd, level, opt int) (*Ucred, error) { + var value Ucred + vallen := Socklen_t(SizeofUcred) + err := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen) + return &value, err +} + //sysnb EpollCreate(size int) (fd int, err error) //epoll_create(size _C_int) _C_int Index: libgo/mksysinfo.sh =================================================================== --- libgo/mksysinfo.sh (revision 232239) +++ libgo/mksysinfo.sh (working copy) @@ -870,6 +870,14 @@ if ! grep 'type ICMPv6Filter ' ${OUT} > echo 'type ICMPv6Filter struct { Data [8]uint32 }' >> ${OUT} fi +# The ip6_mtuinfo struct. +grep '^type _ip6_mtuinfo ' gen-sysinfo.go | \ + sed -e 's/_ip6_mtuinfo/IPv6MTUInfo/' \ + -e 's/ip6m_addr/Addr/' \ + -e 's/_sockaddr_in6/RawSockaddrInet6/' \ + -e 's/ip6m_mtu/Mtu/' \ + >> ${OUT} + # Try to guess the type to use for fd_set. fd_set=`grep '^type _fd_set ' gen-sysinfo.go || true` fds_bits_type="_C_long" @@ -1464,7 +1472,7 @@ set cmsghdr Cmsghdr ip_mreq IPMreq ip_mr msghdr Msghdr nlattr NlAttr nlmsgerr NlMsgerr nlmsghdr NlMsghdr \ rtattr RtAttr rtgenmsg RtGenmsg rtmsg RtMsg rtnexthop RtNexthop \ sock_filter SockFilter sock_fprog SockFprog ucred Ucred \ - icmp6_filter ICMPv6Filter + icmp6_filter ICMPv6Filter ip6_mtuinfo IPv6MTUInfo while test $# != 0; do nc=$1 ngo=$2