From owner-freebsd-bugs Mon May 28 18:40:13 2001 Delivered-To: freebsd-bugs@hub.freebsd.org Received: from freefall.freebsd.org (freefall.freebsd.org [216.136.204.21]) by hub.freebsd.org (Postfix) with ESMTP id 18EB237B423 for ; Mon, 28 May 2001 18:40:03 -0700 (PDT) (envelope-from gnats@FreeBSD.org) Received: (from gnats@localhost) by freefall.freebsd.org (8.11.1/8.11.1) id f4T1e2F70197; Mon, 28 May 2001 18:40:03 -0700 (PDT) (envelope-from gnats) Date: Mon, 28 May 2001 18:40:03 -0700 (PDT) Message-Id: <200105290140.f4T1e2F70197@freefall.freebsd.org> To: freebsd-bugs@FreeBSD.org Cc: From: Brooks Davis Subject: Re: bin/27701: [PATCH] ifconfig: supported media looks bad : wastes space Reply-To: Brooks Davis Sender: owner-freebsd-bugs@FreeBSD.ORG Precedence: bulk List-ID: List-Archive: (Web Archive) List-Help: (List Instructions) List-Subscribe: List-Unsubscribe: X-Loop: FreeBSD.org The following reply was made to PR bin/27701; it has been noted by GNATS. From: Brooks Davis To: Poul-Henning Kamp Cc: brooks@one-eyed-alien.net, FreeBSD-gnats-submit@FreeBSD.ORG Subject: Re: bin/27701: [PATCH] ifconfig: supported media looks bad : wastes space Date: Mon, 28 May 2001 18:32:29 -0700 Hmm, it looks like gnats doesn't like signed mail. Here's an unsigned message with the patch. Index: ifconfig.8 =================================================================== RCS file: /home/ncvs/src/sbin/ifconfig/ifconfig.8,v retrieving revision 1.38 diff -u -r1.38 ifconfig.8 --- ifconfig.8 2001/05/26 09:26:01 1.38 +++ ifconfig.8 2001/05/29 00:28:09 @@ -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 @@ 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, Index: ifconfig.c =================================================================== RCS file: /home/ncvs/src/sbin/ifconfig/ifconfig.c,v retrieving revision 1.61 diff -u -r1.61 ifconfig.c --- ifconfig.c 2001/05/26 09:26:01 1.61 +++ ifconfig.c 2001/05/29 00:28:09 @@ -134,6 +134,8 @@ struct afswtch; +int supmedia = 0; + #ifdef INET6 char addr_buf[MAXHOSTNAMELEN *2 + 1]; /*for getnameinfo()*/ #endif @@ -351,16 +353,16 @@ 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 @@ uponly++; break; case 'm': /* show media choices in status */ - /* ignored for compatibility */ + supmedia = 1; break; default: usage(); @@ -421,7 +423,7 @@ argv += optind; /* -l cannot be used with -a or -m */ - if (namesonly && all) + if (namesonly && (all || supmedia)) usage(); /* nonsense.. */ Index: ifconfig.h =================================================================== RCS file: /home/ncvs/src/sbin/ifconfig/ifconfig.h,v retrieving revision 1.6 diff -u -r1.6 ifconfig.h --- ifconfig.h 2001/05/26 09:26:01 1.6 +++ ifconfig.h 2001/05/29 00:28:09 @@ -38,6 +38,7 @@ 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); Index: ifmedia.c =================================================================== RCS file: /home/ncvs/src/sbin/ifconfig/ifmedia.c,v retrieving revision 1.7 diff -u -r1.7 ifmedia.c --- ifmedia.c 2001/05/26 09:26:01 1.7 +++ ifmedia.c 2001/05/29 01:15:21 @@ -93,8 +93,14 @@ 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) int s; @@ -127,16 +133,18 @@ 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 @@ 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 @@ 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; - 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; + + 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. */ + 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 @@ */ /* 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. */ @@ -552,6 +604,52 @@ } } 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); + } + } + } } /********************************************************************** -- Any statement of the form "X is the one, true Y" is FALSE. PGP fingerprint 655D 519C 26A7 82E7 2529 9BF0 5D8E 8BE9 F238 1AD4 To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-bugs" in the body of the message