From 617588a7894be9e4f775932ff56e20ebfae97a93 Mon Sep 17 00:00:00 2001 From: Rob Landley Date: Sat, 23 Nov 2013 20:02:10 -0600 Subject: The return of ifconfig cleanup. --- toys/pending/ifconfig.c | 69 +++++++++++++++++++++++-------------------------- 1 file changed, 32 insertions(+), 37 deletions(-) diff --git a/toys/pending/ifconfig.c b/toys/pending/ifconfig.c index 5801a67d..55a56892 100644 --- a/toys/pending/ifconfig.c +++ b/toys/pending/ifconfig.c @@ -46,8 +46,6 @@ typedef struct sockaddr_with_len { } sock_u; } sockaddr_with_len; -//for the param settings. - //for ipv6 add/del struct ifreq_inet6 { struct in6_addr ifrinte6_addr; @@ -154,7 +152,7 @@ static void display_ifconfig(char *name, int always, unsigned long long val[]) {ARPHRD_SIT, "IPv6-in-IPv4"}, {-1, "UNSPEC"} }; int i; - char *p; + char *pp; FILE *fp; short flags; @@ -181,8 +179,8 @@ static void display_ifconfig(char *name, int always, unsigned long long val[]) ifre.ifr_addr.sa_family = AF_INET; memset(&ifre.ifr_addr, 0, sizeof(ifre.ifr_addr)); ioctl(TT.sockfd, SIOCGIFADDR, &ifre); - p = (char *)&ifre.ifr_addr; - for (i = 0; i 0) { - sock_in6.sin6_family = AF_INET6; - if(inet_ntop(AF_INET6, &sock_in6.sin6_addr, toybuf, BUFSIZ)) { + ipv6_addr, &plen, &iscope, iface_name); + if (nitems<0 && feof(fp)) break; + if (nitems != 4) perror_exit("bad %s", pp); + + if (!strcmp(name, iface_name)) { + struct sockaddr_in6 s6; + char *ptr = ipv6_addr+sizeof(ipv6_addr)-1; + + // convert giant hex string into colon-spearated ipv6 address by + // inserting ':' every 4 characters. + for (i = 32; i; i--) + if ((*(ptr--) = ipv6_addr[i])) if (!(i&3)) *(ptr--) = ':'; + + // Convert to binary and back to get abbreviated :: version + if (inet_pton(AF_INET6, ipv6_addr, (void *)&s6.sin6_addr) > 0) { + if (inet_ntop(AF_INET6, &s6.sin6_addr, toybuf, sizeof(toybuf))) { char *scopes[] = {"Global","Host","Link","Site","Compat"}, *scope = "Unknown"; - int j; - for (j=0; j < sizeof(scopes)/sizeof(*scopes); j++) - if (iscope == (!!j)<<(j+3)) scope = scopes[j]; - xprintf("%10cinet6 addr: %s/%d Scope: %s\n", ' ', toybuf, plen, scope); + for (i=0; i < sizeof(scopes)/sizeof(*scopes); i++) + if (iscope == (!!i)<<(i+3)) scope = scopes[i]; + xprintf("%10cinet6 addr: %s/%d Scope: %s\n", + ' ', toybuf, plen, scope); } } } @@ -265,8 +260,8 @@ static void display_ifconfig(char *name, int always, unsigned long long val[]) "PORTSEL", "AUTOMEDIA", "DYNAMIC", NULL }; - for(s = str; *s; s++) { - if(flags & mask) xprintf("%s ", *s); + for (s = str; *s; s++) { + if (flags & mask) xprintf("%s ", *s); mask = mask << 1; } } else xprintf("[NO FLAGS] "); @@ -340,7 +335,7 @@ static void show_iface(char *iface_name) if (iface_name) { if (!strcmp(iface_name, name)) { - display_ifconfig(name, 1, val); + display_ifconfig(iface_name, 1, val); return; } -- cgit v1.2.3