diff --git a/libdnet-stripped/config/acinclude.m4 b/libdnet-stripped/config/acinclude.m4 index 3b6c0fb6e..622c6a203 100644 --- a/libdnet-stripped/config/acinclude.m4 +++ b/libdnet-stripped/config/acinclude.m4 @@ -265,6 +265,26 @@ AC_DEFUN(AC_DNET_RAWIP_COOKED, [Define if you have cooked raw IP sockets.]) fi]) +dnl +dnl Check for getkerninfo +dnl +dnl usage: AC_DNET_GETKERNINFO +dnl results: HAVE_GETKERNINFO +dnl +AC_DEFUN(AC_DNET_GETKERNINFO, + [AC_MSG_CHECKING(for getkerninfo) + AC_CACHE_VAL(ac_cv_dnet_getkerninfo, + AC_TRY_COMPILE([ +# include ], + [getkerninfo(KINFO_RT_DUMP, 0, 0, 0);], + ac_cv_dnet_getkerninfo=yes, + ac_cv_dnet_getkerninfo=no)) + AC_MSG_RESULT($ac_cv_dnet_getkerninfo) + if test $ac_cv_dnet_getkerninfo = yes ; then + AC_DEFINE(HAVE_GETKERNINFO, 1, + [Define if has getkerninfo.]) + fi]) + dnl dnl AC_LBL_LIBRARY_NET dnl diff --git a/libdnet-stripped/configure b/libdnet-stripped/configure index 318d0c9cf..7a339bb0b 100755 --- a/libdnet-stripped/configure +++ b/libdnet-stripped/configure @@ -14582,6 +14582,64 @@ $as_echo "$ac_cv_dnet_rawip_cooked" >&6; } cat >>confdefs.h <<\_ACEOF #define HAVE_RAWIP_COOKED 1 +_ACEOF + + fi + { echo "$as_me:$LINENO: checking for getkerninfo" >&5 +echo $ECHO_N "checking for getkerninfo... $ECHO_C" >&6; } + if test "${ac_cv_dnet_getkerninfo+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +# include +int +main () +{ +getkerninfo(KINFO_RT_DUMP, 0, 0, 0); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_dnet_getkerninfo=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_dnet_getkerninfo=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi + + { echo "$as_me:$LINENO: result: $ac_cv_dnet_getkerninfo" >&5 +echo "${ECHO_T}$ac_cv_dnet_getkerninfo" >&6; } + if test $ac_cv_dnet_getkerninfo = yes ; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_GETKERNINFO 1 _ACEOF fi diff --git a/libdnet-stripped/configure.in b/libdnet-stripped/configure.in index 0e7d818d6..e737868fa 100644 --- a/libdnet-stripped/configure.in +++ b/libdnet-stripped/configure.in @@ -212,6 +212,7 @@ if test "$CYGWIN" != yes ; then AC_DNET_IOCTL_ARP AC_DNET_RAWIP_HOST_OFFLEN AC_DNET_RAWIP_COOKED + AC_DNET_GETKERNINFO fi dnl Check for arp interface. diff --git a/libdnet-stripped/include/config.h.in b/libdnet-stripped/include/config.h.in index 304e4ad41..4f3738c01 100644 --- a/libdnet-stripped/include/config.h.in +++ b/libdnet-stripped/include/config.h.in @@ -130,6 +130,9 @@ /* Define if you have cooked raw IP sockets. */ #undef HAVE_RAWIP_COOKED +/* Define if has getkerninfo. */ +#undef HAVE_GETKERNINFO + /* Define if raw IP sockets require host byte ordering for ip_off, ip_len. */ #undef HAVE_RAWIP_HOST_OFFLEN diff --git a/libdnet-stripped/include/dnet_winconfig.h b/libdnet-stripped/include/dnet_winconfig.h index 5d96e7aca..e41907c2a 100644 --- a/libdnet-stripped/include/dnet_winconfig.h +++ b/libdnet-stripped/include/dnet_winconfig.h @@ -131,6 +131,9 @@ /* Define if you have cooked raw IP sockets. */ /* #undef HAVE_RAWIP_COOKED */ +/* Define if has getkerninfo. */ +/* #undef HAVE_GETKERNINFO */ + /* Define if raw IP sockets require host byte ordering for ip_off, ip_len. */ /* #undef HAVE_RAWIP_HOST_OFFLEN */ diff --git a/libdnet-stripped/src/route-bsd.c b/libdnet-stripped/src/route-bsd.c index c6532c941..dd96ee926 100644 --- a/libdnet-stripped/src/route-bsd.c +++ b/libdnet-stripped/src/route-bsd.c @@ -28,6 +28,9 @@ #include #include #endif +#ifdef HAVE_GETKERNINFO +#include +#endif #define route_t oroute_t /* XXX - unixware */ #include @@ -213,7 +216,7 @@ route_get(route_t *r, struct route_entry *entry) return (0); } -#if defined(HAVE_SYS_SYSCTL_H) || defined(HAVE_STREAMS_ROUTE) +#if defined(HAVE_SYS_SYSCTL_H) || defined(HAVE_STREAMS_ROUTE) || defined(HAVE_GETKERNINFO) int route_loop(route_t *r, route_handler callback, void *arg) { @@ -241,6 +244,21 @@ route_loop(route_t *r, route_handler callback, void *arg) } lim = buf + len; next = buf; +#elif defined(HAVE_GETKERNINFO) + int len = getkerninfo(KINFO_RT_DUMP,0,0,0); + + if (len == 0) + return (0); + + if ((buf = malloc(len)) == NULL) + return (-1); + + if (getkerninfo(KINFO_RT_DUMP,buf,&len,0) < 0) { + free(buf); + return (-1); + } + lim = buf + len; + next = buf; #else /* HAVE_STREAMS_ROUTE */ struct rt_giarg giarg, *gp;