Add #ifdefs in case not all platforms support IPv4 and IPv6 multicast.
authorGuus Sliepen <guus@tinc-vpn.org>
Sun, 25 Mar 2012 12:40:55 +0000 (13:40 +0100)
committerGuus Sliepen <guus@tinc-vpn.org>
Sun, 25 Mar 2012 12:40:55 +0000 (13:40 +0100)
src/multicast_device.c

index 392fd3713e03fd33232404fe81e186ae43f60044..495f8fc995835805a52f4c390924c32e7660095a 100644 (file)
@@ -92,6 +92,7 @@ static bool setup_device(void) {
        }
 
        switch(ai->ai_family) {
        }
 
        switch(ai->ai_family) {
+#ifdef IP_ADD_MEMBERSHIP
                case AF_INET: {
                        struct ip_mreq mreq;
                        struct sockaddr_in in;
                case AF_INET: {
                        struct ip_mreq mreq;
                        struct sockaddr_in in;
@@ -103,10 +104,16 @@ static bool setup_device(void) {
                                closesocket(device_fd);
                                return false;
                        }
                                closesocket(device_fd);
                                return false;
                        }
+#ifdef IP_MULTICAST_LOOP
                        setsockopt(device_fd, IPPROTO_IP, IP_MULTICAST_LOOP, &one, sizeof one);
                        setsockopt(device_fd, IPPROTO_IP, IP_MULTICAST_LOOP, &one, sizeof one);
+#endif
+#ifdef IP_MULTICAST_TTL
                        setsockopt(device_fd, IPPROTO_IP, IP_MULTICAST_TTL, &ttl, sizeof ttl);
                        setsockopt(device_fd, IPPROTO_IP, IP_MULTICAST_TTL, &ttl, sizeof ttl);
+#endif
                } break;
                } break;
+#endif
 
 
+#ifdef IPV6_JOIN_GROUP
                case AF_INET6: {
                        struct ipv6_mreq mreq;
                        struct sockaddr_in6 in6;
                case AF_INET6: {
                        struct ipv6_mreq mreq;
                        struct sockaddr_in6 in6;
@@ -118,9 +125,14 @@ static bool setup_device(void) {
                                closesocket(device_fd);
                                return false;
                        }
                                closesocket(device_fd);
                                return false;
                        }
+#ifdef IPV6_MULTICAST_LOOP
                        setsockopt(device_fd, IPPROTO_IPV6, IPV6_MULTICAST_LOOP, &one, sizeof one);
                        setsockopt(device_fd, IPPROTO_IPV6, IPV6_MULTICAST_LOOP, &one, sizeof one);
+#endif
+#ifdef IPV6_MULTICAST_HOPS
                        setsockopt(device_fd, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, &ttl, sizeof ttl);
                        setsockopt(device_fd, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, &ttl, sizeof ttl);
+#endif
                } break;
                } break;
+#endif
        
                default:
                        logger(LOG_ERR, "Multicast for address family %hx unsupported", ai->ai_family);
        
                default:
                        logger(LOG_ERR, "Multicast for address family %hx unsupported", ai->ai_family);