Date: Mon, 28 May 2001 18:30:03 -0700 (PDT) From: Brooks Davis <brooks@one-eyed-alien.net> To: freebsd-bugs@FreeBSD.org Subject: Re: bin/27701: [PATCH] ifconfig: supported media looks bad : wastes space Message-ID: <200105290130.f4T1U3669380@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
The following reply was made to PR bin/27701; it has been noted by GNATS.
From: Brooks Davis <brooks@one-eyed-alien.net>
To: Poul-Henning Kamp <phk@critter.freebsd.dk>
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<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> 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 <full-duplex>)
status: active
# Net and OpenBSD display the supported options this way rather then in
# the older "mediatype <option1,option2> 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("<unknown type>");
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("<unknown subtype>");
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("<unknown type>");
+ 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("<unknown subtype>");
+ 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
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200105290130.f4T1U3669380>
