Also Linux and BSD/Darwin specific bits are no longer needed, so they
are gone.
Signed-off-by: Jan Friesse <jfriesse@xxxxxxxxxx>
---
exec/totemip.c | 324 +++++++++++++-------------------------------------------
1 files changed, 74 insertions(+), 250 deletions(-)
diff --git a/exec/totemip.c b/exec/totemip.c
index a0c166b..93f933d 100644
--- a/exec/totemip.c
+++ b/exec/totemip.c
@@ -427,256 +427,6 @@ int totemip_iface_check(struct totem_ip_address *bindnet,
}
#endif
-#if defined(COROSYNC_BSD) || defined(COROSYNC_DARWIN)
-int totemip_iface_check(struct totem_ip_address *bindnet,
- struct totem_ip_address *boundto,
- int *interface_up,
- int *interface_num,
- int mask_high_bit)
-{
-#define NEXT_IFR(a) ((struct ifreq *)((u_char *)&(a)->ifr_addr +\
- ((a)->ifr_addr.sa_len ? (a)->ifr_addr.sa_len : sizeof((a)->ifr_addr))))
-
- struct sockaddr_in *intf_addr_mask;
- struct sockaddr_storage bindnet_ss;
- struct sockaddr_in *intf_addr_sin;
- struct sockaddr_in *bindnet_sin = (struct sockaddr_in *)&bindnet_ss;
- struct ifaddrs *ifap, *ifa;
- int res = -1;
- int addrlen;
-
- *interface_up = 0;
- *interface_num = 0;
-
- totemip_totemip_to_sockaddr_convert(bindnet,
- 0, &bindnet_ss, &addrlen);
-
- if (getifaddrs(&ifap) != 0)
- return -1;
-
- for (ifa = ifap; ifa; ifa = ifa->ifa_next) {
- intf_addr_sin = (struct sockaddr_in *)ifa->ifa_addr;
- intf_addr_mask = (struct sockaddr_in *)ifa->ifa_netmask;
-
- if (intf_addr_sin->sin_family != AF_INET)
- continue;
-
- if ( bindnet_sin->sin_family == AF_INET &&
- (intf_addr_sin->sin_addr.s_addr & intf_addr_mask->sin_addr.s_addr) ==
- (bindnet_sin->sin_addr.s_addr & intf_addr_mask->sin_addr.s_addr)) {
-
- totemip_copy(boundto, bindnet);
- memcpy(boundto->addr, &intf_addr_sin->sin_addr, sizeof(intf_addr_sin->sin_addr));
-
- /* Get interface infos
- */
- *interface_up = ifa->ifa_flags & IFF_UP;
- *interface_num = if_nametoindex(ifa->ifa_name);
-
- /*
- * Handle case, when nodeid is set to 0 or not set.
- */
- if (bindnet->family == AF_INET && bindnet->nodeid == 0) {
- unsigned int nodeid = 0;
- memcpy (&nodeid, boundto->addr, sizeof (int));
-#if _BYTE_ORDER == _BIG_ENDIAN
- nodeid = swab32 (nodeid);
-#endif
- /*
- * Mask 32nd bit off to workaround bugs in other peoples code
- * (if configuration requests it).
- */
- if (mask_high_bit) {
- nodeid &= 0x7FFFFFFF;
- }
- boundto->nodeid = nodeid;
- }
- res = 0;
- break; /* for */
- }
- }
-
- freeifaddrs(ifap);
-
- return (res);
-}
-#elif defined(COROSYNC_LINUX)
-
-static void parse_rtattr(struct rtattr *tb[], int max, struct rtattr *rta, int len)
-{
- while (RTA_OK(rta, len)) {
- if (rta->rta_type <= max)
- tb[rta->rta_type] = rta;
- rta = RTA_NEXT(rta,len);
- }
-}
-
-int totemip_iface_check(struct totem_ip_address *bindnet,
- struct totem_ip_address *boundto,
- int *interface_up,
- int *interface_num,
- int mask_high_bit)
-{
- int fd;
- int res = -1;
- struct {
- struct nlmsghdr nlh;
- struct rtgenmsg g;
- } req;
- struct sockaddr_nl nladdr;
- struct totem_ip_address ipaddr;
- static char rcvbuf[NETLINK_BUFSIZE];
-
- *interface_up = 0;
- *interface_num = 0;
- memset(&ipaddr, 0, sizeof(ipaddr));
-
- /* Make sure we preserve these */
- ipaddr.family = bindnet->family;
- ipaddr.nodeid = bindnet->nodeid;
-
- /* Ask netlink for a list of interface addresses */
- fd = socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE);
- if (fd <0)
- return -1;
-
- setsockopt(fd,SOL_SOCKET,SO_RCVBUF,&rcvbuf,sizeof(rcvbuf));
-
- memset(&nladdr, 0, sizeof(nladdr));
- nladdr.nl_family = AF_NETLINK;
-
- memset(&req, 0, sizeof(req));
- req.nlh.nlmsg_len = sizeof(req);
- req.nlh.nlmsg_type = RTM_GETADDR;
- req.nlh.nlmsg_flags = NLM_F_ROOT|NLM_F_MATCH|NLM_F_REQUEST;
- req.nlh.nlmsg_pid = 0;
- req.nlh.nlmsg_seq = 1;
- req.g.rtgen_family = bindnet->family;
-
- if (sendto(fd, (void *)&req, sizeof(req), 0,
- (struct sockaddr*)&nladdr, sizeof(nladdr)) < 0) {
- close(fd);
- return -1;
- }
-
- /* Look through the return buffer for our address */
- while (1)
- {
- int status;
- struct nlmsghdr *h;
- struct iovec iov = { rcvbuf, sizeof(rcvbuf) };
- struct msghdr msg = {
- (void*)&nladdr, sizeof(nladdr),
- &iov, 1,
- NULL, 0,
- 0
- };
-
- status = recvmsg(fd, &msg, 0);
- if (!status) {
- close(fd);
- return -1;
- }
-
- h = (struct nlmsghdr *)rcvbuf;
- if (h->nlmsg_type == NLMSG_DONE)
- break;
-
- if (h->nlmsg_type == NLMSG_ERROR) {
- close(fd);
- return -1;
- }
-
- while (NLMSG_OK(h, status)) {
- if (h->nlmsg_type == RTM_NEWADDR) {
- struct ifaddrmsg *ifa = NLMSG_DATA(h);
- struct rtattr *tb[IFA_MAX+1];
- int len = h->nlmsg_len - NLMSG_LENGTH(sizeof(*ifa));
- int found_if = 0;
-
- memset(tb, 0, sizeof(tb));
-
- parse_rtattr(tb, IFA_MAX, IFA_RTA(ifa), len);
-
- memcpy(ipaddr.addr, RTA_DATA(tb[IFA_ADDRESS]), TOTEMIP_ADDRLEN);
- if (totemip_equal(&ipaddr, bindnet)) {
- found_if = 1;
- }
-
- /* If the address we have is an IPv4 network address, then
- substitute the actual IP address of this interface */
- if (!found_if && tb[IFA_LOCAL] && ifa->ifa_family == AF_INET) {
- uint32_t network;
- uint32_t addr;
- uint32_t netmask = htonl(~((1<<(32-ifa->ifa_prefixlen))-1));
-
- memcpy(&network, RTA_DATA(tb[IFA_LOCAL]), sizeof(uint32_t));
- memcpy(&addr, bindnet->addr, sizeof(uint32_t));
-
- if ((addr & netmask) == (network & netmask)) {
- memcpy(ipaddr.addr, RTA_DATA(tb[IFA_ADDRESS]), TOTEMIP_ADDRLEN);
- found_if = 1;
- }
- }
-
- if (found_if) {
-
- /* Found it - check I/F is UP */
- struct ifreq ifr;
- int ioctl_fd; /* Can't do ioctls on netlink FDs */
-
- ioctl_fd = socket(AF_INET, SOCK_STREAM, 0);
- if (ioctl_fd < 0) {
- close(fd);
- return -1;
- }
- memset(&ifr, 0, sizeof(ifr));
- ifr.ifr_ifindex = ifa->ifa_index;
-
- /* SIOCGIFFLAGS needs an interface name */
- status = ioctl(ioctl_fd, SIOCGIFNAME, &ifr);
- status = ioctl(ioctl_fd, SIOCGIFFLAGS, &ifr);
- close(ioctl_fd);
- if (status) {
- res = -1;
- goto finished;
- }
-
- if (ifr.ifr_flags & IFF_UP)
- *interface_up = 1;
-
- *interface_num = ifa->ifa_index;
- /*
- * Mask 32nd bit off to workaround bugs in other peoples code
- * (if configuration requests it).
- */
- if (ipaddr.family == AF_INET && ipaddr.nodeid == 0) {
- unsigned int nodeid = 0;
- memcpy (&nodeid, ipaddr.addr, sizeof (int));
-#if __BYTE_ORDER == __BIG_ENDIAN
- nodeid = swab32 (nodeid);
-#endif
- if (mask_high_bit) {
- nodeid &= 0x7FFFFFFF;
- }
- ipaddr.nodeid = nodeid;
- }
- totemip_copy (boundto, &ipaddr);
- res = 0;
- goto finished;
- }
- }
-
- h = NLMSG_NEXT(h, status);
- }
- }
- res = -1; /* address not found */
-finished:
- close(fd);
- return res;
-}
-#endif /* COROSYNC_LINUX */
-
#ifdef HAVE_GETIFADDRS
int totemip_getifaddrs(struct list_head *addrs)
{
@@ -758,3 +508,77 @@ void totemip_freeifaddrs(struct list_head *addrs)
}
list_init(addrs);
}
+
+int totemip_iface_check(struct totem_ip_address *bindnet,
+ struct totem_ip_address *boundto,
+ int *interface_up,
+ int *interface_num,
+ int mask_high_bit)
+{
+ struct list_head addrs;
+ struct list_head *list;
+ struct totem_ip_if_address *if_addr;
+ struct totem_ip_address bn_netaddr, if_netaddr;
+ socklen_t addr_len;
+ socklen_t si;
+ int res = -1;
+
+ if (totemip_getifaddrs(&addrs) == -1) {
+ return (-1);
+ }
+
+ for (list = addrs.next; list != &addrs; list = list->next) {
+ if_addr = list_entry(list, struct totem_ip_if_address, list);
+
+ if (bindnet->family != if_addr->ip_addr.family)
+ continue ;
+
+ addr_len = 0;
+
+ switch (bindnet->family) {
+ case AF_INET:
+ addr_len = sizeof(struct in_addr);
+ break;
+ case AF_INET6:
+ addr_len = sizeof(struct in6_addr);
+ break;
+ }
+
+ if (addr_len == 0)
+ continue ;
+
+ totemip_copy(&bn_netaddr, bindnet);
+ totemip_copy(&if_netaddr, &if_addr->ip_addr);
+
+ for (si = 0; si < addr_len; si++) {
+ bn_netaddr.addr[si] = bn_netaddr.addr[si] & if_addr->mask_addr.addr[si];
+ if_netaddr.addr[si] = if_netaddr.addr[si] & if_addr->mask_addr.addr[si];
+ }
+
+ if (totemip_equal(&bn_netaddr, &if_netaddr)) {
+ totemip_copy(boundto, &if_addr->ip_addr);
+ boundto->nodeid = bindnet->nodeid;
+ *interface_up = if_addr->interface_up;
+ *interface_num = if_addr->interface_num;
+
+ if (boundto->family == AF_INET && boundto->nodeid == 0) {
+ unsigned int nodeid = 0;
+ memcpy (&nodeid, boundto->addr, sizeof (int));
+#if __BYTE_ORDER == __BIG_ENDIAN
+ nodeid = swab32 (nodeid);
+#endif
+ if (mask_high_bit) {
+ nodeid &= 0x7FFFFFFF;
+ }
+ boundto->nodeid = nodeid;
+ }
+
+ res = 0;
+ goto finished;
+ }
+ }
+
+finished:
+ totemip_freeifaddrs(&addrs);
+ return (res);
+}
--
1.7.1
_______________________________________________
discuss mailing list
discuss@xxxxxxxxxxxx
http://lists.corosync.org/mailman/listinfo/discuss
[Corosync Project]
[Linux USB Devel]
[Video for Linux]
[Linux Audio Users]
[Photo]
[Yosemite News]
[Yosemite Photos]
[Free Online Dating]
[Linux Kernel]
[Linux SCSI]
[XFree86]