virNetDevBridgeGet: Don't require users to virNetDevSetupControl

So far, this function has just three callers. Two of them call
virNetDevSetupControl to create a socket that we can then
optionally use for ioctl() to fetch data. However, querying sysfs
is preferred. Therefore it doesn't make much sense to require
users to set up the socket if they don't even know it will be
used in favour of sysfs. We can set up the socket iff we need to.

Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
This commit is contained in:
Michal Privoznik 2016-06-01 11:52:53 +02:00
parent 93b59fcff6
commit 263a88806c

View File

@ -169,12 +169,12 @@ static int virNetDevBridgeSet(const char *brname,
static int virNetDevBridgeGet(const char *brname, static int virNetDevBridgeGet(const char *brname,
const char *paramname, /* sysfs param name */ const char *paramname, /* sysfs param name */
unsigned long *value, /* current value */ unsigned long *value) /* current value */
int fd, /* control socket */
struct ifreq *ifr) /* pre-filled bridge name */
{ {
char *path = NULL; char *path = NULL;
int ret = -1; int ret = -1;
int fd = -1;
struct ifreq ifr;
if (virAsprintf(&path, SYSFS_NET_DIR "%s/bridge/%s", brname, paramname) < 0) if (virAsprintf(&path, SYSFS_NET_DIR "%s/bridge/%s", brname, paramname) < 0)
return -1; return -1;
@ -196,7 +196,11 @@ static int virNetDevBridgeGet(const char *brname,
} else { } else {
struct __bridge_info info; struct __bridge_info info;
unsigned long args[] = { BRCTL_GET_BRIDGE_INFO, (unsigned long)&info, 0, 0 }; unsigned long args[] = { BRCTL_GET_BRIDGE_INFO, (unsigned long)&info, 0, 0 };
ifr->ifr_data = (char*)&args;
if ((fd = virNetDevSetupControl(brname, &ifr)) < 0)
goto cleanup;
ifr.ifr_data = (char*)&args;
if (ioctl(fd, SIOCDEVPRIVATE, ifr) < 0) { if (ioctl(fd, SIOCDEVPRIVATE, ifr) < 0) {
virReportSystemError(errno, virReportSystemError(errno,
_("Unable to get bridge %s %s"), brname, paramname); _("Unable to get bridge %s %s"), brname, paramname);
@ -216,6 +220,7 @@ static int virNetDevBridgeGet(const char *brname,
ret = 0; ret = 0;
cleanup: cleanup:
VIR_FORCE_CLOSE(fd);
VIR_FREE(path); VIR_FREE(path);
return ret; return ret;
} }
@ -825,20 +830,12 @@ int virNetDevBridgeSetSTPDelay(const char *brname,
int virNetDevBridgeGetSTPDelay(const char *brname, int virNetDevBridgeGetSTPDelay(const char *brname,
int *delayms) int *delayms)
{ {
int fd = -1;
int ret = -1; int ret = -1;
struct ifreq ifr;
unsigned long val; unsigned long val;
if ((fd = virNetDevSetupControl(brname, &ifr)) < 0) ret = virNetDevBridgeGet(brname, "forward_delay", &val);
goto cleanup;
ret = virNetDevBridgeGet(brname, "forward_delay", &val,
fd, &ifr);
*delayms = JIFFIES_TO_MS(val); *delayms = JIFFIES_TO_MS(val);
cleanup:
VIR_FORCE_CLOSE(fd);
return ret; return ret;
} }
@ -885,20 +882,12 @@ int virNetDevBridgeSetSTP(const char *brname,
int virNetDevBridgeGetSTP(const char *brname, int virNetDevBridgeGetSTP(const char *brname,
bool *enabled) bool *enabled)
{ {
int fd = -1;
int ret = -1; int ret = -1;
struct ifreq ifr;
unsigned long val; unsigned long val;
if ((fd = virNetDevSetupControl(brname, &ifr)) < 0) ret = virNetDevBridgeGet(brname, "stp_state", &val);
goto cleanup;
ret = virNetDevBridgeGet(brname, "stp_state", &val,
fd, &ifr);
*enabled = val ? true : false; *enabled = val ? true : false;
cleanup:
VIR_FORCE_CLOSE(fd);
return ret; return ret;
} }
#elif defined(HAVE_BSD_BRIDGE_MGMT) #elif defined(HAVE_BSD_BRIDGE_MGMT)
@ -1000,7 +989,7 @@ virNetDevBridgeGetVlanFiltering(const char *brname,
int ret = -1; int ret = -1;
unsigned long value; unsigned long value;
if (virNetDevBridgeGet(brname, "vlan_filtering", &value, -1, NULL) < 0) if (virNetDevBridgeGet(brname, "vlan_filtering", &value) < 0)
goto cleanup; goto cleanup;
*enable = !!value; *enable = !!value;