From owner-freebsd-bugs Mon May 28 18:30:16 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 5F7DF37B422 for ; Mon, 28 May 2001 18:30:03 -0700 (PDT) (envelope-from gnats@FreeBSD.org) Received: (from gnats@localhost) by freefall.freebsd.org (8.11.1/8.11.1) id f4T1U3669380; Mon, 28 May 2001 18:30:03 -0700 (PDT) (envelope-from gnats) Date: Mon, 28 May 2001 18:30:03 -0700 (PDT) Message-Id: <200105290130.f4T1U3669380@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: FreeBSD-gnats-submit@FreeBSD.ORG Subject: Re: bin/27701: [PATCH] ifconfig: supported media looks bad : wastes space Date: Mon, 28 May 2001 18:26:40 -0700 --BOKacYhQ+x31HxR3 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On Mon, May 28, 2001 at 10:37:38PM +0200, Poul-Henning Kamp wrote: >=20 > I tried to apply your patch, but it seems to screw up the formatting, > even with your 2nd patch, can you try to produce a fixed patch ? I've attached an updated patch below. The flaw in the previous one was using the same code to print both supported and current media types. The new output looks like this: tx0: flags=3D8943 mtu 1500 inet 216.39.168.226 netmask 0xfffffff0 broadcast 216.39.168.239 ether 00:e0:29:27:50:95 # The () part is only displayed if the settings differ (that should have # been the case before.) Following the example of the OpenBSD box I've # been using as an example, I added the disply of the top level media # type. media: Ethernet autoselect (100baseTX ) status: active # Net and OpenBSD display the supported options this way rather then in # the older "mediatype style. I think it's more # useful since it gives the administrator something to copy and paste. supported media: media autoselect media 100baseTX mediaopt full-duplex media 100baseTX media 10baseT/UTP mediaopt full-duplex media 10baseT/UTP -- Brooks --=20 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 Index: ifconfig.8 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D 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 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D 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 @@ =20 struct afswtch; =20 +int supmedia =3D 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 =3D 1; break; default: usage(); @@ -421,7 +423,7 @@ argv +=3D optind; =20 /* -l cannot be used with -a or -m */ - if (namesonly && all) + if (namesonly && (all || supmedia)) usage(); =20 /* nonsense.. */ Index: ifconfig.h =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D 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 @@ =20 extern char name[32]; /* name of interface */ extern int allmedia; +extern int supmedia; struct afswtch; =20 extern void setmedia(const char *, int, int, const struct afswtch *rafp); Index: ifmedia.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D 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)); =20 +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"); =20 printf("\tmedia: "); - print_media_word(ifmr.ifm_current); + print_media_word(ifmr.ifm_current, 1); if (ifmr.ifm_active !=3D ifmr.ifm_current) { putchar(' '); putchar('('); - print_media_word(ifmr.ifm_active); + print_media_word(ifmr.ifm_active, 0); putchar(')'); } =20 + 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 @@ =20 putchar('\n'); =20 - if (ifmr.ifm_count > 0) { - printf("\tsupported media:"); + if (ifmr.ifm_count > 0 && supmedia) { + printf("\tsupported media:\n"); for (i =3D 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'); } =20 free(media_list); @@ -496,22 +504,69 @@ return (-1); } =20 -static void -print_media_word(ifmw) +static struct ifmedia_description *get_toptype_desc(ifmw) int ifmw; { struct ifmedia_description *desc; + + for (desc =3D ifm_type_descriptions; desc->ifmt_string !=3D NULL; desc++) + if (IFM_TYPE(ifmw) =3D=3D 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 =3D 0, i; =20 - /* Find the top-level interface type. */ for (desc =3D ifm_type_descriptions, ttos =3D ifmedia_types_to_subtypes; desc->ifmt_string !=3D NULL; desc++, ttos++) if (IFM_TYPE(ifmw) =3D=3D 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 =3D 0; ttos->subtypes[i].desc !=3D NULL; i++) { + if (ttos->subtypes[i].alias) + continue; + for (desc =3D ttos->subtypes[i].desc; + desc->ifmt_string !=3D NULL; desc++) { + if (IFM_SUBTYPE(ifmw) =3D=3D 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 =3D 0, i; + + /* Find the top-level interface type. */ + desc =3D get_toptype_desc(ifmw); + ttos =3D get_toptype_ttos(ifmw); if (desc->ifmt_string =3D=3D NULL) { printf(""); return; + } else if (print_toptype) { + printf("%s", desc->ifmt_string); } =20 /* @@ -520,21 +575,18 @@ */ =20 /* Find subtype. */ - for (i =3D 0; ttos->subtypes[i].desc !=3D NULL; i++) { - if (ttos->subtypes[i].alias) - continue; - for (desc =3D ttos->subtypes[i].desc; - desc->ifmt_string !=3D NULL; desc++) { - if (IFM_SUBTYPE(ifmw) =3D=3D desc->ifmt_word) - goto got_subtype; - } - } + desc =3D get_subtype_desc(ifmw, ttos); + if (desc !=3D NULL) + goto got_subtype; =20 /* Falling to here means unknown subtype. */ printf(""); return; =20 got_subtype: + if (print_toptype) + putchar(' '); + printf("%s", desc->ifmt_string); =20 /* 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 =3D get_toptype_desc(ifmw); + ttos =3D get_toptype_ttos(ifmw); + if (desc->ifmt_string =3D=3D NULL) { + printf(""); + return; + } + + /* + * Don't print the top-level type; it's not like we can + * change it, or anything. + */ + + /* Find subtype. */ + desc =3D get_subtype_desc(ifmw, ttos); + if (desc !=3D NULL) + goto got_subtype; + + /* Falling to here means unknown subtype. */ + printf(""); + return; + + got_subtype: + printf("media %s", desc->ifmt_string); + + /* Find options. */ + for (i =3D 0; ttos->options[i].desc !=3D NULL; i++) { + if (ttos->options[i].alias) + continue; + for (desc =3D ttos->options[i].desc; + desc->ifmt_string !=3D NULL; desc++) { + if (ifmw & desc->ifmt_word) { + printf(" mediaopt %s", desc->ifmt_string); + } + } + } } =20 /********************************************************************** --BOKacYhQ+x31HxR3 Content-Type: application/pgp-signature Content-Disposition: inline -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.0.4 (GNU/Linux) Comment: For info see http://www.gnupg.org iD8DBQE7EvrPXY6L6fI4GtQRAoyoAKDXiqZrZ/7On0m8ymDao3tk0ANnzwCgyHPJ 3c4TB3gcdodZDtUmBeFThzo= =bGDT -----END PGP SIGNATURE----- --BOKacYhQ+x31HxR3-- To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-bugs" in the body of the message