Index: sbin/ifconfig/af_inet.c =================================================================== --- sbin/ifconfig/af_inet.c +++ sbin/ifconfig/af_inet.c @@ -54,6 +54,7 @@ static struct in_aliasreq in_addreq; static struct ifreq in_ridreq; +extern char *f_subnet; static void in_status(int s __unused, const struct ifaddrs *ifa) @@ -66,19 +67,34 @@ if (sin == NULL) return; - printf("\tinet %s ", inet_ntoa(sin->sin_addr)); + printf("\tinet %s", inet_ntoa(sin->sin_addr)); if (ifa->ifa_flags & IFF_POINTOPOINT) { sin = (struct sockaddr_in *)ifa->ifa_dstaddr; if (sin == NULL) sin = &null_sin; - printf("--> %s ", inet_ntoa(sin->sin_addr)); + printf(" --> %s ", inet_ntoa(sin->sin_addr)); } sin = (struct sockaddr_in *)ifa->ifa_netmask; if (sin == NULL) sin = &null_sin; - printf("netmask 0x%lx ", (unsigned long)ntohl(sin->sin_addr.s_addr)); + if (f_subnet != NULL && strcmp(f_subnet, "cidr") == 0) { + int cidr = 32; + unsigned long smask; + + smask = ntohl(sin->sin_addr.s_addr); + while ((smask & 1) == 0) { + smask = smask >> 1; + cidr--; + if (cidr == 0) + break; + } + printf("/%d ", cidr); + } else if (f_subnet != NULL && strcmp(f_subnet, "dotted") == 0) + printf(" netmask %s ", inet_ntoa(sin->sin_addr)); + else + printf(" netmask 0x%lx ", (unsigned long)ntohl(sin->sin_addr.s_addr)); if (ifa->ifa_flags & IFF_BROADCAST) { sin = (struct sockaddr_in *)ifa->ifa_broadaddr; Index: sbin/ifconfig/af_link.c =================================================================== --- sbin/ifconfig/af_link.c +++ sbin/ifconfig/af_link.c @@ -51,19 +51,31 @@ static struct ifreq link_ridreq; +extern char *f_ether; + static void link_status(int s __unused, const struct ifaddrs *ifa) { /* XXX no const 'cuz LLADDR is defined wrong */ struct sockaddr_dl *sdl = (struct sockaddr_dl *) ifa->ifa_addr; + char *ether_format; + int i; if (sdl != NULL && sdl->sdl_alen > 0) { if ((sdl->sdl_type == IFT_ETHER || sdl->sdl_type == IFT_L2VLAN || sdl->sdl_type == IFT_BRIDGE) && sdl->sdl_alen == ETHER_ADDR_LEN) - printf("\tether %s\n", - ether_ntoa((struct ether_addr *)LLADDR(sdl))); + if (f_ether != NULL && strcmp(f_ether, "dash") == 0) { + ether_format = ether_ntoa((struct ether_addr *)LLADDR(sdl)); + for (i = 0; i < strlen(ether_format); i++) { + if (ether_format[i] == ':') + ether_format[i] = '-'; + } + printf("\tether %s\n", ether_format); + } else + printf("\tether %s\n", + ether_ntoa((struct ether_addr *)LLADDR(sdl))); else { int n = sdl->sdl_nlen > 0 ? sdl->sdl_nlen + 1 : 0; Index: sbin/ifconfig/ifconfig.8 =================================================================== --- sbin/ifconfig/ifconfig.8 +++ sbin/ifconfig/ifconfig.8 @@ -28,7 +28,7 @@ .\" From: @(#)ifconfig.8 8.3 (Berkeley) 1/5/94 .\" $FreeBSD$ .\" -.Dd Aug 12, 2015 +.Dd August 29, 2015 .Dt IFCONFIG 8 .Os .Sh NAME @@ -36,6 +36,8 @@ .Nd configure network interface parameters .Sh SYNOPSIS .Nm +.Op Fl c +.Op Fl s .Op Fl L .Op Fl k .Op Fl m @@ -194,6 +196,17 @@ List the interfaces in the given group. .El .Pp +The following flags can be used to modify the output format of +.Nm : +.Bl -tag -width indent +.It Fl c +Display subnet masks in CIDR notation. +For example 10.0.0.0/8 or 203.0.113.224/29 +.It Fl s +Display subnet masks in dotted quad notation. +For example 255.255.0.0 or 255.255.255.192 +.El +.Pp The following parameters may be set with .Nm : .Bl -tag -width indent Index: sbin/ifconfig/ifconfig.c =================================================================== --- sbin/ifconfig/ifconfig.c +++ sbin/ifconfig/ifconfig.c @@ -97,6 +97,10 @@ int supmedia = 0; int printkeys = 0; /* Print keying material for interfaces. */ +/* Formatter Strings */ +char *f_subnet, *f_ether; +char *f_input, *f_format, *f_class, *f_modifier; + static int ifconfig(int argc, char *const *argv, int iscreate, const struct afswtch *afp); static void status(const struct afswtch *afp, const struct sockaddr_dl *sdl, @@ -140,8 +144,8 @@ } fprintf(stderr, - "usage: ifconfig %sinterface address_family [address [dest_address]]\n" - " [parameters]\n" + "usage: ifconfig [-f type:format] %sinterface address_family\n" + " [address [dest_address]] [parameters]\n" " ifconfig interface create\n" " ifconfig -a %s[-d] [-m] [-u] [-v] [address_family]\n" " ifconfig -l [-d] [-u] [address_family]\n" @@ -316,7 +320,7 @@ all = downonly = uponly = namesonly = noload = verbose = 0; /* Parse leading line options */ - strlcpy(options, "adklmnuv", sizeof(options)); + strlcpy(options, "f:adklmnuv", sizeof(options)); for (p = opts; p != NULL; p = p->next) strlcat(options, p->opt, sizeof(options)); while ((c = getopt(argc, argv, options)) != -1) { @@ -327,6 +331,34 @@ case 'd': /* restrict scan to "down" interfaces */ downonly++; break; + case 'f': + if (optarg == NULL) + usage(); + f_input = strdup(optarg); + if (f_input == NULL) + errx(1, "Failed to allocate memory"); + + while ((f_format = strsep(&f_input, ",")) != NULL) { +printf("Format: %s\n", f_format); + f_class = f_format; + f_modifier = strchr(f_format, ':'); + if (f_modifier[0] == '\0') { + printf("Skipping %s\n", f_class); + continue; + } + f_modifier[0] = '\0'; + f_modifier++; +printf("Class: %s, modifier: %s\n", f_class, f_modifier); + if (strcmp(f_class, "subnet") == 0) { +printf("setting subnet to %s\n", f_modifier); + f_subnet = f_modifier; + } + else if (strcmp(f_class, "ether") == 0) { +printf("setting ether to %s\n", f_modifier); + f_ether = f_modifier; + } + } + break; case 'k': printkeys++; break;