Skip site navigation (1)Skip section navigation (2)
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>