virSocketAddr *peer,
unsigned int prefix)
{
- virSocketAddr *broadcast = NULL;
- int ret = -1;
- struct nl_msg *nlmsg = NULL;
unsigned int recvbuflen;
+ VIR_AUTOPTR(virNetlinkMsg) nlmsg = NULL;
+ VIR_AUTOPTR(virSocketAddr) broadcast = NULL;
VIR_AUTOFREE(struct nlmsghdr *) resp = NULL;
VIR_AUTOFREE(char *) ipStr = NULL;
VIR_AUTOFREE(char *) peerStr = NULL;
!(peer && VIR_SOCKET_ADDR_VALID(peer))) {
/* compute a broadcast address if this is IPv4 */
if (VIR_ALLOC(broadcast) < 0)
- goto cleanup;
+ return -1;
if (virSocketAddrBroadcastByPrefix(addr, prefix, broadcast) < 0) {
- virReportError(VIR_ERR_INTERNAL_ERROR,
- _("Failed to determine broadcast address for '%s/%d'"),
- ipStr, prefix);
- goto cleanup;
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("Failed to determine broadcast address for '%s/%d'"),
+ ipStr, prefix);
+ return -1;
}
bcastStr = virSocketAddrFormat(broadcast);
}
if (!(nlmsg = virNetDevCreateNetlinkAddressMessage(RTM_NEWADDR, ifname,
addr, prefix,
broadcast, peer)))
- goto cleanup;
+ return -1;
if (virNetlinkCommand(nlmsg, &resp, &recvbuflen,
0, 0, NETLINK_ROUTE, 0) < 0)
- goto cleanup;
+ return -1;
if (virNetlinkGetErrorCode(resp, recvbuflen) < 0) {
peerStr ? " peer " : "", peerStr ? peerStr : "",
bcastStr ? " bcast " : "", bcastStr ? bcastStr : "",
ifname);
- goto cleanup;
+ return -1;
}
- ret = 0;
- cleanup:
- nlmsg_free(nlmsg);
- VIR_FREE(broadcast);
- return ret;
+ return 0;
}
virSocketAddr *addr,
unsigned int prefix)
{
- int ret = -1;
- struct nl_msg *nlmsg = NULL;
unsigned int recvbuflen;
+ VIR_AUTOPTR(virNetlinkMsg) nlmsg = NULL;
VIR_AUTOFREE(struct nlmsghdr *) resp = NULL;
if (!(nlmsg = virNetDevCreateNetlinkAddressMessage(RTM_DELADDR, ifname,
addr, prefix,
NULL, NULL)))
- goto cleanup;
+ return -1;
if (virNetlinkCommand(nlmsg, &resp, &recvbuflen, 0, 0,
NETLINK_ROUTE, 0) < 0)
- goto cleanup;
+ return -1;
if (virNetlinkGetErrorCode(resp, recvbuflen) < 0) {
virReportError(VIR_ERR_SYSTEM_ERROR,
_("Error removing IP address from %s"), ifname);
- goto cleanup;
+ return -1;
}
- ret = 0;
- cleanup:
- nlmsg_free(nlmsg);
- return ret;
+ return 0;
}
virSocketAddrPtr gateway,
unsigned int metric)
{
- int ret = -1;
- struct nl_msg *nlmsg = NULL;
struct nlmsghdr *resp = NULL;
unsigned int recvbuflen;
unsigned int ifindex;
int errCode;
virSocketAddr defaultAddr;
virSocketAddrPtr actualAddr;
+ VIR_AUTOPTR(virNetlinkMsg) nlmsg = NULL;
VIR_AUTOFREE(char *) toStr = NULL;
VIR_AUTOFREE(char *) viaStr = NULL;
int family = VIR_SOCKET_ADDR_FAMILY(gateway);
if (family == AF_INET) {
if (virSocketAddrParseIPv4(&defaultAddr, VIR_SOCKET_ADDR_IPV4_ALL) < 0)
- goto cleanup;
+ return -1;
} else {
if (virSocketAddrParseIPv6(&defaultAddr, VIR_SOCKET_ADDR_IPV6_ALL) < 0)
- goto cleanup;
+ return -1;
}
actualAddr = &defaultAddr;
if (virNetDevGetIPAddressBinary(actualAddr, &addrData, &addrDataLen) < 0 ||
virNetDevGetIPAddressBinary(gateway, &gatewayData, &addrDataLen) < 0)
- goto cleanup;
+ return -1;
/* Get the interface index */
if ((ifindex = if_nametoindex(ifname)) == 0)
- goto cleanup;
+ return -1;
if (!(nlmsg = nlmsg_alloc_simple(RTM_NEWROUTE,
NLM_F_REQUEST | NLM_F_CREATE |
NLM_F_EXCL))) {
virReportOOMError();
- goto cleanup;
+ return -1;
}
memset(&rtmsg, 0, sizeof(rtmsg));
if (virNetlinkCommand(nlmsg, &resp, &recvbuflen, 0, 0,
NETLINK_ROUTE, 0) < 0)
- goto cleanup;
+ return -1;
if ((errCode = virNetlinkGetErrorCode(resp, recvbuflen)) < 0) {
virReportSystemError(errCode, _("Error adding route to %s"), ifname);
- goto cleanup;
+ return -1;
}
- ret = 0;
- cleanup:
- nlmsg_free(nlmsg);
- return ret;
+ return 0;
buffer_too_small:
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("allocated netlink buffer is too small"));
- goto cleanup;
+ return -1;
}
int
virNetDevIPWaitDadFinish(virSocketAddrPtr *addrs, size_t count)
{
- struct nl_msg *nlmsg = NULL;
struct ifaddrmsg ifa;
unsigned int recvbuflen;
- int ret = -1;
bool dad = true;
time_t max_time = time(NULL) + VIR_DAD_WAIT_TIMEOUT;
+ VIR_AUTOPTR(virNetlinkMsg) nlmsg = NULL;
if (!(nlmsg = nlmsg_alloc_simple(RTM_GETADDR,
NLM_F_REQUEST | NLM_F_DUMP))) {
if (nlmsg_append(nlmsg, &ifa, sizeof(ifa), NLMSG_ALIGNTO) < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("allocated netlink buffer is too small"));
- goto cleanup;
+ return -1;
}
/* Periodically query netlink until DAD finishes on all known addresses. */
if (virNetlinkCommand(nlmsg, &resp, &recvbuflen, 0, 0,
NETLINK_ROUTE, 0) < 0)
- goto cleanup;
+ return -1;
if (virNetlinkGetErrorCode(resp, recvbuflen) < 0) {
virReportError(VIR_ERR_SYSTEM_ERROR, "%s",
_("error reading DAD state information"));
- goto cleanup;
+ return -1;
}
/* Parse response. */
_("Duplicate Address Detection "
"not finished in %d seconds"), VIR_DAD_WAIT_TIMEOUT);
} else {
- ret = 0;
+ return 0;
}
- cleanup:
- nlmsg_free(nlmsg);
- return ret;
+ return -1;
}
static int
bool
virNetDevIPCheckIPv6Forwarding(void)
{
- struct nl_msg *nlmsg = NULL;
bool valid = false;
struct rtgenmsg genmsg;
size_t i;
.devices = NULL,
.ndevices = 0
};
+ VIR_AUTOPTR(virNetlinkMsg) nlmsg = NULL;
/* Prepare the request message */
}
cleanup:
- nlmsg_free(nlmsg);
virStringListFreeCount(data.devices, data.ndevices);
return valid;
}
virSocketAddr *peer,
unsigned int prefix)
{
- virCommandPtr cmd = NULL;
virSocketAddr broadcast;
- int ret = -1;
+ VIR_AUTOPTR(virCommand) cmd = NULL;
VIR_AUTOFREE(char *) addrstr = NULL;
VIR_AUTOFREE(char *) bcaststr = NULL;
VIR_AUTOFREE(char *) peerstr = NULL;
if (!(addrstr = virSocketAddrFormat(addr)))
- goto cleanup;
+ return -1;
if (peer && VIR_SOCKET_ADDR_VALID(peer) && !(peerstr = virSocketAddrFormat(peer)))
- goto cleanup;
+ return -1;
/* format up a broadcast address if this is IPv4 */
if (!peerstr && ((VIR_SOCKET_ADDR_IS_FAMILY(addr, AF_INET)) &&
((virSocketAddrBroadcastByPrefix(addr, prefix, &broadcast) < 0) ||
!(bcaststr = virSocketAddrFormat(&broadcast))))) {
- goto cleanup;
+ return -1;
}
# ifdef IFCONFIG_PATH
# endif
if (virCommandRun(cmd, NULL) < 0)
- goto cleanup;
+ return -1;
- ret = 0;
- cleanup:
- virCommandFree(cmd);
- return ret;
+ return 0;
}
virSocketAddr *addr,
unsigned int prefix)
{
- virCommandPtr cmd = NULL;
- int ret = -1;
+ VIR_AUTOPTR(virCommand) cmd = NULL;
VIR_AUTOFREE(char *) addrstr = NULL;
if (!(addrstr = virSocketAddrFormat(addr)))
- goto cleanup;
+ return -1;
# ifdef IFCONFIG_PATH
cmd = virCommandNew(IFCONFIG_PATH);
virCommandAddArg(cmd, ifname);
# endif
if (virCommandRun(cmd, NULL) < 0)
- goto cleanup;
+ return -1;
- ret = 0;
- cleanup:
- virCommandFree(cmd);
- return ret;
+ return 0;
}
virSocketAddrPtr gateway,
unsigned int metric)
{
- virCommandPtr cmd = NULL;
- int ret = -1;
+ VIR_AUTOPTR(virCommand) cmd = NULL;
VIR_AUTOFREE(char *) addrstr = NULL;
VIR_AUTOFREE(char *) gatewaystr = NULL;
if (!(addrstr = virSocketAddrFormat(addr)))
- goto cleanup;
+ return -1;
if (!(gatewaystr = virSocketAddrFormat(gateway)))
- goto cleanup;
+ return -1;
cmd = virCommandNew(IP_PATH);
virCommandAddArgList(cmd, "route", "add", NULL);
virCommandAddArgFormat(cmd, "%s/%u", addrstr, prefix);
virCommandAddArgFormat(cmd, "%u", metric);
if (virCommandRun(cmd, NULL) < 0)
- goto cleanup;
+ return -1;
- ret = 0;
- cleanup:
- virCommandFree(cmd);
- return ret;
+ return 0;
}