diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2008-01-08 08:20:35 -0800 |
---|---|---|
committer | Stephen Hemminger <stephen.hemminger@vyatta.com> | 2008-01-08 08:20:35 -0800 |
commit | 0c20fa4ec6ba2933ac07008e1f288574a6941e79 (patch) | |
tree | 646fb2dbf10221419902d49f34ce7d5881b12e8d | |
parent | 6907ae6731516f3fcc508ba8d6dc187604383eb5 (diff) | |
download | android_external_brctl-0c20fa4ec6ba2933ac07008e1f288574a6941e79.tar.gz android_external_brctl-0c20fa4ec6ba2933ac07008e1f288574a6941e79.tar.bz2 android_external_brctl-0c20fa4ec6ba2933ac07008e1f288574a6941e79.zip |
fix use of sysfs (affects 32/64 bit compat)
I built current git head of bridge-utils.
32-bit binary omn 64-bit kernel doesn't show
bridged interfaces:
bridge name bridge id STP enabled interfaces
br0 8000.000000000000 no can't get port info: Operation not supported
It turns out that it uses wrong directory name
and falls back to using ioctls. Bridge ioctls
seems to be deprecated and 32/64 compat is missing,
thus it fails.
Attached patch makes brctl use /sys/class/net/br0/brif
instead of nonexistent /sys/class/net/br0/brport:
/sys/class/net/br0
...
...
./brif:
lrwxrwxrwx 1 root root 0 Jan 8 10:54 eth0 -> ../../../../class/net/eth0/brport
Please apply.
--
Signed-off-by: Stephen Hemminger <stephen.hemminger@vyatta.com>
-rw-r--r-- | libbridge/libbridge_init.c | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/libbridge/libbridge_init.c b/libbridge/libbridge_init.c index 099cfd8..a7473bd 100644 --- a/libbridge/libbridge_init.c +++ b/libbridge/libbridge_init.c @@ -186,12 +186,18 @@ int br_foreach_port(const char *brname, struct dirent **namelist; char path[SYSFS_PATH_MAX]; - snprintf(path, SYSFS_PATH_MAX, SYSFS_CLASS_NET "%s/brport", brname); + snprintf(path, SYSFS_PATH_MAX, SYSFS_CLASS_NET "%s/brif", brname); count = scandir(path, &namelist, 0, alphasort); if (count < 0) return old_foreach_port(brname, iterator, arg); for (i = 0; i < count; i++) { + if (namelist[i]->d_name[0] == '.' + && (namelist[i]->d_name[1] == '\0' + || (namelist[i]->d_name[1] == '.' + && namelist[i]->d_name[2] == '\0'))) + continue; + if (iterator(brname, namelist[i]->d_name, arg)) break; } |