aboutsummaryrefslogtreecommitdiff
path: root/libgo
diff options
context:
space:
mode:
authorian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>2012-04-03 23:45:10 +0000
committerian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>2012-04-03 23:45:10 +0000
commitc55f0b6723e2d73f2daf2bb34df4b878f842f742 (patch)
tree36ccc9c1942654e210650c934a2648a75a2f8e4b /libgo
parent0592708f6bf7ae736b7f2b11ef94f3596ccd30b9 (diff)
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
Diffstat (limited to 'libgo')
-rw-r--r--libgo/Makefile.am1
-rw-r--r--libgo/Makefile.in2
-rwxr-xr-xlibgo/configure11
-rw-r--r--libgo/configure.ac6
-rw-r--r--libgo/go/net/interface_linux.go13
-rw-r--r--libgo/go/syscall/netlink_linux.go54
-rw-r--r--libgo/testsuite/Makefile.in1
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@