| @@ -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; |
| } |
| |