summaryrefslogtreecommitdiffstats
path: root/sbin/ifconfig
diff options
context:
space:
mode:
authorphk <phk@FreeBSD.org>2001-05-29 09:13:44 +0000
committerphk <phk@FreeBSD.org>2001-05-29 09:13:44 +0000
commitde9bff5d04a6648d18315758ba3fc3c56bef1f05 (patch)
tree03e1c73f9af3dbf790af67ceca6eb7b4e7f06af2 /sbin/ifconfig
parentb7bd9d6b28334d79ebd3b8ca19c21cf54a4e5c21 (diff)
downloadFreeBSD-src-de9bff5d04a6648d18315758ba3fc3c56bef1f05.zip
FreeBSD-src-de9bff5d04a6648d18315758ba3fc3c56bef1f05.tar.gz
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>
Diffstat (limited to 'sbin/ifconfig')
-rw-r--r--sbin/ifconfig/ifconfig.87
-rw-r--r--sbin/ifconfig/ifconfig.c14
-rw-r--r--sbin/ifconfig/ifconfig.h1
-rw-r--r--sbin/ifconfig/ifmedia.c142
4 files changed, 136 insertions, 28 deletions
diff --git a/sbin/ifconfig/ifconfig.8 b/sbin/ifconfig/ifconfig.8
index 3382a5d..14c7d03 100644
--- a/sbin/ifconfig/ifconfig.8
+++ b/sbin/ifconfig/ifconfig.8
@@ -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,
diff --git a/sbin/ifconfig/ifconfig.c b/sbin/ifconfig/ifconfig.c
index 858221d..f865af24 100644
--- a/sbin/ifconfig/ifconfig.c
+++ b/sbin/ifconfig/ifconfig.c
@@ -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.. */
diff --git a/sbin/ifconfig/ifconfig.h b/sbin/ifconfig/ifconfig.h
index 4931643..f5c3325 100644
--- a/sbin/ifconfig/ifconfig.h
+++ b/sbin/ifconfig/ifconfig.h
@@ -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);
diff --git a/sbin/ifconfig/ifmedia.c b/sbin/ifconfig/ifmedia.c
index 0e770f7..c6794fa 100644
--- a/sbin/ifconfig/ifmedia.c
+++ b/sbin/ifconfig/ifmedia.c
@@ -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;
- 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 @@ 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.
**********************************************************************/
OpenPOWER on IntegriCloud