From f14a54137494f45f4870bb15599e3017534752d3 Mon Sep 17 00:00:00 2001 From: Rob Landley Date: Sun, 5 Aug 2018 17:40:40 -0500 Subject: Add ifconfig -S (short view), and do some minor cleanups while there. --- toys/net/ifconfig.c | 68 ++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 46 insertions(+), 22 deletions(-) diff --git a/toys/net/ifconfig.c b/toys/net/ifconfig.c index 74779c54..634b6dd0 100644 --- a/toys/net/ifconfig.c +++ b/toys/net/ifconfig.c @@ -11,20 +11,21 @@ * outfill|keepalive INTEGER - SLIP analog dialup line quality monitoring * metric INTEGER - added to Linux 0.9.10 with comment "never used", still true -USE_IFCONFIG(NEWTOY(ifconfig, "^?a", TOYFLAG_SBIN)) +USE_IFCONFIG(NEWTOY(ifconfig, "^?aS", TOYFLAG_SBIN)) config IFCONFIG bool "ifconfig" default y help - usage: ifconfig [-a] [INTERFACE [ACTION...]] + usage: ifconfig [-aS] [INTERFACE [ACTION...]] Display or configure network interface. With no arguments, display active interfaces. First argument is interface to operate on, one argument by itself displays that interface. - -a Show all interfaces, not just active ones + -a All interfaces displayed, not just active ones + -S Short view, one line per interface Standard ACTIONs to perform on an INTERFACE: @@ -100,6 +101,7 @@ static int get_addrinfo(char *host, sa_family_t af, void *addr) static void display_ifconfig(char *name, int always, unsigned long long val[]) { struct ifreq ifre; + struct sockaddr_in *si = (void *)&ifre.ifr_addr; struct { int type; char *title; @@ -118,21 +120,37 @@ static void display_ifconfig(char *name, int always, unsigned long long val[]) flags = ifre.ifr_flags; if (!always && !(flags & IFF_UP)) return; + if (toys.optflags&FLAG_S) { + unsigned uu = 0; + int len; + + ioctl(TT.sockfd, SIOCGIFADDR, &ifre); + len = printf("%*s %s", -9, name, inet_ntoa(si->sin_addr)); + if (!ioctl(TT.sockfd, SIOCGIFNETMASK, &ifre)) + uu = htonl(*(unsigned *)&(si->sin_addr)); + for (i = 0; uu; i++) uu <<= 1; + len += printf("/%d", i); + printf("%*c", 26-len, ' '); + } + // query hardware type and hardware address xioctl(TT.sockfd, SIOCGIFHWADDR, &ifre); - for (i=0; i < (sizeof(types)/sizeof(*types))-1; i++) - if (ifre.ifr_hwaddr.sa_family == types[i].type) break; - - xprintf("%-9s Link encap:%s ", name, types[i].title); - if(i >= 0 && ifre.ifr_hwaddr.sa_family == ARPHRD_ETHER) { - xprintf("HWaddr "); - for (i=0; i<6; i++) xprintf(":%02x"+!i, ifre.ifr_hwaddr.sa_data[i]); + if (toys.optflags&FLAG_S) + for (i=0; i<6; i++) printf(":%02x"+!i, ifre.ifr_hwaddr.sa_data[i]); + else { + for (i=0; i < ARRAY_LEN(types)-1; i++) + if (ifre.ifr_hwaddr.sa_family == types[i].type) break; + xprintf("%-9s Link encap:%s ", name, types[i].title); + if(ifre.ifr_hwaddr.sa_family == ARPHRD_ETHER) { + xprintf("HWaddr "); + for (i=0; i<6; i++) xprintf(":%02x"+!i, ifre.ifr_hwaddr.sa_data[i]); + } + sprintf(toybuf, "/sys/class/net/%.15s/device/driver", name); + if (readlink0(toybuf, toybuf, sizeof(toybuf))>0) + if ((pp = strrchr(toybuf, '/'))) xprintf(" Driver %s", pp+1); + xputc('\n'); } - sprintf(toybuf, "/sys/class/net/%.15s/device/driver", name); - if (readlink0(toybuf, toybuf, sizeof(toybuf))>0 && (pp = strrchr(toybuf, '/'))) - xprintf(" Driver %s", pp+1); - xputc('\n'); // If an address is assigned record that. @@ -142,7 +160,7 @@ static void display_ifconfig(char *name, int always, unsigned long long val[]) pp = (char *)&ifre.ifr_addr; for (i = 0; isin_family == AF_INET) ? "inet" : (si->sin_family == AF_INET6) ? "inet6" : "unspec"); - for (i=0; i < sizeof(addr)/sizeof(*addr); i++) { + for (i=0; isin_family = 0; @@ -200,10 +218,11 @@ static void display_ifconfig(char *name, int always, unsigned long long val[]) char *scopes[] = {"Global","Host","Link","Site","Compat"}, *scope = "Unknown"; - for (i=0; i < sizeof(scopes)/sizeof(*scopes); i++) + for (i=0; i= 0) val[16] = ifre.ifr_qlen; else val[16] = -1; - for (i = 0; i < sizeof(order); i++) { + for (i = 0; ion, off = t->off; @@ -519,7 +543,7 @@ void ifconfig_main(void) break; } - if (i == sizeof(try)/sizeof(*try)) help_exit("bad argument '%s'", *argv); + if (i == ARRAY_LEN(try)) help_exit("bad argument '%s'", *argv); } close(TT.sockfd); } -- cgit v1.2.3