Date: Mon, 28 May 2001 18:40: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: <200105290140.f4T1e2F70197@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: 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("<unknown type>");
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("<unknown subtype>");
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("<unknown type>");
+ 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("<unknown subtype>");
+ 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
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200105290140.f4T1e2F70197>
