summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Mares <mj@ucw.cz>1999-04-12 15:27:56 +0000
committerMartin Mares <mj@ucw.cz>1999-04-12 15:27:56 +0000
commit61fb537c6273c50deb7d33f8af246993eab4bc4d (patch)
treeee108fce7337013453b6b9c5065ccd2e2b45acce
parent5a99ade413b97a780758f5c8f927604ad6c8e57b (diff)
Use `struct ip_mreqn' instead of `struct ip_mreq' for multicast
operations on 2.1/2.2 kernels. This allows passing of real interface indexes instead of referencing interfaces by their IP addresses which fails badly in presence of unnumbered interfaces. Unfortunately, this structure is not visible with glibc 2.0 as it provides its own networking headers :-( Both libc5 and glibc 2.1 should be OK.
-rw-r--r--aclocal.m412
-rw-r--r--configure.in1
-rw-r--r--sysdep/autoconf.h.in3
-rw-r--r--sysdep/unix/io.c3
4 files changed, 17 insertions, 2 deletions
diff --git a/aclocal.m4 b/aclocal.m4
index 651b0db4..98a5ca8e 100644
--- a/aclocal.m4
+++ b/aclocal.m4
@@ -116,3 +116,15 @@ case "$bird_cv_type_time_t" in
*) AC_DEFINE(TIME_T_IS_SIGNED) ;;
esac
])
+
+AC_DEFUN(BIRD_CHECK_STRUCT_IP_MREQN,
+[AC_CACHE_CHECK([struct ip_mreqn], bird_cv_struct_ip_mreqn,[
+AC_TRY_COMPILE([#include <netinet/in.h>
+],[struct ip_mreqn x;
+],[bird_cv_struct_ip_mreqn=yes
+],[bird_cv_struct_ip_mreqn=no
+])])
+if test "$bird_cv_struct_ip_mreqn" = yes ; then
+ AC_DEFINE(HAVE_STRUCT_IP_MREQN)
+fi
+])
diff --git a/configure.in b/configure.in
index 2cf123a4..a8ef7347 100644
--- a/configure.in
+++ b/configure.in
@@ -109,6 +109,7 @@ BIRD_CHECK_INTEGERS
BIRD_CHECK_ENDIAN
BIRD_CHECK_STRUCT_ALIGN
BIRD_CHECK_TIME_T
+BIRD_CHECK_STRUCT_MREQN
if test "$enable_debug" = yes ; then
AC_DEFINE(PATH_CONFIG_DIR, ".")
diff --git a/sysdep/autoconf.h.in b/sysdep/autoconf.h.in
index ae4d6b65..6c76f1a9 100644
--- a/sysdep/autoconf.h.in
+++ b/sysdep/autoconf.h.in
@@ -29,6 +29,9 @@
#undef TIME_T_IS_64BIT
#undef TIME_T_IS_SIGNED
+/* We have struct ip_mreqn in <netinet/in.h> */
+#undef HAVE_STRUCT_IP_MREQN
+
/* Protocols compiled in */
#undef CONFIG_STATIC
#undef CONFIG_RIP
diff --git a/sysdep/unix/io.c b/sysdep/unix/io.c
index 69f8a5c7..d98972c7 100644
--- a/sysdep/unix/io.c
+++ b/sysdep/unix/io.c
@@ -407,8 +407,7 @@ sk_open(sock *s)
case SK_UDP_MC:
case SK_IP_MC:
{
-#ifdef HAVE_IP_MREQN
- /* FIXME: Define HAVE_IP_MREQN somewhere :) */
+#ifdef HAVE_STRUCT_IP_MREQN
struct ip_mreqn mreq;
#define mreq_add mreq
ASSERT(s->iface);