aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorbuytenh <buytenh>2002-01-16 11:51:27 +0000
committerbuytenh <buytenh>2002-01-16 11:51:27 +0000
commitfd5d91267a7ddd121455eb34d25853ec85cb6a4b (patch)
tree746f5a530a49868ede30d46ee7407d8f5dc08ade
parent4753040a8d87587ba1fc7f259dee7bbca4f18f10 (diff)
downloadbridge-utils-fd5d91267a7ddd121455eb34d25853ec85cb6a4b.tar.gz
Work around sparc64 brokenness.
-rw-r--r--libbridge/Makefile2
-rw-r--r--libbridge/libbridge_devif.c36
-rw-r--r--libbridge/libbridge_if.c41
-rw-r--r--libbridge/libbridge_private.h9
4 files changed, 72 insertions, 16 deletions
diff --git a/libbridge/Makefile b/libbridge/Makefile
index d7366df..375775b 100644
--- a/libbridge/Makefile
+++ b/libbridge/Makefile
@@ -26,4 +26,4 @@ libbridge_init.o: libbridge_init.c libbridge.h libbridge_private.h
$(CC) $(CFLAGS) -c libbridge_init.c
libbridge_misc.o: libbridge_misc.c libbridge.h libbridge_private.h
- $(CC) $(CFLAGS) -c libbridge_misc.c
+ $(CC) $(CFLAGS) -c libbridge_misc.c
diff --git a/libbridge/libbridge_devif.c b/libbridge/libbridge_devif.c
index 0d342e1..6b35788 100644
--- a/libbridge/libbridge_devif.c
+++ b/libbridge/libbridge_devif.c
@@ -26,9 +26,26 @@
#include "libbridge.h"
#include "libbridge_private.h"
-int br_device_ioctl(struct bridge *br, unsigned long arg0, unsigned long arg1, unsigned long arg2, unsigned long arg3)
+int br_device_ioctl32(struct bridge *br, unsigned long arg0, unsigned long arg1, unsigned long arg2, unsigned long arg3)
+{
+ unsigned long args[4];
+ struct ifreq ifr;
+
+ args[0] = arg0;
+ args[1] = arg1;
+ args[2] = arg2;
+ args[3] = arg3;
+
+ memcpy(ifr.ifr_name, br->ifname, IFNAMSIZ);
+ ((unsigned long *)(&ifr.ifr_data))[0] = ((unsigned long)args) & ~0UL;
+
+ return ioctl(br_socket_fd, SIOCDEVPRIVATE, &ifr);
+}
+
+#ifdef sparc
+int br_device_ioctl64(struct bridge *br, unsigned long arg0, unsigned long arg1, unsigned long arg2, unsigned long arg3)
{
- arg_t args[4];
+ unsigned long long args[4];
struct ifreq ifr;
args[0] = arg0;
@@ -37,9 +54,20 @@ int br_device_ioctl(struct bridge *br, unsigned long arg0, unsigned long arg1, u
args[3] = arg3;
memcpy(ifr.ifr_name, br->ifname, IFNAMSIZ);
- ((arg_t *)(&ifr.ifr_data))[0] = (arg_t)args;
+ ((unsigned long long *)(&ifr.ifr_data))[0] = ((unsigned long long)args) & ~0UL;
+
+ return ioctl(br_socket_fd, SIOCDEVPRIVATE + 3, &ifr);
+}
+#endif
+
+int br_device_ioctl(struct bridge *br, unsigned long arg0, unsigned long arg1, unsigned long arg2, unsigned long arg3)
+{
+#ifdef sparc
+ if (__kernel_is_64_bit())
+ return br_device_ioctl64(br, arg0, arg1, arg2, arg3);
+#endif
- return ioctl(br_socket_fd, BRIDGE_IOCTL, &ifr);
+ return br_device_ioctl32(br, arg0, arg1, arg2, arg3);
}
int br_add_interface(struct bridge *br, int ifindex)
diff --git a/libbridge/libbridge_if.c b/libbridge/libbridge_if.c
index 6394279..3627747 100644
--- a/libbridge/libbridge_if.c
+++ b/libbridge/libbridge_if.c
@@ -26,9 +26,9 @@
#include "libbridge.h"
#include "libbridge_private.h"
-int br_ioctl(unsigned long arg0, unsigned long arg1, unsigned long arg2)
+static int br_ioctl32(unsigned long arg0, unsigned long arg1, unsigned long arg2)
{
- arg_t arg[3];
+ unsigned long arg[3];
arg[0] = arg0;
arg[1] = arg1;
@@ -37,6 +37,43 @@ int br_ioctl(unsigned long arg0, unsigned long arg1, unsigned long arg2)
return ioctl(br_socket_fd, SIOCGIFBR, arg);
}
+#ifdef sparc
+static int br_ioctl64(unsigned long arg0, unsigned long arg1, unsigned long arg2)
+{
+ unsigned long long arg[3];
+
+ arg[0] = arg0;
+ arg[1] = arg1;
+ arg[2] = arg2;
+
+ return ioctl(br_socket_fd, SIOCGIFBR, arg);
+}
+
+static int __kernel_is_64_bit()
+{
+ static int kernel_is_64_bit = -1;
+
+ if (kernel_is_64_bit == -1) {
+ struct utsname buf;
+
+ uname(&buf);
+ kernel_is_64_bit = !strcmp(buf.machine, "sparc64");
+ }
+
+ return kernel_is_64_bit;
+}
+#endif
+
+int br_ioctl(unsigned long arg0, unsigned long arg1, unsigned long arg2)
+{
+#ifdef sparc
+ if (__kernel_is_64_bit())
+ return br_ioctl64(arg0, arg1, arg2);
+#endif
+
+ return br_ioctl32(arg0, arg1, arg2);
+}
+
int br_get_version()
{
return br_ioctl(BRCTL_GET_VERSION, 0, 0);
diff --git a/libbridge/libbridge_private.h b/libbridge/libbridge_private.h
index 97d74a3..58a80cf 100644
--- a/libbridge/libbridge_private.h
+++ b/libbridge/libbridge_private.h
@@ -21,15 +21,6 @@
#include <asm/param.h>
-#if defined(__arch64__) && defined(sparc)
-#define BRIDGE_IOCTL (SIOCDEVPRIVATE + 3)
-typedef unsigned long long arg_t;
-#else
-#define BRIDGE_IOCTL (SIOCDEVPRIVATE)
-typedef unsigned long arg_t;
-#endif
-
-
extern int br_socket_fd;
unsigned long __tv_to_jiffies(struct timeval *tv);