dnl Process this file with autoconf to produce a configure script.
dnl
AC_INIT(agent/mibgroup/ucd-snmp/extensible.c)
AC_CONFIG_HEADER(config.h)

dnl
dnl save the configure arguments
dnl
AC_DEFINE_UNQUOTED(CONFIGURE_OPTIONS,"$ac_configure_args")

dnl
dnl Compilation setup
dnl
AC_ARG_WITH(cc, [
Compiler Options:
  --with-cc=CC                    use CC to compile (default=gcc).],
    [CC=$with_cc;export CC])

AC_ARG_WITH(cflags,
[  --with-cflags=CFLAGS            use CFLAGS as compile time arguments.],
    [CFLAGS=$with_cflags; export CFLAGS])

AC_ARG_WITH(ldflags,
[  --with-ldflags=LDFLAGS          use LDFLAGS as link time arguments to ld.],
    [LIBS=$with_ldflags; export LIBS])

AC_ARG_ENABLE(mini_agent,
[  --enable-mini-agent             Build a minimal agent.],
    mini_agent="yes",mini_agent="no")

AC_ARG_ENABLE(ipv6,
[  --enable-ipv6                   Generate IPv6 ready version.],
    [if test "x$enable_ipv6" = "xyes"; then
      AC_DEFINE(INET6)
    fi])

AC_ARG_ENABLE(debugging,
[  --enable-debugging              Outputs extra debugging information at all
                                  times.  Normally, you should not enable this,
                                  but instead use the -D flag of the commands,
                                  which toggles debbuging output at runtime.
  --disable-debugging             Disallows debugging code to be built in.
                                  This might provide some speed benefits.],
    AC_DEFINE(SNMP_ALWAYS_DEBUG))

AC_ARG_ENABLE(developer,
[  --enable-developer              Turns on super-duper-extra-compile-warnings
                                  when using gcc.],
    developer=yes)

if test "x$enable_debugging" = "xno"; then
    AC_DEFINE(SNMP_NO_DEBUGGING)
fi

AC_ARG_WITH(dmalloc,
[  --with-dmalloc=PATH             Use dmalloc library (www.dmalloc.com)],
    if test "x$withval" = "xyes"; then
      AC_ADD_SEARCH_PATH(/usr/local)
      LIBS="$LIBS -ldmalloc"
      AC_DEFINE(HAVE_DMALLOC_H)
    elif test -d "$withval"; then
      AC_ADD_SEARCH_PATH($withval)
      LIBS="$LIBS -ldmalloc"
      AC_DEFINE(HAVE_DMALLOC_H)
    fi
)
AC_SUBST(HAVE_DMALLOC_H)

AC_ARG_WITH(efence,
[  --with-efence                   Look for and use libefence (malloc).],
      use_efence="$withval")

AC_ARG_WITH(openssl,
[  --with-openssl=PATH             Look for openssl in PATH/lib.],
    tryopenssl=$withval
    if test "x$withval" = "xyes"; then
      AC_ADD_SEARCH_PATH(/usr/local/ssl)
      tryopenssl=yes
    elif test "x$withval" = "xno"; then
      with_openssl="no"
      tryopenssl=no
    elif test -d "$withval"; then
      AC_ADD_SEARCH_PATH($withval)
      tryopenssl=yes
    fi,
)

AC_ARG_ENABLE(privacy,
[  --disable-privacy               Don't compile in support for privacy.])
if test "x$enable_privacy" != "xno"; then
  AC_DEFINE(SCAPI_AUTHPRIV)
fi

AC_ARG_ENABLE(internal-md5,
[  --enable-internal-md5           Use the internal MD5 support.],
AC_DEFINE(USE_INTERNAL_MD5))


AC_ARG_ENABLE(eol-terminated-comments, [
Configuring the SNMP library (and the applications that use it):
  --enable-mib-eol-comments       Treat \"--\" as a mib comment terminated only
                                  by an end of line condition.  (This can now
                                  be turned on/off at runtime instead.)],
    AC_DEFINE(MIB_COMMENT_IS_EOL_TERMINATED))

AC_ARG_WITH(opaque-special-types,
[  --without-opaque-special-types  Don't use special opaque encodings.
                                  SNMP normally can not handle
                                  floating numbers, nor large 64 bit
                                  integers well.  By default, the
                                  ucd-snmp package compiles in
                                  support for these extra datatypes
                                  (in a legal way)])

AC_ARG_WITH(mibdirs,
[  --with-mibdirs=\"dir1:dir2:\"     Default directories to look for mibs.
                                    (Default: \$HOME/.snmp/mibs:DATADIR/snmp/mibs)],
    [DEFAULT_MIBDIRS="$with_mibdirs"
    AC_DEFINE_UNQUOTED(DEFAULT_MIBDIRS,"$with_mibdirs")])

AC_ARG_WITH(mibs,
[  --with-mibs=\"item1:item2:\"      Default mib IDs to read.
                                    (The default list is \"IP-MIB:IF-MIB:
                                    TCP-MIB:UDP-MIB:SNMPv2-MIB:RFC1213-MIB\"
                                    with the addition of any mibs used
                                    by the mib modules the agent is
                                    configured with)],
    DEFAULT_MIBS="$with_mibs")

AC_ARG_WITH(mibfiles,
[  --with-mibfiles=\"file1:file2\"   Default mib files to load.
                                    (Default:  none.  uses IDs above instead.)],
    AC_DEFINE_UNQUOTED(DEFAULT_MIBFILES,"$with_mibfiles"))


AC_ARG_ENABLE(testing-code,
[  --enable-testing-code           Enables some code sections that should 
                                  only be used for testing of certain
                                  SNMP functionalities.  This should *not* 
                                  be turned on for production use.  Ever.],
    AC_DEFINE(SNMP_TESTING_CODE))

AC_ARG_ENABLE(reentrant,
[  --enable-reentrant              Enables locking functions that protect
                                  library resources in some multi-threading
                                  environments.  This does not guarantee
                                  thread-safe operation.
                                  Currently an experimental setting.],
    with_res_locks="yes",with_res_locks="no")

AC_ARG_WITH(root-access,
[
Configuring the agent:
  --without-root-access           The snmpd agent won't require root access to
                                  run it.  The information it returns in the
                                  mib-II tree may not be correct, however.])

AC_ARG_WITH(dummy-values,
[  --with-dummy-values             Provide 'placeholder' dummy values where
                                  the necessary information is not available.
                                  This is technically not compliant with the
                                  SNMP specifications, but was how the agent
                                  operated for versions < 4.0.])

AC_ARG_WITH(persistent-directory,
[  --with-persistent-directory=\"directory\"
                                  Default directory for persistent data storage.],ac_cv_user_prompt_PERSISTENT_DIRECTORY="$with_persistent_directory")

AC_ARG_WITH(sys_contact,
[  --with-sys-contact=\"who@where\"  Default system contact.
                                    (Default: LOGIN@DOMAINNAME)],
    ac_cv_user_prompt_SYS_CONTACT="$with_sys_contact")

AC_ARG_WITH(sys_location,
[  --with-sys-location=\"location\"  Default system location.
                                    (Default: Unknown)],
    ac_cv_user_prompt_SYS_LOC="$with_sys_location")

AC_ARG_WITH(logfile,
[  --with-logfile=\"location\"       Default log file location for snmpd.],
    ac_cv_user_prompt_LOGFILE="$with_logfile")

dnl This can't be within AC_ARG_WITH.  I don't want to read autoconf m4
dnl to find out why.
AC_SUBST(WRAPLIBS)

AC_ARG_WITH(mib_modules,
[  --with-mib-modules=\"item1 ...\"  Compile with additional mib modules
                                    (Space separated list).])

AC_ARG_WITH(out_mib_modules,
[  --with-out-mib-modules=\"list\"   Compile without these mib modules.

  Default mib modules compiled into the agent (which can be removed):
  
    mibII:                 support for the mib-II tree.
    snmpv3:                support for the snmpv3 mib modules.
    ucd_snmp:              ucd-snmp specific extensions.

  Optional mib modules that can be built into the agent include:
    host:                  host resources mib support.
                             (beta level code for linux, hpux, solaris, bsdi)
    smux:                  smux support to allow subagents to attach to snmpd.
    misc/ipfwacc:          accounting rules IP firewall information (linux).
    ipfwchains/ipfwchains: firewall chains under ipfw for linux.
                           (Download separately from the ucd-snmp ftp site.)
    target:                Support for the SNMP WGs TARGET-MIB.
    ucd-snmp/dlmod:        Dynamically loadable MIB modules.
    ucd-snmp/diskio:       Table of io-devices and how much data they have
                           read/written.  (only tested on Solaris)

  AgentX support:  (warning: beta code)
    agentx/client:         allows the agent to run as either a snmp agent
                           or as an agentX sub-agent.
    agentx/master:         makes the agent run as an agentX master agent
                           as well as a normal snmp agent.
    agentx:                includes both agentx/master and agentx/client.

  Optional modules for C coders to look at and/or include as extension examples:
  
    examples/ucdDemoPublic: SNMPv3 interoperability testing mib.
    examples/example:       example C code extension.])

dnl
dnl Catch common mistakes in configure options
dnl
AC_ARG_WITH(mib_module,,    AC_MSG_ERROR([ Invalid option. Use --with-mib-modules instead ])     )
AC_ARG_WITH(out_mib_module,,AC_MSG_ERROR([ Invalid option. Use --with-out-mib-modules instead ]) )

dnl
dnl otherwise prompted information
dnl
AC_ARG_WITH(defaults,
[
Miscellaneous:
  --with-defaults          Use defaults for prompted values.],
    defaults="yes",defaults="no")

dnl Only define if specifically chosen as --without (ie, default to true). 
if test "x$with_root_access" = "xno"; then
  AC_DEFINE(NO_ROOT_ACCESS)
fi

dnl Define unless specifically suppressed (ie, option defaults to false). 
if test "x$with_dummy_values" != "xyes"; then
  AC_DEFINE(NO_DUMMY_VALUES)
fi

dnl Only define if specifically chosen as --without (ie, default to true). 
if test "x$with_opaque_special_types" != "xno"; then
  AC_DEFINE(OPAQUE_SPECIAL_TYPES)
fi

dnl overflow problems with hpux's sh
dnl taken from Perl's Configure script 

echo $ac_n "Checking if I need to feed myself to ksh...  $ac_c" 1>&AC_FD_MSG
if test -f /hp-ux -a -f /bin/ksh; then
  if (PATH=.; alias -x) >/dev/null 2>&1; then
    echo "no"	1>&AC_FD_MSG
  else
    echo "yes"	1>&AC_FD_MSG
    if test "x$1" = "x"; then
      exec /bin/ksh $0
    else
      exec /bin/ksh $0 "$@"
    fi
  fi
else
  echo "no"	1>&AC_FD_MSG
fi

dnl libtool stuff for shared/static libraries.
AC_LIBTOOL_DLOPEN
AC_LIBTOOL_WIN32_DLL
AC_PROG_LIBTOOL

dnl Checks for programs.
AC_PROG_CC
AC_PROG_CPP
AC_PROG_INSTALL
AC_PROG_LN_S
AC_PROG_MAKE_SET
AC_PATH_PROG(PSPROG,ps)
AC_PATH_PROG(PERLPROG,perl)
AC_CHECK_PROGS(WHOAMI, whoami logname, whoami)
AC_CHECK_PROGS(SED,sed gsed)
AC_CHECK_PROG(AUTOCONF, autoconf)
AC_CHECK_PROG(AUTOHEADER, autoheader)
if test "x$test ac_cv_prog_AUTOCONF" = "x"; then
	AUTOCONF=":"
	AC_SUBST(AUTOCONF)
fi
if test "x$test ac_cv_prog_AUTOHEADER" = "x"; then
	AUTOHEADER=":"
	AC_SUBST(AUTOHEADER)
fi

AC_PATH_PROG(UNAMEPROG,uname)
AC_DEFINE_UNQUOTED(UNAMEPROG,"$UNAMEPROG")

AC_AIX

AC_C_CONST

dnl get version number.
AC_MSG_CHECKING(for ucd-snmp version number)
VERSION=`cat $srcdir/version.h | sed 's/";//;s/.*"//;s/pre/0./;'`
AC_SUBST(VERSION)
AC_MSG_RESULT($VERSION)

AC_MSG_CHECKING(for developer flags)
if test "x$developer" != "xno" -a -f $srcdir/remove-files; then
  dnl turn on the developer flag when taken from a CVS checkout (not a release)
  developer="yes"
fi

dnl super type checking
if test "x$developer" = "xyes" -a "x$ac_cv_prog_gcc" = "xyes"; then
  devflags="-Wall -Wstrict-prototypes -Wwrite-strings -Wcast-qual -Wno-unused -Wno-char-subscripts"
  CFLAGS="$CFLAGS $devflags"
else
  devflags="none"
fi
AC_MSG_RESULT($devflags)

dnl system check
AC_CANONICAL_SYSTEM
changequote(, )
PARTIALTARGETOS=`echo $target_os | sed 's/[-._].*//'`
CFLAGS="$CFLAGS -D$PARTIALTARGETOS"
changequote([, ])

dnl
dnl check for special includes and pick one
dnl

AC_MSG_CHECKING(for system include file)
changequote(, )
filebase=$target_os
while test "x$filebase" != "x$last" -a ! -f $srcdir/s/$filebase.h
do
    last=$filebase
    filebase=`echo $filebase | sed 's/[-._][^-._]*$//'`
    if test "x$filebase" = "x$last"; then
	filebase=`echo $filebase | sed 's/[0-9]*$//'`
    fi
done

if test "x$filebase" = "x$last"; then
    filebase="generic"
fi
ac_cv_SYSTEM_INCLUDE_FILE="s/$filebase.h"

changequote([, ])
AC_MSG_RESULT($ac_cv_SYSTEM_INCLUDE_FILE)
AC_DEFINE_UNQUOTED(SYSTEM_INCLUDE_FILE, "$ac_cv_SYSTEM_INCLUDE_FILE")

dnl second part, the CPU type.

AC_MSG_CHECKING(for machine-type include file)
changequote(, )
filebase=$target_cpu
while test "x$filebase" != "x$last" -a ! -f $srcdir/m/$filebase.h
do
    last=$filebase
    filebase=`echo $filebase | sed 's/[-._][^-._]*$//'`
done

if test "x$filebase" = "x$last"; then
    filebase="generic"
fi
ac_cv_MACHINE_INCLUDE_FILE="m/$filebase.h"
AC_MSG_RESULT($ac_cv_MACHINE_INCLUDE_FILE)

changequote([, ])
AC_DEFINE_UNQUOTED(MACHINE_INCLUDE_FILE, "$ac_cv_MACHINE_INCLUDE_FILE")

AC_PATH_PROG(CCPATH,$CC)
dnl watch out for /usr/ucb/cc on solaris, it doesn't work with this package.
case $target_os in
    bsdi*)
	if test "x$CCPATH" = "x/usr/ucb/cc" -o "x$CCPATH" = "x/usr/bin/cc"; then
	    AC_MSG_ERROR([

*** The BSDI /usr/ucb/cc compiler does not work with this package.  
*** Please run configure with --with-cc=gcc
])
	fi
    ;;
    solaris*)
	if test "x$CCPATH" = "x/usr/ucb/cc"; then
	    AC_MSG_ERROR([

*** The solaris /usr/ucb/cc compiler does not work with this package.  
*** Please put a different compiler in your path first or run
*** configure with --with-cc=XX, where XX is the compiler you want to use.
])
	fi
    ;;
esac
    
AC_MSG_CHECKING(for additional cpp flags)
dnl gcc extra CPPFLAGS
if test "x$GCC" = "xyes" -a "x$CPP" = "x$CC -E"; then
  dnl extra cpp flags for gnu c compiler to allow .in file extensions.
  EXTRACPPFLAGS="-x c"
else
  EXTRACPPFLAGS=""
fi

dnl Solaris extra cpp flags.
if test "x$GCC" != "xyes"; then
  case $target_os in
    solaris*) EXTRACPPFLAGS="$EXTRACPPFLAGS -Xs" ;;
  esac
fi

AC_SUBST(EXTRACPPFLAGS)
AC_MSG_RESULT($EXTRACPPFLAGS)

dnl Prefixes must begin with "/"

if test "x$prefix" = "xNONE"; then
  prefix=/usr/local
fi

fch=`echo $prefix | sed 's/\(.\).*/\1/'`
if test $fch != "/" ; then
   prefix=`pwd`/$prefix
   echo "adjusting prefix to $prefix"
fi

if test "x$exec_prefix" = "xNONE"; then
  exec_prefix=$prefix
fi

fch=`echo $exec_prefix | sed 's/\(.\).*/\1/'`
if test $fch != "/" ; then
   exec_prefix=`pwd`/$exec_prefix
   echo "adjusting exec_prefix to $exec_prefix"
fi

dnl Set SNMPLIBPATH & SNMPSHAREPATH

SNMPLIBPATH=""
tmpset="$libdir/snmp"
while test "x$tmpset" != "x$SNMPLIBPATH"; do
  SNMPLIBPATH="$tmpset"
  eval tmpset="$tmpset"
done
AC_DEFINE_UNQUOTED(SNMPLIBPATH,"$SNMPLIBPATH")
AC_DEFINE_UNQUOTED(SNMPDLMODPATH,"$SNMPLIBPATH/dlmod")

SNMPSHAREPATH=""
tmpset="$datadir/snmp"
while test "x$tmpset" != "x$SNMPSHAREPATH"; do
  SNMPSHAREPATH="$tmpset"
  eval tmpset="$tmpset"
done
AC_DEFINE_UNQUOTED(SNMPSHAREPATH,"$SNMPSHAREPATH")

if test "x$DEFAULT_MIBDIRS" = "x"; then
  AC_DEFINE_UNQUOTED(DEFAULT_MIBDIRS,"\$HOME/.snmp/mibs:$SNMPSHAREPATH/mibs")
fi

SNMPCONFPATH=""
tmpset="$sysconfdir/snmp"
while test "x$tmpset" != "x$SNMPCONFPATH"; do
  SNMPCONFPATH="$tmpset"
  eval tmpset="$tmpset"
done
AC_DEFINE_UNQUOTED(SNMPCONFPATH,"$SNMPCONFPATH")

dnl guess IPv6 stack type.
if test "x$enable_ipv6" = "xyes"; then
	v6type=unknown
	v6lib=none
	v6trylibc=no

	AC_MSG_CHECKING([ipv6 stack type])
	for i in v6d toshiba kame inria zeta linux-glibc linux-inet6; do
		case $i in
		v6d)
			AC_EGREP_CPP(yes, [dnl
#include </usr/local/v6/include/sys/types.h>
#ifdef __V6D__
yes
#endif],
				[v6type=$i; v6lib=v6;
				v6libdir=/usr/local/v6/lib;
				CFLAGS="-I/usr/local/v6/include $CFLAGS"])
			;;
		toshiba)
			AC_EGREP_CPP(yes, [dnl
#include <sys/param.h>
#ifdef _TOSHIBA_INET6
yes
#endif],
				[v6type=$i; v6lib=inet6;
				v6libdir=/usr/local/v6/lib;
				CFLAGS="-DINET6 $CFLAGS"])
			;;
		kame)
			AC_EGREP_CPP(yes, [dnl
#include <netinet/in.h>
#ifdef __KAME__
yes
#endif],
				[v6type=$i; v6lib=inet6;
				v6libdir=/usr/local/v6/lib;
				v6trylibc=yes;
				CFLAGS="-DINET6 $CFLAGS"])
			;;
		inria)
			AC_EGREP_CPP(yes, [dnl
#include <netinet/in.h>
#ifdef IPV6_INRIA_VERSION
yes
#endif],
				[v6type=$i;
				v6lib=dummy;
				v6libdir=none;
				v6trylibc=yes;
				CFLAGS="-DINET6 $CFLAGS"])
			;;
		zeta)
			AC_EGREP_CPP(yes, [dnl
#include <sys/param.h>
#ifdef _ZETA_MINAMI_INET6
A
yes
#endif],
				[v6type=$i; v6lib=inet6;
				v6libdir=/usr/local/v6/lib;
				CFLAGS="-DINET6 $CFLAGS"])
			;;
		linux-glibc)
			AC_EGREP_CPP(yes, [dnl
#include <features.h>
#if defined(__GLIBC__) && ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 1) || (__GLIBC_ > 2))
yes
#endif],
				[v6type=$i;
				v6lib=dummy;
				v6libdir=none;
				v6trylibc=yes;
				CFLAGS="-DINET6 $CFLAGS"])
			;;
		linux-inet6)
			if test -d /usr/inet6; then
				v6type=$i
				v6lib=inet6
				v6libdir=/usr/inet6/lib
				CFLAGS="-DINET6 $CFLAGS"
			fi
			;;
		esac
		if test "$v6type" != "unknown"; then
			break
		fi
	done

	if test "$v6lib" != "none"; then
		if test -d $v6libdir -a -f $v6libdir/lib$v6lib.a; then
			LIBS="-L$v6libdir -l$v6lib $LIBS"
			enable_ipv6="yes"
			AC_MSG_RESULT(["$v6type, $enable_ipv6, using lib$v6lib"])
		elif test "$v6trylibc" = "yes"; then
			enable_ipv6="yes"
			AC_MSG_RESULT(["$v6type, $enable_ipv6, using libc"])
		else
			echo
			echo "Fatal: no IPv6 library lib$v6lib.a found."
			exit 1
		fi
	else
		enable_ipv6="no"
		AC_MSG_RESULT(["$v6type, $enable_ipv6"])
	fi
fi

dnl
dnl Maybe add library extensions for thread mutex locking.
dnl

if test "x$with_res_locks" = "xyes"; then

    cat >> confdefs.h <<\EOF
#define _REENTRANT 1
EOF

    case $target_os in

    aix*)
	CC_RUNTIME_ARG="$CC_RUNTIME_ARG -lpthreads"
	;;

    *)
	;;

    esac
fi

AC_MSG_CHECKING(whether we have to build PIC code)
echo "$with_mib_modules" | grep "ucd-snmp/dlmod" >/dev/null
if test $? -eq 0 ; then
	DLLIBS="-ldl"
        LIB_CFLAGS="$LIB_CFLAGS $SHLIB_CFLAGS"
	AC_MSG_RESULT(yes)
else
	DLLIBS=""
	AC_MSG_RESULT(no)
fi

dnl
dnl Do hairy agent module processing.
dnl
changequote(, )
AC_MSG_CHECKING(for and configuring mib modules to use)

mibdir="agent/mibgroup"
module_list=""
module_list_code=""
new_with_mib_modules=`echo $with_mib_modules | sed 's/,/ /g;'`
new_with_out_mib_modules=`echo $with_out_mib_modules | sed 's/,/ /g;'`
new_module_list="mibII ucd_snmp snmpv3mibs $new_with_mib_modules"
default_mibs=IP-MIB:IF-MIB:TCP-MIB:UDP-MIB:SNMPv2-MIB:RFC1213-MIB

if test "x$mini_agent" = "xyes"; then
new_with_out_mib_modules="mibII $new_without_mib_modules"
new_module_list="snmpv3mibs mibII/snmp_mib mibII/system_mib mibII/sysORTable examples/ucdDemoPublic mibII/vacm_vars $new_with_mib_modules"
default_mibs=SNMPv2-MIB:RFC1213-MIB
default_mibs_install=" "
fi


if test "x$enable_ipv6" = "xyes"; then
	new_module_list="$new_module_list mibII/ipv6"
fi

dnl Create include file list for snmp_vars.h to use.
if test ! -d agent; then
  mkdir agent
fi
if test ! -d agent/mibgroup; then
  mkdir agent/mibgroup
fi
for i in $mibdir/mib_module_includes.h $mibdir/mib_module_inits.h $mibdir/mib_module_shutdown.h mib_module_config.h $mibdir/mib_module_dot_conf.h; do
  rm -f $i
  echo "/* This file is automatically generated by configure.  Do not modify by hand. */" > $i
done

test_modules="$new_module_list"
new_module_list=""
module_list_h=""

for i in $test_modules
 do
  if echo " $new_with_out_mib_modules " | grep " $i " > /dev/null; then
    :
  else
    new_module_list="$new_module_list $i"
  fi
done

AC_MSG_RESULT($new_module_list.)

AC_MSG_CHECKING(for and configuring mib modules pieces to use)
while test "x$new_module_list" != "x"; do
  for i in $new_module_list
    do
    if echo " $new_with_out_mib_modules " | grep " $i " > /dev/null; then
      :
    else
      if test -f $srcdir/$mibdir/$i.h; then
        new_list=""
        new_list_arch=`grep config_arch_require $srcdir/$mibdir/$i.h | sed 's/.*config_arch_require(\(.*\), *\(.*\)).*/\1-xarchx-\2/'`
	if test "x$new_list_arch" != "x"; then
          for j in $new_list_arch
	    do
	    archtest=`echo $j | sed 's/-xarchx-.*//'`
	    if test "x$target_os" = "x$archtest" -o "x$PARTIALTARGETOS" = "x$archtest"; then
	      new_list="$new_list `echo $j | sed 's/.*-xarchx-//'`"
	    fi
	  done
	fi
	new_list="$new_list `grep config_require $srcdir/$mibdir/$i.h | sed 's/.*config_require(\(.*\)).*/\1/'`"
	if test "x$new_list" != "x"; then
	  for j in $new_list
	    do
	    if test ! -f $srcdir/$mibdir/$j.h; then
	      AC_MSG_ERROR(mib module "$i" requires module "$j" but $j.h or $j.c could not be found in $srcdir/$mibdir)
	    elif echo " $new_with_out_mib_modules " | grep " $j " > /dev/null; then
	      AC_MSG_WARN(mib module "$i" requires module "$j" but you told me to compile without it)
	    elif echo " $module_list $new_list_two $new_module_list " | grep " $j " > /dev/null; then
	      :
	    else
	      new_list_two="$new_list_two $j"
	    fi
	  done
	fi
	new_mibs=`grep config_add_mib $srcdir/$mibdir/$i.h | sed 's/.*config_add_mib(\(.*\)).*/\1/'`
	if test "x$new_mibs" != "x"; then
	    for j in $new_mibs
		do
		if test "x`echo :$default_mibs: | grep :$j:`" = "x"; then
		    default_mibs="$default_mibs:$j"
		fi
		if test -f $srcdir/mibs/$j.txt; then
		    if echo $default_mibs_install | grep " $j " > /dev/null; then
			    :
		    else
			    default_mibs_install="$default_mibs_install $j.txt"
		    fi
		fi
	    done
	fi
      else
	AC_MSG_ERROR(module files $i.h or $i.c could not be found in $srcdir/$mibdir)
      fi
      module_list="$module_list $i"
      echo '#include "'"mibgroup/$i.h"'"' >> $mibdir/mib_module_includes.h
      module_list_h="$module_list_h mibgroup/$i.h"
      if test -f $srcdir/$mibdir/$i.c; then
        module_list_code="$module_list_code $i"
        mnm=`echo $i | sed 's/.*\///;s/\.c$//;'`
	if grep init_$mnm $srcdir/$mibdir/$i.c > /dev/null; then
	    echo "  init_$mnm();" >> $mibdir/mib_module_inits.h
	fi
	if grep shutdown_`basename $i` $srcdir/$mibdir/$i.c > /dev/null; then
	    echo "  shutdown_`basename $i`();" >> $mibdir/mib_module_shutdown.h
	fi
      fi
      if test "x`echo $i | sed 's/\///g;'`" != "x$i"; then
	mnd=`echo $i | sed 's/\/[^/]*$//;'`
	if test ! -d ./$mibdir/$mnd; then
	    module_directories="$module_directories ./$mibdir/$mnd"
	fi
      fi
      if grep config_load_mib $srcdir/$mibdir/$i.h > /dev/null 2>&1; then
      	AC_MSG_WARN(mib module "$i" uses the "config_load_mib" directive, which is no longer supported.  It probably won't work.)
      fi
      grep config_parse_dot_conf $srcdir/$mibdir/$i.h | sed 's@.*config_parse_dot_conf(\([^)]*\), *\([^),]*\), *\([^),]*\), *\([^),]*\)).*@register_config_handler("snmpd",\1, \2, \3, \4);@' >> $mibdir/mib_module_dot_conf.h
      sym="`echo ${i} | sed 's/[^a-zA-Z0-9_]/_/g' | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`"
      echo "/* Define if compiling with the ${i} module files.  */" >> mib_module_config.h
      echo "#define USING_${sym}_MODULE 1" >> mib_module_config.h
      echo " " >> mib_module_config.h
      echo $ac_n " $i$ac_c" 1>&AC_FD_MSG
    fi
  done
  new_module_list="$new_list_two"
  new_list_two=""
done
module_list_o=`echo "$module_list_code " | sed 's/\([^ ]\) /\1.o /g'`
module_list_lo=`echo "$module_list_code " | sed 's/\([^ ]\) /\1.lo /g'`
module_list_c=`echo "$module_list_code " | sed 's/\([^ ]\) /\1.c /g'`
mibgroup_list_o=`echo " $module_list_o " | sed 's@ \([^ ]*\)\.o@ mibgroup/\1.o @g'`
mibgroup_list_lo=`echo " $module_list_lo " | sed 's@ \([^ ]*\)\.lo@ mibgroup/\1.lo @g'`
changequote([, ])
AC_SUBST(module_list_c)
AC_SUBST(module_list_h)
AC_SUBST(module_list_o)
AC_SUBST(module_list_lo)
AC_SUBST(mibgroup_list_o)
AC_SUBST(mibgroup_list_lo)
AC_SUBST(default_mibs_install)

AC_MSG_RESULT(.)

AC_MSG_CHECKING(if directories neeed to be created)
for i in $module_directories; do
  $srcdir/mkinstalldirs $i
done
AC_MSG_RESULT(.)

AC_MSG_CHECKING(default mib files to read)
if test "x$DEFAULT_MIBS" = "x"; then
  DEFAULT_MIBS="$default_mibs"
fi
AC_DEFINE_UNQUOTED(DEFAULT_MIBS,"$DEFAULT_MIBS")
AC_MSG_RESULT($DEFAULT_MIBS)

dnl
dnl Check for kernel location
dnl

AC_CACHE_CHECK(for location of system kernel,ac_cv_KERNEL_LOC,
[ac_cv_KERNEL_LOC="unknown"
dnl First determine if test expects a -f or a -c (character device (SYSV))

if test -c /dev/null; then
  CFLAG="-c"
elif test -f /dev/null; then
  CFLAG="-f"
else
  dnl fall back
  CFLAG="-f"
fi
for i in /vmunix /hp-ux /stand/vmunix /dev/ksyms /kernel/unix /kernel/genunix /netbsd /unix /kernel /bsd
  do
  if test -f $i -o $CFLAG $i; then
    ac_cv_KERNEL_LOC="$i"
    break;
  fi
done
if test $i = "unknown"; then
  AC_MSG_WARN(Can't find system kernel...  Setting to /vmunix)
  ac_cv_KERNEL_LOC="/vmunix"
fi
])

AC_DEFINE_UNQUOTED(KERNEL_LOC,"$ac_cv_KERNEL_LOC")

dnl
dnl Check for mount table location
dnl

AC_CACHE_CHECK(for mount table location,ac_cv_ETC_MNTTAB,
[ac_cv_ETC_MNTTAB="unknown"
for i in /etc/mnttab /etc/mtab
  do
  if test -f $i; then
    ac_cv_ETC_MNTTAB="$i"
    break;
  fi
done
])

AC_DEFINE_UNQUOTED(ETC_MNTTAB,"$ac_cv_ETC_MNTTAB")

dnl Check for /dev/dmem or /dev/drum location
AC_CACHE_CHECK(for location of swap device,ac_cv_DMEM_LOC,
[
dnl First determine if test expects a -f or a -c (character device (SYSV))

if test -f /dev/kmem; then
  CTEST="test -f"
elif test -c /dev/kmem; then
  CTEST="test -c"
else
  dnl fall back
  CTEST="test -f"
fi

if $CTEST /dev/dmem; then
  ac_cv_DMEM_LOC="/dev/dmem"
elif $CTEST /dev/drum; then
  ac_cv_DMEM_LOC="/dev/drum"
else
  ac_cv_DMEM_LOC="none"
fi
])

if test "x$ac_cv_DMEM_LOC" != "xnone"; then
  AC_DEFINE_UNQUOTED(DMEM_LOC,"$ac_cv_DMEM_LOC")
fi

dnl efence
if test "x$developer" = "xyes" -a "x$use_efence" != "xno"; then
    use_efence="yes"
fi

if test "x$use_efence" = "xyes"; then
    AC_CHECK_LIB(efence, EF_Exit)
fi

dnl Checks for libraries.
dnl AC_CHECK_LIB(des, main)
AC_CHECK_LIB(elf, nlist)
AC_CHECK_LIB(m, asin)

dnl On some platforms (Irix) libnsl and libsocket should not be used.
AC_CHECK_FUNC(gethostbyname, AC_DEFINE(HAVE_GETHOSTBYNAME),
	AC_CHECK_LIB(nsl, gethostbyname, AC_DEFINE(HAVE_GETHOSTBYNAME)
	LIBS="${LIBS} -lnsl"))
AC_CHECK_FUNC(getservbyname, AC_DEFINE(HAVE_GETSERVBYNAME),
	AC_CHECK_LIB(socket, getservbyname, AC_DEFINE(HAVE_GETSERVBYNAME)
	LIBS="${LIBS} -lsocket"))

dnl AC_CHECK_LIB(ucb, bzero)

dnl check for tcp wrapper support
_cppflags="${CPPFLAGS}"
_ldflags="${LDFLAGS}"

AC_ARG_WITH(libwrap,
[  --with-libwrap[=LIBPATH] Compile in libwrap (tcp_wrappers) support.],[
  if test "$with_libwrap" != "no" -a "$with_libwrap" != "yes"; then
    CPPFLAGS="${CPPFLAGS} -I$with_libwrap/include"
    LDFLAGS="${LDFLAGS} -L$with_libwrap/lib"
  fi

  _libs=${LIBS}
  AC_CHECK_HEADER(tcpd.h,
      LIBS="$LIBS -lwrap"
      AC_MSG_CHECKING(for TCP wrappers library -lwrap)
      AC_TRY_LINK([#include <tcpd.h>
int allow_severity = 0;
int deny_severity  = 0;
],[hosts_access()],
	  AC_MSG_RESULT(yes)
	  AC_DEFINE(USE_LIBWRAP)
	  test "$with_libwrap" != no && WRAPLIBS="-L$with_libwrap/lib"
	  WRAPLIBS="$WRAPLIBS -lwrap",
	  AC_MSG_RESULT(no)
	  dnl Linux RedHat 6.1 won't link libwrap without libnsl
	  AC_CHECK_FUNC(yp_get_default_domain, ,
	      AC_CHECK_LIB(nsl, yp_get_default_domain))
	  AC_MSG_CHECKING(for TCP wrappers library -lwrap linked with -lnsl)
	  AC_TRY_LINK([#include <tcpd.h>
int allow_severity = 0;
int deny_severity  = 0;
],[hosts_access()],
	      AC_MSG_RESULT(yes)
	      test "$with_libwrap" != no && WRAPLIBS="-L$with_libwrap/lib"
	      WRAPLIBS="$WRAPLIBS -lwrap", AC_MSG_RESULT(no)),
	  CPPFLAGS=${_cppflags}),
      CPPFLAGS=${_cppflags})
  LDFLAGS=${_ldflags}
  LIBS=${_libs}
])

dnl ARG.  RPM is a real pain.
AC_CHECK_LIB(popt, poptParseArgvString)

dnl zlib is required for newer versions of rpm
_cppflags="${CPPFLAGS}"
_ldflags="${LDFLAGS}"

AC_ARG_WITH(zlib,
[  --with-zlib[=DIR]        use libz in DIR],[
  if test -d "$withval"; then
    CPPFLAGS="${CPPFLAGS} -I$withval/include"
    LDFLAGS="${LDFLAGS} -L$withval/lib"
  fi
])

AC_CHECK_HEADER(zlib.h,
    AC_CHECK_LIB(z, gzread, , CPPFLAGS=${_cppflags} LDFLAGS=${_ldflags}),
    CPPFLAGS=${_cppflags} LDFLAGS=${_ldflags})

dnl
dnl with rpm3 or higher, we need db1 to exist
dnl

AC_CHECK_LIB(db1, dbopen,[
  AC_DEFINE(HAVE_LIBDB)
  LIBS="-ldb1 $LIBS"
],,-lz)

dnl Ok, -ldb1 may not exist, try -ldb
_cppflags="${CPPFLAGS}"
_ldflags="${LDFLAGS}"

AC_ARG_WITH(db,
[  --with-db[=DIR]          use db in DIR],[
  if test -d "$withval"; then
    CPPFLAGS="${CPPFLAGS} -I$withval/include"
    LDFLAGS="${LDFLAGS} -L$withval/lib"
  fi
])

if test "x$ac_cv_lib_db1_dbopen" = "xno"; then
  AC_CHECK_HEADER(db.h,
    AC_CHECK_LIB(db, dbopen,[
    AC_DEFINE(HAVE_LIBDB)
    LIBS="-ldb $LIBS"
  ], CPPFLAGS=${_cppflags} LDFLAGS=${_ldflags}),
  CPPFLAGS=${_cppflags} LDFLAGS=${_ldflags})
fi

dnl
dnl now check for rpm using the appropriate db library
dnl
AC_CHECK_LIB(rpm, rpmdbOpen,[
  AC_DEFINE(HAVE_LIBRPM)
  LIBS="-lrpm $LIBS"
  CFLAGS="$CFLAGS -I/usr/include/rpm"
],,-lz)


dnl Replace `main' with a function in -lkstat:
AC_CHECK_LIB(kstat, kstat_lookup)
dnl Replace `main' with a function in -lkvm:
AC_CHECK_LIB(kvm, kvm_read)
dnl Check for nlist in mld (irix)
AC_CHECK_LIB(mld, nlist)
dnl Check for security related functions
if test "x$with_openssl" != "xno"; then
    AC_CHECK_LIB(crypto, EVP_md5)
fi

dnl Checks for header files.
AC_HEADER_STDC
AC_HEADER_DIRENT
AC_HEADER_SYS_WAIT
AC_CHECK_HEADERS(stdarg.h string.h fcntl.h limits.h sys/file.h sys/ioctl.h syslog.h unistd.h netinet/tcpip.h netinet/in.h netinet/ip.h net/if.h netdb.h sys/dmap.h machine/pte.h xti.h sys/sockio.h sys/socket.h sys/un.h fstab.h sys/fs.h mtab.h ufs/fs.h ufs/ffs/fs.h sys/fixpoint.h machine/param.h sys/vm.h vm/vm.h sys/vmmeter.h sys/vmparam.h sys/vmmac.h sys/vmsystm.h sys/mbuf.h sys/time.h sys/swap.h inet/mib2.h sys/statvfs.h sys/vfs.h sys/mnttab.h sys/user.h sys/proc.h sys/select.h mntent.h sys/mntent.h kstat.h utsname.h sys/utsname.h sys/cdefs.h getopt.h locale.h pthread.h sys/loadavg.h regex.h)
dnl FreeBSD required headers
AC_CHECK_HEADERS(malloc.h sys/param.h net/if_dl.h sys/sysctl.h stdlib.h net/if_mib.h net/if_types.h net/if_var.h sys/queue.h osreldate.h sys/disklabel.h machine/types.h sys/socketvar.h)
dnl Linux
AC_CHECK_HEADERS(sys/conf.h netinet/in_systm.h netinet/tcp.h netinet/udp.h netinet/in_var.h netinet/in_pcb.h netinet/if_ether.h netinet/ip_var.h netinet/tcp_timer.h netinet/tcp_var.h netinet/tcp_fsm.h netinet/udp_var.h netinet/icmp_var.h sys/protosw.h nlist.h ioctls.h asm/page.h)
dnl NetBSD required headers
AC_CHECK_HEADERS(arpa/inet.h kvm.h sys/pool.h)
dnl BSDi2 headers
AC_CHECK_HEADERS(sys/mount.h vm/swap_pager.h ufs/ufs/dinode.h)
dnl BSDi3 headers
AC_CHECK_HEADERS(sys/stat.h sys/vnode.h ufs/ufs/quota.h ufs/ufs/inode.h)
dnl irix headers
AC_CHECK_HEADERS(sys/hashing.h sys/tcpipstats.h sys/sysmp.h)
dnl from smux stuff
AC_CHECK_HEADERS(err.h sys/filio.h sgtty.h)
dnl AIX needs this for statfs func
AC_CHECK_HEADERS(sys/statfs.h)
dnl Dynix
AC_CHECK_HEADERS(net/route.h)
dnl for HostRes (HP-UX at least)
AC_CHECK_HEADERS(sys/dkio.h sys/diskio.h sys/pstat.h linux/hdreg.h pkglocs.h)
dnl WIN32
AC_CHECK_HEADERS(winsock.h io.h)
dnl SCO
AC_CHECK_HEADERS(sys/stream.h)
dnl KAME
AC_CHECK_HEADERS(netinet/ip6.h netinet6/in6_var.h netinet6/in6_pcb.h netinet6/ip6_var.h netinet6/tcp6.h netinet6/tcp6_fsm.h netinet6/nd6.h netinet6/tcp6_timer.h netinet6/tcp6_var.h)

dnl OpenSSL
AC_CHECK_HEADERS(openssl/hmac.h openssl/evp.h)

dnl Printing
AC_PATH_PROG(LPSTAT_PATH,lpstat)
if test x$LPSTAT_PATH != x; then
    AC_DEFINE_UNQUOTED(LPSTAT_PATH,"$LPSTAT_PATH")
    AC_DEFINE(HAVE_LPSTAT)
fi
AC_CHECK_FUNCS(cgetnext)
if test -r /etc/printcap; then
    AC_DEFINE(HAVE_PRINTCAP)
fi

AC_MSG_CHECKING(for authentication support)
if test "x$ac_cv_lib_crypto_EVP_md5" != "xyes" -o "x$ac_cv_header_openssl_hmac_h" != "xyes" -o "x$ac_cv_header_openssl_hmac_h" != "xyes"; then
dnl if OpenSSL is not found, default to using internal md5 support.
    AC_DEFINE(USE_INTERNAL_MD5)
    AC_MSG_RESULT(Internal MD5 Support)
    if test "x$tryopenssl" = "xyes"; then
	AC_MSG_WARN(Asked to use OpenSSL but I couldn't find it.)
    fi
else
    if test "x$tryopenssl" = "xno"; then
	AC_DEFINE(USE_INTERNAL_MD5)
	AC_MSG_RESULT(Internal MD5 Support)
    else
	AC_DEFINE(USE_OPENSSL)
	AC_MSG_RESULT(OpenSSL Support)
    fi
fi

dnl Checks for typedefs, structures, and compiler characteristics.
AC_TYPE_OFF_T
AC_TYPE_PID_T
AC_HEADER_TIME

dnl AIX keeps in_addr_t in /usr/include/netinet/in.h
AC_MSG_CHECKING(for in_addr_t)
AC_CACHE_VAL(ac_cv_type_$1,
[AC_EGREP_CPP(dnl
changequote(<<,>>)dnl
<<in_addr_t[^a-zA-Z_0-9]>>dnl
changequote([,]), [#include <sys/types.h>
#if STDC_HEADERS
#include <stdlib.h>
#include <stddef.h>
#endif
#ifdef HAVE_NETINET_IN_H
#include <netinet/in.h>
#endif], ac_cv_type_in_addr_t=yes, ac_cv_type_in_addr_t=no)])dnl

AC_MSG_RESULT($ac_cv_type_in_addr_t)
if test $ac_cv_type_in_addr_t = no; then
  AC_DEFINE(in_addr_t, u_int)
fi

dnl Check ps args
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"
else
  AC_MSG_WARN(Unable to determine valid ps flags...  defaulting...)
  ac_cv_ps_flags="-acx"
fi
])

AC_DEFINE_UNQUOTED(PSCMD, "$PSPROG $ac_cv_ps_flags")

dnl Checks for byte order
AC_C_BIGENDIAN

dnl Checks for library functions.
AC_FUNC_ALLOCA
AC_PROG_GCC_TRADITIONAL
AC_FUNC_MEMCMP
AC_TYPE_SIGNAL
AC_FUNC_GETMNTENT
AC_CHECK_FUNCS(setmntent gethostname uname gettimeofday select socket strtol)
AC_CHECK_FUNCS(strchr strdup memcpy memmove index bcopy strcasestr regcomp)
AC_CHECK_FUNCS(signal sigset sigblock sighold strerror setenv vsnprintf)
AC_CHECK_FUNCS(sigaction)
AC_CHECK_FUNCS(snprintf)
AC_CHECK_FUNCS(random lrand48 rand)
AC_CHECK_FUNCS(execv system fork getpid strncasecmp sigalrm)
AC_CHECK_FUNCS(rpmGetPath)

AC_CHECK_FUNCS(getloadavg)
AC_CHECK_FUNCS(kvm_openfiles nlist knlist)
dnl BSDi2 functions differ
AC_CHECK_FUNCS(statvfs statfs)
AC_CHECK_FUNCS(getdtablesize)
dnl freebsd2 checks
AC_CHECK_FUNCS(getfsstat kvm_getprocs)
AC_CHECK_FUNCS(usleep)
AC_CHECK_FUNCS(setlocale)
AC_CHECK_FUNCS(tcgetattr)
AC_CHECK_FUNCS(if_nameindex if_freenameindex)
dnl solaris checks
AC_CHECK_FUNCS(getpagesize)

AC_MSG_CHECKING([for SIOCGIFADDR in sys/ioctl.h])
AC_CACHE_VAL(cv_sys_ioctl_h_has_SIOCGIFADDR,
[ AC_EGREP_CPP(xxxyesxxx,
[
#ifdef HAVE_SYS_IOCTL_H
#include <sys/ioctl.h>
#endif
#ifdef SIOCGIFADDR
xxxyesxxx
#endif
], cv_sys_ioctl_h_has_SIOCGIFADDR=yes, cv_sys_ioctl_h_has_SIOCGIFADDR=no)])
AC_MSG_RESULT($cv_sys_ioctl_h_has_SIOCGIFADDR)
if test $cv_sys_ioctl_h_has_SIOCGIFADDR = yes; then
  AC_DEFINE(SYS_IOCTL_H_HAS_SIOCGIFADDR)
fi

# ultrix
AC_MSG_CHECKING([for two-argument statfs with struct fs_data (Ultrix)])
AC_CACHE_VAL(fu_cv_sys_stat_fs_data,
[AC_TRY_RUN([#include <sys/types.h>
#ifdef HAVE_SYS_PARAM_H
#include <sys/param.h>
#endif
#ifdef HAVE_SYS_MOUNT_H
#include <sys/mount.h>
#endif
#ifdef HAVE_SYS_FS_TYPES_H
#include <sys/fs_types.h>
#endif
main ()
{
struct fs_data fsd;
/* Ultrix's statfs returns 1 for success,
   0 for not mounted, -1 for failure.  */
exit (statfs (".", &fsd) != 1);
}],
fu_cv_sys_stat_fs_data=yes,
fu_cv_sys_stat_fs_data=no,
fu_cv_sys_stat_fs_data=no)])
AC_MSG_RESULT($fu_cv_sys_stat_fs_data)
if test $fu_cv_sys_stat_fs_data = yes; then
  AC_DEFINE(STAT_STATFS_FS_DATA)
fi

dnl check if compiler pre-processor defines __FUNCTION__
AC_CACHE_CHECK(if __FUNCTION__ is defined,ac_cv_HAVE_CPP_UNDERBAR_FUNCTION_DEFINED,
[
AC_TRY_COMPILE(,[
    char *cp = __FUNCTION__;
], ac_cv_HAVE_CPP_UNDERBAR_FUNCTION_DEFINED=yes, ac_cv_HAVE_CPP_UNDERBAR_FUNCTION_DEFINED=no)])

if test "x$ac_cv_HAVE_CPP_UNDERBAR_FUNCTION_DEFINED" = "xyes"; then
  AC_DEFINE(HAVE_CPP_UNDERBAR_FUNCTION_DEFINED)
fi

AC_CHECK_STRUCT_FOR([
#include <sys/types.h>
#include <sys/signal.h>
], sigaction, sa_sigaction, no)

AC_CHECK_STRUCT_FOR([
#include <sys/types.h>
#define KERNEL
#define _KERNEL
#include <sys/socket.h>
#undef KERNEL
#undef _KERNEL
], sockaddr, sa_len, no)

AC_CHECK_STRUCT_FOR([
#include <sys/types.h>
#define KERNEL
#define _KERNEL
#include <sys/socket.h>
#undef KERNEL
#undef _KERNEL
], sockaddr, sa_union.sa_generic.sa_family2, no)

AC_CHECK_STRUCT_FOR([
#include <sys/types.h>
#define KERNEL
#define _KERNEL
#include <sys/socket.h>
#undef KERNEL
#undef _KERNEL
#include <net/route.h>
], rtentry, rt_dst, no)

dnl checking for 4.3 vs 4.4 rtentry.
AC_CACHE_CHECK(type of rtentry structure,ac_cv_RTENTRY_TYPE,
[

dnl 4.4 compat
AC_TRY_COMPILE([
#include <sys/types.h>
#define KERNEL
#define _KERNEL
#include <sys/socket.h>
#undef KERNEL
#undef _KERNEL
#include <net/route.h>
],[

#ifndef STRUCT_RTENTRY_HAS_RT_DST
#define rt_dst rt_nodes->rn_key
#endif

  struct rtentry rt; 
  rt.rt_nodes[0].rn_b = 1;
  rt.rt_dst;
  ], ac_cv_RTENTRY_TYPE="BSD-4.4")

dnl 4.3 compat
if test "x$ac_cv_RTENTRY_TYPE" = "x"; then
AC_TRY_COMPILE([
#include <sys/types.h>
#define KERNEL
#define _KERNEL
#include <sys/socket.h>
#undef KERNEL
#undef _KERNEL
#include <net/route.h>
],[
struct rtentry rt; 
rt.rt_hash;
], ac_cv_RTENTRY_TYPE="BSD-4.3")
fi

dnl else ack.
if test "x$ac_cv_RTENTRY_TYPE" = "x"; then
  AC_MSG_WARN(Unknown)
  ac_cv_RTENTRY_TYPE="unknown"
fi

])

if test "x$ac_cv_RTENTRY_TYPE" = "xBSD-4.4"; then
  AC_DEFINE(RTENTRY_4_4)
fi

dnl checking for alpha's ortentry vs rtentry
if test "x$ac_cv_RTENTRY_TYPE" = "xunknown"; then
AC_CACHE_CHECK(for struct rtentry, ac_cv_struct_rtentry,
[AC_EGREP_CPP(ortentry, [#define KERNEL
#include<net/route.h>
],  ac_cv_struct_rtentry=ortentry,  ac_cv_struct_rtentry=rtentry )
if test "x$ac_cv_struct_rtentry" = "xrtentry" ; then
  ac_cv_struct_rtentry="rtentry"
else
  ac_cv_struct_rtentry="ortentry"
fi
])
else
  RTENTRY_TYPE="rtentry"
  ac_cv_struct_rtentry="rtentry"
fi

if test "x$ac_cv_struct_rtentry" != "x"; then
  AC_DEFINE_UNQUOTED(RTENTRY,struct ${ac_cv_struct_rtentry})
else
  AC_DEFINE(RTENTRY,struct rtentry)
fi

dnl check for 4.3's rtentry->rt_next
if test "x$ac_cv_RTENTRY_TYPE" = "xBSD-4.3"; then
AC_CACHE_CHECK(for struct rtentry has a rt_next node, 
	ac_cv_struct_rtentry_rt_next,
[
AC_TRY_COMPILE([
#include <sys/types.h>
#define KERNEL
#define _KERNEL
#include <sys/socket.h>
#undef KERNEL
#undef _KERNEL
#include <net/route.h>
],[
struct rtentry rt; 
rt.rt_next;
], ac_cv_struct_rtentry_rt_next=yes,  ac_cv_struct_rtentry_rt_next=no )
])

if test "x$ac_cv_struct_rtentry_rt_next" = "xyes"; then
  AC_DEFINE(RTENTRY_RT_NEXT)
fi

fi

dnl Check struct rtentry for various things.
AC_CHECK_STRUCT_FOR([
#include <sys/types.h>
#define KERNEL
#define _KERNEL
#include <sys/socket.h>
#undef KERNEL
#undef _KERNEL
#include <net/route.h>
], rtentry, rt_unit)

AC_CHECK_STRUCT_FOR([
#include <sys/types.h>
#define KERNEL
#define _KERNEL
#include <sys/socket.h>
#undef KERNEL
#undef _KERNEL
#include <net/route.h>
], rtentry, rt_refcnt)

AC_CHECK_STRUCT_FOR([
#include <sys/types.h>
#define KERNEL
#define _KERNEL
#include <sys/socket.h>
#undef KERNEL
#undef _KERNEL
#include <net/route.h>
], rtentry, rt_hash)

AC_CHECK_STRUCT_FOR([
#include <sys/types.h>
#define KERNEL
#define _KERNEL
#include <sys/socket.h>
#undef KERNEL
#undef _KERNEL
#include <net/route.h>
], rtentry, rt_use)

dnl Check tcpstat for tcpstat.tcp_rcvmemdrop
AC_CHECK_STRUCT_FOR([
#include <sys/types.h>
#include <netinet/tcp.h>
#ifdef HAVE_NETINET_TCP_TIMER_H
#include <netinet/tcp_timer.h>
#endif

#ifdef HAVE_NETINET_TCP_VAR_H
#include<netinet/tcp_var.h>
#endif
], tcpstat, tcp_rcvmemdrop)

dnl irix checks

AC_CHECK_STRUCT_FOR([
#include <sys/types.h>
#include <sys/socket.h>
#include <net/if.h>
#ifdef HAVE_NET_IF_VAR_H
#include <net/if_var.h>
#endif
], ifnet, if_mtu)

if test "x$ac_cv_struct_ifnet_has_if_mtu" = "xno"; then
AC_CACHE_CHECK(if _KERNEL needs to be defined for if_mtu, ac_cv_IFNET_NEEDS_KERNEL,
[
if test "x$ac_cv_struct_ifnet_has_if_mtu" = "xyes"; then
  ac_cv_IFNET_NEEDS_KERNEL=no
else
AC_TRY_COMPILE([
#define _KERNEL 1
#include <sys/types.h>
#include <sys/socket.h>
#ifdef HAVE_SYS_TIME_H
#include <sys/time.h>
#endif
#include <net/if.h>
#ifdef HAVE_NET_IF_VAR_H
#include <net/if_var.h>
#endif
],[
struct ifnet testit;
testit.if_mtu = 0;
], ac_cv_IFNET_NEEDS_KERNEL=yes, ac_cv_IFNET_NEEDS_KERNEL=no)
fi
])

if test "x$ac_cv_IFNET_NEEDS_KERNEL" = "xyes"; then
  AC_DEFINE(IFNET_NEEDS_KERNEL)
fi
fi

AC_CHECK_STRUCT_FOR([
#ifdef IFNET_NEEDS_KERNEL
#define _KERNEL 1
#endif
#include <sys/types.h>
#include <sys/socket.h>
#ifdef HAVE_SYS_TIME_H
#include <sys/time.h>
#endif
#include <net/if.h>
#ifdef HAVE_NET_IF_VAR_H
#include <net/if_var.h>
#endif
], ifaddr, ifa_next)

dnl Check ifnet entries using macro defined in aclocal.m4.
dnl
dnl XXX  Broken on FreeBSD where these are #define'd in <net/if.h>
dnl
AC_CHECK_IFNET_FOR(if_baudrate)
AC_CHECK_IFNET_FOR(if_speed)
AC_CHECK_IFNET_FOR(if_type)
AC_CHECK_IFNET_FOR(if_imcasts)
AC_CHECK_IFNET_FOR(if_iqdrops)
AC_CHECK_IFNET_FOR(if_noproto)
AC_CHECK_IFNET_FOR(if_omcasts)
AC_CHECK_IFNET_FOR(if_xname,no)
AC_CHECK_IFNET_FOR(if_lastchange.tv_sec)
AC_CHECK_IFNET_FOR(if_obytes)
AC_CHECK_IFNET_FOR(if_ibytes)
AC_CHECK_IFNET_FOR(if_addrlist)
AC_CHECK_IFNET_FOR(if_addrhead.tqh_first)

AC_CHECK_STRUCT_FOR([
#if HAVE_NETINET_UDP_VAR_H
#include <netinet/udp_var.h>
#endif
],udpstat,udps_discard)

AC_CHECK_STRUCT_FOR([
#include<sys/types.h>
#include<sys/socket.h>
#ifdef HAVE_SYS_TIME_H
#include <sys/time.h>
#endif
#include<net/if.h>
#if HAVE_NETINET_IN_H
#include<netinet/in.h>
#endif
#if HAVE_NETINET_IF_ETHER_H
#include<netinet/if_ether.h>
#endif
],arphd,at_next)

AC_CHECK_STRUCT_FOR([
#if HAVE_SYS_CONF_H
#include <sys/conf.h>
#endif
],swdevt,sw_nblksenabled)

AC_CHECK_STRUCT_FOR([
#ifdef HAVE_SYS_STAT_H
#include <sys/stat.h>
#endif
#if HAVE_SYS_STATFS_H
#include <sys/statfs.h>
#endif
#if HAVE_SYS_STATVFS_H
#include <sys/statvfs.h>
#endif
],statvfs,f_frsize)

AC_CHECK_STRUCT_FOR([
#ifdef HAVE_SYS_STAT_H
#include <sys/stat.h>
#endif
#if HAVE_SYS_STATFS_H
#include <sys/statfs.h>
#endif
#if HAVE_SYS_STATVFS_H
#include <sys/statvfs.h>
#endif
],statvfs,f_files)

AC_CHECK_STRUCT_FOR([
#if HAVE_NLIST_H
#include <nlist.h>
#endif
],nlist,n_value)

dnl attempt to figure out if sysctl is usable

AC_CACHE_CHECK(if sysctl can read kernel information,ac_cv_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
#include <sys/types.h>
#if HAVE_SYS_PARAM_H
# include <sys/param.h>
#endif
#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_CAN_USE_SYSCTL=yes, ac_cv_CAN_USE_SYSCTL=no)])

if test "x$ac_cv_CAN_USE_SYSCTL" = "xyes"; then
  AC_DEFINE(CAN_USE_SYSCTL)
fi

dnl
dnl In FreeBSD 4.x, the TCP timer constants aren't.  They are defined
dnl in terms of `hz', the kernel clock tick.  In this case,
dnl we need to have a local variable `hz' in scope and set to a useful
dnl value whenever we use one of these constants.
dnl
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)
fi

dnl
dnl Prompt for various bits of user information
dnl

if test "x$ac_cv_user_prompt_LOGFILE" = "x" -o "x$ac_cv_user_prompt_SYS_LOC" = "x" -o "x$ac_cv_user_prompt_SYS_CONTACT" = "x"; then
AC_CACHE_CHECK(if you have run configure before, ac_cv_have_warned,
[
if test "x$defaults" = "xno"; then
cat << EOF

	 ************** Configuration Section **************

	You are about to be prompted by a series of questions.  Answer
them carefully, as they determine how the snmp agent and related
applications are to function.

	After the configure script finishes, you can browse the newly
created config.h file for further - less important - parameters to
modify.  Be careful if you re-run configure though since config.h will
be over written.

-Press return to continue-
EOF

read tmpinput
ac_cv_have_warned="yes"
echo $ac_n "disabling above prompt for future runs...  $ac_c"
else
  ac_cv_have_warned="no"
fi
])
else
  ac_cv_have_warned="yes"
fi

ME=`$WHOAMI`
if test -f /etc/resolv.conf; then
  LOC=`cat /etc/resolv.conf | grep '^domain' | tail -1 | awk '{print $NF}'`
else
  LOC="@no.where"
fi

AC_PROMPT_USER(SYS_CONTACT,[

*** System Contact Information:

	Describes who should be contacted about the host the agent is
running on.  This information is available in the MIB-II tree.  This
Can Also Be Over-Ridden Using The \"syscontact\" Syntax In The Agent'S
Configuration Files.

System Contact Information],$ME@$LOC,1)

AC_PROMPT_USER(SYS_LOC,[

*** System Location:

	Describes the location of the system.  This information is
available in the MIB-II tree.  This Can also be over-ridden using the
\"syslocation\" syntax in the agent's configuration files.

System Location],Unknown,1)

if test -d /var/log; then
  defaultlog="/var/log/snmpd.log"
else
  defaultlog="/usr/adm/snmpd.log"
fi
  
AC_PROMPT_USER(LOGFILE,[

*** Logfile location:

	Enter the default location for the snmpd agent to dump
information & errors to.  If not defined (enter the keyword \"none\"
at the prompt below) the agent will use stdout and stderr instead.
(Note: This value can be over-ridden using command line options.)

Location to write logfile],$defaultlog,1)

if test -d /var; then
  defaultstore="/var/ucd-snmp"
else
  defaultstore="/etc/ucd-snmp"
fi
  
AC_PROMPT_USER(PERSISTENT_DIRECTORY,[

*** snmpd persistent storage location:

	Enter a directory for the snmp library to store persistent
data in the form of a configuration file.

Location to write persistent information],$defaultstore,1)

PERSISTENT_DIRECTORY=$ac_cv_user_prompt_PERSISTENT_DIRECTORY
AC_SUBST(PERSISTENT_DIRECTORY)

AC_SUBST(DLLIBS)

AC_OUTPUT([
 Makefile:Makefile.top:Makefile.in
 snmplib/Makefile:Makefile.top:snmplib/Makefile.in 
 agent/Makefile:Makefile.top:agent/Makefile.in
 apps/Makefile:Makefile.top:apps/Makefile.in
 apps/snmpnetstat/Makefile:Makefile.top:apps/snmpnetstat/Makefile.in
 agent/mibgroup/Makefile:Makefile.top:agent/mibgroup/Makefile.in
 local/Makefile:Makefile.top:local/Makefile.in
 testing/Makefile:Makefile.top:testing/Makefile.in
 man/Makefile:Makefile.top:man/Makefile.in
 ov/Makefile:Makefile.top:ov/Makefile.in
 mibs/Makefile:Makefile.top:mibs/Makefile.in
], echo timestamp > stamp-h)

dnl Local Variables:
dnl mode: Autoconf
dnl comment-start: "dnl"
dnl End:
