2005-05-07 Yar Tikhiy <yar@comp.chem.msu.su>

	* configure.ac: Check for OSes which support passing ifindex in
	  struct ip_mreq.
	* lib/sockopt.c: Add support for BSD style ifindex in ip_mreq.
	* ospfd/ospf_network.c: Log ifindex on multicast membership leave/join
	  events.
diff --git a/lib/ChangeLog b/lib/ChangeLog
index f514532..18ac221 100644
--- a/lib/ChangeLog
+++ b/lib/ChangeLog
@@ -1,3 +1,7 @@
+2005-05-07 Yar Tikhiy <yar@comp.chem.msu.su>
+
+	* sockopt.c: Add support for BSD style ifindex in ip_mreq.
+
 2005-05-06 Paul Jakma <paul@dishone.st>
 
 	* (general) extern and static'ification of functions in code and
diff --git a/lib/sockopt.c b/lib/sockopt.c
index 81db88d..655ecdc 100644
--- a/lib/sockopt.c
+++ b/lib/sockopt.c
@@ -171,8 +171,7 @@
 			unsigned int ifindex)
 {
 
-  /* Linux 2.2.0 and up */
-#if defined(GNU_LINUX) && LINUX_VERSION_CODE > 131584
+#ifdef HAVE_STRUCT_IP_MREQN_IMR_IFINDEX
   /* This is better because it uses ifindex directly */
   struct ip_mreqn mreqn;
   
@@ -212,11 +211,16 @@
   struct in_addr m;
   struct ip_mreq mreq;
 
+#ifdef HAVE_BSD_STRUCT_IP_MREQ_HACK
+  if (ifindex)
+    m.s_addr = htonl(ifindex);
+  else
+#endif
+    m = if_addr;
+
   switch (optname)
     {
     case IP_MULTICAST_IF:
-      m = if_addr;
-      
       return setsockopt (sock, IPPROTO_IP, optname, (void *)&m, sizeof(m)); 
       break;
 
@@ -224,7 +228,7 @@
     case IP_DROP_MEMBERSHIP:
       memset (&mreq, 0, sizeof(mreq));
       mreq.imr_multiaddr.s_addr = mcast_addr;
-      mreq.imr_interface = if_addr;
+      mreq.imr_interface = m;
       
       return setsockopt (sock, 
 			 IPPROTO_IP,