update (c) messages for mark & ross's contributions
[disorder] / server / speaker-network.c
index c8edbfe..150fea6 100644 (file)
@@ -118,20 +118,16 @@ static void network_init(void) {
                    res->ai_socktype,
                    res->ai_protocol)) < 0)
     fatal(errno, "error creating broadcast socket");
-  if((res->ai_family == PF_INET
-      && IN_MULTICAST(
-           ntohl(((struct sockaddr_in *)res->ai_addr)->sin_addr.s_addr)
-         ))
-     || (res->ai_family == PF_INET6
-         && IN6_IS_ADDR_MULTICAST(
-               &((struct sockaddr_in6 *)res->ai_addr)->sin6_addr
-            ))) {
+  if(multicast(res->ai_addr)) {
     /* Multicasting */
     switch(res->ai_family) {
     case PF_INET: {
       const int mttl = config->multicast_ttl;
       if(setsockopt(bfd, IPPROTO_IP, IP_MULTICAST_TTL, &mttl, sizeof mttl) < 0)
         fatal(errno, "error setting IP_MULTICAST_TTL on multicast socket");
+      if(setsockopt(bfd, IPPROTO_IP, IP_MULTICAST_LOOP,
+                    &config->multicast_loop, sizeof one) < 0)
+        fatal(errno, "error setting IP_MULTICAST_LOOP on multicast socket");
       break;
     }
     case PF_INET6: {
@@ -139,6 +135,9 @@ static void network_init(void) {
       if(setsockopt(bfd, IPPROTO_IPV6, IPV6_MULTICAST_HOPS,
                     &mttl, sizeof mttl) < 0)
         fatal(errno, "error setting IPV6_MULTICAST_HOPS on multicast socket");
+      if(setsockopt(bfd, IPPROTO_IP, IPV6_MULTICAST_LOOP,
+                    &config->multicast_loop, sizeof (int)) < 0)
+        fatal(errno, "error setting IPV6_MULTICAST_LOOP on multicast socket");
       break;
     }
     default: