Use the new SIOCGIFINDEX ioctl to efficiently map a name to an index.
If the syscall fails, fall back on the old method as a compatability measure.
This commit is contained in:
parent
85e1c08791
commit
f8c01ba3e2
@ -35,6 +35,7 @@
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/sockio.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <net/if.h>
|
||||
#include <net/route.h>
|
||||
@ -48,8 +49,8 @@
|
||||
((a) > 0 ? (1 + (((a) - 1) | (sizeof(long) - 1))) : sizeof(long))
|
||||
#define ADVANCE(x, n) (x += ROUNDUP((n)->sa_len))
|
||||
|
||||
unsigned int
|
||||
if_nametoindex(ifname)
|
||||
static unsigned int
|
||||
if_onametoindex(ifname)
|
||||
const char *ifname;
|
||||
{
|
||||
struct if_nameindex *iff = if_nameindex(), *ifx;
|
||||
@ -69,6 +70,25 @@ if_nametoindex(ifname)
|
||||
errno = ENXIO;
|
||||
return 0;
|
||||
}
|
||||
|
||||
unsigned int
|
||||
if_nametoindex(ifname)
|
||||
const char *ifname;
|
||||
{
|
||||
int s;
|
||||
struct ifreq ifr;
|
||||
|
||||
s = socket(AF_INET, SOCK_DGRAM, 0);
|
||||
if (s == -1)
|
||||
return (0);
|
||||
strlcpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name));
|
||||
if (ioctl(s, SIOCGIFINDEX, &ifr) == -1) {
|
||||
close (s);
|
||||
return (if_onametoindex(ifname));
|
||||
}
|
||||
close(s);
|
||||
return (ifr.ifr_index);
|
||||
}
|
||||
|
||||
char *
|
||||
if_indextoname(ifindex, ifname)
|
||||
|
Loading…
Reference in New Issue
Block a user