From patchwork Mon Jan 30 23:57:44 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ian Lance Taylor X-Patchwork-Id: 138670 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) by ozlabs.org (Postfix) with SMTP id 28B1B1007D1 for ; Tue, 31 Jan 2012 10:58:12 +1100 (EST) Comment: DKIM? See http://www.dkim.org DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=gcc.gnu.org; s=default; x=1328572693; h=Comment: DomainKey-Signature:Received:Received:Received:Received:Received: Received:Received:From:To:Subject:Date:Message-ID:User-Agent: MIME-Version:Content-Type:Mailing-List:Precedence:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:Sender: Delivered-To; bh=CEp6Q+HEl16F7DesphIUeAKMD70=; b=KeH+p2pa43Slrn6 DK8XzCwEjoDtbjaoy1eixsgaguZyjJx2ynuvmxlPx3/ycdgb75hijDGqnx75KEoh 9EA2Pf1wPdPO99gbkmXKhrhAoN2UcOO9d62dxVJvSvRhdhG/Z4sBTTuSsagnZYs5 kU9XTx6ociXy0BqLC3V4Xw4Adc6Q= Comment: DomainKeys? See http://antispam.yahoo.com/domainkeys DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=default; d=gcc.gnu.org; h=Received:Received:X-SWARE-Spam-Status:X-Spam-Check-By:Received:Received:Received:Received:Received:From:To:Subject:Date:Message-ID:User-Agent:MIME-Version:Content-Type:X-IsSubscribed:Mailing-List:Precedence:List-Id:List-Unsubscribe:List-Archive:List-Post:List-Help:Sender:Delivered-To; b=l+G9LwTq1202toQpQ4M/I2QpzzynImlCCBm0i6fcYyPJJ+Zih6Fl0BG9c4oolS lpnG4ynWo4Ott18Z5BPLOwBK2ao63vYIMYH0FaTHWBaag9NgCunDPRQRZLfsAXS9 DBrVo5jgSRKAlmWZUQeVo/YYrmuwqhSbXFbuSkFhrbw1Q=; Received: (qmail 13937 invoked by alias); 30 Jan 2012 23:58:07 -0000 Received: (qmail 13929 invoked by uid 22791); 30 Jan 2012 23:58:06 -0000 X-SWARE-Spam-Status: No, hits=-2.6 required=5.0 tests=AWL, BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, RCVD_IN_DNSWL_LOW, T_FRT_STOCK2, T_RP_MATCHES_RCVD, T_TVD_MIME_NO_HEADERS X-Spam-Check-By: sourceware.org Received: from mail-iy0-f175.google.com (HELO mail-iy0-f175.google.com) (209.85.210.175) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Mon, 30 Jan 2012 23:57:48 +0000 Received: by iaby12 with SMTP id y12so5683549iab.20 for ; Mon, 30 Jan 2012 15:57:47 -0800 (PST) Received: by 10.50.47.166 with SMTP id e6mr1318435ign.22.1327967867707; Mon, 30 Jan 2012 15:57:47 -0800 (PST) Received: by 10.50.47.166 with SMTP id e6mr1318422ign.22.1327967867606; Mon, 30 Jan 2012 15:57:47 -0800 (PST) Received: from coign.google.com ([72.14.225.65]) by mx.google.com with ESMTPS id r18sm19973325ibh.4.2012.01.30.15.57.45 (version=TLSv1/SSLv3 cipher=OTHER); Mon, 30 Jan 2012 15:57:46 -0800 (PST) From: Ian Lance Taylor To: gcc-patches@gcc.gnu.org, gofrontend-dev@googlegroups.com Subject: libgo patch committed: Support socket control messages Date: Mon, 30 Jan 2012 15:57:44 -0800 Message-ID: User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/23.1 (gnu/linux) MIME-Version: 1.0 X-IsSubscribed: yes Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org This patch to libgo adds support for socket control messages. The source code was already there, but wasn't being built because mksysinfo didn't generate the necessary type information. This patch fixes that. Bootstrapped and ran Go testsuite on x86_64-unknown-linux-gnu. Committed to mainline. Ian diff -r e7bd4eb1ed7e libgo/Makefile.am --- a/libgo/Makefile.am Fri Jan 27 14:36:52 2012 -0800 +++ b/libgo/Makefile.am Mon Jan 30 15:50:31 2012 -0800 @@ -1593,6 +1593,13 @@ syscall_uname_file = go/syscall/libcall_uname.go endif +# GNU/Linux specific socket control messages. +if LIBGO_IS_LINUX +syscall_sockcmsg_file = go/syscall/sockcmsg_linux.go +else +syscall_sockcmsg_file = +endif + # Support for netlink sockets and messages. if LIBGO_IS_LINUX syscall_netlink_file = go/syscall/netlink_linux.go @@ -1606,8 +1613,10 @@ go/syscall/libcall_support.go \ go/syscall/libcall_posix.go \ go/syscall/socket.go \ + go/syscall/sockcmsg_unix.go \ go/syscall/str.go \ go/syscall/syscall.go \ + $(syscall_sockcmsg_file) \ $(syscall_syscall_file) \ $(syscall_exec_file) \ $(syscall_exec_os_file) \ diff -r e7bd4eb1ed7e libgo/go/syscall/sockcmsg_unix.go --- a/libgo/go/syscall/sockcmsg_unix.go Fri Jan 27 14:36:52 2012 -0800 +++ b/libgo/go/syscall/sockcmsg_unix.go Mon Jan 30 15:50:31 2012 -0800 @@ -14,7 +14,7 @@ // Round the length of a raw sockaddr up to align it propery. func cmsgAlignOf(salen int) int { - salign := sizeofPtr + salign := int(sizeofPtr) // NOTE: It seems like 64-bit Darwin kernel still requires 32-bit // aligned access to BSD subsystem. if darwinAMD64 { @@ -39,7 +39,7 @@ } func cmsgData(cmsg *Cmsghdr) unsafe.Pointer { - return unsafe.Pointer(uintptr(unsafe.Pointer(cmsg)) + SizeofCmsghdr) + return unsafe.Pointer(uintptr(unsafe.Pointer(cmsg)) + uintptr(SizeofCmsghdr)) } type SocketControlMessage struct { @@ -72,7 +72,7 @@ func socketControlMessageHeaderAndData(buf []byte) (*Cmsghdr, []byte, error) { h := (*Cmsghdr)(unsafe.Pointer(&buf[0])) - if h.Len < SizeofCmsghdr || int(h.Len) > len(buf) { + if int(h.Len) < SizeofCmsghdr || int(h.Len) > len(buf) { return nil, nil, EINVAL } return h, buf[cmsgAlignOf(SizeofCmsghdr):], nil diff -r e7bd4eb1ed7e libgo/go/syscall/socket.go --- a/libgo/go/syscall/socket.go Fri Jan 27 14:36:52 2012 -0800 +++ b/libgo/go/syscall/socket.go Mon Jan 30 15:50:31 2012 -0800 @@ -17,12 +17,12 @@ var SocketDisableIPv6 bool type Sockaddr interface { - sockaddr() (ptr *RawSockaddrAny, len Socklen_t, err error) // lowercase; only we can define Sockaddrs + sockaddr() (ptr *RawSockaddrAny, len Socklen_t, err error) // lowercase; only we can define Sockaddrs } type RawSockaddrAny struct { Addr RawSockaddr - Pad [12]int8 + Pad [12]int8 } const SizeofSockaddrAny = 0x1c @@ -30,7 +30,7 @@ type SockaddrInet4 struct { Port int Addr [4]byte - raw RawSockaddrInet4 + raw RawSockaddrInet4 } func (sa *SockaddrInet4) sockaddr() (*RawSockaddrAny, Socklen_t, error) { @@ -40,7 +40,7 @@ sa.raw.Family = AF_INET n := sa.raw.setLen() p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port)) - p[0] = byte(sa.Port>>8) + p[0] = byte(sa.Port >> 8) p[1] = byte(sa.Port) for i := 0; i < len(sa.Addr); i++ { sa.raw.Addr[i] = sa.Addr[i] @@ -49,10 +49,10 @@ } type SockaddrInet6 struct { - Port int + Port int ZoneId uint32 - Addr [16]byte - raw RawSockaddrInet6 + Addr [16]byte + raw RawSockaddrInet6 } func (sa *SockaddrInet6) sockaddr() (*RawSockaddrAny, Socklen_t, error) { @@ -62,7 +62,7 @@ sa.raw.Family = AF_INET6 n := sa.raw.setLen() p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port)) - p[0] = byte(sa.Port>>8) + p[0] = byte(sa.Port >> 8) p[1] = byte(sa.Port) sa.raw.Scope_id = sa.ZoneId for i := 0; i < len(sa.Addr); i++ { @@ -73,7 +73,7 @@ type SockaddrUnix struct { Name string - raw RawSockaddrUnix + raw RawSockaddrUnix } func (sa *SockaddrUnix) sockaddr() (*RawSockaddrAny, Socklen_t, error) { @@ -268,12 +268,12 @@ } type Linger struct { - Onoff int32; - Linger int32; + Onoff int32 + Linger int32 } func SetsockoptLinger(fd, level, opt int, l *Linger) (err error) { - return setsockopt(fd, level, opt, (*byte)(unsafe.Pointer(l)), Socklen_t(unsafe.Sizeof(*l))); + return setsockopt(fd, level, opt, (*byte)(unsafe.Pointer(l)), Socklen_t(unsafe.Sizeof(*l))) } func SetsockoptIPMreq(fd, level, opt int, mreq *IPMreq) (err error) { @@ -405,3 +405,7 @@ func (msghdr *Msghdr) SetControllen(length int) { msghdr.Controllen = Msghdr_controllen_t(length) } + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = Cmsghdr_len_t(length) +} diff -r e7bd4eb1ed7e libgo/mksysinfo.sh --- a/libgo/mksysinfo.sh Fri Jan 27 14:36:52 2012 -0800 +++ b/libgo/mksysinfo.sh Mon Jan 30 15:50:31 2012 -0800 @@ -483,6 +483,43 @@ -e 's/msg_flags/Flags/' \ >> ${OUT} +# The MSG_ flags for Msghdr. +grep '^const _MSG_' gen-sysinfo.go | \ + sed -e 's/^\(const \)_\(MSG_[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT} + +# The cmsghdr struct. +cmsghdr=`grep '^type _cmsghdr ' gen-sysinfo.go` +if test -n "$cmsghdr"; then + cmsghdr_len=`echo $cmsghdr | sed -n -e 's/^.*cmsg_len \([^ ]*\);.*$/\1/p'` + echo "type Cmsghdr_len_t $cmsghdr_len" >> ${OUT} + echo "$cmsghdr" | \ + sed -e 's/_cmsghdr/Cmsghdr/' \ + -e 's/cmsg_len *[a-zA-Z0-9_]*/Len Cmsghdr_len_t/' \ + -e 's/cmsg_level/Level/' \ + -e 's/cmsg_type/Type/' \ + >> ${OUT} + + # The size of the cmsghdr struct. + echo 'var SizeofCmsghdr = int(unsafe.Sizeof(Cmsghdr{}))' >> ${OUT} +fi + +# The SCM_ flags for Cmsghdr. +grep '^const _SCM_' gen-sysinfo.go | \ + sed -e 's/^\(const \)_\(SCM_[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT} + +# The ucred struct. +grep '^type _ucred ' gen-sysinfo.go | \ + sed -e 's/_ucred/Ucred/' \ + -e 's/pid/Pid/' \ + -e 's/uid/Uid/' \ + -e 's/gid/Gid/' \ + >> ${OUT} + +# The size of the ucred struct. +if grep 'type Ucred ' ${OUT} >/dev/null 2>&1; then + echo 'var SizeofUcred = int(unsafe.Sizeof(Ucred{}))' >> ${OUT} +fi + # The ip_mreq struct. grep '^type _ip_mreq ' gen-sysinfo.go | \ sed -e 's/_ip_mreq/IPMreq/' \