summaryrefslogtreecommitdiffstats
path: root/sbin/ifconfig
diff options
context:
space:
mode:
authorbrooks <brooks@FreeBSD.org>2004-02-04 02:55:46 +0000
committerbrooks <brooks@FreeBSD.org>2004-02-04 02:55:46 +0000
commitb8d51aa138d0828da395e4cd549238f660870733 (patch)
tree729fd6e77fc7e52279bc2c36a1473c8924b86b3d /sbin/ifconfig
parent4f14e0fa867d5fae33d247bfe7a0aff6a2f9374e (diff)
downloadFreeBSD-src-b8d51aa138d0828da395e4cd549238f660870733.zip
FreeBSD-src-b8d51aa138d0828da395e4cd549238f660870733.tar.gz
Add ifconfig support for network interface renaming. In the process,
reorganize the printing of the interface name when using wildcard cloning so it is not printed if it we either immediately rename or destroy the interface. Reviewed by: ru
Diffstat (limited to 'sbin/ifconfig')
-rw-r--r--sbin/ifconfig/ifconfig.88
-rw-r--r--sbin/ifconfig/ifconfig.c44
2 files changed, 49 insertions, 3 deletions
diff --git a/sbin/ifconfig/ifconfig.8 b/sbin/ifconfig/ifconfig.8
index 710fbe0..5141556 100644
--- a/sbin/ifconfig/ifconfig.8
+++ b/sbin/ifconfig/ifconfig.8
@@ -322,6 +322,9 @@ this directive is used to select between 802.11a
and 802.11g
.Pq Dq 11g
operating modes.
+.It Cm name Ar name
+Set the interface name to
+.Ar name .
.It Cm rxcsum , txcsum
If the driver supports user-configurable checksum offloading,
enable receive (or transmit) checksum offloading on the interface.
@@ -353,7 +356,10 @@ Create the specified network pseudo-device.
If the interface is given without a unit number, try to create a new
device with an arbitrary unit number.
If creation of an arbitrary device is successful, the new device name is
-printed to standard output.
+printed to standard output unless the interface is renamed or destroyed
+in the same
+.Nm
+invocation.
.It Cm destroy
Destroy the specified network pseudo-device.
.It Cm plumb
diff --git a/sbin/ifconfig/ifconfig.c b/sbin/ifconfig/ifconfig.c
index d8dd71b..d2a9405 100644
--- a/sbin/ifconfig/ifconfig.c
+++ b/sbin/ifconfig/ifconfig.c
@@ -129,6 +129,7 @@ struct afswtch;
int supmedia = 0;
int listcloners = 0;
+int printname = 0; /* Print the name of the created interface. */
#ifdef INET6
char addr_buf[MAXHOSTNAMELEN *2 + 1]; /*for getnameinfo()*/
@@ -172,6 +173,7 @@ c_func setip6eui64;
c_func setifipdst;
c_func setifflags, setifmetric, setifmtu, setifcap;
c_func clone_destroy;
+c_func setifname;
void clone_create(void);
@@ -286,6 +288,7 @@ struct cmd {
{ "compress", IFF_LINK0, setifflags },
{ "noicmp", IFF_LINK1, setifflags },
{ "mtu", NEXTARG, setifmtu },
+ { "name", NEXTARG, setifname },
{ 0, 0, setifaddr },
{ 0, 0, setifdstaddr },
};
@@ -525,7 +528,7 @@ main(int argc, char *argv[])
clone_create();
argc--, argv++;
if (argc == 0)
- exit(0);
+ goto end;
}
ifindex = if_nametoindex(name);
if (ifindex == 0)
@@ -631,6 +634,9 @@ main(int argc, char *argv[])
if (namesonly && need_nl > 0)
putchar('\n');
+end:
+ if (printname)
+ printf("%s\n", name);
exit (0);
}
@@ -1039,6 +1045,30 @@ setifmtu(const char *val, int dummy __unused, int s,
warn("ioctl (set mtu)");
}
+void
+setifname(const char *val, int dummy __unused, int s,
+ const struct afswtch *afp)
+{
+ char *newname;
+
+ newname = strdup(val);
+
+ ifr.ifr_data = newname;
+ if (ioctl(s, SIOCSIFNAME, (caddr_t)&ifr) < 0) {
+ warn("ioctl (set name)");
+ free(newname);
+ return;
+ }
+ strlcpy(name, newname, sizeof(name));
+ free(newname);
+
+ /*
+ * Even if we just created the interface, we don't need to print
+ * its name because we just nailed it down separately.
+ */
+ printname = 0;
+}
+
#define IFFBITS \
"\020\1UP\2BROADCAST\3DEBUG\4LOOPBACK\5POINTOPOINT\6SMART\7RUNNING" \
"\10NOARP\11PROMISC\12ALLMULTI\13OACTIVE\14SIMPLEX\15LINK0\16LINK1\17LINK2" \
@@ -1885,8 +1915,13 @@ clone_create(void)
if (ioctl(s, SIOCIFCREATE, &ifr) < 0)
err(1, "SIOCIFCREATE");
+ /*
+ * If we get a different name back then we put in, we probably
+ * want to print it out, but we might change our mind later so
+ * we just signal our intrest and leave the printout for later.
+ */
if (strcmp(name, ifr.ifr_name) != 0) {
- printf("%s\n", ifr.ifr_name);
+ printname = 1;
strlcpy(name, ifr.ifr_name, sizeof(name));
}
@@ -1900,4 +1935,9 @@ clone_destroy(const char *val, int d, int s, const struct afswtch *rafp)
(void) strncpy(ifr.ifr_name, name, sizeof(ifr.ifr_name));
if (ioctl(s, SIOCIFDESTROY, &ifr) < 0)
err(1, "SIOCIFDESTROY");
+ /*
+ * If we create and destroy an interface in the same command,
+ * there isn't any reason to print it's name.
+ */
+ printname = 0;
}
OpenPOWER on IntegriCloud