package NetSNMP::default_store;

use strict;
use warnings;
use Carp;

require Exporter;
require DynaLoader;
use AutoLoader;

use vars qw(@ISA %EXPORT_TAGS @EXPORT_OK @EXPORT $VERSION $AUTOLOAD);

@ISA = qw(Exporter DynaLoader);

# Items to export into callers namespace by default. Note: do not export
# names by default without a very good reason. Use EXPORT_OK instead.
# Do not simply export all your public functions/methods/constants.

# This allows declaration	use NetSNMP::default_store ':all';
# If you do not need this, moving things directly into @EXPORT or @EXPORT_OK
# will save memory.
%EXPORT_TAGS = ( 'all' => [ qw(
				   NETSNMP_DS_MAX_IDS
				   NETSNMP_DS_MAX_SUBIDS
				   NETSNMP_DS_LIBRARY_ID
				   NETSNMP_DS_APPLICATION_ID
				   NETSNMP_DS_TOKEN_ID
				   NETSNMP_DS_LIB_MIB_ERRORS
				   NETSNMP_DS_LIB_SAVE_MIB_DESCRS
				   NETSNMP_DS_LIB_MIB_COMMENT_TERM
				   NETSNMP_DS_LIB_MIB_PARSE_LABEL
				   NETSNMP_DS_LIB_DUMP_PACKET
				   NETSNMP_DS_LIB_LOG_TIMESTAMP
				   NETSNMP_DS_LIB_DONT_READ_CONFIGS
				   NETSNMP_DS_LIB_MIB_REPLACE
				   NETSNMP_DS_LIB_PRINT_NUMERIC_ENUM
				   NETSNMP_DS_LIB_PRINT_NUMERIC_OIDS
				   NETSNMP_DS_LIB_DONT_BREAKDOWN_OIDS
				   NETSNMP_DS_LIB_ALARM_DONT_USE_SIG
				   NETSNMP_DS_LIB_PRINT_FULL_OID
				   NETSNMP_DS_LIB_QUICK_PRINT
				   NETSNMP_DS_LIB_RANDOM_ACCESS
				   NETSNMP_DS_LIB_REGEX_ACCESS
				   NETSNMP_DS_LIB_DONT_CHECK_RANGE
				   NETSNMP_DS_LIB_NO_TOKEN_WARNINGS
				   NETSNMP_DS_LIB_NUMERIC_TIMETICKS
				   NETSNMP_DS_LIB_ESCAPE_QUOTES
				   NETSNMP_DS_LIB_REVERSE_ENCODE
				   NETSNMP_DS_LIB_PRINT_BARE_VALUE
				   NETSNMP_DS_LIB_EXTENDED_INDEX
				   NETSNMP_DS_LIB_PRINT_HEX_TEXT
				   NETSNMP_DS_LIB_PRINT_UCD_STYLE_OID
				   NETSNMP_DS_LIB_READ_UCD_STYLE_OID
				   NETSNMP_DS_LIB_HAVE_READ_PREMIB_CONFIG
				   NETSNMP_DS_LIB_HAVE_READ_CONFIG
				   NETSNMP_DS_LIB_QUICKE_PRINT
				   NETSNMP_DS_LIB_DONT_PRINT_UNITS
				   NETSNMP_DS_LIB_NO_DISPLAY_HINT
				   NETSNMP_DS_LIB_16BIT_IDS
				   NETSNMP_DS_LIB_DONT_PERSIST_STATE
				   NETSNMP_DS_LIB_2DIGIT_HEX_OUTPUT
				   NETSNMP_DS_LIB_IGNORE_NO_COMMUNITY
				   NETSNMP_DS_LIB_DISABLE_PERSISTENT_LOAD
				   NETSNMP_DS_LIB_DISABLE_PERSISTENT_SAVE
				   NETSNMP_DS_LIB_APPEND_LOGFILES
				   NETSNMP_DS_LIB_MIB_WARNINGS
				   NETSNMP_DS_LIB_SECLEVEL
				   NETSNMP_DS_LIB_SNMPVERSION
				   NETSNMP_DS_LIB_DEFAULT_PORT
				   NETSNMP_DS_LIB_OID_OUTPUT_FORMAT
				   NETSNMP_DS_LIB_STRING_OUTPUT_FORMAT
				   NETSNMP_DS_LIB_HEX_OUTPUT_LENGTH
				   NETSNMP_DS_LIB_SERVERSENDBUF
				   NETSNMP_DS_LIB_SERVERRECVBUF
				   NETSNMP_DS_LIB_CLIENTSENDBUF
				   NETSNMP_DS_LIB_CLIENTRECVBUF
				   NETSNMP_DS_SNMP_VERSION_1
				   NETSNMP_DS_SNMP_VERSION_2c
				   NETSNMP_DS_SNMP_VERSION_3
				   NETSNMP_DS_LIB_SECNAME
				   NETSNMP_DS_LIB_CONTEXT
				   NETSNMP_DS_LIB_PASSPHRASE
				   NETSNMP_DS_LIB_AUTHPASSPHRASE
				   NETSNMP_DS_LIB_PRIVPASSPHRASE
				   NETSNMP_DS_LIB_OPTIONALCONFIG
				   NETSNMP_DS_LIB_APPTYPE
				   NETSNMP_DS_LIB_COMMUNITY
				   NETSNMP_DS_LIB_PERSISTENT_DIR
				   NETSNMP_DS_LIB_CONFIGURATION_DIR
				   NETSNMP_DS_LIB_SECMODEL
				   NETSNMP_DS_LIB_MIBDIRS
				   NETSNMP_DS_LIB_OIDSUFFIX
				   NETSNMP_DS_LIB_OIDPREFIX
				   NETSNMP_DS_LIB_CLIENT_ADDR
				   NETSNMP_DS_LIB_TEMP_FILE_PATTERN
				   NETSNMP_DS_LIB_AUTHMASTERKEY
				   NETSNMP_DS_LIB_PRIVMASTERKEY
				   NETSNMP_DS_LIB_AUTHLOCALIZEDKEY
				   NETSNMP_DS_LIB_PRIVLOCALIZEDKEY
				   NETSNMP_DS_LIB_APPTYPES
				   NETSNMP_DS_LIB_KSM_KEYTAB
				   NETSNMP_DS_LIB_KSM_SERVICE_NAME
				   NETSNMP_DS_LIB_SBSM_LOCAL_PWD
	netsnmp_ds_get_boolean
	netsnmp_ds_get_int
	netsnmp_ds_get_string
	netsnmp_ds_get_void
	netsnmp_ds_register_config
	netsnmp_ds_register_premib
	netsnmp_ds_set_boolean
	netsnmp_ds_set_int
	netsnmp_ds_set_string
	netsnmp_ds_set_void
	netsnmp_ds_shutdown
	netsnmp_ds_toggle_boolean
) ] );

@EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } );

@EXPORT = qw(
				   NETSNMP_DS_MAX_IDS
				   NETSNMP_DS_MAX_SUBIDS
				   NETSNMP_DS_LIBRARY_ID
				   NETSNMP_DS_APPLICATION_ID
				   NETSNMP_DS_TOKEN_ID
				   NETSNMP_DS_LIB_MIB_ERRORS
				   NETSNMP_DS_LIB_SAVE_MIB_DESCRS
				   NETSNMP_DS_LIB_MIB_COMMENT_TERM
				   NETSNMP_DS_LIB_MIB_PARSE_LABEL
				   NETSNMP_DS_LIB_DUMP_PACKET
				   NETSNMP_DS_LIB_LOG_TIMESTAMP
				   NETSNMP_DS_LIB_DONT_READ_CONFIGS
				   NETSNMP_DS_LIB_MIB_REPLACE
				   NETSNMP_DS_LIB_PRINT_NUMERIC_ENUM
				   NETSNMP_DS_LIB_PRINT_NUMERIC_OIDS
				   NETSNMP_DS_LIB_DONT_BREAKDOWN_OIDS
				   NETSNMP_DS_LIB_ALARM_DONT_USE_SIG
				   NETSNMP_DS_LIB_PRINT_FULL_OID
				   NETSNMP_DS_LIB_QUICK_PRINT
				   NETSNMP_DS_LIB_RANDOM_ACCESS
				   NETSNMP_DS_LIB_REGEX_ACCESS
				   NETSNMP_DS_LIB_DONT_CHECK_RANGE
				   NETSNMP_DS_LIB_NO_TOKEN_WARNINGS
				   NETSNMP_DS_LIB_NUMERIC_TIMETICKS
				   NETSNMP_DS_LIB_ESCAPE_QUOTES
				   NETSNMP_DS_LIB_REVERSE_ENCODE
				   NETSNMP_DS_LIB_PRINT_BARE_VALUE
				   NETSNMP_DS_LIB_EXTENDED_INDEX
				   NETSNMP_DS_LIB_PRINT_HEX_TEXT
				   NETSNMP_DS_LIB_PRINT_UCD_STYLE_OID
				   NETSNMP_DS_LIB_READ_UCD_STYLE_OID
				   NETSNMP_DS_LIB_HAVE_READ_PREMIB_CONFIG
				   NETSNMP_DS_LIB_HAVE_READ_CONFIG
				   NETSNMP_DS_LIB_QUICKE_PRINT
				   NETSNMP_DS_LIB_DONT_PRINT_UNITS
				   NETSNMP_DS_LIB_NO_DISPLAY_HINT
				   NETSNMP_DS_LIB_16BIT_IDS
				   NETSNMP_DS_LIB_DONT_PERSIST_STATE
				   NETSNMP_DS_LIB_2DIGIT_HEX_OUTPUT
				   NETSNMP_DS_LIB_IGNORE_NO_COMMUNITY
				   NETSNMP_DS_LIB_DISABLE_PERSISTENT_LOAD
				   NETSNMP_DS_LIB_DISABLE_PERSISTENT_SAVE
				   NETSNMP_DS_LIB_APPEND_LOGFILES
				   NETSNMP_DS_LIB_MIB_WARNINGS
				   NETSNMP_DS_LIB_SECLEVEL
				   NETSNMP_DS_LIB_SNMPVERSION
				   NETSNMP_DS_LIB_DEFAULT_PORT
				   NETSNMP_DS_LIB_OID_OUTPUT_FORMAT
				   NETSNMP_DS_LIB_STRING_OUTPUT_FORMAT
				   NETSNMP_DS_LIB_HEX_OUTPUT_LENGTH
				   NETSNMP_DS_LIB_SERVERSENDBUF
				   NETSNMP_DS_LIB_SERVERRECVBUF
				   NETSNMP_DS_LIB_CLIENTSENDBUF
				   NETSNMP_DS_LIB_CLIENTRECVBUF
				   NETSNMP_DS_SNMP_VERSION_1
				   NETSNMP_DS_SNMP_VERSION_2c
				   NETSNMP_DS_SNMP_VERSION_3
				   NETSNMP_DS_LIB_SECNAME
				   NETSNMP_DS_LIB_CONTEXT
				   NETSNMP_DS_LIB_PASSPHRASE
				   NETSNMP_DS_LIB_AUTHPASSPHRASE
				   NETSNMP_DS_LIB_PRIVPASSPHRASE
				   NETSNMP_DS_LIB_OPTIONALCONFIG
				   NETSNMP_DS_LIB_APPTYPE
				   NETSNMP_DS_LIB_COMMUNITY
				   NETSNMP_DS_LIB_PERSISTENT_DIR
				   NETSNMP_DS_LIB_CONFIGURATION_DIR
				   NETSNMP_DS_LIB_SECMODEL
				   NETSNMP_DS_LIB_MIBDIRS
				   NETSNMP_DS_LIB_OIDSUFFIX
				   NETSNMP_DS_LIB_OIDPREFIX
				   NETSNMP_DS_LIB_CLIENT_ADDR
				   NETSNMP_DS_LIB_TEMP_FILE_PATTERN
				   NETSNMP_DS_LIB_AUTHMASTERKEY
				   NETSNMP_DS_LIB_PRIVMASTERKEY
				   NETSNMP_DS_LIB_AUTHLOCALIZEDKEY
				   NETSNMP_DS_LIB_PRIVLOCALIZEDKEY
				   NETSNMP_DS_LIB_APPTYPES
				   NETSNMP_DS_LIB_KSM_KEYTAB
				   NETSNMP_DS_LIB_KSM_SERVICE_NAME
				   NETSNMP_DS_LIB_SBSM_LOCAL_PWD
);
$VERSION = '5.0703';

sub AUTOLOAD {
    # This AUTOLOAD is used to 'autoload' constants from the constant()
    # XS function.

    my $constname;
    ($constname = $AUTOLOAD) =~ s/.*:://;
    croak "&NetSNMP::default_store::constant not defined" if $constname eq 'cons
tant';
    my ($error, $val) = constant($constname);
    if ($error) { croak $error; }
    {
        no strict 'refs';
        # Fixed between 5.005_53 and 5.005_61
#XXX    if ($] >= 5.00561) {
#XXX        *$AUTOLOAD = sub () { $val };
#XXX    }
#XXX    else {
            *$AUTOLOAD = sub { $val };
#XXX    }
    }
    goto &$AUTOLOAD;
}

bootstrap NetSNMP::default_store $VERSION;

# Preloaded methods go here.

# Autoload methods go after =cut, and are processed by the autosplit program.

1;
__END__

=head1 NAME

NetSNMP::default_store - Perl extension for Net-SNMP generic storage of global data

=head1 SYNOPSIS

  use NetSNMP::default_store qw(:all);
  $port = netsnmp_ds_get_int(NETSNMP_DS_LIBRARY_ID, DS_LIB_DEFAULT_PORT);
  netsnmp_ds_set_int(NETSNMP_DS_LIBRARY_ID, DS_LIB_DEFAULT_PORT, 161);

=head1 DESCRIPTION

This module is a wrapper around the net-snmp default store routines.
See the net-snmp default_store manual page for details on what the
various functions do and the values that can be set/retrieved.

=head2 EXPORT

None by default.

=head2 Exportable constants

				   NETSNMP_DS_MAX_IDS
				   NETSNMP_DS_MAX_SUBIDS
				   NETSNMP_DS_LIBRARY_ID
				   NETSNMP_DS_APPLICATION_ID
				   NETSNMP_DS_TOKEN_ID
				   NETSNMP_DS_LIB_MIB_ERRORS
				   NETSNMP_DS_LIB_SAVE_MIB_DESCRS
				   NETSNMP_DS_LIB_MIB_COMMENT_TERM
				   NETSNMP_DS_LIB_MIB_PARSE_LABEL
				   NETSNMP_DS_LIB_DUMP_PACKET
				   NETSNMP_DS_LIB_LOG_TIMESTAMP
				   NETSNMP_DS_LIB_DONT_READ_CONFIGS
				   NETSNMP_DS_LIB_MIB_REPLACE
				   NETSNMP_DS_LIB_PRINT_NUMERIC_ENUM
				   NETSNMP_DS_LIB_PRINT_NUMERIC_OIDS
				   NETSNMP_DS_LIB_DONT_BREAKDOWN_OIDS
				   NETSNMP_DS_LIB_ALARM_DONT_USE_SIG
				   NETSNMP_DS_LIB_PRINT_FULL_OID
				   NETSNMP_DS_LIB_QUICK_PRINT
				   NETSNMP_DS_LIB_RANDOM_ACCESS
				   NETSNMP_DS_LIB_REGEX_ACCESS
				   NETSNMP_DS_LIB_DONT_CHECK_RANGE
				   NETSNMP_DS_LIB_NO_TOKEN_WARNINGS
				   NETSNMP_DS_LIB_NUMERIC_TIMETICKS
				   NETSNMP_DS_LIB_ESCAPE_QUOTES
				   NETSNMP_DS_LIB_REVERSE_ENCODE
				   NETSNMP_DS_LIB_PRINT_BARE_VALUE
				   NETSNMP_DS_LIB_EXTENDED_INDEX
				   NETSNMP_DS_LIB_PRINT_HEX_TEXT
				   NETSNMP_DS_LIB_PRINT_UCD_STYLE_OID
				   NETSNMP_DS_LIB_READ_UCD_STYLE_OID
				   NETSNMP_DS_LIB_HAVE_READ_PREMIB_CONFIG
				   NETSNMP_DS_LIB_HAVE_READ_CONFIG
				   NETSNMP_DS_LIB_QUICKE_PRINT
				   NETSNMP_DS_LIB_DONT_PRINT_UNITS
				   NETSNMP_DS_LIB_NO_DISPLAY_HINT
				   NETSNMP_DS_LIB_16BIT_IDS
				   NETSNMP_DS_LIB_DONT_PERSIST_STATE
				   NETSNMP_DS_LIB_2DIGIT_HEX_OUTPUT
				   NETSNMP_DS_LIB_IGNORE_NO_COMMUNITY
				   NETSNMP_DS_LIB_DISABLE_PERSISTENT_LOAD
				   NETSNMP_DS_LIB_DISABLE_PERSISTENT_SAVE
				   NETSNMP_DS_LIB_APPEND_LOGFILES
				   NETSNMP_DS_LIB_MIB_WARNINGS
				   NETSNMP_DS_LIB_SECLEVEL
				   NETSNMP_DS_LIB_SNMPVERSION
				   NETSNMP_DS_LIB_DEFAULT_PORT
				   NETSNMP_DS_LIB_OID_OUTPUT_FORMAT
				   NETSNMP_DS_LIB_STRING_OUTPUT_FORMAT
				   NETSNMP_DS_LIB_HEX_OUTPUT_LENGTH
				   NETSNMP_DS_LIB_SERVERSENDBUF
				   NETSNMP_DS_LIB_SERVERRECVBUF
				   NETSNMP_DS_LIB_CLIENTSENDBUF
				   NETSNMP_DS_LIB_CLIENTRECVBUF
				   NETSNMP_DS_SNMP_VERSION_1
				   NETSNMP_DS_SNMP_VERSION_2c
				   NETSNMP_DS_SNMP_VERSION_3
				   NETSNMP_DS_LIB_SECNAME
				   NETSNMP_DS_LIB_CONTEXT
				   NETSNMP_DS_LIB_PASSPHRASE
				   NETSNMP_DS_LIB_AUTHPASSPHRASE
				   NETSNMP_DS_LIB_PRIVPASSPHRASE
				   NETSNMP_DS_LIB_OPTIONALCONFIG
				   NETSNMP_DS_LIB_APPTYPE
				   NETSNMP_DS_LIB_COMMUNITY
				   NETSNMP_DS_LIB_PERSISTENT_DIR
				   NETSNMP_DS_LIB_CONFIGURATION_DIR
				   NETSNMP_DS_LIB_SECMODEL
				   NETSNMP_DS_LIB_MIBDIRS
				   NETSNMP_DS_LIB_OIDSUFFIX
				   NETSNMP_DS_LIB_OIDPREFIX
				   NETSNMP_DS_LIB_CLIENT_ADDR
				   NETSNMP_DS_LIB_TEMP_FILE_PATTERN
				   NETSNMP_DS_LIB_AUTHMASTERKEY
				   NETSNMP_DS_LIB_PRIVMASTERKEY
				   NETSNMP_DS_LIB_AUTHLOCALIZEDKEY
				   NETSNMP_DS_LIB_PRIVLOCALIZEDKEY
				   NETSNMP_DS_LIB_APPTYPES
				   NETSNMP_DS_LIB_KSM_KEYTAB
				   NETSNMP_DS_LIB_KSM_SERVICE_NAME
				   NETSNMP_DS_LIB_SBSM_LOCAL_PWD

=head2 Exportable functions

  int netsnmp_ds_get_boolean(int storeid, int which)
  int netsnmp_ds_get_int(int storeid, int which)
  char *netsnmp_ds_get_string(int storeid, int which)
  void *netsnmp_ds_get_void(int storeid, int which)
  int netsnmp_ds_register_config(unsigned char type, const char *ftype, const char *token,
                       int storeid, int which)
  int netsnmp_ds_register_premib(unsigned char type, const char *ftype, const char *token,
                       int storeid, int which)
  int netsnmp_ds_set_boolean(int storeid, int which, int value)
  int netsnmp_ds_set_int(int storeid, int which, int value)
  int netsnmp_ds_set_string(int storeid, int which, const char *value)
  int netsnmp_ds_set_void(int storeid, int which, void *value)
  void netsnmp_ds_shutdown(void)
  int netsnmp_ds_toggle_boolean(int storeid, int which)

=head1 AUTHOR

Wes Hardaker, hardaker@users.sourceforge.net

=head1 SEE ALSO

perl(1), default_store(3).

=cut
