From c55f0b6723e2d73f2daf2bb34df4b878f842f742 Mon Sep 17 00:00:00 2001 From: ian Date: Tue, 3 Apr 2012 23:45:10 +0000 Subject: [PATCH] syscall, net: Fix GNU/Linux netlink code for big-endian systems. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-4_7-branch@186124 138bc75d-0d04-0410-961f-82ee72b054a4 --- libgo/Makefile.am | 1 + libgo/Makefile.in | 2 ++ libgo/configure | 11 ++++++-- libgo/configure.ac | 6 +++++ libgo/go/net/interface_linux.go | 13 ++++++++-- libgo/go/syscall/netlink_linux.go | 54 +++++++++++++++++++++++++++------------ libgo/testsuite/Makefile.in | 1 + 7 files changed, 67 insertions(+), 21 deletions(-) diff --git a/libgo/Makefile.am b/libgo/Makefile.am index 11a650be689..e19cdf0a36d 100644 --- a/libgo/Makefile.am +++ b/libgo/Makefile.am @@ -1559,6 +1559,7 @@ s-syscall_arch: Makefile echo "package syscall" > syscall_arch.go.tmp echo 'const ARCH = "'$(GOARCH)'"' >> syscall_arch.go.tmp echo 'const OS = "'$(GOOS)'"' >> syscall_arch.go.tmp + echo 'const BigEndian = $(GO_BIGENDIAN)' >> syscall_arch.go.tmp $(SHELL) $(srcdir)/../move-if-change syscall_arch.go.tmp syscall_arch.go $(STAMP) $@ diff --git a/libgo/Makefile.in b/libgo/Makefile.in index f790205bed4..c7740cf80e1 100644 --- a/libgo/Makefile.in +++ b/libgo/Makefile.in @@ -369,6 +369,7 @@ GOARCH = @GOARCH@ GOC = @GOC@ GOCFLAGS = $(CFLAGS) GOOS = @GOOS@ +GO_BIGENDIAN = @GO_BIGENDIAN@ GO_LIBCALL_OS_ARCH_FILE = @GO_LIBCALL_OS_ARCH_FILE@ GO_LIBCALL_OS_FILE = @GO_LIBCALL_OS_FILE@ GO_SYSCALL_OS_ARCH_FILE = @GO_SYSCALL_OS_ARCH_FILE@ @@ -4371,6 +4372,7 @@ s-syscall_arch: Makefile echo "package syscall" > syscall_arch.go.tmp echo 'const ARCH = "'$(GOARCH)'"' >> syscall_arch.go.tmp echo 'const OS = "'$(GOOS)'"' >> syscall_arch.go.tmp + echo 'const BigEndian = $(GO_BIGENDIAN)' >> syscall_arch.go.tmp $(SHELL) $(srcdir)/../move-if-change syscall_arch.go.tmp syscall_arch.go $(STAMP) $@ diff --git a/libgo/configure b/libgo/configure index 34125ec144d..b57ba949a39 100755 --- a/libgo/configure +++ b/libgo/configure @@ -612,6 +612,7 @@ HAVE_STRERROR_R_FALSE HAVE_STRERROR_R_TRUE HAVE_SYS_MMAN_H_FALSE HAVE_SYS_MMAN_H_TRUE +GO_BIGENDIAN PTHREAD_LIBS PTHREAD_CFLAGS NET_LIBS @@ -11100,7 +11101,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 11103 "configure" +#line 11104 "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -11206,7 +11207,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 11209 "configure" +#line 11210 "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -14408,6 +14409,12 @@ $as_echo "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;; esac +case $ac_cv_c_bigendian in + yes) GO_BIGENDIAN=true ;; + no) GO_BIGENDIAN=false ;; + *) as_fn_error "unknown endianness" "$LINENO" 5 ;; +esac + diff --git a/libgo/configure.ac b/libgo/configure.ac index b47d17d015f..8be03911b87 100644 --- a/libgo/configure.ac +++ b/libgo/configure.ac @@ -400,6 +400,12 @@ dnl Test if -lrt is required for sched_yield. AC_SEARCH_LIBS([sched_yield], [rt]) AC_C_BIGENDIAN +case $ac_cv_c_bigendian in + yes) GO_BIGENDIAN=true ;; + no) GO_BIGENDIAN=false ;; + *) AC_MSG_ERROR([unknown endianness]) ;; +esac +AC_SUBST(GO_BIGENDIAN) GCC_CHECK_UNWIND_GETIPINFO diff --git a/libgo/go/net/interface_linux.go b/libgo/go/net/interface_linux.go index 825b20227ae..0d7017f301e 100644 --- a/libgo/go/net/interface_linux.go +++ b/libgo/go/net/interface_linux.go @@ -64,7 +64,11 @@ func newLink(ifim *syscall.IfInfomsg, attrs []syscall.NetlinkRouteAttr) Interfac case syscall.IFLA_IFNAME: ifi.Name = string(a.Value[:len(a.Value)-1]) case syscall.IFLA_MTU: - ifi.MTU = int(uint32(a.Value[3])<<24 | uint32(a.Value[2])<<16 | uint32(a.Value[1])<<8 | uint32(a.Value[0])) + if syscall.BigEndian { + ifi.MTU = int(uint32(a.Value[0])<<24 | uint32(a.Value[1])<<16 | uint32(a.Value[2])<<8 | uint32(a.Value[3])) + } else { + ifi.MTU = int(uint32(a.Value[3])<<24 | uint32(a.Value[2])<<16 | uint32(a.Value[1])<<8 | uint32(a.Value[0])) + } } } return ifi @@ -196,7 +200,12 @@ func parseProcNetIGMP(path string, ifi *Interface) []Addr { for i := 0; i+1 < len(f[0]); i += 2 { b[i/2], _ = xtoi2(f[0][i:i+2], 0) } - ifma := IPAddr{IP: IPv4(b[3], b[2], b[1], b[0])} + var ifma IPAddr + if syscall.BigEndian { + ifma = IPAddr{IP: IPv4(b[0], b[1], b[2], b[3])} + } else { + ifma = IPAddr{IP: IPv4(b[3], b[2], b[1], b[0])} + } ifmat = append(ifmat, ifma.toAddr()) } } diff --git a/libgo/go/syscall/netlink_linux.go b/libgo/go/syscall/netlink_linux.go index 8683bb3dacb..1c99a81785f 100644 --- a/libgo/go/syscall/netlink_linux.go +++ b/libgo/go/syscall/netlink_linux.go @@ -30,23 +30,43 @@ type NetlinkRouteRequest struct { func (rr *NetlinkRouteRequest) toWireFormat() []byte { b := make([]byte, rr.Header.Len) - b[0] = byte(rr.Header.Len) - b[1] = byte(rr.Header.Len >> 8) - b[2] = byte(rr.Header.Len >> 16) - b[3] = byte(rr.Header.Len >> 24) - b[4] = byte(rr.Header.Type) - b[5] = byte(rr.Header.Type >> 8) - b[6] = byte(rr.Header.Flags) - b[7] = byte(rr.Header.Flags >> 8) - b[8] = byte(rr.Header.Seq) - b[9] = byte(rr.Header.Seq >> 8) - b[10] = byte(rr.Header.Seq >> 16) - b[11] = byte(rr.Header.Seq >> 24) - b[12] = byte(rr.Header.Pid) - b[13] = byte(rr.Header.Pid >> 8) - b[14] = byte(rr.Header.Pid >> 16) - b[15] = byte(rr.Header.Pid >> 24) - b[16] = byte(rr.Data.Family) + if BigEndian { + b[0] = byte(rr.Header.Len >> 24) + b[1] = byte(rr.Header.Len >> 16) + b[2] = byte(rr.Header.Len >> 8) + b[3] = byte(rr.Header.Len) + b[4] = byte(rr.Header.Type >> 8) + b[5] = byte(rr.Header.Type) + b[6] = byte(rr.Header.Flags >> 8) + b[7] = byte(rr.Header.Flags) + b[8] = byte(rr.Header.Seq >> 24) + b[9] = byte(rr.Header.Seq >> 16) + b[10] = byte(rr.Header.Seq >> 8) + b[11] = byte(rr.Header.Seq) + b[12] = byte(rr.Header.Pid >> 24) + b[13] = byte(rr.Header.Pid >> 16) + b[14] = byte(rr.Header.Pid >> 8) + b[15] = byte(rr.Header.Pid) + b[16] = byte(rr.Data.Family) + } else { + b[0] = byte(rr.Header.Len) + b[1] = byte(rr.Header.Len >> 8) + b[2] = byte(rr.Header.Len >> 16) + b[3] = byte(rr.Header.Len >> 24) + b[4] = byte(rr.Header.Type) + b[5] = byte(rr.Header.Type >> 8) + b[6] = byte(rr.Header.Flags) + b[7] = byte(rr.Header.Flags >> 8) + b[8] = byte(rr.Header.Seq) + b[9] = byte(rr.Header.Seq >> 8) + b[10] = byte(rr.Header.Seq >> 16) + b[11] = byte(rr.Header.Seq >> 24) + b[12] = byte(rr.Header.Pid) + b[13] = byte(rr.Header.Pid >> 8) + b[14] = byte(rr.Header.Pid >> 16) + b[15] = byte(rr.Header.Pid >> 24) + b[16] = byte(rr.Data.Family) + } return b } diff --git a/libgo/testsuite/Makefile.in b/libgo/testsuite/Makefile.in index 4628fdd919b..56808efd168 100644 --- a/libgo/testsuite/Makefile.in +++ b/libgo/testsuite/Makefile.in @@ -86,6 +86,7 @@ GOARCH = @GOARCH@ GOC = @GOC@ GOCFLAGS = @GOCFLAGS@ GOOS = @GOOS@ +GO_BIGENDIAN = @GO_BIGENDIAN@ GO_LIBCALL_OS_ARCH_FILE = @GO_LIBCALL_OS_ARCH_FILE@ GO_LIBCALL_OS_FILE = @GO_LIBCALL_OS_FILE@ GO_SYSCALL_OS_ARCH_FILE = @GO_SYSCALL_OS_ARCH_FILE@ -- 2.11.0