Private struct ifmaddrs for OSX cause struct ifmaddrs is missing too on OSX 10.6.

This commit is contained in:
Adam Ierymenko 2014-02-01 23:18:31 -08:00
parent e16b2a8831
commit 8236f20759

View file

@ -727,7 +727,15 @@ bool EthernetTap::updateMulticastGroups(std::set<MulticastGroup> &groups)
//#define GIM_RTM_ADDR RTM_NEWMADDR //#define GIM_RTM_ADDR RTM_NEWMADDR
//#endif //#endif
static inline int _intl_getifmaddrs(struct ifmaddrs **pif) // Not in 10.6 includes so use our own
struct _intl_ifmaddrs {
struct _intl_ifmaddrs *ifma_next;
struct sockaddr *ifma_name;
struct sockaddr *ifma_addr;
struct sockaddr *ifma_lladdr;
};
static inline int _intl_getifmaddrs(struct _intl_ifmaddrs **pif)
{ {
int icnt = 1; int icnt = 1;
int dcnt = 0; int dcnt = 0;
@ -741,7 +749,7 @@ static inline int _intl_getifmaddrs(struct ifmaddrs **pif)
char *next; char *next;
char *p; char *p;
struct ifma_msghdr2 *ifmam; struct ifma_msghdr2 *ifmam;
struct ifmaddrs *ifa, *ift; struct _intl_ifmaddrs *ifa, *ift;
struct rt_msghdr *rtm; struct rt_msghdr *rtm;
struct sockaddr *sa; struct sockaddr *sa;
@ -790,16 +798,16 @@ static inline int _intl_getifmaddrs(struct ifmaddrs **pif)
} }
} }
data = (char *)malloc(sizeof(struct ifmaddrs) * icnt + dcnt); data = (char *)malloc(sizeof(struct _intl_ifmaddrs) * icnt + dcnt);
if (data == NULL) { if (data == NULL) {
free(buf); free(buf);
return (-1); return (-1);
} }
ifa = (struct ifmaddrs *)(void *)data; ifa = (struct _intl_ifmaddrs *)(void *)data;
data += sizeof(struct ifmaddrs) * icnt; data += sizeof(struct _intl_ifmaddrs) * icnt;
memset(ifa, 0, sizeof(struct ifmaddrs) * icnt); memset(ifa, 0, sizeof(struct _intl_ifmaddrs) * icnt);
ift = ifa; ift = ifa;
for (next = buf; next < buf + needed; next += rtm->rtm_msglen) { for (next = buf; next < buf + needed; next += rtm->rtm_msglen) {
@ -867,7 +875,7 @@ static inline int _intl_getifmaddrs(struct ifmaddrs **pif)
return (0); return (0);
} }
static inline void _intl_freeifmaddrs(struct ifmaddrs *ifmp) static inline void _intl_freeifmaddrs(struct _intl_ifmaddrs *ifmp)
{ {
free(ifmp); free(ifmp);
} }
@ -877,9 +885,9 @@ static inline void _intl_freeifmaddrs(struct ifmaddrs *ifmp)
bool EthernetTap::updateMulticastGroups(std::set<MulticastGroup> &groups) bool EthernetTap::updateMulticastGroups(std::set<MulticastGroup> &groups)
{ {
std::set<MulticastGroup> newGroups; std::set<MulticastGroup> newGroups;
struct ifmaddrs *ifmap = (struct ifmaddrs *)0; struct _intl_ifmaddrs *ifmap = (struct _intl_ifmaddrs *)0;
if (!_intl_getifmaddrs(&ifmap)) { if (!_intl_getifmaddrs(&ifmap)) {
struct ifmaddrs *p = ifmap; struct _intl_ifmaddrs *p = ifmap;
while (p) { while (p) {
if (p->ifma_addr->sa_family == AF_LINK) { if (p->ifma_addr->sa_family == AF_LINK) {
struct sockaddr_dl *in = (struct sockaddr_dl *)p->ifma_name; struct sockaddr_dl *in = (struct sockaddr_dl *)p->ifma_name;