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(shared,
[  --enable-shared                 Compile, use, and install shared libraries.],
    with_shared="yes",with_shared="no")

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))

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

AC_ARG_WITH(KMT,
[  --with-KMT=PATH                 Look for libkmt in PATH/lib.],
    AC_ADD_SEARCH_PATH($withval)
)

AC_ARG_WITH(SSLeay,
[  --with-SSLeay=PATH              Look for SSLeay installation in PATH.],
    AC_ADD_SEARCH_PATH($withval)
)

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.],
    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: 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(developer,
[  --enable-developer              Turns on super-duper-extra-compile-warnings
                                  when using gcc.],
    developer=yes)

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(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")

AC_ARG_WITH(libwrap,
[  --with-libwrap[=LIBPATH]        Compile in libwrap (tcp_wrappers) support.],
    if test "x$withval" != "x" -a -d "$withval"; then
        WRAPLIBS="-L$withval -lwrap"
    elif test "x$withval" = "xyes"; then
        WRAPLIBS="-lwrap"
    else
        WRAPLIBS="$withval $LIBS"
    fi
    AC_DEFINE(USE_LIBWRAP)
)

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.
    ucd_snmp:              ucd-snmp specific extensions.

  Optional mib modules that can be built into the agent include:
    host:                  host resources mib support.
                             (alpha level code for linux, hpux, solaris)
    smux:                  smux sub-agent support.
    misc/ipfwacc:          accounting rules IP firewall information.
                             (only under linux)
    ipfwchains/ipfwchains: firewall chains under ipfw for linux.
                             (see agent/mibgroup/ipfwchains/README)
    target:                Support for the TARGET-MIB.
    ucd-snmp/pass_persist: Persistent pass scripts that stay around.
                           Not currently included by default solely because
                           it needs more testing.

  Optional modules for C coders to look at and/or include as extension examples:
  
    examples/example:      example C code extension.
    examples/wombat:       template file similar to example.])

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 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"
if test -f /hp-ux -a -f /bin/ksh; then
  if (PATH=.; alias -x) >/dev/null 2>&1; then
    echo "no"
  else
    echo "yes"
    if test "x$1" = "x"; then
      exec /bin/ksh $0
    else
      exec /bin/ksh $0 "$@"
    fi
  fi
else
  echo "no"
fi

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_CHECK_PROGS(WHOAMI, whoami logname, whoami)
AC_CHECK_PROGS(SED,sed gsed)
AC_PATH_PROG(UNAMEPROG,uname)
AC_DEFINE_UNQUOTED(UNAMEPROG,"$UNAMEPROG")

AC_AIX

AC_C_CONST

dnl super type checking
AC_MSG_CHECKING(for developer flags)
if test "x$developer" = "xyes" -a "x$ac_cv_prog_gcc" = "xyes"; then
  devflags="-Wall -Wstrict-prototypes -Wwrite-strings -Wcast-qual -pedantic -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"; 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 Set SNMPLIBPATH & SNMPSHAREPATH

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

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

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,"$SNMPSHAREPATH/mibs")
fi

dnl
dnl Figure out appropriate shared libraries extensions if necessary.
dnl

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

    dnl defaults

    if test "x$GCC" = "xyes"; then
      SHLIB_CFLAGS="-fpic -shared"
    else
      SHLIB_CFLAGS="-Kpic"
    fi
    SHLIB_EXTENSION="so"
	SHLIB_VERSION=
    SHLIB_LD_CMD="ld -r -o"
    SHLIB_LDCONFIG_CMD=
    CC_RUNTIME_ARG=
    RANLIB=":"

    dnl over-rides
    case $target_os in

    linux*)
	SHLIB_LDCONFIG_CMD='PATH="$$PATH:/sbin" ldconfig -n $(libdir)'
	;;

    irix*)
	SHLIB_LD_CMD="ld -shared -o"
	CC_RUNTIME_ARG="-Wl,-rpath -Wl,$libdir"
	;;

    netbsd* | openbsd*)
	SHLIB_LD_CMD="ld -Bshareable -o"
	CC_RUNTIME_ARG="-R$libdir"
	SHLIB_LDCONFIG_CMD='PATH="$$PATH:/sbin" ldconfig -m $(libdir)'
	;;

    hpux*)
	SHLIB_EXTENSION="sl"
        if test "x$GCC" != "xyes"; then
	    SHLIB_CFLAGS="+Z"
	fi
	CC_RUNTIME_ARG="-Wl,+b,$libdir"
	SHLIB_LD_CMD="ld -b -o"
	;;

    osf*)
	CC_RUNTIME_ARG="-rpath $libdir"
	SHLIB_LD_CMD="ld -shared -o"
	;;
	
    aix*)
	;;

    sysv4*)
	CC_RUNTIME_ARG="-R$libdir"
	;;
    
    sunos*)
        if test "x$GCC" != "xyes"; then
	    SHLIB_CFLAGS="-PIC"
	fi
	SHLIB_LDCONFIG_CMD='PATH="$$PATH:/usr/etc" ldconfig $(libdir)'
	;;
    
    solaris*)
	SHLIB_LD_CMD="ld -G -o"
	CC_RUNTIME_ARG="-R$libdir"
	;;
    
    freebsd*)
	SHLIB_LD_CMD="ld -Bshareable -o"
	SHLIB_VERSION=.3.5
	;;

    *)
	AC_MSG_ERROR([
	  *** shared libraries aren't supported for architecture $target_os
	])
	;;

    esac
else
    SHLIB_EXTENSION="a"
    SHLIB_LD_CMD="ar cr"
    SHLIB_LDCONFIG_CMD=":"
fi
AC_SUBST(CC_RUNTIME_ARG)
AC_SUBST(SHLIB_CFLAGS)
AC_SUBST(SHLIB_EXTENSION)
AC_SUBST(SHLIB_VERSION)
AC_SUBST(SHLIB_LDCONFIG_CMD)
AC_SUBST(SHLIB_LD_CMD)
AC_PROG_RANLIB
AC_MSG_CHECKING(for how to build the library)
AC_MSG_RESULT([EXTENISON=$SHLIB_EXTENSION, VERSION=$SHLIB_VERSION, LD=$SHLIB_LD_CMD, LDCONFIG=$SHLIB_LDCONFIG_CMD, RANLIB=$RANLIB, CCFLAGS=$SHLIB_CFLAGS $CC_RUNTIME_ARG])

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_module_list="mibII ucd_snmp snmpv3mibs $with_mib_modules"

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 $mibdir/mib_module_loads.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=""
default_mibs=IP-MIB:IF-MIB:TCP-MIB:UDP-MIB:SNMPv2-MIB:RFC1213-MIB

for i in $test_modules
 do
  if echo " $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 " $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 " $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
	    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
      grep config_load_mib $srcdir/$mibdir/$i.h | sed 's@.*config_load_mib(\([^)]*\), *\([^),]*\), *\([^),]*\)).*@{{\1}, \2, (struct variable *) \3, sizeof(\3)/sizeof(*\3),sizeof(*\3),"'$i'"},@;s/\.\([0-9]*\)/,\1/g' >> $mibdir/mib_module_loads.h
      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"
    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_c=`echo "$module_list_code " | sed 's/\([^ ]\) /\1.c /g'`
mibgroup_list_o=`echo " $module_list_o " | sed 's@ \([^ ]*\)\.o@ mibgroup/\1.o @g'`
changequote([, ])
AC_SUBST(module_list_c)
AC_SUBST(module_list_h)
AC_SUBST(module_list_o)
AC_SUBST(mibgroup_list_o)

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 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_FUNCS(gethostbyname getservbyname)
if test "x$ac_cv_func_gethostbyname" != "xyes"; then
       AC_CHECK_LIB(nsl, gethostbyname)
       if test "x$ac_cv_lib_nsl_gethostbyname" = "yes"; then
	    AC_DEFINE(HAVE_GETHOSTBYNAME)
       fi
fi
if test "x$ac_cv_func_getservbyname" != "xyes"; then
       AC_CHECK_LIB(socket, getservbyname)
       if test "x$ac_cv_lib_socket_getservbyname" = "yes"; then
	    AC_DEFINE(HAVE_GETSERVBYNAME)
       fi
fi
dnl AC_CHECK_LIB(ucb, bzero)

dnl zlib is required for newer versions of rpm
AC_CHECK_LIB(z, zlibVersion)
dnl
dnl with rpm3 or higher, we need db1 to exist
dnl
AC_CHECK_LIB(rpm, rpmdbOpen,[
  AC_DEFINE(HAVE_LIBRPM)
  LIBS="-lrpm -ldb1 $LIBS"
],,-ldb1 -lz)

dnl Ok, -ldb1 may not exist, try -ldb
if test "x$ac_cv_lib_rpm_rpmdbOpen" = "xno"; then
  unset ac_cv_lib_rpm_rpmdbOpen
  AC_CHECK_LIB(rpm, rpmdbOpen,[
    AC_DEFINE(HAVE_LIBRPM)
    LIBS="-lrpm -ldb $LIBS"
  ],,-ldb -lz)
fi

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
AC_CHECK_LIB(crypto, SSLeay_version)
AC_CHECK_LIB(kmt, kmt_init)

dnl Checks for header files.
AC_HEADER_STDC
AC_HEADER_DIRENT
AC_HEADER_SYS_WAIT
AC_CHECK_HEADERS(string.h fcntl.h limits.h sys/file.h sys/ioctl.h syslog.h unistd.h netinet/tcpip.h netinet/in.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)
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)
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 KMT
AC_CHECK_HEADERS(kmt.h kmt_algs.h)

if test "x$ac_cv_lib_kmt_kmt_init" != "xyes"; then
dnl if KMT is not found, default to using internal md5 support.
    AC_DEFINE(USE_INTERNAL_MD5)
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"
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)
AC_CHECK_FUNCS(signal sigset sigblock sighold strerror setenv)
AC_CHECK_FUNCS(random lrand48 rand)
AC_CHECK_FUNCS(rpmGetPath)

dnl
dnl Check for /dev/random as well
dnl

AC_CACHE_CHECK(if /dev/random exists,ac_cv_HAVE_DEV_RANDOM,
[ac_cv_HAVE_DEV_RANDOM="no"
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
if test -f $i -o $CFLAG /dev/random; then
  ac_cv_HAVE_DEV_RANDOM="yes"
  AC_DEFINE(HAVE_DEV_RANDOM)
fi
])

AC_CHECK_FUNCS(getloadavg)
AC_CHECK_FUNCS(kvm_openfiles nlist)
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_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>
#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([
#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 KMT is not very portable and we need to handle problems it creates.
dnl
AC_CHECK_TYPE(u_int8_t,  unsigned char)
AC_CHECK_TYPE(u_int16_t, unsigned short)
AC_CHECK_TYPE(u_int32_t, unsigned int)

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)

AC_SUBST(PERSISTENT_DIRECTORY)

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
 agent/dlmods/Makefile:Makefile.top:agent/dlmods/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: sh
dnl comment-start: "dnl"
dnl End:
