static int virNetDevBridgeGet(const char *brname,
const char *paramname, /* sysfs param name */
- unsigned long *value, /* current value */
- int fd, /* control socket */
- struct ifreq *ifr) /* pre-filled bridge name */
+ unsigned long *value) /* current value */
{
char *path = NULL;
int ret = -1;
+ int fd = -1;
+ struct ifreq ifr;
if (virAsprintf(&path, SYSFS_NET_DIR "%s/bridge/%s", brname, paramname) < 0)
return -1;
} else {
struct __bridge_info info;
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) {
virReportSystemError(errno,
_("Unable to get bridge %s %s"), brname, paramname);
ret = 0;
cleanup:
+ VIR_FORCE_CLOSE(fd);
VIR_FREE(path);
return ret;
}
int virNetDevBridgeGetSTPDelay(const char *brname,
int *delayms)
{
- int fd = -1;
int ret = -1;
- struct ifreq ifr;
unsigned long val;
- if ((fd = virNetDevSetupControl(brname, &ifr)) < 0)
- goto cleanup;
-
- ret = virNetDevBridgeGet(brname, "forward_delay", &val,
- fd, &ifr);
+ ret = virNetDevBridgeGet(brname, "forward_delay", &val);
*delayms = JIFFIES_TO_MS(val);
- cleanup:
- VIR_FORCE_CLOSE(fd);
return ret;
}
int virNetDevBridgeGetSTP(const char *brname,
bool *enabled)
{
- int fd = -1;
int ret = -1;
- struct ifreq ifr;
unsigned long val;
- if ((fd = virNetDevSetupControl(brname, &ifr)) < 0)
- goto cleanup;
-
- ret = virNetDevBridgeGet(brname, "stp_state", &val,
- fd, &ifr);
+ ret = virNetDevBridgeGet(brname, "stp_state", &val);
*enabled = val ? true : false;
- cleanup:
- VIR_FORCE_CLOSE(fd);
return ret;
}
#elif defined(HAVE_BSD_BRIDGE_MGMT)
int ret = -1;
unsigned long value;
- if (virNetDevBridgeGet(brname, "vlan_filtering", &value, -1, NULL) < 0)
+ if (virNetDevBridgeGet(brname, "vlan_filtering", &value) < 0)
goto cleanup;
*enable = !!value;