aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorshemminger <shemminger>2004-06-03 22:10:06 +0000
committershemminger <shemminger>2004-06-03 22:10:06 +0000
commit946695beaac41b6b50a5e641bbfd292f85e5a163 (patch)
treec2ba618b3aacdd4732b11493373325ed3c16e4d0
parenta5a664df717e5e6d4135abfa871227b17572a24c (diff)
downloadandroid_external_brctl-946695beaac41b6b50a5e641bbfd292f85e5a163.tar.gz
android_external_brctl-946695beaac41b6b50a5e641bbfd292f85e5a163.tar.bz2
android_external_brctl-946695beaac41b6b50a5e641bbfd292f85e5a163.zip
Workaround older libraries with buste if_indextoname etc.
-rw-r--r--libbridge/libbridge_devif.c14
-rw-r--r--libbridge/libbridge_init.c26
2 files changed, 34 insertions, 6 deletions
diff --git a/libbridge/libbridge_devif.c b/libbridge/libbridge_devif.c
index 3efd1e4..018f9ce 100644
--- a/libbridge/libbridge_devif.c
+++ b/libbridge/libbridge_devif.c
@@ -137,7 +137,7 @@ static int old_get_bridge_info(const char *bridge, struct bridge_info *info)
ifr.ifr_data = (char *) &args;
if (ioctl(br_socket_fd, SIOCDEVPRIVATE, &ifr) < 0) {
- fprintf(stderr, "%s: can't get info %s\n",
+ dprintf("%s: can't get info %s\n",
bridge, strerror(errno));
return errno;
}
@@ -390,10 +390,20 @@ int br_set_bridge_priority(const char *br, int bridge_priority)
BRCTL_SET_BRIDGE_PRIORITY);
}
+/* sigh.. if_nametoindex busted on older glibc and uclibc */
+static inline unsigned int ifnametoindex(const char* ifname)
+{
+ struct ifreq ifr;
+
+ strncpy (ifr.ifr_name, ifname, sizeof (ifr.ifr_name));
+
+ return (ioctl(br_socket_fd, SIOCGIFINDEX,&ifr) < 0) ? 0 : ifr.ifr_ifindex;
+}
+
static int nametoportindex(const char *brname, const char *ifname)
{
int i;
- int ifindex = if_nametoindex(ifname);
+ int ifindex = ifnametoindex(ifname);
int ifindices[MAX_PORTS];
unsigned long args[4] = { BRCTL_GET_PORT_LIST,
(unsigned long)ifindices, MAX_PORTS, 0 };
diff --git a/libbridge/libbridge_init.c b/libbridge/libbridge_init.c
index a74aa5b..3abcb18 100644
--- a/libbridge/libbridge_init.c
+++ b/libbridge/libbridge_init.c
@@ -98,6 +98,18 @@ static int new_foreach_bridge(int (*iterator)(const char *name, void *),
}
#endif
+/* once again, if_indextoname busted on older glibc and uclibc */
+static inline char * ifindextoname (unsigned int ifindex, char *ifname)
+{
+ struct ifreq ifr;
+
+ ifr.ifr_ifindex = ifindex;
+ if ( ioctl(br_socket_fd, SIOCGIFNAME, &ifr) < 0)
+ return NULL;
+
+ return strncpy(ifname, ifr.ifr_name, IFNAMSIZ);
+}
+
/*
* Old interface uses ioctl
*/
@@ -111,7 +123,6 @@ static int old_foreach_bridge(int (*iterator)(const char *, void *),
(unsigned long)ifindices, MAX_BRIDGES };
num = ioctl(br_socket_fd, SIOCGIFBR, args);
- dprintf("old_foreach_bridge num=%d\n", num);
if (num < 0) {
fprintf(stderr, "Get bridge indices failed: %s\n",
strerror(errno));
@@ -119,7 +130,7 @@ static int old_foreach_bridge(int (*iterator)(const char *, void *),
}
for (i = 0; i < num; i++) {
- if (!if_indextoname(ifindices[i], ifname)) {
+ if (!ifindextoname(ifindices[i], ifname)) {
fprintf(stderr, "get find name for ifindex %d\n",
ifindices[i]);
return -errno;
@@ -174,15 +185,22 @@ static int old_foreach_port(const char *brname,
ifr.ifr_data = (char *) &args;
err = ioctl(br_socket_fd, SIOCDEVPRIVATE, &ifr);
- if (err < 0)
+ if (err < 0) {
+ fprintf(stderr, "list ports for bridge:'%s' failed: %s\n",
+ brname, strerror(errno));
return -errno;
+ }
count = 0;
for (i = 0; i < MAX_PORTS; i++) {
if (!ifindices[i])
continue;
- if (!if_indextoname(ifindices[i], ifname))
+ if (!ifindextoname(ifindices[i], ifname)) {
+ fprintf(stderr, "can't find name for ifindex:%d\n",
+ ifindices[i]);
continue;
+ }
+
++count;
if (iterator(brname, ifname, i, arg))
break;