From: Martin Mares Date: Thu, 16 Dec 1999 13:23:32 +0000 (+0000) Subject: Handle cases when SIOCGIFINDEX is defined, but doesn't work (new glibc X-Git-Tag: v1.2.0~1374 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e693ddff874890a9e5c990f6ca75d2e2358d065a;p=thirdparty%2Fbird.git Handle cases when SIOCGIFINDEX is defined, but doesn't work (new glibc with 2.0 kernels). --- diff --git a/TODO b/TODO index 2c0a02275..475c545f4 100644 --- a/TODO +++ b/TODO @@ -17,8 +17,6 @@ Core - netlink: import Linux route attributes to our rta's, so that they can be filtered? -- iface: SIOCGIFINDEX exists on glibc systems, but it doesn't work on 2.0.x kernels! - - socket: Use IP_RECVERR for BGP TCP sockets? - config: executable config files diff --git a/sysdep/unix/krt-iface.c b/sysdep/unix/krt-iface.c index 3a50e8b21..e9df6e433 100644 --- a/sysdep/unix/krt-iface.c +++ b/sysdep/unix/krt-iface.c @@ -36,11 +36,11 @@ scan_ifs(struct ifreq *r, int cnt) unsigned fl; ip_addr netmask; int l; - int sec = 0; if_start_update(); for (cnt /= sizeof(struct ifreq); cnt; cnt--, r++) { + int sec = 0; bzero(&i, sizeof(i)); bzero(&a, sizeof(a)); DBG("%s\n", r->ifr_name); @@ -136,11 +136,12 @@ scan_ifs(struct ifreq *r, int cnt) i.mtu = r->ifr_mtu; #ifdef SIOCGIFINDEX - if (ioctl(if_scan_sock, SIOCGIFINDEX, r) < 0) - DBG("SIOCGIFINDEX failed: %m\n"); - else + if (ioctl(if_scan_sock, SIOCGIFINDEX, r) >= 0) i.index = r->ifr_ifindex; -#else + else if (errno != -EINVAL) + DBG("SIOCGIFINDEX failed: %m\n"); + else /* defined, but not supported by the kernel */ +#endif /* * The kernel doesn't give us real ifindices, but we still need them * at least for OSPF unnumbered links. So let's make them up ourselves. @@ -152,7 +153,6 @@ scan_ifs(struct ifreq *r, int cnt) static int if_index_counter = 1; i.index = if_index_counter++; } -#endif pi = NULL; if (sec)