diff options
author | shemminger <shemminger> | 2004-06-03 22:10:06 +0000 |
---|---|---|
committer | shemminger <shemminger> | 2004-06-03 22:10:06 +0000 |
commit | 946695beaac41b6b50a5e641bbfd292f85e5a163 (patch) | |
tree | c2ba618b3aacdd4732b11493373325ed3c16e4d0 /libbridge | |
parent | a5a664df717e5e6d4135abfa871227b17572a24c (diff) | |
download | android_external_brctl-946695beaac41b6b50a5e641bbfd292f85e5a163.tar.gz android_external_brctl-946695beaac41b6b50a5e641bbfd292f85e5a163.tar.bz2 android_external_brctl-946695beaac41b6b50a5e641bbfd292f85e5a163.zip |
Workaround older libraries with buste if_indextoname etc.
Diffstat (limited to 'libbridge')
-rw-r--r-- | libbridge/libbridge_devif.c | 14 | ||||
-rw-r--r-- | libbridge/libbridge_init.c | 26 |
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; |