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 <brooks@one-eyed-alien.net>
This commit is contained in:
phk 2001-05-29 09:13:44 +00:00
parent b7bd9d6b28
commit de9bff5d04
4 changed files with 138 additions and 30 deletions

View File

@ -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,

View File

@ -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.. */

View File

@ -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);

View File

@ -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("<unknown type>");
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("<unknown subtype>");
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("<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);
}
}
}
}
/**********************************************************************
* ...until here.
**********************************************************************/