PPI: Missing commit
[senf.git] / Socket / Protocols / INet / MulticastSocketProtocol.cc
index 42f2126..e37108f 100644 (file)
@@ -79,7 +79,7 @@ prefix_ void senf::MulticastSocketProtocol::mcIface(std::string const & iface)
     const
 {
     struct ip_mreqn mreqn;
-    ::memset(&mreqn,sizeof(mreqn),0);
+    ::memset(&mreqn, 0, sizeof(mreqn));
     if (!iface.empty()) {
         mreqn.imr_ifindex = if_nametoindex(iface.c_str());
         if (mreqn.imr_ifindex == 0)
@@ -242,6 +242,7 @@ prefix_ void senf::INet6MulticastSocketProtocol::mcAddMembership(INet6Address co
 
 prefix_ void senf::INet6MulticastSocketProtocol::mcAddMembership(INet6Address const & mcAddr,
                                                                  std::string const & iface)
+    const
 {
     if (mcAddr.inet4Mapped()) {
         struct ip_mreqn mreqn;
@@ -311,14 +312,13 @@ senf::INet6MulticastSocketProtocol::mcDropMembership(INet6Address const & mcAddr
 }
 
 namespace {
+
     void mc6SSMSourceRequest(int operation, int fd, senf::INet6Address const & group,
-                             senf::INet6Address const & source, std::string const & iface)
+                             senf::INet6Address const & source, int ifacei)
     {
         struct group_source_req req;
         ::memset(&req, 0, sizeof(req));
-        req.gsr_interface = if_nametoindex(iface.c_str());
-        if (req.gsr_interface == 0)
-            throw senf::SystemException("::if_nametoindex()", ENOENT SENF_EXC_DEBUGINFO);
+        req.gsr_interface = ifacei;
         req.gsr_group.ss_family = AF_INET6;
         std::copy(group.begin(), group.end(),
                   reinterpret_cast<struct sockaddr_in6&>(req.gsr_group).sin6_addr.s6_addr);
@@ -328,6 +328,19 @@ namespace {
         if (::setsockopt(fd, SOL_IPV6, MCAST_JOIN_SOURCE_GROUP, &req, sizeof(req)) < 0)
             SENF_THROW_SYSTEM_EXCEPTION("::setsockopt()");
     }
+
+    void mc6SSMSourceRequest(int operation, int fd, senf::INet6Address const & group,
+                             senf::INet6Address const & source, std::string const & iface)
+    {
+        int ifacei (0);
+        if (! iface.empty()) {
+            ifacei = if_nametoindex(iface.c_str());
+            if (ifacei == 0)
+                throw senf::SystemException("::if_nametoindex()", ENOENT SENF_EXC_DEBUGINFO);
+        }
+        mc6SSMSourceRequest(operation, fd, group, source, ifacei);
+    }
+
 }
 
 prefix_ void senf::INet6MulticastSocketProtocol::mcJoinSSMSource(INet6Address const & group,
@@ -338,6 +351,14 @@ prefix_ void senf::INet6MulticastSocketProtocol::mcJoinSSMSource(INet6Address co
     mc6SSMSourceRequest(MCAST_JOIN_SOURCE_GROUP, fd(), group, source, iface);
 }
 
+prefix_ void senf::INet6MulticastSocketProtocol::mcJoinSSMSource(INet6Address const & group,
+                                                                 INet6Address const & source,
+                                                                 int ifacei)
+    const
+{
+    mc6SSMSourceRequest(MCAST_JOIN_SOURCE_GROUP, fd(), group, source, ifacei);
+}
+
 prefix_ void senf::INet6MulticastSocketProtocol::mcLeaveSSMSource(INet6Address const & group,
                                                                   INet6Address const & source,
                                                                   std::string const & iface)
@@ -346,11 +367,12 @@ prefix_ void senf::INet6MulticastSocketProtocol::mcLeaveSSMSource(INet6Address c
     mc6SSMSourceRequest(MCAST_LEAVE_SOURCE_GROUP, fd(), group, source, iface);
 }
 
+
 ///////////////////////////////cc.e////////////////////////////////////////
 #undef prefix_
 //#include "MulticastSocketProtocol.mpp"
 
-\f
+
 // Local Variables:
 // mode: c++
 // fill-column: 100