summaryrefslogtreecommitdiffstats
path: root/sbin
diff options
context:
space:
mode:
Diffstat (limited to 'sbin')
-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