svn commit: r295836 - head/sbin/ifconfig

Kristof Provost kp at FreeBSD.org
Sat Feb 20 11:36:37 UTC 2016


Author: kp
Date: Sat Feb 20 11:36:35 2016
New Revision: 295836
URL: https://svnweb.freebsd.org/changeset/base/295836

Log:
  ifconfig(8): can't use 'name' or 'description' when creating interface with auto numbering
  
  If one does 'ifconfig tap create name blah', it will return error because the
  'name' command doesn't properly populate the request sent to ioctl(...). The
  'description' command has the same bug, and is also fixed with this patch.
  
  If one does 'ifconfig tap create mtu 9000 name blah', it DOES work, but 'tap0'
  (or other sequence number) is echoed, instead of the expected 'blah'. (assuming
  the name change actually succeeded)
  
  Submitted by:	Marie Helene Kvello-Aune <marieheleneka at gmail.com>
  Differential Revision:	https://reviews.freebsd.org/D5341

Modified:
  head/sbin/ifconfig/ifclone.c
  head/sbin/ifconfig/ifconfig.c
  head/sbin/ifconfig/ifconfig.h

Modified: head/sbin/ifconfig/ifclone.c
==============================================================================
--- head/sbin/ifconfig/ifclone.c	Sat Feb 20 10:56:46 2016	(r295835)
+++ head/sbin/ifconfig/ifclone.c	Sat Feb 20 11:36:35 2016	(r295836)
@@ -144,11 +144,12 @@ ifclonecreate(int s, void *arg)
 	}
 
 	/*
-	 * If we get a different name back than we put in, print it.
+	 * If we get a different name back than we put in, update record and
+	 * indicate it should be printed later.
 	 */
 	if (strncmp(name, ifr.ifr_name, sizeof(name)) != 0) {
 		strlcpy(name, ifr.ifr_name, sizeof(name));
-		printf("%s\n", name);
+		printifname = 1;
 	}
 }
 

Modified: head/sbin/ifconfig/ifconfig.c
==============================================================================
--- head/sbin/ifconfig/ifconfig.c	Sat Feb 20 10:56:46 2016	(r295835)
+++ head/sbin/ifconfig/ifconfig.c	Sat Feb 20 11:36:35 2016	(r295836)
@@ -93,6 +93,7 @@ int	clearaddr;
 int	newaddr = 1;
 int	verbose;
 int	noload;
+int	printifname = 0;
 
 int	supmedia = 0;
 int	printkeys = 0;		/* Print keying material for interfaces. */
@@ -108,6 +109,8 @@ static struct afswtch *af_getbyname(cons
 static struct afswtch *af_getbyfamily(int af);
 static void af_other_status(int);
 
+void printifnamemaybe(void);
+
 static struct option *opts = NULL;
 
 struct ifa_order_elt {
@@ -297,6 +300,12 @@ sortifaddrs(struct ifaddrs *list,
 	return (result);
 }
 
+void printifnamemaybe()
+{
+	if (printifname)
+		printf("%s\n", name);
+}
+
 int
 main(int argc, char *argv[])
 {
@@ -314,6 +323,12 @@ main(int argc, char *argv[])
 	size_t iflen;
 
 	all = downonly = uponly = namesonly = noload = verbose = 0;
+	
+	/*
+	 * Ensure we print interface name when expected to,
+	 * even if we terminate early due to error.
+	 */
+	atexit(printifnamemaybe);
 
 	/* Parse leading line options */
 	strlcpy(options, "adklmnuv", sizeof(options));
@@ -1011,6 +1026,8 @@ setifname(const char *val, int dummy __u
     const struct afswtch *afp)
 {
 	char *newname;
+	
+	strncpy(ifr.ifr_name, name, sizeof(ifr.ifr_name));
 
 	newname = strdup(val);
 	if (newname == NULL)
@@ -1020,6 +1037,7 @@ setifname(const char *val, int dummy __u
 		free(newname);
 		err(1, "ioctl SIOCSIFNAME (set name)");
 	}
+	printifname = 1;
 	strlcpy(name, newname, sizeof(name));
 	free(newname);
 }
@@ -1031,6 +1049,8 @@ setifdescr(const char *val, int dummy __
 {
 	char *newdescr;
 
+	strncpy(ifr.ifr_name, name, sizeof(ifr.ifr_name));
+	
 	ifr.ifr_buffer.length = strlen(val) + 1;
 	if (ifr.ifr_buffer.length == 1) {
 		ifr.ifr_buffer.buffer = newdescr = NULL;

Modified: head/sbin/ifconfig/ifconfig.h
==============================================================================
--- head/sbin/ifconfig/ifconfig.h	Sat Feb 20 10:56:46 2016	(r295835)
+++ head/sbin/ifconfig/ifconfig.h	Sat Feb 20 11:36:35 2016	(r295836)
@@ -133,6 +133,7 @@ extern	int supmedia;
 extern	int printkeys;
 extern	int newaddr;
 extern	int verbose;
+extern	int printifname;
 
 void	setifcap(const char *, int value, int s, const struct afswtch *);
 


More information about the svn-src-head mailing list