diff options
Diffstat (limited to 'libbridge/libbridge_devif.c')
-rw-r--r-- | libbridge/libbridge_devif.c | 14 |
1 files changed, 12 insertions, 2 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 }; |