From de9bff5d04a6648d18315758ba3fc3c56bef1f05 Mon Sep 17 00:00:00 2001 From: phk Date: Tue, 29 May 2001 09:13:44 +0000 Subject: [PATCH] When using interfaces that support if_media, the supported media list is printed on a single, very long, and generally unreadable line. This isn't very useful. It's also really ugly and most of the time you don't care what media is supported anyway. PR: 27701 Submitted by: Brooks Davis --- sbin/ifconfig/ifconfig.8 | 7 ++ sbin/ifconfig/ifconfig.c | 14 ++-- sbin/ifconfig/ifconfig.h | 1 + sbin/ifconfig/ifmedia.c | 146 ++++++++++++++++++++++++++++++++------- 4 files changed, 138 insertions(+), 30 deletions(-) diff --git a/sbin/ifconfig/ifconfig.8 b/sbin/ifconfig/ifconfig.8 index 3382a5d757e0..14c7d033ccee 100644 --- a/sbin/ifconfig/ifconfig.8 +++ b/sbin/ifconfig/ifconfig.8 @@ -41,6 +41,7 @@ .Sh SYNOPSIS .Nm .Op Fl L +.Op Fl m .Ar interface .Op Ar address_family .Oo @@ -52,6 +53,7 @@ .Fl a .Op Fl L .Op Fl d +.Op Fl m .Op Fl u .Op Ar address_family .Nm @@ -62,6 +64,7 @@ .Nm .Op Fl L .Op Fl d +.Op Fl m .Op Fl u .Sh DESCRIPTION .Nm Ifconfig @@ -530,6 +533,10 @@ will report only the details specific to that protocol family. If the driver does supports the media selection system, the supported media list will be included in the output. .Pp +If the +.Fl m +flag is passed before an interface name, ifconfig will display all +of the supported media for the specified interface. If .Fl L flag is supplied, address lifetime is displayed for IPv6 addresses, diff --git a/sbin/ifconfig/ifconfig.c b/sbin/ifconfig/ifconfig.c index 858221dbb78a..f865af24ec2c 100644 --- a/sbin/ifconfig/ifconfig.c +++ b/sbin/ifconfig/ifconfig.c @@ -134,6 +134,8 @@ static int ip6lifetime; struct afswtch; +int supmedia = 0; + #ifdef INET6 char addr_buf[MAXHOSTNAMELEN *2 + 1]; /*for getnameinfo()*/ #endif @@ -351,16 +353,16 @@ usage() fprintf(stderr, "%s\n%s\n%s\n%s\n%s\n", "usage: ifconfig interface address_family [address [dest_address]]", " [parameters]", - " ifconfig -a [-d] [-u] [address_family]", + " ifconfig -a [-d] [-m] [-u] [address_family]", " ifconfig -l [-d] [-u] [address_family]", - " ifconfig [-d] [-u]"); + " ifconfig [-d] [-m] [-u]"); #else fprintf(stderr, "%s\n%s\n%s\n%s\n%s\n", "usage: ifconfig [-L] interface address_family [address [dest_address]]", " [parameters]", - " ifconfig -a [-L] [-d] [-u] [address_family]", + " ifconfig -a [-L] [-d] [-m] [-u] [address_family]", " ifconfig -l [-d] [-u] [address_family]", - " ifconfig [-L] [-d] [-u]"); + " ifconfig [-L] [-d] [-m] [-u]"); #endif exit(1); } @@ -410,7 +412,7 @@ main(argc, argv) uponly++; break; case 'm': /* show media choices in status */ - /* ignored for compatibility */ + supmedia = 1; break; default: usage(); @@ -421,7 +423,7 @@ main(argc, argv) argv += optind; /* -l cannot be used with -a or -m */ - if (namesonly && all) + if (namesonly && (all || supmedia)) usage(); /* nonsense.. */ diff --git a/sbin/ifconfig/ifconfig.h b/sbin/ifconfig/ifconfig.h index 4931643a97a6..f5c33253b405 100644 --- a/sbin/ifconfig/ifconfig.h +++ b/sbin/ifconfig/ifconfig.h @@ -38,6 +38,7 @@ extern struct ifreq ifr; extern char name[32]; /* name of interface */ extern int allmedia; +extern int supmedia; struct afswtch; extern void setmedia(const char *, int, int, const struct afswtch *rafp); diff --git a/sbin/ifconfig/ifmedia.c b/sbin/ifconfig/ifmedia.c index 0e770f7d22a9..c6794fa23eb2 100644 --- a/sbin/ifconfig/ifmedia.c +++ b/sbin/ifconfig/ifmedia.c @@ -93,7 +93,13 @@ static void domediaopt __P((const char *, int, int)); static int get_media_subtype __P((int, const char *)); static int get_media_options __P((int, const char *)); static int lookup_media_word __P((struct ifmedia_description *, const char *)); -static void print_media_word __P((int)); +static void print_media_word __P((int, int)); +static void print_media_word_ifconfig __P((int)); + +static struct ifmedia_description *get_toptype_desc __P((int)); +static struct ifmedia_type_to_subtype *get_toptype_ttos __P((int)); +static struct ifmedia_description *get_subtype_desc __P((int, + struct ifmedia_type_to_subtype *ttos)); void media_status(s, info) @@ -127,16 +133,18 @@ media_status(s, info) err(1, "SIOCGIFMEDIA"); printf("\tmedia: "); - print_media_word(ifmr.ifm_current); + print_media_word(ifmr.ifm_current, 1); if (ifmr.ifm_active != ifmr.ifm_current) { putchar(' '); putchar('('); - print_media_word(ifmr.ifm_active); + print_media_word(ifmr.ifm_active, 0); putchar(')'); } + putchar('\n'); + if (ifmr.ifm_status & IFM_AVALID) { - printf(" status: "); + printf("\tstatus: "); switch (IFM_TYPE(ifmr.ifm_active)) { case IFM_ETHER: if (ifmr.ifm_status & IFM_ACTIVE) @@ -164,13 +172,13 @@ media_status(s, info) putchar('\n'); - if (ifmr.ifm_count > 0) { - printf("\tsupported media:"); + if (ifmr.ifm_count > 0 && supmedia) { + printf("\tsupported media:\n"); for (i = 0; i < ifmr.ifm_count; i++) { - putchar(' '); - print_media_word(media_list[i]); + printf("\t\t"); + print_media_word_ifconfig(media_list[i]); + putchar('\n'); } - putchar('\n'); } free(media_list); @@ -496,22 +504,69 @@ lookup_media_word(desc, val) return (-1); } -static void -print_media_word(ifmw) +static struct ifmedia_description *get_toptype_desc(ifmw) int ifmw; { struct ifmedia_description *desc; + + for (desc = ifm_type_descriptions; desc->ifmt_string != NULL; desc++) + if (IFM_TYPE(ifmw) == desc->ifmt_word) + break; + + return desc; +} + +static struct ifmedia_type_to_subtype *get_toptype_ttos(ifmw) + int ifmw; +{ + struct ifmedia_description *desc; + struct ifmedia_type_to_subtype *ttos; + + for (desc = ifm_type_descriptions, ttos = ifmedia_types_to_subtypes; + desc->ifmt_string != NULL; desc++, ttos++) + if (IFM_TYPE(ifmw) == desc->ifmt_word) + break; + + return ttos; +} + +static struct ifmedia_description *get_subtype_desc(ifmw, ttos) + int ifmw; + struct ifmedia_type_to_subtype *ttos; +{ + int i; + struct ifmedia_description *desc; + + for (i = 0; ttos->subtypes[i].desc != NULL; i++) { + if (ttos->subtypes[i].alias) + continue; + for (desc = ttos->subtypes[i].desc; + desc->ifmt_string != NULL; desc++) { + if (IFM_SUBTYPE(ifmw) == desc->ifmt_word) + return desc; + } + } + + return NULL; +} + +static void +print_media_word(ifmw, print_toptype) + int ifmw; + int print_toptype; +{ + struct ifmedia_description *desc; struct ifmedia_type_to_subtype *ttos; int seen_option = 0, i; /* Find the top-level interface type. */ - for (desc = ifm_type_descriptions, ttos = ifmedia_types_to_subtypes; - desc->ifmt_string != NULL; desc++, ttos++) - if (IFM_TYPE(ifmw) == desc->ifmt_word) - break; + desc = get_toptype_desc(ifmw); + ttos = get_toptype_ttos(ifmw); if (desc->ifmt_string == NULL) { printf(""); return; + } else if (print_toptype) { + printf("%s", desc->ifmt_string); } /* @@ -520,21 +575,18 @@ print_media_word(ifmw) */ /* Find subtype. */ - for (i = 0; ttos->subtypes[i].desc != NULL; i++) { - if (ttos->subtypes[i].alias) - continue; - for (desc = ttos->subtypes[i].desc; - desc->ifmt_string != NULL; desc++) { - if (IFM_SUBTYPE(ifmw) == desc->ifmt_word) - goto got_subtype; - } - } + desc = get_subtype_desc(ifmw, ttos); + if (desc != NULL) + goto got_subtype; /* Falling to here means unknown subtype. */ printf(""); return; got_subtype: + if (print_toptype) + putchar(' '); + printf("%s", desc->ifmt_string); /* Find options. */ @@ -554,6 +606,52 @@ print_media_word(ifmw) printf("%s", seen_option ? ">" : ""); } +static void +print_media_word_ifconfig(ifmw) + int ifmw; +{ + struct ifmedia_description *desc; + struct ifmedia_type_to_subtype *ttos; + int i; + + /* Find the top-level interface type. */ + desc = get_toptype_desc(ifmw); + ttos = get_toptype_ttos(ifmw); + if (desc->ifmt_string == NULL) { + printf(""); + return; + } + + /* + * Don't print the top-level type; it's not like we can + * change it, or anything. + */ + + /* Find subtype. */ + desc = get_subtype_desc(ifmw, ttos); + if (desc != NULL) + goto got_subtype; + + /* Falling to here means unknown subtype. */ + printf(""); + return; + + got_subtype: + printf("media %s", desc->ifmt_string); + + /* Find options. */ + for (i = 0; ttos->options[i].desc != NULL; i++) { + if (ttos->options[i].alias) + continue; + for (desc = ttos->options[i].desc; + desc->ifmt_string != NULL; desc++) { + if (ifmw & desc->ifmt_word) { + printf(" mediaopt %s", desc->ifmt_string); + } + } + } +} + /********************************************************************** * ...until here. **********************************************************************/