#include <config.h>
#endif
+#define __APPLE_USE_RFC_2292
+
#include <inttypes.h>
#include <errno.h>
#include <string.h>
memcpy(&ret_sa->sin6_addr, a, sizeof(CattaIPv6Address));
}
-int catta_mdns_mcast_join_ipv4(int fd, const CattaIPv4Address *a, int idx, int join) {
+int catta_mdns_mcast_join_ipv4(int fd, const CattaIPv4Address *a, CattaIfIndex idx, int join) {
#ifdef HAVE_STRUCT_IP_MREQN
struct ip_mreqn mreq;
#else
return 0;
}
-int catta_mdns_mcast_join_ipv6(int fd, const CattaIPv6Address *a, int idx, int join) {
+int catta_mdns_mcast_join_ipv6(int fd, const CattaIPv6Address *a, CattaIfIndex idx, int join) {
struct ipv6_mreq mreq6;
struct sockaddr_in6 sa6;
if (errno != EAGAIN && errno != EWOULDBLOCK) {
char where[64];
- struct sockaddr_in *sin = msg->msg_name;
+ struct sockaddr *sa = msg->msg_name;
- inet_ntop(sin->sin_family, &sin->sin_addr, where, sizeof(where));
+ if(sa->sa_family == AF_INET)
+ inet_ntop(sa->sa_family, &((struct sockaddr_in *)sa)->sin_addr, where, sizeof(where));
+ else
+ inet_ntop(sa->sa_family, &((struct sockaddr_in6 *)sa)->sin6_addr, where, sizeof(where));
catta_log_debug("sendmsg() to %s failed: %s", where, errnostrsocket());
return -1;
}
#ifdef HAVE_IPI_SPEC_DST
if (src_address)
pkti->ipi_spec_dst.s_addr = src_address->address;
+#else
+ if (src_address)
+ pkti->ipi_addr.s_addr = src_address->address;
#endif
}
#elif defined(IP_MULTICAST_IF)
msg.msg_iovlen = 1;
msg.msg_flags = 0;
+// TODO: don't ask me why, but Win8.1 64bit WSASendMsg() fails with an InvalidArgument error 10022 when IPv6 source address is specified ( everHannes / hannes.ahrens@everbase.net )
+#ifdef _WIN32
+ msg.msg_control = NULL;
+ msg.msg_controllen = 0;
+#else
if (iface > 0 || src_address) {
struct in6_pktinfo *pkti;
msg.msg_control = NULL;
msg.msg_controllen = 0;
}
+#endif
return sendmsg_loop(fd, &msg, 0);
}