diff options
author | buytenh <buytenh> | 2002-01-16 11:51:27 +0000 |
---|---|---|
committer | buytenh <buytenh> | 2002-01-16 11:51:27 +0000 |
commit | fd5d91267a7ddd121455eb34d25853ec85cb6a4b (patch) | |
tree | 746f5a530a49868ede30d46ee7407d8f5dc08ade | |
parent | 4753040a8d87587ba1fc7f259dee7bbca4f18f10 (diff) | |
download | bridge-utils-fd5d91267a7ddd121455eb34d25853ec85cb6a4b.tar.gz |
Work around sparc64 brokenness.
-rw-r--r-- | libbridge/Makefile | 2 | ||||
-rw-r--r-- | libbridge/libbridge_devif.c | 36 | ||||
-rw-r--r-- | libbridge/libbridge_if.c | 41 | ||||
-rw-r--r-- | libbridge/libbridge_private.h | 9 |
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); |