diff --git a/libgo/Makefile.am b/libgo/Makefile.am index 80081950562..d6578156b8d 100644 --- a/libgo/Makefile.am +++ b/libgo/Makefile.am @@ -1593,6 +1593,13 @@ else # !LIBGO_IS_SOLARIS 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_base_syscall_files = \ 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 --git a/libgo/Makefile.in b/libgo/Makefile.in index c96f13ce50f..6e0cea813f8 100644 --- a/libgo/Makefile.in +++ b/libgo/Makefile.in @@ -1923,6 +1923,10 @@ go_unicode_utf8_files = \ # 32-bit Solaris 2/x86 needs _nuname, handled in libcall_solaris_386.go. @LIBGO_IS_386_TRUE@@LIBGO_IS_SOLARIS_TRUE@syscall_uname_file = @LIBGO_IS_SOLARIS_FALSE@syscall_uname_file = go/syscall/libcall_uname.go +@LIBGO_IS_LINUX_FALSE@syscall_sockcmsg_file = + +# GNU/Linux specific socket control messages. +@LIBGO_IS_LINUX_TRUE@syscall_sockcmsg_file = go/syscall/sockcmsg_linux.go @LIBGO_IS_LINUX_FALSE@syscall_netlink_file = # Support for netlink sockets and messages. @@ -1933,8 +1937,10 @@ go_base_syscall_files = \ 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 --git a/libgo/go/syscall/sockcmsg_unix.go b/libgo/go/syscall/sockcmsg_unix.go index d279decb65a..1faac84f4a6 100644 --- a/libgo/go/syscall/sockcmsg_unix.go +++ b/libgo/go/syscall/sockcmsg_unix.go @@ -14,7 +14,7 @@ import ( // 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 CmsgSpace(datalen int) int { } 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 ParseSocketControlMessage(buf []byte) ([]SocketControlMessage, error) { 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 --git a/libgo/go/syscall/socket.go b/libgo/go/syscall/socket.go index 517b5b9408d..7a2e95ca2a2 100644 --- a/libgo/go/syscall/socket.go +++ b/libgo/go/syscall/socket.go @@ -17,12 +17,12 @@ import "unsafe" 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 @@ const SizeofSockaddrAny = 0x1c type SockaddrInet4 struct { Port int Addr [4]byte - raw RawSockaddrInet4 + raw RawSockaddrInet4 } func (sa *SockaddrInet4) sockaddr() (*RawSockaddrAny, Socklen_t, error) { @@ -40,7 +40,7 @@ func (sa *SockaddrInet4) sockaddr() (*RawSockaddrAny, Socklen_t, error) { 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 @@ func (sa *SockaddrInet4) sockaddr() (*RawSockaddrAny, Socklen_t, error) { } 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 @@ func (sa *SockaddrInet6) sockaddr() (*RawSockaddrAny, Socklen_t, error) { 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 @@ func (sa *SockaddrInet6) sockaddr() (*RawSockaddrAny, Socklen_t, error) { type SockaddrUnix struct { Name string - raw RawSockaddrUnix + raw RawSockaddrUnix } func (sa *SockaddrUnix) sockaddr() (*RawSockaddrAny, Socklen_t, error) { @@ -268,12 +268,12 @@ func SetsockoptTimeval(fd, level, opt int, tv *Timeval) (err error) { } 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 (iov *Iovec) SetLen(length int) { 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 --git a/libgo/mksysinfo.sh b/libgo/mksysinfo.sh index a3864fc0cd3..16635d236ba 100755 --- a/libgo/mksysinfo.sh +++ b/libgo/mksysinfo.sh @@ -483,6 +483,43 @@ echo $msghdr | \ -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/' \