forked from unpbook/unpv13e
-
Notifications
You must be signed in to change notification settings - Fork 0
/
if_indextoname.c
51 lines (45 loc) · 1.15 KB
/
if_indextoname.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
/* include if_indextoname */
#include "unpifi.h"
#include "unproute.h"
char *
if_indextoname(unsigned int idx, char *name)
{
char *buf, *next, *lim;
size_t len;
struct if_msghdr *ifm;
struct sockaddr *sa, *rti_info[RTAX_MAX];
struct sockaddr_dl *sdl;
if ( (buf = net_rt_iflist(0, idx, &len)) == NULL)
return(NULL);
lim = buf + len;
for (next = buf; next < lim; next += ifm->ifm_msglen) {
ifm = (struct if_msghdr *) next;
if (ifm->ifm_type == RTM_IFINFO) {
sa = (struct sockaddr *) (ifm + 1);
get_rtaddrs(ifm->ifm_addrs, sa, rti_info);
if ( (sa = rti_info[RTAX_IFP]) != NULL) {
if (sa->sa_family == AF_LINK) {
sdl = (struct sockaddr_dl *) sa;
if (sdl->sdl_index == idx) {
int slen = min(IFNAMSIZ - 1, sdl->sdl_nlen);
strncpy(name, sdl->sdl_data, slen);
name[slen] = 0; /* null terminate */
free(buf);
return(name);
}
}
}
}
}
free(buf);
return(NULL); /* no match for index */
}
/* end if_indextoname */
char *
If_indextoname(unsigned int idx, char *name)
{
char *ptr;
if ( (ptr = if_indextoname(idx, name)) == NULL)
err_quit("if_indextoname error for %d", idx);
return(ptr);
}