From b4fbbb033ec3165d153b626c48e560c021fe59a7 Mon Sep 17 00:00:00 2001 From: Szymon Janc Date: Thu, 6 Feb 2014 16:28:40 +0100 Subject: [PATCH] android/pan: Use ioctl instead of sysfs for setting forward delay Using sysfs is causing problems due to filesystem permissions (bluetoothd is running as bluetooth user) and bluetoothd already has required capabilities for setting forward delay through ioctl. --- android/pan.c | 31 +++++++++++++++---------------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/android/pan.c b/android/pan.c index 83def538a..1cb82a172 100644 --- a/android/pan.c +++ b/android/pan.c @@ -33,6 +33,9 @@ #include #include #include +#include +#include +#include #include "btio/btio.h" #include "lib/bluetooth.h" @@ -54,7 +57,6 @@ #define BNEP_BRIDGE "bt-pan" #define BNEP_PANU_INTERFACE "bt-pan" #define BNEP_NAP_INTERFACE "bt-pan%d" -#define FORWARD_DELAY_PATH "/sys/class/net/"BNEP_BRIDGE"/bridge/forward_delay" static bdaddr_t adapter_addr; GSList *devices = NULL; @@ -80,25 +82,22 @@ static struct { .bridge = false, }; - -static int set_forward_delay(void) +static int set_forward_delay(int sk) { - int fd, ret; - - fd = open(FORWARD_DELAY_PATH, O_RDWR); - if (fd < 0) { - int err = -errno; + unsigned long args[4] = { BRCTL_SET_BRIDGE_FORWARD_DELAY, 0 ,0, 0 }; + struct ifreq ifr; - error("pan: open forward delay file failed: %d (%s)", - -err, strerror(-err)); + memset(&ifr, 0, sizeof(ifr)); + strncpy(ifr.ifr_name, BNEP_BRIDGE, IFNAMSIZ); + ifr.ifr_data = (char *) args; - return err; + if (ioctl(sk, SIOCDEVPRIVATE, &ifr) < 0) { + error("pan: setting forward delay failed: %d (%s)", + errno, strerror(errno)); + return -1; } - ret = write(fd, "0", sizeof("0")); - close(fd); - - return ret; + return 0; } static int nap_create_bridge(void) @@ -122,7 +121,7 @@ static int nap_create_bridge(void) } } - err = set_forward_delay(); + err = set_forward_delay(sk); if (err < 0) ioctl(sk, SIOCBRDELBR, BNEP_BRIDGE); -- 2.47.3