int ctdb_sys_send_arp(const ctdb_sock_addr *addr, const char *iface)
{
- int s;
+ int s = -1;
struct sockaddr_ll sall = {0};
struct ifreq if_hwaddr = {
.ifr_ifru = {
if (ioctl(s, SIOCGIFINDEX, &ifr) < 0) {
ret = errno;
DBG_ERR("Interface '%s' not found\n", iface);
- goto fail;
+ goto done;
}
/* Get MAC address */
if ( ret < 0 ) {
ret = errno;
DBG_ERR("ioctl failed\n");
- goto fail;
+ goto done;
}
if (ARPHRD_LOOPBACK == if_hwaddr.ifr_hwaddr.sa_family) {
ret = 0;
D_DEBUG("Ignoring loopback arp request\n");
- goto fail;
+ goto done;
}
if (if_hwaddr.ifr_hwaddr.sa_family != ARPHRD_ETHER) {
ret = EINVAL;
DBG_ERR("Not an ethernet address family (0x%x)\n",
if_hwaddr.ifr_hwaddr.sa_family);
- goto fail;;
+ goto done;
}
/* Set up most of destination address structure */
&len);
if (ret != 0) {
DBG_ERR("Failed to build ARP request\n");
- goto fail;
+ goto done;
}
memcpy(&sall.sll_addr[0], ether_dhost, sall.sll_halen);
if (ret < 0 ) {
ret = errno;
DBG_ERR("Failed sendto\n");
- goto fail;
+ goto done;
}
/* Send unsolicited ARP reply */
&len);
if (ret != 0) {
DBG_ERR("Failed to build ARP reply\n");
- goto fail;
+ goto done;
}
memcpy(&sall.sll_addr[0], ether_dhost, sall.sll_halen);
if (ret < 0 ) {
ret = errno;
DBG_ERR("Failed sendto\n");
- goto fail;
+ goto done;
}
- close(s);
break;
case AF_INET6:
&len);
if (ret != 0) {
DBG_ERR("Failed to build IPv6 neighbor advertisement\n");
- goto fail;
+ goto done;
}
memcpy(&sall.sll_addr[0], ether_dhost, sall.sll_halen);
if (ret < 0 ) {
ret = errno;
DBG_ERR("Failed sendto\n");
- goto fail;
+ goto done;
}
- close(s);
break;
default:
ret = EINVAL;
DBG_ERR("Not an ipv4/ipv6 address (family is %u)\n",
addr->ip.sin_family);
- goto fail;
+ goto done;
}
- return 0;
+ ret = 0;
-fail:
- close(s);
+done:
+ if (s != -1) {
+ close(s);
+ }
return ret;
}