#!/bin/sh
#
# $Id$
#
# this shell script is designed to merely dump the configuration
# information about how the net-snmp package was compiled.  The
# information is particularly useful for applications that need to
# link against the net-snmp libraries and hence must know about any
# other libraries that must be linked in as well.

check_build_dir()
{
      build_dir=$1

      if test "x$build_dir" = "x" ; then
         echo "You must specify a build directory."
         exit 1
      fi
      # is it the src dir?
      if test -f $build_dir/net-snmp-config.in ; then
         return
      fi
      # make sure we can find build dir
      if test ! -d $build_dir/snmplib/.libs ; then
         echo "$build_dir does not appear to be a build directory."
         exit 1
      fi
}

# usage: index n arguments
# effect: returns the (n+1)th argument
index()
{
    [ $# -gt $1 ] || return
    shift $1
    echo $1
}

# usage: count arguments
# effect: returns the number of arguments
count()
{
    echo $#
}

prefix=/usr
exec_prefix=${prefix}
includedir=${prefix}/include
libdir=/usr/lib64
# Avoid that configure complains that this script ignores ${prefix}/share
echo "${prefix}/share" >/dev/null
NSC_LDFLAGS="-Wl,-O1 -Wl,--as-needed"

NSC_LIBS=""
NSC_LNETSNMPLIBS="-lm   -lcrypto"
NSC_LAGENTLIBS=" -lwrap -Wl,-E"
NSC_LMIBLIBS="-ldl -lm  -lpcre "

NSC_INCLUDEDIR=${includedir}
NSC_LIBDIR=-L${libdir}

NSC_SNMPLIBS="-lnetsnmp ${NSC_LNETSNMPLIBS}"
NSC_SUBAGENTLIBS="-lnetsnmpagent ${NSC_LAGENTLIBS} ${NSC_SNMPLIBS}"
NSC_AGENTLIBS="-lnetsnmpmibs ${NSC_LMIBLIBS} ${NSC_SUBAGENTLIBS}"

NSC_PREFIX=$prefix
NSC_EXEC_PREFIX=$exec_prefix
NSC_SRCDIR=.
NSC_INCDIR=${NSC_PREFIX}/include

NSC_BASE_SNMP_LIBS="-lnetsnmp"
NSC_BASE_SUBAGENT_LIBS="-lnetsnmpagent ${NSC_BASE_SNMP_LIBS}"
NSC_BASE_AGENT_LIBS="-lnetsnmpmibs ${NSC_BASE_SUBAGENT_LIBS}"

NSC_SRC_LIBDIRS="agent/.libs snmplib/.libs"
NSC_SRC_LIBDEPS="agent/.libs/libnetsnmpmibs.a agent/.libs/libnetsnmpagent.a snmplib/.libs/libnetsnmp.a"

if test "x$NSC_SRCDIR" = "x." ; then
   NSC_SRCDIR="NET-SNMP-SOURCE-DIR"
elif test "x$NSC_SRCDIR" = "x" ; then
   NSC_SRCDIR="NET-SNMP-SOURCE-DIR"
fi

if test "x$1" = "x"; then
  usage="yes"
else
  while test "x$done" = "x" -a "x$1" != "x" -a "x$usage" != "xyes"; do
  case "$1" in
    -*=*) optarg=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
    *) optarg= ;;
  esac

  unset shifted
  case $1 in
    --prefix=*)
      prefix=$optarg
      NSC_PREFIX=${prefix}
      NSC_INCLUDEDIR=${prefix}/include
      NSC_LIBDIR=-L${prefix}/lib
      ;;

    --exec-prefix=*)
      exec_prefix=$optarg
      NSC_EXEC_PREFIX=${exec_prefix}
      NSC_LIBDIR=-L${exec_prefix}/lib
      ;;

    --debug-tokens|--deb*|--dbg*)
      echo "find $NSC_SRCDIR -name \"*.c\" -print | xargs grep DEBUGMSGT | grep \\\" | cut -f 2 -d\\\" | sort -u"
      if test "x$NSC_SRCDIR" != "xNET-SNMP-SOURCE-DIR" ; then
        /usr/bin/find $NSC_SRCDIR -name "*.c" -print | xargs grep DEBUGMSGT | grep \" | cut -f 2 -d\" | sort -u
      fi
      ;;
    --indent-options|--in*)
      echo "indent -orig -nbc -bap -nut -nfca `(cd $NSC_INCDIR/net-snmp; perl -n -e 'print "-T $1 " if (/}\s*(netsnmp_\w+)\s*;/);' */*.h)`"
      ;;
    --configure-options|--con*)
      echo " '--prefix=/usr' '--build=x86_64-pc-linux-gnu' '--host=x86_64-pc-linux-gnu' '--mandir=/usr/share/man' '--infodir=/usr/share/info' '--datadir=/usr/share' '--sysconfdir=/etc' '--localstatedir=/var/lib' '--docdir=/usr/share/doc/net-snmp-5.8.1_rc1' '--htmldir=/usr/share/doc/net-snmp-5.8.1_rc1/html' '--with-sysroot=/' '--libdir=/usr/lib64' '--disable-internal-md5' '--enable-ipv6' '--disable-mfd-rewrites' '--enable-embedded-perl' '--enable-ucd-snmp-compatibility' '--with-bzip2' '--without-elf' '--without-kmem-usage' '--without-mysql' '--without-nl' '--without-pcap' '--without-pci' '--with-perl-modules=INSTALLDIRS=vendor' '--without-python-modules' '--without-rpm' '--with-openssl' '--with-libwrap' '--with-zlib' '--enable-shared' '--disable-static' '--with-default-snmp-version=3' '--with-install-prefix=/var/tmp/portage/net-analyzer/net-snmp-5.8.1_rc1/image' '--with-ldflags=-Wl,-O1 -Wl,--as-needed' '--with-logfile=/var/log/net-snmpd.log' '--with-mib-modules=host ucd-snmp/dlmod ucd-snmp/diskio ucd-snmp/extensible mibII/mta_sendmail etherlike-mib/dot3StatsTable' '--with-persistent-directory=/var/lib/net-snmp' '--with-sys-contact=root@Unknown' '--with-sys-location=Unknown' 'build_alias=x86_64-pc-linux-gnu' 'host_alias=x86_64-pc-linux-gnu' 'CFLAGS=-O2 -march=x86-64 -pipe' 'LDFLAGS=-Wl,-O1 -Wl,--as-needed' 'PKG_CONFIG_PATH=/usr/lib64/pkgconfig'"
      ;;
    --snmpd-module-list|--mod*)
echo  mibII/mta_sendmail ucd-snmp/diskio ucd-snmp/dlmod ucd-snmp/extensible etherlike-mib/dot3StatsTable/dot3StatsTable etherlike-mib/dot3StatsTable/dot3StatsTable_data_get etherlike-mib/dot3StatsTable/dot3StatsTable_data_set etherlike-mib/dot3StatsTable/dot3StatsTable_data_access etherlike-mib/dot3StatsTable/dot3StatsTable_interface host/hrh_storage host/hrh_filesys host/hrSWInstalledTable host/hrSWRunTable host/hr_system host/hr_device host/hr_other host/hr_proc host/hr_network host/hr_print host/hr_disk host/hr_partition util_funcs/header_simple_table ucd-snmp/pass util_funcs utilities/execute snmpv3/snmpEngine snmpv3/snmpMPDStats snmpv3/usmStats snmpv3/usmConf snmpv3/usmUser mibII/system_mib mibII/sysORTable mibII/snmp_mib mibII/vacm_vars mibII/setSerialNo mibII/at mibII/ip mibII/tcp mibII/udp mibII/ipv6 mibII/icmp ucd-snmp/disk_hw ucd-snmp/proc ucd-snmp/versioninfo ucd-snmp/pass_persist ucd-snmp/loadave agent/extend ucd-snmp/errormib ucd-snmp/file ucd-snmp/proxy ucd-snmp/logmatch ucd-snmp/memory ucd-snmp/vmstat notification/snmpNotifyTable notification/snmpNotifyFilterProfileTable notification-log-mib/notification_log target/snmpTargetAddrEntry target/snmpTargetParamsEntry target/target target/target_counters agent/nsTransactionTable agent/nsModuleTable agent/nsDebug agent/nsCache agent/nsLogging agent/nsVacmAccessTable agentx/master agentx/subagent disman/event/mteScalars disman/event/mteTrigger disman/event/mteTriggerTable disman/event/mteTriggerDeltaTable disman/event/mteTriggerExistenceTable disman/event/mteTriggerBooleanTable disman/event/mteTriggerThresholdTable disman/event/mteTriggerConf disman/event/mteEvent disman/event/mteEventTable disman/event/mteEventSetTable disman/event/mteEventNotificationTable disman/event/mteEventConf disman/event/mteObjects disman/event/mteObjectsTable disman/event/mteObjectsConf disman/schedule/schedCore disman/schedule/schedConf disman/schedule/schedTable utilities/override utilities/iquery etherlike-mib/data_access/dot3stats_linux host/data_access/swinst host/data_access/swrun host/hrSWRunPerfTable ucd-snmp/pass_common util_funcs/header_generic mibII/updates mibII/vacm_context mibII/vacm_conf mibII/data_access/at_linux mibII/data_access/at_unix mibII/ipAddr mibII/var_route mibII/route_write mibII/kernel_linux mibII/tcpTable mibII/udpTable ip-mib/ip_scalars util_funcs/restart notification/snmpNotifyTable_data header_complex snmp-notification-mib/snmpNotifyFilterTable/snmpNotifyFilterTable_data_storage snmp-notification-mib/snmpNotifyFilterTable/snmpNotifyFilterTable notification/snmpNotifyFilterProfileTable_data target/snmpTargetAddrEntry_data target/snmpTargetParamsEntry_data agentx/protocol agentx/master_admin agentx/agentx_config agentx/client hardware/memory/hw_mem hardware/memory/memory_linux hardware/fsys/hw_fsys hardware/fsys/fsys_mntent host/data_access/swinst_apt host/data_access/swrun_procfs_status hardware/cpu/cpu hardware/cpu/cpu_linux if-mib/ifTable/ifTable if-mib/ifXTable/ifXTable ip-mib/ipAddressTable/ipAddressTable ip-mib/ipAddressPrefixTable/ipAddressPrefixTable ip-mib/ipDefaultRouterTable/ipDefaultRouterTable ip-mib/inetNetToMediaTable/inetNetToMediaTable ip-mib/inetNetToMediaTable/inetNetToMediaTable_interface ip-mib/inetNetToMediaTable/inetNetToMediaTable_data_access ip-mib/ipSystemStatsTable/ipSystemStatsTable ip-mib/ipSystemStatsTable/ipSystemStatsTable_interface ip-mib/ipSystemStatsTable/ipSystemStatsTable_data_access ip-mib/ipv6ScopeZoneIndexTable/ipv6ScopeZoneIndexTable ip-mib/ipIfStatsTable/ipIfStatsTable ip-mib/ipIfStatsTable/ipIfStatsTable_interface ip-mib/ipIfStatsTable/ipIfStatsTable_data_access ip-forward-mib/ipCidrRouteTable/ipCidrRouteTable ip-forward-mib/inetCidrRouteTable/inetCidrRouteTable tcp-mib/tcpConnectionTable/tcpConnectionTable tcp-mib/tcpListenerTable/tcpListenerTable udp-mib/udpEndpointTable/udpEndpointTable snmp-notification-mib/snmpNotifyFilterTable/snmpNotifyFilterTable_interface snmp-notification-mib/snmpNotifyFilterTable/snmpNotifyFilterTable_data_access if-mib/data_access/interface if-mib/ifTable/ifTable_interface if-mib/ifTable/ifTable_data_access if-mib/ifXTable/ifXTable_interface if-mib/ifXTable/ifXTable_data_access ip-mib/ipAddressTable/ipAddressTable_interface ip-mib/ipAddressTable/ipAddressTable_data_access ip-mib/ipAddressPrefixTable/ipAddressPrefixTable_interface ip-mib/ipAddressPrefixTable/ipAddressPrefixTable_data_access ip-mib/ipDefaultRouterTable/ipDefaultRouterTable_interface ip-mib/ipDefaultRouterTable/ipDefaultRouterTable_data_access ip-mib/ipDefaultRouterTable/ipDefaultRouterTable_data_get ip-mib/data_access/arp_common ip-mib/data_access/arp_netlink ip-mib/data_access/systemstats_common ip-mib/data_access/systemstats_linux ip-mib/data_access/scalars_linux ip-mib/ipv6ScopeZoneIndexTable/ipv6ScopeZoneIndexTable_interface ip-mib/ipv6ScopeZoneIndexTable/ipv6ScopeZoneIndexTable_data_access ip-mib/ipIfStatsTable/ipIfStatsTable_data_get ip-forward-mib/ipCidrRouteTable/ipCidrRouteTable_interface ip-forward-mib/ipCidrRouteTable/ipCidrRouteTable_data_access ip-forward-mib/inetCidrRouteTable/inetCidrRouteTable_interface ip-forward-mib/inetCidrRouteTable/inetCidrRouteTable_data_access tcp-mib/data_access/tcpConn_common tcp-mib/data_access/tcpConn_linux util_funcs/get_pid_from_inode tcp-mib/tcpConnectionTable/tcpConnectionTable_interface tcp-mib/tcpConnectionTable/tcpConnectionTable_data_access tcp-mib/tcpListenerTable/tcpListenerTable_interface tcp-mib/tcpListenerTable/tcpListenerTable_data_access udp-mib/udpEndpointTable/udpEndpointTable_interface udp-mib/udpEndpointTable/udpEndpointTable_data_access if-mib/data_access/interface_linux if-mib/data_access/interface_ioctl ip-mib/data_access/ipaddress_common ip-mib/data_access/ipaddress_linux ip-mib/data_access/defaultrouter_common ip-mib/data_access/defaultrouter_linux ip-mib/data_access/ipv6scopezone_common ip-mib/data_access/ipv6scopezone_linux ip-forward-mib/data_access/route_common ip-forward-mib/data_access/route_linux ip-forward-mib/data_access/route_ioctl udp-mib/data_access/udp_endpoint_common udp-mib/data_access/udp_endpoint_linux ip-mib/data_access/ipaddress_ioctl
      ;;
    --default-mibs|--mibs|--MIBS)
      echo :SNMPv2-MIB:IF-MIB:IP-MIB:TCP-MIB:UDP-MIB:HOST-RESOURCES-MIB:NOTIFICATION-LOG-MIB:DISMAN-EVENT-MIB:DISMAN-SCHEDULE-MIB:HOST-RESOURCES-TYPES:MTA-MIB:NETWORK-SERVICES-MIB:UCD-DISKIO-MIB:UCD-DLMOD-MIB:UCD-SNMP-MIB:UCD-DEMO-MIB:SNMP-TARGET-MIB:NET-SNMP-AGENT-MIB:NET-SNMP-PASS-MIB:SNMP-FRAMEWORK-MIB:SNMP-MPD-MIB:SNMP-USER-BASED-SM-MIB:SNMP-VIEW-BASED-ACM-MIB:SNMP-COMMUNITY-MIB:IPV6-ICMP-MIB:IPV6-MIB:IPV6-TCP-MIB:IPV6-UDP-MIB:IP-FORWARD-MIB:NET-SNMP-EXTEND-MIB:SNMP-NOTIFICATION-MIB:SNMPv2-TM:NET-SNMP-VACM-MIB
      ;;
    --default-mibdirs|--mibdirs|--MIBDIRS)
      echo $HOME/.snmp/mibs:/usr/share/snmp/mibs
      ;;
    --env-separator)
      echo ":"
      ;;
    --exeext)
      echo ""
      ;;
    --snmpconfpath|--SNMPCONFPATH)
      echo "/etc/snmp:/usr/share/snmp:/usr/lib64/snmp:$HOME/.snmp:/var/lib/net-snmp"
      ;;
    --persistent-directory|--persistent-dir)
      echo /var/lib/net-snmp
      ;;
    --perlprog|--perl)
      echo /usr/bin/perl
      ;;
    #################################################### compile
    --base-cflags)
      echo -O2 -march=x86-64 -pipe -DNETSNMP_ENABLE_IPV6 -fno-strict-aliasing -DNETSNMP_REMOVE_U64 -O2 -march=x86-64 -pipe -Ulinux -Dlinux=linux  -D_REENTRANT -D_GNU_SOURCE -fwrapv -fno-strict-aliasing -pipe -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64  -I/usr/lib64/perl5/5.30.3/x86_64-linux-thread-multi/CORE   -I${NSC_INCLUDEDIR}
      ;;
    --cflags|--cf*)
      echo -O2 -march=x86-64 -pipe -DNETSNMP_ENABLE_IPV6 -fno-strict-aliasing -DNETSNMP_REMOVE_U64 -O2 -march=x86-64 -pipe -Ulinux -Dlinux=linux  -D_REENTRANT -D_GNU_SOURCE -fwrapv -fno-strict-aliasing -pipe -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64  -I/usr/lib64/perl5/5.30.3/x86_64-linux-thread-multi/CORE    -I. -I${NSC_INCLUDEDIR}
      ;;
    --srcdir)
      echo $NSC_SRCDIR
      ;;
    #################################################### linking
    --libdir|--lib-dir)
      echo $NSC_LIBDIR
      ;;
    --ldflags|--ld*)
      echo $NSC_LDFLAGS
      ;;
    --build-lib-dirs)
      shift
      build_dir=$1
      check_build_dir $build_dir
      for dir in $NSC_SRC_LIBDIRS; do
          result="$result -L$build_dir/$dir"
      done
      echo $result
      ;;
    --build-lib-deps)
      shift
      build_dir=$1
      check_build_dir $build_dir
      for dir in $NSC_SRC_LIBDEPS; do
          result="$result $build_dir/$dir"
      done
      echo $result
      ;;
    --build-includes)
      shift
      build_dir=$1
      check_build_dir $build_dir
      result="-I$build_dir/include"
      if test "$build_dir" != "$NSC_SRCDIR" -a "$NSC_SRCDIR" != "NET-SNMP-SOURCE-DIR"
      then
          result="$result -I$NSC_SRCDIR/include"
      fi
      echo $result
      ;;
    --build-command)
      echo "x86_64-pc-linux-gnu-gcc -O2 -march=x86-64 -pipe -DNETSNMP_ENABLE_IPV6 -fno-strict-aliasing -DNETSNMP_REMOVE_U64 -O2 -march=x86-64 -pipe -Ulinux -Dlinux=linux  -D_REENTRANT -D_GNU_SOURCE -fwrapv -fno-strict-aliasing -pipe -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64  -I/usr/lib64/perl5/5.30.3/x86_64-linux-thread-multi/CORE   "
      ;;
    #################################################### client lib
    --libs)
      # use this one == --netsnmp-libs + --external-libs
      echo $NSC_LIBDIR $NSC_SNMPLIBS $NSC_LIBS
      ;;
    --netsnmp-libs)
      echo $NSC_LIBDIR $NSC_BASE_SNMP_LIBS
      ;;
    --external-libs)
      echo $NSC_LNETSNMPLIBS $NSC_LIBS -Wl,-E
      ;;
    #################################################### agent lib
    --base-agent-libs)
      echo $NSC_BASE_AGENT_LIBS
      ;;
    --base-subagent-libs)
      echo $NSC_BASE_SUBAGENT_LIBS
      ;;
    --agent-libs)
      # use this one == --netsnmp-agent-libs + --external-libs
      echo $NSC_LIBDIR $NSC_AGENTLIBS $NSC_LIBS
      ;;
    --netsnmp-agent-libs)
      echo $NSC_LIBDIR $NSC_BASE_AGENT_LIBS
      ;;
    --external-agent-libs)
      echo $NSC_LMIBLIBS $NSC_LAGENTLIBS $NSC_LNETSNMPLIBS $NSC_LIBS
      ;;
    ####################################################
    --version|--ver*)
      echo 5.8.1.rc1
      ;;
    --help)
      usage="yes"
      ;;
    --prefix|--pre*)
      echo $NSC_PREFIX
      ;;
    --exec-prefix)
      echo $NSC_EXEC_PREFIX
      ;;
    ####################################################
    --create-snmpv3-user)
      done=1
      shift
      net-snmp-create-v3-user $*
      exit $?
      ;;

    ####################################################
    --compile-subagent)
      shift
      shifted=1
      while test "x$done" = "x" -a "x$1" != "x" ; do
	case $1 in
            --norm)
	        norm=1
	        shift
		;;
            --cflags)
	        shift
	        if test "x$1" = "x" ; then
	            echo "You must specify the extra cflags"
	            exit 1
	        fi
	        cflags="$1"
	        echo "setting extra cflags: $cflags"
	        shift
		;;
            --ldflags)
	        shift
	        if test "x$1" = "x" ; then
	            echo "You must specify the extra ldflags"
	            exit 1
	        fi
	        ldflags="$1"
	        echo "setting extra ldflags: $ldflags"
	        shift
		;;
 	    --*)
		echo "unknown suboption to --compile-subagent: $1"
		exit 1
		;;
	    *)
                if test "x$outname" = "x"; then
                  outname=$1
                  shift
                else
	          done=1
                fi
		;;
	esac
      done
      tmpfile=netsnmptmp.$$.c
      if test -f $tmpfile; then
	echo "Ack.  Can't create $tmpfile: already exists"
	exit 1
      fi
      echo "generating the temporary code file: $tmpfile"
      rm -f $tmpfile
      cat > $tmpfile <<EOF
/* generated from net-snmp-config */
#include <net-snmp/net-snmp-config.h>
#ifdef HAVE_SIGNAL
#include <signal.h>
#endif /* HAVE_SIGNAL */
#ifdef HAVE_SYS_STAT_H
#include <sys/stat.h>
#endif /*  HAVE_SYS_STAT_H */
#ifdef HAVE_FCNTL_H
#include <fcntl.h>
#endif /* HAVE_FCNTL_H */
#include <net-snmp/net-snmp-includes.h>
#include <net-snmp/agent/net-snmp-agent-includes.h>
EOF

    # If we were only given a single filename
    # (and no explicit output name)
    # then use that as the base of the output name
    #
    # If we weren't even given that, then bomb out
    if test "x$1" = "x"; then
      if test "x$outname" = "x"; then
        echo "No MIB module codefile specified"
        rm -f $tmpfile
        exit 1
      else
        cfiles=$outname
        outname=`basename $cfiles | sed 's/\.[co]$//'`
        if test -f $outname.h; then
          if grep "init_$outname" $outname.h; then
            echo "  #include \"$outname.h\"" >> $tmpfile
          fi
        fi
      fi
    fi

    # add include files
    while test "$1" != ""; do
      cfiles="$cfiles $1"
      name=`basename $1 | sed 's/\.[co]$//'`
      if test -f $name.h; then
        if grep "init_$name" $name.h; then
          echo "  #include \"$name.h\"" >> $tmpfile
        fi
      fi
      shift
    done

      cat >> $tmpfile <<EOF
const char *app_name = "$outname";
static int reconfig = 0;

extern int netsnmp_running;

RETSIGTYPE
stop_server(int a) {
    netsnmp_running = 0;
}

#ifdef SIGHUP
RETSIGTYPE
hup_handler(int sig)
{
    reconfig = 1;
    signal(SIGHUP, hup_handler);
}
#endif

static void
usage(const char *prog)
{
    fprintf(stderr,
            "USAGE: %s [OPTIONS]\n"
            "\n"
            "OPTIONS:\n", prog);

    fprintf(stderr,
            "  -c FILE[,...]\t\tread FILE(s) as configuration file(s)\n"
            "  -C\t\t\tdo not read the default configuration files\n"
            "  -d\t\t\tdump all traffic\n"
            "  -D TOKEN[,...]\tturn on debugging output for the specified "
            "TOKENs\n"
            "\t\t\t   (ALL gives extremely verbose debugging output)\n"
            "  -f\t\t\tDo not fork() from the calling shell.\n"
            "  -h\t\t\tdisplay this help message\n"
            "  -H\t\t\tdisplay a list of configuration file directives\n"
            "  -L LOGOPTS\t\tToggle various defaults controlling logging:\n");
    snmp_log_options_usage("\t\t\t  ", stderr);
#ifndef DISABLE_MIB_LOADING
    fprintf(stderr,
            "  -m MIB[" ENV_SEPARATOR "...]\t\tload given list of MIBs (ALL loads "
            "everything)\n"
            "  -M DIR[" ENV_SEPARATOR "...]\t\tlook in given list of directories for MIBs\n");
#endif /* DISABLE_MIB_LOADING */
    fprintf(stderr,
            "  -p FILE\t\tstore process id in FILE\n");
#ifndef DISABLE_MIB_LOADING
    fprintf(stderr,
            "  -P MIBOPTS\t\tToggle various defaults controlling mib "
            "parsing:\n");
    snmp_mib_toggle_options_usage("\t\t\t  ", stderr);
#endif /* DISABLE_MIB_LOADING */
    fprintf(stderr,
            "  -v\t\t\tdisplay package version number\n"
            "  -x TRANSPORT\tconnect to master agent using TRANSPORT\n");
    exit(1);
}

static void
version(void)
{
    fprintf(stderr, "NET-SNMP version: %s\n", netsnmp_get_version());
    exit(0);
}

int
main (int argc, char **argv)
{
  int arg;
  char* cp = NULL;
  int dont_fork = 0, do_help = 0;
  char* pid_file = NULL;

  while ((arg = getopt(argc, argv, "c:CdD:fhHL:"
#ifndef DISABLE_MIB_LOADING
                       "m:M:"
#endif /* DISABLE_MIB_LOADING */
                       "n:p:"
#ifndef DISABLE_MIB_LOADING
                       "P:"
#endif /* DISABLE_MIB_LOADING */
                       "vx:")) != EOF) {
    switch (arg) {
      case 'c':
        if (optarg != NULL) {
          netsnmp_ds_set_string(NETSNMP_DS_LIBRARY_ID,
                                NETSNMP_DS_LIB_OPTIONALCONFIG, optarg);
        } else {
          usage(argv[0]);
        }
        break;

      case 'C':
        netsnmp_ds_set_boolean(NETSNMP_DS_LIBRARY_ID,
                               NETSNMP_DS_LIB_DONT_READ_CONFIGS, 1);
        break;

    case 'd':
      netsnmp_ds_set_boolean(NETSNMP_DS_LIBRARY_ID,
                             NETSNMP_DS_LIB_DUMP_PACKET, 1);
      break;

    case 'D':
      debug_register_tokens(optarg);
      snmp_set_do_debugging(1);
      break;

    case 'f':
      dont_fork = 1;
      break;

    case 'h':
      usage(argv[0]);
      break;

    case 'H':
      do_help = 1;
      break;

    case 'L':
      if (snmp_log_options(optarg, argc, argv) < 0) {
        exit(1);
      }
      break;

#ifndef DISABLE_MIB_LOADING
    case 'm':
      if (optarg != NULL) {
        setenv("MIBS", optarg, 1);
      } else {
        usage(argv[0]);
      }
      break;

    case 'M':
      if (optarg != NULL) {
        setenv("MIBDIRS", optarg, 1);
      } else {
        usage(argv[0]);
      }
      break;
#endif /* DISABLE_MIB_LOADING */

    case 'n':
      if (optarg != NULL) {
        app_name = optarg;
        netsnmp_ds_set_string(NETSNMP_DS_LIBRARY_ID,
                              NETSNMP_DS_LIB_APPTYPE, app_name);
      } else {
        usage(argv[0]);
      }
      break;

    case 'p':
      if (optarg != NULL) {
        pid_file = optarg;
      } else {
        usage(argv[0]);
      }
      break;

#ifndef DISABLE_MIB_LOADING
    case 'P':
      cp = snmp_mib_toggle_options(optarg);
      if (cp != NULL) {
        fprintf(stderr, "Unknown parser option to -P: %c.\n", *cp);
        usage(argv[0]);
      }
      break;
#endif /* DISABLE_MIB_LOADING */

    case 'v':
      version();
      break;

    case 'x':
      if (optarg != NULL) {
        netsnmp_ds_set_string(NETSNMP_DS_APPLICATION_ID,
                              NETSNMP_DS_AGENT_X_SOCKET, optarg);
      } else {
        usage(argv[0]);
      }
      break;

    default:
      fprintf(stderr, "invalid option: -%c\n", arg);
      usage(argv[0]);
      break;
    }
  }

  if (do_help) {
    netsnmp_ds_set_boolean(NETSNMP_DS_APPLICATION_ID,
                           NETSNMP_DS_AGENT_NO_ROOT_ACCESS, 1);
  } else {
    /* we are a subagent */
    netsnmp_ds_set_boolean(NETSNMP_DS_APPLICATION_ID,
                           NETSNMP_DS_AGENT_ROLE, 1);

    if (!dont_fork) {
      if (netsnmp_daemonize(1, snmp_stderrlog_status()) != 0)
        exit(1);
    }

#if HAVE_GETPID
    if (pid_file != NULL) {
      /*
       * unlink the pid_file, if it exists, prior to open.  Without
       * doing this the open will fail if the user specified pid_file
       * already exists.
       */
      int fd;
      unlink(pid_file);
      fd = open(pid_file, O_CREAT | O_EXCL | O_WRONLY, 0600);
      if (fd == -1) {
        snmp_log_perror(pid_file);
        if (!netsnmp_ds_get_boolean(NETSNMP_DS_APPLICATION_ID,
                                    NETSNMP_DS_AGENT_NO_ROOT_ACCESS)) {
          exit(1);
        }
      } else {
        char buf[3 + sizeof(long) * 3];
        int len = snprintf(buf, sizeof(buf), "%ld\n", (long int)getpid());
        write(fd, buf, len);
        close(fd);
      }
    }
#endif

    /* initialize tcpip, if necessary */
    SOCK_STARTUP;
  }

  /* initialize the agent library */
  init_agent(app_name);

  /* initialize your mib code here */
EOF

    # add init routines
    for i in $cfiles ; do
      name=`basename $i | sed 's/\.[co]$//'`
      echo checking for init_$name in $i
      if grep "init_$name" $i ; then
        echo "  init_${name}();" >> $tmpfile
      fi
    done

    # handle the main loop
    cat >> $tmpfile <<EOF

  /* $outname will be used to read $outname.conf files. */
  init_snmp("$outname");

  if (do_help) {
    fprintf(stderr, "Configuration directives understood:\n");
    read_config_print_usage("  ");
    exit(0);
  }

  /* In case we received a request to stop (kill -TERM or kill -INT) */
  netsnmp_running = 1;
#ifdef SIGTERM
  signal(SIGTERM, stop_server);
#endif
#ifdef SIGINT
  signal(SIGINT, stop_server);
#endif
#ifdef SIGHUP
  signal(SIGHUP, hup_handler);
#endif

  /* main loop here... */
  while(netsnmp_running) {
    if (reconfig) {
      free_config();
      read_configs();
      reconfig = 0;
    }
    agent_check_and_process(1);
  }

  /* at shutdown time */
  snmp_shutdown(app_name);

  /* deinitialize your mib code here */
EOF

    # add shutdown routines

    i=`count $cfiles`
    while [ $i -gt 0 ] ; do
      fullname=`index $i $cfiles`
      name=`basename $fullname | sed 's/\.[co]$//'`
      echo checking for shutdown_$name in $fullname
      if grep "shutdown_$name" $fullname ; then
        echo "  shutdown_${name}();" >> $tmpfile
      fi
      i=`expr $i - 1`
    done

    # finish file
    cat >> $tmpfile <<EOF

  /* shutdown the agent library */
  shutdown_agent();

  if (pid_file != NULL) {
    unlink(pid_file);
  }

  SOCK_CLEANUP;
  exit(0);
}
EOF
      if test "$?" != 0 -o ! -f "$tmpfile" ; then
        echo "Ack.  Can't create $tmpfile."
	exit 1
      fi
      cmd="x86_64-pc-linux-gnu-gcc $cflags -O2 -march=x86-64 -pipe -DNETSNMP_ENABLE_IPV6 -fno-strict-aliasing -DNETSNMP_REMOVE_U64 -O2 -march=x86-64 -pipe -Ulinux -Dlinux=linux  -D_REENTRANT -D_GNU_SOURCE -fwrapv -fno-strict-aliasing -pipe -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64  -I/usr/lib64/perl5/5.30.3/x86_64-linux-thread-multi/CORE   -I. -I${NSC_INCLUDEDIR} -o $outname $tmpfile $cfiles $NSC_LDFLAGS $NSC_LIBDIR $NSC_BASE_AGENT_LIBS $NSC_AGENTLIBS $ldflags"
      echo "running: $cmd"
      echo `$cmd`
      result=$?
      if test "x$norm" != "x1" ; then
        echo "removing the temporary code file: $tmpfile"
        rm -f $tmpfile
      else
        echo "leaving the temporary code file: $tmpfile"
      fi
      if test "$result" = "0" -a -f "$outname" ; then
        echo "subagent program $outname created"
      fi
      exit $result
      ;;

    *)
      echo "unknown option $1"
      usage="yes"
      ;;
  esac
  if [ "x$shifted" = "x" ] ; then
      shift
  fi
  done
fi

if test "x$usage" = "xyes"; then
  echo ""
  echo "Usage:"
  echo "  net-snmp-config [--cflags] [--agent-libs] [--libs] [--version]"
  echo "                  ... [see below for complete flag list]"
  echo ""
  echo "    --version         displays the net-snmp version number"
  echo "    --indent-options  displays the indent options from the Coding Style"
  echo "    --debug-tokens    displays a example command line to search to source"
  echo "                      code for a list of available debug tokens"
  echo ""
  echo "  SNMP Setup commands:"
  echo ""
  echo "    --create-snmpv3-user creates a SNMPv3 user in Net-SNMP config file."
  echo "                         See net-snmp-create-v3-user --help for list of"
  echo "                         accepted options."
  echo ""
  echo "  These options produce the various compilation flags needed when"
  echo "  building external SNMP applications:"
  echo ""
  echo "    --base-cflags     lists additional compilation flags needed"
  echo "    --cflags          lists additional compilation flags needed"
  echo "                      (includes -I. and extra developer warning flags)"
  echo ""
  echo "  These options produce the various link flags needed when"
  echo "  building external SNMP applications:"
  echo ""
  echo "    --libs            lists libraries needed for building applications"
  echo "    --agent-libs      lists libraries needed for building subagents"
  echo ""
  echo "  These options produce various link flags broken down into parts."
  echo "  (Most of the time the simple options above should be used.)"
  echo ""
  echo "    --libdir              path to netsnmp libraries"
  echo ""
  echo "    --base-agent-libs     netsnmp specific agent libraries"
  echo ""
  echo "    --netsnmp-libs        netsnmp specific libraries (with path)"
  echo "    --netsnmp-agent-libs  netsnmp specific agent libraries (with path)"
  echo ""
  echo "    --ldflags             link flags for external libraries"
  echo "    --external-libs       external libraries needed by netsnmp libs"
  echo "    --external-agent-libs external libraries needed by netsnmp agent libs"
  echo ""
  echo "  These options produce various link flags used when linking an"
  echo "  external application against an uninstalled build directory."
  echo ""
  echo "    --build-includes      include path to build/source includes"
  echo "    --build-lib-dirs      link path to libraries"
  echo "    --build-lib-deps      path to libraries for dependency target"
  echo "    --build-command       command to compile \$3... to \$2"
  echo ""
  echo "  Automated subagent building (produces an OUTPUTNAME binary file):"
  echo "  [this feature has not been tested very well yet.  use at your risk.]"
  echo ""
  echo "    --compile-subagent OUTPUTNAME [--norm] [--cflags flags]"
  echo "                                  [--ldflags flags] mibmodule1.c [...]]"
  echo ""
  echo "         --norm           leave the generated .c file around to read."
  echo "         --cflags flags   extra cflags to use (e.g. -I...)."
  echo "         --ldflags flags  extra ld flags to use (e.g. -L... -l...)."
  echo ""
  echo "  Details on how the net-snmp package was compiled:"
  echo ""
  echo "    --configure-options   display original configure arguments"
  echo "    --prefix              display the installation prefix"
  echo "    --snmpd-module-list   display the modules compiled into the agent"
  echo "    --default-mibs        display default list of MIBs"
  echo "    --default-mibdirs     display default list of MIB directories"
  echo "    --snmpconfpath        display default SNMPCONFPATH"
  echo "    --persistent-directory display default persistent directory"
  echo "    --perlprog            display path to perl for the perl modules"
  echo ""
  exit
fi  
