| # -*- autoconf -*- |
| ######################################### |
| ## |
| # Miscellaneous Operating-System characteristics |
| ## |
| ######################################### |
| |
| |
| # Determine how to test for character devices |
| # [We assume that /dev/null does actually exist!] |
| # |
| if test -c /dev/null; then |
| CDEV_TEST_FLAG="-c" |
| elif test -f /dev/null; then |
| CDEV_TEST_FLAG="-f" |
| else |
| AC_MSG_WARN([Can't reliably detect character devices]) |
| # Is it actually sensible to fall back on "test -f" ? |
| CDEV_TEST_FLAG="-f" |
| fi |
| |
| # Kernel Location |
| # used in library/agent |
| # |
| AC_CACHE_CHECK([for location of system kernel], |
| ac_cv_KERNEL_LOC, |
| [ac_cv_KERNEL_LOC="unknown" |
| for i in /vmunix /hp-ux /stand/vmunix /dev/ksyms /kernel/unix /kernel/genunix /netbsd /unix /kernel /bsd /mach_kernel /boot/kernel/kernel |
| do |
| if test $CDEV_TEST_FLAG $i; then |
| ac_cv_KERNEL_LOC="$i" |
| break; |
| fi |
| done |
| # |
| # In principle, this test is meant to provide a default path to the kernel |
| # In practice, the test is broken and the kernel path is set to "unknown" |
| # |
| # Note that on certain systems (e.g. some Linux distributions), |
| # it is impossible to predict the name of the kernel, |
| # particularly if it includes the kernel version, architecture, etc |
| # |
| # Since this default will never actually be used, then don't try to set it |
| # |
| if test $i = "unknown"; then |
| AC_MSG_WARN([Can't find system kernel... hopefully this won't be needed!]) |
| fi |
| ]) |
| AC_DEFINE_UNQUOTED(KERNEL_LOC,"$ac_cv_KERNEL_LOC", [location of UNIX kernel]) |
| |
| |
| # /dev/kmem existence |
| # used in agent only |
| # |
| AC_CACHE_CHECK([for /dev/kmem], |
| ac_cv_HAVE_KMEM, |
| [if test $CDEV_TEST_FLAG /dev/kmem; then |
| ac_cv_HAVE_KMEM="/dev/kmem" |
| fi |
| ]) |
| # |
| # Note that it's OK if this device is not found |
| # |
| if test "x$ac_cv_HAVE_KMEM" = "x/dev/kmem"; then |
| AC_DEFINE_UNQUOTED(HAVE_KMEM,"$ac_cv_HAVE_KMEM", [Define if you have /dev/kmem]) |
| fi |
| |
| |
| # Swap device Location |
| # (/dev/dmem or /dev/drum) |
| # used in agent only |
| # |
| AC_CACHE_CHECK([for location of swap device], |
| ac_cv_DMEM_LOC, |
| [if test $CDEV_TEST_FLAG /dev/dmem; then |
| ac_cv_DMEM_LOC="/dev/dmem" |
| elif test $CDEV_TEST_FLAG /dev/drum; then |
| ac_cv_DMEM_LOC="/dev/drum" |
| else |
| ac_cv_DMEM_LOC="none" |
| fi |
| ]) |
| # |
| # Note that it's OK if this device is not found |
| # |
| if test "x$ac_cv_DMEM_LOC" != "xnone"; then |
| AC_DEFINE_UNQUOTED(DMEM_LOC,"$ac_cv_DMEM_LOC", [location of swap device]) |
| fi |
| |
| |
| # Mount table Location |
| # used in agent only |
| # |
| AC_CACHE_CHECK([for mount table location], |
| ac_cv_ETC_MNTTAB, |
| [ac_cv_ETC_MNTTAB="${with_mnttab:-unknown}" |
| if test "$ac_cv_ETC_MNTTAB" = "unknown"; then |
| for i in /etc/mnttab /etc/mtab /etc/filesystems /dev/mnttab |
| do |
| if test -f $i -o -c $i; then |
| ac_cv_ETC_MNTTAB="$i" |
| break; |
| fi |
| done |
| fi |
| ]) |
| AC_DEFINE_UNQUOTED(ETC_MNTTAB,"$ac_cv_ETC_MNTTAB", [location of mount table list]) |
| |
| |
| # Printing |
| # used in agent only |
| # |
| AC_PATH_PROG([LPSTAT_PATH],lpstat) |
| if test x$LPSTAT_PATH != x; then |
| AC_DEFINE_UNQUOTED(LPSTAT_PATH, "$LPSTAT_PATH", |
| [Path to the lpstat command]) |
| AC_DEFINE(HAVE_LPSTAT, 1, [Set if the lpstat command is available]) |
| fi |
| if test -r /etc/printcap; then |
| AC_DEFINE(HAVE_PRINTCAP, 1, [Set if /etc/printcap exists]) |
| fi |
| |
| |
| # Check ps args |
| # used in agent only |
| # |
| AC_CACHE_CHECK([for correct flags to ps], |
| ac_cv_ps_flags, |
| [ |
| if test "`($PSPROG -e 2>&1) | $EGREP ' (ps) *$' | awk '{print $NF}'`" = "ps" ; then |
| ac_cv_ps_flags="-e" |
| elif test "`($PSPROG -el 2>&1) | $EGREP ' (ps) *$' | awk '{print $NF}'`" = "ps" ; then |
| ac_cv_ps_flags="-el" |
| elif test "`($PSPROG acx 2>&1) | $EGREP ' (ps) *$' | awk '{print $NF}'`" = "ps" ; then |
| ac_cv_ps_flags="acx" |
| elif test "`($PSPROG -acx 2>&1) | $EGREP ' (ps) *$' | awk '{print $NF}'`" = "ps" ; then |
| ac_cv_ps_flags="-acx" |
| elif test "`($PSPROG -o pid,tt,state,time,ucomm 2>&1) | $EGREP ' ps *$' | awk '{print $NF}'`" = "ps" ; then |
| ac_cv_ps_flags="-o pid,tt,state,time,ucomm" |
| elif test "`($PSPROG ax 2>&1) | $EGREP ' (ps) *$' | awk '{print $NF}'`" = "ps" ; then |
| ac_cv_ps_flags="ax" |
| elif test "x$PARTIALTARGETOS" = "xcygwin"; then |
| ac_cv_ps_flags="-e" |
| elif test "x$PARTIALTARGETOS" = "xmingw32" -o "x$PARTIALTARGETOS" = "xmingw32msvc"; then |
| ac_cv_ps_flags="-e" |
| else |
| AC_MSG_WARN([Unable to determine valid ps flags... defaulting...]) |
| ac_cv_ps_flags="-acx" |
| fi |
| ]) |
| |
| PSCMD="$PSPROG $ac_cv_ps_flags" |
| AC_SUBST(PSCMD) |
| AC_DEFINE_UNQUOTED(PSCMD, "$PSPROG $ac_cv_ps_flags", |
| [Command to generate ps output, the final column must be the process |
| name withOUT arguments]) |
| |
| |
| ## |
| # System/Compilation-related |
| ## |
| |
| # Test for SIGHUP |
| # |
| |
| AC_MSG_CHECKING([for SIGHUP]) |
| AC_COMPILE_IFELSE( |
| [AC_LANG_PROGRAM([#include <signal.h>], [return SIGHUP])], |
| [netsnmp_have_sighup=yes], |
| [netsnmp_have_sighup=no] |
| ) |
| AC_MSG_RESULT([$netsnmp_have_sighup]) |
| if test "x$netsnmp_have_sighup" = xyes; then |
| AC_DEFINE([HAVE_SIGHUP], [1], |
| [Define if SIGHUP is defined in <signal.h>.]) |
| fi |
| |
| |
| # Check whether sysctl() is usable |
| # used in library/agent |
| # |
| if test $cross_compiling = yes; then |
| AC_MSG_WARN([Can't check sysctl, manually define NETSNMP_CAN_USE_SYSCTL if platform support available]) |
| else |
| AC_CACHE_CHECK([if sysctl can read kernel information], |
| ac_cv_NETSNMP_CAN_USE_SYSCTL, |
| [AC_TRY_RUN([ |
| #if TIME_WITH_SYS_TIME |
| # include <sys/time.h> |
| # include <time.h> |
| #else |
| # if HAVE_SYS_TIME_H |
| # include <sys/time.h> |
| # else |
| # include <time.h> |
| # endif |
| #endif |
| #if HAVE_SYS_PARAM_H |
| # include <sys/param.h> |
| #endif |
| #include <sys/types.h> |
| #if HAVE_SYS_SYSCTL_H |
| # include <sys/sysctl.h> |
| #endif |
| |
| main() { |
| int mib[2]; |
| size_t len; |
| struct timeval boottime; |
| |
| mib[0] = CTL_KERN; |
| mib[1] = KERN_BOOTTIME; |
| |
| len = sizeof(boottime); |
| sysctl(mib, 2, &boottime, &len, NULL, NULL); |
| if (boottime.tv_sec != 0) |
| exit(0); |
| else |
| exit(1); |
| } |
| ], |
| ac_cv_NETSNMP_CAN_USE_SYSCTL=yes, |
| ac_cv_NETSNMP_CAN_USE_SYSCTL=no, |
| ac_cv_NETSNMP_CAN_USE_SYSCTL=no)]) |
| fi |
| |
| if test "x$ac_cv_NETSNMP_CAN_USE_SYSCTL" = "xyes"; then |
| AC_DEFINE(NETSNMP_CAN_USE_SYSCTL, 1, [sysctl works to get boottime, etc...]) |
| fi |
| |
| |
| # Check whether TCP timer constants are indeed constant |
| # or depend on the kernel clock tick 'hz'. (FreeBSD 4.x) |
| # |
| # If the latter, then we will need to have a local |
| # variable 'hz' defined and with a suitable value, |
| # whenever we want to use one one of these 'constants'. |
| # |
| # used in agent only |
| # |
| AC_CACHE_CHECK([whether TCP timers depend on 'hz'], |
| ac_cv_TCPTV_NEEDS_HZ, |
| [AC_EGREP_CPP(hz, |
| [ |
| #include <netinet/tcp_timer.h> |
| TCPTV_SRTTDFLT |
| ], |
| ac_cv_TCPTV_NEEDS_HZ=yes, |
| ac_cv_TCPTV_NEEDS_HZ=no)]) |
| |
| if test "x$ac_cv_TCPTV_NEEDS_HZ" = "xyes"; then |
| AC_DEFINE(TCPTV_NEEDS_HZ, 1, |
| [Define if the TCP timer constants in <netinet/tcp_timer.h> |
| depend on the integer variable 'hz'. @<:@FreeBSD 4.x@:>@]) |
| fi |
| |
| |
| # Check whether IP Route table is cached (Solaris) |
| # used in agent only |
| # |
| case $target_os in |
| solaris*) |
| # Header checks (Solaris 2.6/7) |
| # |
| AC_CHECK_HEADERS(inet/common.h) |
| AC_CHECK_HEADERS(inet/ip.h,ac_inet_ip_h=yes,ac_inet_ip_h=no, |
| AC_INCLUDES_DEFAULT([]) |
| [ |
| #if HAVE_SYS_STREAM_H |
| #include <sys/stream.h> |
| #endif |
| #if HAVE_INET_COMMON_H |
| #include <inet/common.h> |
| #endif |
| ]) |
| if test $ac_inet_ip_h = yes ; then |
| AC_CACHE_CHECK([for mib2_ipRouteEntry_t in inet/mib2.h], |
| ac_cv_mib2_ipRouteEntry_t, |
| [AC_TRY_COMPILE([ |
| #if HAVE_INET_MIB2_H |
| #include <inet/mib2.h> |
| #endif |
| ],[ |
| mib2_ipRouteEntry_t testit; |
| if(sizeof(testit)) |
| return(0); |
| ], |
| ac_cv_mib2_ipRouteEntry_t=yes, |
| ac_cv_mib2_ipRouteEntry_t=no)]) |
| |
| if test "x$ac_cv_mib2_ipRouteEntry_t" = "xyes" ; then |
| AC_CACHE_CHECK([whether IRE_CACHE is defined in inet/ip.h], |
| ac_cv_ire_cache, |
| [AC_TRY_COMPILE([ |
| #if HAVE_INET_IP_H |
| #include <inet/ip.h> |
| #endif |
| ],[ |
| int testit=IRE_CACHE; |
| if(testit) |
| return(0); |
| ], |
| ac_cv_ire_cache=yes, |
| ac_cv_ire_cache=no)]) |
| else |
| ac_cv_ire_cache=no |
| fi |
| |
| if test "x$ac_cv_ire_cache" = "xyes" ; then |
| AC_DEFINE(HAVE_DEFINED_IRE_CACHE,[], |
| [define to 1 if you have IRE_CACHE defined in <inet/ip.h> header file.]) |
| else |
| AC_MSG_WARN([It seems that you have inet/ip.h, but IRE_CACHE is not defined. \ |
| That means that your query to ipRoute MIB could generate over 20k results! \ |
| And this can be very slow.]) |
| fi |
| fi # "test $ac_inet_ip_h = yes" |
| ;; |
| esac |
| |
| # Check whether IP_PKTINFO is usable. |
| # |
| |
| AC_CACHE_CHECK([for IP_PKTINFO ], |
| [ac_cv_have_ip_pktinfo], |
| [AC_LINK_IFELSE([AC_LANG_PROGRAM([ |
| #include <stdio.h> /* printf() */ |
| #include <stdlib.h> /* malloc() */ |
| #include <string.h> /* memset() */ |
| #include <sys/types.h> |
| #include <sys/socket.h> |
| #include <netinet/in.h> |
| ], [ |
| void *buf; |
| int len; |
| void *from; |
| socklen_t *fromlen; |
| |
| struct iovec iov; |
| char *cmsg = malloc(CMSG_SPACE(sizeof(struct in_pktinfo))); |
| struct cmsghdr *cm; |
| struct msghdr msg; |
| |
| iov.iov_base = buf; |
| iov.iov_len = len; |
| |
| memset(&msg, 0, sizeof msg); |
| msg.msg_name = from; |
| msg.msg_namelen = *fromlen; |
| msg.msg_iov = &iov; |
| msg.msg_iovlen = 1; |
| msg.msg_control = &cmsg; |
| msg.msg_controllen = sizeof(cmsg); |
| |
| for (cm = CMSG_FIRSTHDR(&msg); cm; cm = CMSG_NXTHDR(&msg, cm)) { |
| if (cm->cmsg_level == SOL_IP && cm->cmsg_type == IP_PKTINFO) { |
| struct in_pktinfo* src = (struct in_pktinfo *)CMSG_DATA(cm); |
| printf("Address: %s; index: %d\n", inet_ntoa(src->ipi_addr), |
| src->ipi_ifindex); |
| } |
| } |
| ])], |
| [ac_cv_have_ip_pktinfo=yes], |
| [ac_cv_have_ip_pktinfo=no] |
| )]) |
| if test x$ac_cv_have_ip_pktinfo = xyes; then |
| AC_DEFINE(HAVE_IP_PKTINFO, 1, [Set if IP_PKTINFO is usable]) |
| fi |
| |
| # Check whether IP_RECVDSTADDR is usable. |
| # |
| |
| AC_CACHE_CHECK([for IP_RECVDSTADDR ], |
| [ac_cv_have_ip_recvdstaddr], |
| [AC_LINK_IFELSE([AC_LANG_PROGRAM([ |
| #include <stdio.h> /* printf() */ |
| #include <stdlib.h> /* malloc() */ |
| #include <string.h> /* memset() */ |
| #include <sys/types.h> |
| #include <sys/socket.h> |
| #include <netinet/in.h> |
| ], [ |
| void *buf; |
| int len; |
| void *from; |
| socklen_t *fromlen; |
| |
| struct iovec iov; |
| char *cmsg = malloc(CMSG_SPACE(sizeof(struct in_addr))); |
| struct cmsghdr *cm; |
| struct msghdr msg; |
| |
| iov.iov_base = buf; |
| iov.iov_len = len; |
| |
| memset(&msg, 0, sizeof msg); |
| msg.msg_name = from; |
| msg.msg_namelen = *fromlen; |
| msg.msg_iov = &iov; |
| msg.msg_iovlen = 1; |
| msg.msg_control = &cmsg; |
| msg.msg_controllen = sizeof(cmsg); |
| |
| for (cm = CMSG_FIRSTHDR(&msg); cm; cm = CMSG_NXTHDR(&msg, cm)) { |
| if (cm->cmsg_level == IPPROTO_IP && cm->cmsg_type == IP_RECVDSTADDR) { |
| struct in_addr* src = (struct in_addr *)CMSG_DATA(cm); |
| printf("Address: %s\n", inet_ntoa(src)); |
| } |
| } |
| ])], |
| [ac_cv_have_ip_recvdstaddr=yes], |
| [ac_cv_have_ip_recvdstaddr=no] |
| )]) |
| if test x$ac_cv_have_ip_recvdstaddr = xyes; then |
| AC_DEFINE(HAVE_IP_RECVDSTADDR, 1, [Set if IP_RECVDSTADDR is usable]) |
| fi |