ll_map: disable interface name caching code
No binary (build failed)
—
(log yok)
| @@ -11,26 +11,34 @@ | |
| * | |
| */ | |
| - | //#include <sys/socket.h> /* socket() */ |
| #include <net/if.h> /* struct ifreq and co. */ | |
| - | //#include <sys/ioctl.h> /* ioctl() & SIOCGIFINDEX */ |
| #include "libbb.h" | |
| #include "libnetlink.h" | |
| #include "ll_map.h" | |
| struct idxmap { | |
| - | struct idxmap * next; |
| - | int index; |
| - | int type; |
| - | int alen; |
| - | unsigned flags; |
| - | unsigned char addr[8]; |
| - | char name[16]; |
| + | struct idxmap *next; |
| + | int index; |
| + | int type; |
| + | int alen; |
| + | unsigned flags; |
| + | unsigned char addr[8]; |
| + | char name[16]; |
| }; | |
| static struct idxmap *idxmap[16]; | |
| + | static struct idxmap *find_by_index(int idx) |
| + | { |
| + | struct idxmap *im; |
| + | |
| + | for (im = idxmap[idx & 0xF]; im; im = im->next) |
| + | if (im->index == idx) |
| + | return im; |
| + | return NULL; |
| + | } |
| + | |
| int ll_remember_index(struct sockaddr_nl *who, struct nlmsghdr *n, void *arg) | |
| { | |
| int h; | |
| @@ -44,25 +52,22 @@ int ll_remember_index(struct sockaddr_nl *who, struct nlmsghdr *n, void *arg) | |
| if (n->nlmsg_len < NLMSG_LENGTH(sizeof(ifi))) | |
| return -1; | |
| - | |
| memset(tb, 0, sizeof(tb)); | |
| parse_rtattr(tb, IFLA_MAX, IFLA_RTA(ifi), IFLA_PAYLOAD(n)); | |
| if (tb[IFLA_IFNAME] == NULL) | |
| return 0; | |
| - | h = ifi->ifi_index&0xF; |
| + | h = ifi->ifi_index & 0xF; |
| for (imp = &idxmap[h]; (im = *imp) != NULL; imp = &im->next) | |
| if (im->index == ifi->ifi_index) | |
| - | break; |
| - | |
| - | if (im == NULL) { |
| - | im = xmalloc(sizeof(*im)); |
| - | im->next = *imp; |
| - | im->index = ifi->ifi_index; |
| - | *imp = im; |
| - | } |
| + | goto found; |
| + | im = xmalloc(sizeof(*im)); |
| + | im->next = *imp; |
| + | im->index = ifi->ifi_index; |
| + | *imp = im; |
| + | found: |
| im->type = ifi->ifi_type; | |
| im->flags = ifi->ifi_flags; | |
| if (tb[IFLA_ADDRESS]) { | |
| @@ -85,9 +90,9 @@ const char *ll_idx_n2a(int idx, char *buf) | |
| if (idx == 0) | |
| return "*"; | |
| - | for (im = idxmap[idx & 0xF]; im; im = im->next) |
| - | if (im->index == idx) |
| - | return im->name; |
| + | im = find_by_index(idx); |
| + | if (im) |
| + | return im->name; |
| snprintf(buf, 16, "if%d", idx); | |
| return buf; | |
| } | |
| @@ -100,17 +105,19 @@ const char *ll_index_to_name(int idx) | |
| return ll_idx_n2a(idx, nbuf); | |
| } | |
| + | #ifdef UNUSED |
| int ll_index_to_type(int idx) | |
| { | |
| struct idxmap *im; | |
| if (idx == 0) | |
| return -1; | |
| - | for (im = idxmap[idx & 0xF]; im; im = im->next) |
| - | if (im->index == idx) |
| - | return im->type; |
| + | im = find_by_index(idx); |
| + | if (im) |
| + | return im->type; |
| return -1; | |
| } | |
| + | #endif |
| unsigned ll_index_to_flags(int idx) | |
| { | |
| @@ -118,23 +125,24 @@ unsigned ll_index_to_flags(int idx) | |
| if (idx == 0) | |
| return 0; | |
| - | |
| - | for (im = idxmap[idx & 0xF]; im; im = im->next) |
| - | if (im->index == idx) |
| - | return im->flags; |
| + | im = find_by_index(idx); |
| + | if (im) |
| + | return im->flags; |
| return 0; | |
| } | |
| - | // TODO: caching is not warranted - no users which repeatedly call it |
| int xll_name_to_index(const char * const name) | |
| { | |
| + | int ret = 0; |
| + | int sock_fd; |
| + | |
| + | /* caching is not warranted - no users which repeatedly call it */ |
| + | #ifdef UNUSED |
| static char ncache[16]; | |
| static int icache; | |
| struct idxmap *im; | |
| - | int sock_fd; |
| int i; | |
| - | int ret = 0; |
| if (name == NULL) | |
| goto out; | |
| @@ -159,10 +167,13 @@ int xll_name_to_index(const char * const name) | |
| * we explicitely request it (check for dev_load() in net/core/dev.c). | |
| * I can think of other similar scenario, but they are less common... | |
| * Jean II */ | |
| + | #endif |
| + | |
| sock_fd = socket(AF_INET, SOCK_DGRAM, 0); | |
| if (sock_fd) { | |
| struct ifreq ifr; | |
| int tmp; | |
| + | |
| strncpy(ifr.ifr_name, name, IFNAMSIZ); | |
| ifr.ifr_ifindex = -1; | |
| tmp = ioctl(sock_fd, SIOCGIFINDEX, &ifr); | |
| @@ -173,7 +184,7 @@ int xll_name_to_index(const char * const name) | |
| * to the reader... Jean II */ | |
| ret = ifr.ifr_ifindex; | |
| } | |
| - | out: |
| + | /* out:*/ |
| if (ret <= 0) | |
| bb_error_msg_and_die("cannot find device \"%s\"", name); | |
| return ret; | |
| @@ -2,12 +2,12 @@ | |
| #ifndef __LL_MAP_H__ | |
| #define __LL_MAP_H__ 1 | |
| - | extern int ll_remember_index(struct sockaddr_nl *who, struct nlmsghdr *n, void *arg); |
| - | extern int ll_init_map(struct rtnl_handle *rth); |
| - | extern int xll_name_to_index(const char * const name); |
| - | extern const char *ll_index_to_name(int idx); |
| - | extern const char *ll_idx_n2a(int idx, char *buf); |
| - | extern int ll_index_to_type(int idx); |
| - | extern unsigned ll_index_to_flags(int idx); |
| + | int ll_remember_index(struct sockaddr_nl *who, struct nlmsghdr *n, void *arg); |
| + | int ll_init_map(struct rtnl_handle *rth); |
| + | int xll_name_to_index(const char * const name); |
| + | const char *ll_index_to_name(int idx); |
| + | const char *ll_idx_n2a(int idx, char *buf); |
| + | /* int ll_index_to_type(int idx); */ |
| + | unsigned ll_index_to_flags(int idx); |
| #endif /* __LL_MAP_H__ */ | |