diff options
Diffstat (limited to 'networking')
-rw-r--r-- | networking/interface.c | 99 |
1 files changed, 54 insertions, 45 deletions
diff --git a/networking/interface.c b/networking/interface.c index 51e3d74..f8721f4 100644 --- a/networking/interface.c +++ b/networking/interface.c @@ -88,11 +88,9 @@ static const char *INET_sprint(struct sockaddr *sap, int numeric) if (sap->sa_family == 0xFFFF || sap->sa_family == 0) return "[NONE SET]"; - if (INET_rresolve(buff, sizeof(buff), (struct sockaddr_in *) sap, numeric, 0xffffff00) != 0) return NULL; - return buff; } @@ -221,10 +219,13 @@ static const struct aftype inet6_aftype = { /* Display an UNSPEC address. */ static char *UNSPEC_print(unsigned char *ptr) { - static char buff[sizeof(struct sockaddr) * 3 + 1]; + static char *buff; + char *pos; unsigned int i; + if (!buff); + buff = xmalloc(sizeof(struct sockaddr) * 3 + 1); pos = buff; for (i = 0; i < sizeof(struct sockaddr); i++) { /* careful -- not every libc's sprintf returns # bytes written */ @@ -341,7 +342,7 @@ struct interface { }; -int interface_opt_a; /* show all interfaces */ +smallint interface_opt_a; /* show all interfaces */ static struct interface *int_list, *int_last; @@ -522,7 +523,7 @@ static int if_readconf(void) ifc.ifc_buf = xrealloc(ifc.ifc_buf, ifc.ifc_len); if (ioctl(skfd, SIOCGIFCONF, &ifc) < 0) { - perror("SIOCGIFCONF"); + bb_perror_msg("SIOCGIFCONF"); goto out; } if (ifc.ifc_len == sizeof(struct ifreq) * numreqs) { @@ -548,7 +549,8 @@ static int if_readconf(void) static int if_readlist_proc(char *target) { - static int proc_read; + static smallint proc_read; + FILE *fh; char buf[512]; struct interface *ife; @@ -581,7 +583,7 @@ static int if_readlist_proc(char *target) break; } if (ferror(fh)) { - perror(_PATH_PROCNET_DEV); + bb_perror_msg(_PATH_PROCNET_DEV); err = -1; proc_read = 0; } @@ -598,22 +600,6 @@ static int if_readlist(void) return err; } -static int for_all_interfaces(int (*doit) (struct interface *, void *), - void *cookie) -{ - struct interface *ife; - - if (!int_list && (if_readlist() < 0)) - return -1; - for (ife = int_list; ife; ife = ife->next) { - int err = doit(ife, cookie); - - if (err) - return err; - } - return 0; -} - /* Fetch the interface configuration from the kernel. */ static int if_fetch(struct interface *ife) { @@ -732,9 +718,10 @@ static const struct hwtype loop_hwtype = { /* Display an Ethernet address in readable format. */ static char *pr_ether(unsigned char *ptr) { - static char buff[64]; + static char *buff; - snprintf(buff, sizeof(buff), "%02X:%02X:%02X:%02X:%02X:%02X", + free(buff); + buff = xasprintf("%02X:%02X:%02X:%02X:%02X:%02X", (ptr[0] & 0377), (ptr[1] & 0377), (ptr[2] & 0377), (ptr[3] & 0377), (ptr[4] & 0377), (ptr[5] & 0377) ); @@ -743,7 +730,7 @@ static char *pr_ether(unsigned char *ptr) static int in_ether(const char *bufp, struct sockaddr *sap); -static struct hwtype ether_hwtype = { +static const struct hwtype ether_hwtype = { .name = "ether", .title = "Ethernet", .type = ARPHRD_ETHER, @@ -1040,29 +1027,28 @@ static void ife_print(struct interface *ptr) (struct sockaddr *) &sap.sin6_addr); sap.sin6_family = AF_INET6; printf(" inet6 addr: %s/%d", - inet6_aftype.sprint((struct sockaddr *) &sap, 1), + INET6_sprint((struct sockaddr *) &sap, 1), plen); printf(" Scope:"); switch (scope & IPV6_ADDR_SCOPE_MASK) { case 0: - printf("Global"); + puts("Global"); break; case IPV6_ADDR_LINKLOCAL: - printf("Link"); + puts("Link"); break; case IPV6_ADDR_SITELOCAL: - printf("Site"); + puts("Site"); break; case IPV6_ADDR_COMPATv4: - printf("Compat"); + puts("Compat"); break; case IPV6_ADDR_LOOPBACK: - printf("Host"); + puts("Host"); break; default: - printf("Unknown"); + puts("Unknown"); } - puts(""); } } fclose(f); @@ -1144,14 +1130,13 @@ static void ife_print(struct interface *ptr) } -static int do_if_print(struct interface *ife, void *cookie) +static int do_if_print(struct interface *ife) /*, int *opt_a)*/ { - int *opt_a = (int *) cookie; int res; res = do_if_fetch(ife); if (res >= 0) { - if ((ife->flags & IFF_UP) || *opt_a) + if ((ife->flags & IFF_UP) || interface_opt_a) ife_print(ife); } return res; @@ -1167,21 +1152,45 @@ static struct interface *lookup_interface(char *name) return ife; } +#ifdef UNUSED +static int for_all_interfaces(int (*doit) (struct interface *, void *), + void *cookie) +{ + struct interface *ife; + + if (!int_list && (if_readlist() < 0)) + return -1; + for (ife = int_list; ife; ife = ife->next) { + int err = doit(ife, cookie); + + if (err) + return err; + } + return 0; +} +#endif + /* for ipv4 add/del modes */ static int if_print(char *ifname) { + struct interface *ife; int res; if (!ifname) { - res = for_all_interfaces(do_if_print, &interface_opt_a); - } else { - struct interface *ife; - - ife = lookup_interface(ifname); - res = do_if_fetch(ife); - if (res >= 0) - ife_print(ife); + /*res = for_all_interfaces(do_if_print, &interface_opt_a);*/ + if (!int_list && (if_readlist() < 0)) + return -1; + for (ife = int_list; ife; ife = ife->next) { + int err = do_if_print(ife); /*, &interface_opt_a);*/ + if (err) + return err; + } + return 0; } + ife = lookup_interface(ifname); + res = do_if_fetch(ife); + if (res >= 0) + ife_print(ife); return res; } |