Ensure consistent error messages from ifconfig(8).
If multiple threads are invoking "ifconfig XXX create" a race may occur which can lead to two different error messages for the same error. a) ifconfig: SIOCIFCREATE2: File exists b) ifconfig: interface XXX already exists This patch ensures ifconfig prints the same error code for the same case. Reviewed by: imp@ and kib@ Differential Revision: https://reviews.freebsd.org/D27380 MFC after: 1 week Sponsored by: Mellanox Technologies // NVIDIA Networking
This commit is contained in:
parent
accf961151
commit
05952067bb
@ -151,8 +151,7 @@ ifclonecreate(int s, void *arg)
|
||||
}
|
||||
if (clone_cb == NULL) {
|
||||
/* NB: no parameters */
|
||||
if (ioctl(s, SIOCIFCREATE2, &ifr) < 0)
|
||||
err(1, "SIOCIFCREATE2");
|
||||
ioctl_ifcreate(s, &ifr);
|
||||
} else {
|
||||
clone_cb(s, &ifr);
|
||||
}
|
||||
|
@ -198,6 +198,19 @@ usage(void)
|
||||
exit(1);
|
||||
}
|
||||
|
||||
void
|
||||
ioctl_ifcreate(int s, struct ifreq *ifr)
|
||||
{
|
||||
if (ioctl(s, SIOCIFCREATE2, ifr) < 0) {
|
||||
switch (errno) {
|
||||
case EEXIST:
|
||||
errx(1, "interface %s already exists", ifr->ifr_name);
|
||||
default:
|
||||
err(1, "SIOCIFCREATE2");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#define ORDERS_SIZE(x) sizeof(x) / sizeof(x[0])
|
||||
|
||||
static int
|
||||
|
@ -160,3 +160,4 @@ struct ifmediareq *ifmedia_getstate(int s);
|
||||
|
||||
void print_vhid(const struct ifaddrs *, const char *);
|
||||
|
||||
void ioctl_ifcreate(int s, struct ifreq *);
|
||||
|
@ -5758,8 +5758,7 @@ wlan_create(int s, struct ifreq *ifr)
|
||||
memcmp(params.icp_bssid, zerobssid, sizeof(zerobssid)) == 0)
|
||||
errx(1, "no bssid specified for WDS (use wlanbssid)");
|
||||
ifr->ifr_data = (caddr_t) ¶ms;
|
||||
if (ioctl(s, SIOCIFCREATE2, ifr) < 0)
|
||||
err(1, "SIOCIFCREATE2");
|
||||
ioctl_ifcreate(s, ifr);
|
||||
|
||||
/* XXX preserve original name for ifclonecreate(). */
|
||||
strlcpy(orig_name, name, sizeof(orig_name));
|
||||
|
@ -324,8 +324,7 @@ static void
|
||||
lagg_create(int s, struct ifreq *ifr)
|
||||
{
|
||||
ifr->ifr_data = (caddr_t) ¶ms;
|
||||
if (ioctl(s, SIOCIFCREATE2, ifr) < 0)
|
||||
err(1, "SIOCIFCREATE2");
|
||||
ioctl_ifcreate(s, ifr);
|
||||
}
|
||||
|
||||
static struct cmd lagg_cmds[] = {
|
||||
|
@ -162,8 +162,7 @@ vlan_create(int s, struct ifreq *ifr)
|
||||
errx(1, "must specify a parent device for vlan create");
|
||||
ifr->ifr_data = (caddr_t) ¶ms;
|
||||
}
|
||||
if (ioctl(s, SIOCIFCREATE2, ifr) < 0)
|
||||
err(1, "SIOCIFCREATE2");
|
||||
ioctl_ifcreate(s, ifr);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -191,8 +191,7 @@ vxlan_create(int s, struct ifreq *ifr)
|
||||
vxlan_check_params();
|
||||
|
||||
ifr->ifr_data = (caddr_t) ¶ms;
|
||||
if (ioctl(s, SIOCIFCREATE2, ifr) < 0)
|
||||
err(1, "SIOCIFCREATE2");
|
||||
ioctl_ifcreate(s, ifr);
|
||||
}
|
||||
|
||||
static
|
||||
|
Loading…
Reference in New Issue
Block a user