Blame agent/mibgroup/host/hr_storage.c.autofs-skip

Packit 8e45bd
/*
Packit 8e45bd
 *  Host Resources MIB - storage group implementation - hr_storage.c
Packit 8e45bd
 *
Packit 8e45bd
 */
Packit 8e45bd
Packit 8e45bd
#include <net-snmp/net-snmp-config.h>
Packit 8e45bd
Packit 8e45bd
#if defined(freebsd5)
Packit 8e45bd
/* undefine these in order to use getfsstat */
Packit 8e45bd
#undef HAVE_STATVFS
Packit 8e45bd
#undef HAVE_STRUCT_STATVFS_F_FRSIZE
Packit 8e45bd
#endif
Packit 8e45bd
Packit 8e45bd
#include <sys/types.h>
Packit 8e45bd
#if HAVE_SYS_PARAM_H
Packit 8e45bd
#include <sys/param.h>
Packit 8e45bd
#endif
Packit 8e45bd
#if HAVE_UNISTD_H
Packit 8e45bd
#include <unistd.h>
Packit 8e45bd
#endif
Packit 8e45bd
#if TIME_WITH_SYS_TIME
Packit 8e45bd
# include <sys/time.h>
Packit 8e45bd
# include <time.h>
Packit 8e45bd
#else
Packit 8e45bd
# if HAVE_SYS_TIME_H
Packit 8e45bd
#  include <sys/time.h>
Packit 8e45bd
# else
Packit 8e45bd
#  include <time.h>
Packit 8e45bd
# endif
Packit 8e45bd
#endif
Packit 8e45bd
Packit 8e45bd
#if (!defined(mingw32) && !defined(WIN32))
Packit 8e45bd
#if HAVE_UTMPX_H
Packit 8e45bd
#include <utmpx.h>
Packit 8e45bd
#else
Packit 8e45bd
#include <utmp.h>
Packit 8e45bd
#endif
Packit 8e45bd
#endif /* mingw32 */
Packit 8e45bd
#ifndef dynix
Packit 8e45bd
#if HAVE_SYS_VM_H
Packit 8e45bd
#include <sys/vm.h>
Packit 8e45bd
#if (!defined(KERNEL) || defined(MACH_USER_API)) && defined(HAVE_SYS_VMMETER_H) /*OS X does not #include <sys/vmmeter.h> if (defined(KERNEL) && !defined(MACH_USER_API)) */
Packit 8e45bd
#include <sys/vmmeter.h>
Packit 8e45bd
#endif
Packit 8e45bd
#else
Packit 8e45bd
#if HAVE_VM_VM_H
Packit 8e45bd
#include <vm/vm.h>
Packit 8e45bd
#if HAVE_MACHINE_TYPES_H
Packit 8e45bd
#include <machine/types.h>
Packit 8e45bd
#endif
Packit 8e45bd
#if HAVE_SYS_VMMETER_H
Packit 8e45bd
#include <sys/vmmeter.h>
Packit 8e45bd
#endif
Packit 8e45bd
#if HAVE_VM_VM_PARAM_H
Packit 8e45bd
#include <vm/vm_param.h>
Packit 8e45bd
#endif
Packit 8e45bd
#else
Packit 8e45bd
#if HAVE_SYS_VMPARAM_H
Packit 8e45bd
#include <sys/vmparam.h>
Packit 8e45bd
#endif
Packit 8e45bd
#if HAVE_SYS_VMMAC_H
Packit 8e45bd
#include <sys/vmmac.h>
Packit 8e45bd
#endif
Packit 8e45bd
#if HAVE_SYS_VMMETER_H
Packit 8e45bd
#include <sys/vmmeter.h>
Packit 8e45bd
#endif
Packit 8e45bd
#if HAVE_SYS_VMSYSTM_H
Packit 8e45bd
#include <sys/vmsystm.h>
Packit 8e45bd
#endif
Packit 8e45bd
#endif                          /* vm/vm.h */
Packit 8e45bd
#endif                          /* sys/vm.h */
Packit 8e45bd
#if defined(HAVE_UVM_UVM_PARAM_H) && defined(HAVE_UVM_UVM_EXTERN_H)
Packit 8e45bd
#include <uvm/uvm_param.h>
Packit 8e45bd
#include <uvm/uvm_extern.h>
Packit 8e45bd
#elif defined(HAVE_VM_VM_PARAM_H) && defined(HAVE_VM_VM_EXTERN_H)
Packit 8e45bd
#include <vm/vm_param.h>
Packit 8e45bd
#include <vm/vm_extern.h>
Packit 8e45bd
#endif
Packit 8e45bd
#if HAVE_KVM_H
Packit 8e45bd
#include <kvm.h>
Packit 8e45bd
#endif
Packit 8e45bd
#if HAVE_FCNTL_H
Packit 8e45bd
#include <fcntl.h>
Packit 8e45bd
#endif
Packit 8e45bd
#if HAVE_SYS_POOL_H
Packit 8e45bd
#if defined(MBPOOL_SYMBOL) && defined(MCLPOOL_SYMBOL)
Packit 8e45bd
#define __POOL_EXPOSE
Packit 8e45bd
#include <sys/pool.h>
Packit 8e45bd
#else
Packit 8e45bd
#undef HAVE_SYS_POOL_H
Packit 8e45bd
#endif
Packit 8e45bd
#endif
Packit 8e45bd
#if HAVE_SYS_MBUF_H
Packit 8e45bd
#include <sys/mbuf.h>
Packit 8e45bd
#endif
Packit 8e45bd
#if HAVE_SYS_SYSCTL_H
Packit 8e45bd
#include <sys/sysctl.h>
Packit 8e45bd
#if defined(CTL_HW) && defined(HW_PAGESIZE)
Packit 8e45bd
#define USE_SYSCTL
Packit 8e45bd
#endif
Packit 8e45bd
#if USE_MACH_HOST_STATISTICS
Packit 8e45bd
#include <mach/mach.h>
Packit 8e45bd
#elif defined(CTL_VM) && (defined(VM_METER) || defined(VM_UVMEXP))
Packit 8e45bd
#define USE_SYSCTL_VM
Packit 8e45bd
#endif
Packit 8e45bd
#endif                          /* if HAVE_SYS_SYSCTL_H */
Packit 8e45bd
#endif                          /* ifndef dynix */
Packit 8e45bd
Packit 8e45bd
#if (defined(aix4) || defined(aix5) || defined(aix6) || defined(aix7)) && HAVE_LIBPERFSTAT_H
Packit 8e45bd
#ifdef HAVE_SYS_PROTOSW_H
Packit 8e45bd
#include <sys/protosw.h>
Packit 8e45bd
#endif
Packit 8e45bd
#include <libperfstat.h>
Packit 8e45bd
#endif
Packit 8e45bd
Packit 8e45bd
Packit 8e45bd
#include "host_res.h"
Packit 8e45bd
#include "hr_storage.h"
Packit 8e45bd
#include "hr_filesys.h"
Packit 8e45bd
#include <net-snmp/agent/auto_nlist.h>
Packit 8e45bd
Packit 8e45bd
#if HAVE_MNTENT_H
Packit 8e45bd
#include <mntent.h>
Packit 8e45bd
#endif
Packit 8e45bd
#if HAVE_SYS_MNTTAB_H
Packit 8e45bd
#include <sys/mnttab.h>
Packit 8e45bd
#endif
Packit 8e45bd
#if HAVE_SYS_STATVFS_H
Packit 8e45bd
#include <sys/statvfs.h>
Packit 8e45bd
#endif
Packit 8e45bd
#if HAVE_SYS_VFS_H
Packit 8e45bd
#include <sys/vfs.h>
Packit 8e45bd
#endif
Packit 8e45bd
#if HAVE_SYS_MOUNT_H
Packit 8e45bd
#ifdef __osf__
Packit 8e45bd
#undef m_next
Packit 8e45bd
#undef m_data
Packit 8e45bd
#endif
Packit 8e45bd
#include <sys/mount.h>
Packit 8e45bd
#endif
Packit 8e45bd
#ifdef HAVE_MACHINE_PARAM_H
Packit 8e45bd
#include <machine/param.h>
Packit 8e45bd
#endif
Packit 8e45bd
#include <sys/stat.h>
Packit 8e45bd
Packit 8e45bd
#if defined(hpux10) || defined(hpux11)
Packit 8e45bd
#include <sys/pstat.h>
Packit 8e45bd
#endif
Packit 8e45bd
#if defined(solaris2)
Packit 8e45bd
#if HAVE_SYS_SWAP_H
Packit 8e45bd
#include <sys/swap.h>
Packit 8e45bd
#endif
Packit 8e45bd
#endif
Packit 8e45bd
Packit 8e45bd
#if HAVE_STRING_H
Packit 8e45bd
#include <string.h>
Packit 8e45bd
#else
Packit 8e45bd
#include <strings.h>
Packit 8e45bd
#endif
Packit 8e45bd
#if HAVE_NBUTIL_H
Packit 8e45bd
#include <nbutil.h>
Packit 8e45bd
#endif
Packit 8e45bd
Packit 8e45bd
#include <net-snmp/utilities.h>
Packit 8e45bd
#include <net-snmp/output_api.h>
Packit 8e45bd
Packit 8e45bd
#include <net-snmp/agent/net-snmp-agent-includes.h>
Packit 8e45bd
#include <net-snmp/agent/hardware/memory.h>
Packit 8e45bd
Packit 8e45bd
#ifdef solaris2
Packit 8e45bd
#include "kernel_sunos5.h"
Packit 8e45bd
#endif
Packit 8e45bd
Packit 8e45bd
#include <net-snmp/agent/agent_read_config.h>
Packit 8e45bd
#include <net-snmp/library/read_config.h>
Packit 8e45bd
Packit 8e45bd
#define HRSTORE_MONOTONICALLY_INCREASING
Packit 8e45bd
Packit 8e45bd
        /*********************
Packit 8e45bd
	 *
Packit 8e45bd
	 *  Kernel & interface information,
Packit 8e45bd
	 *   and internal forward declarations
Packit 8e45bd
	 *
Packit 8e45bd
	 *********************/
Packit 8e45bd
Packit 8e45bd
Packit 8e45bd
#ifdef solaris2
Packit 8e45bd
Packit 8e45bd
extern struct mnttab *HRFS_entry;
Packit 8e45bd
#define HRFS_mount	mnt_mountp
Packit 8e45bd
#define HRFS_statfs	statvfs
Packit 8e45bd
#define HRFS_HAS_FRSIZE HAVE_STRUCT_STATVFS_F_FRSIZE
Packit 8e45bd
Packit 8e45bd
#elif defined(WIN32)
Packit 8e45bd
/* fake block size */
Packit 8e45bd
#define FAKED_BLOCK_SIZE 512
Packit 8e45bd
Packit 8e45bd
extern struct win_statfs *HRFS_entry;
Packit 8e45bd
#define HRFS_statfs	win_statfs
Packit 8e45bd
#define HRFS_mount	f_driveletter
Packit 8e45bd
Packit 8e45bd
#elif defined(HAVE_STATVFS) && defined(__NetBSD__)
Packit 8e45bd
Packit 8e45bd
extern struct statvfs *HRFS_entry;
Packit 8e45bd
extern int      fscount;
Packit 8e45bd
#define HRFS_statfs	statvfs
Packit 8e45bd
#define HRFS_mount	f_mntonname
Packit 8e45bd
#define HRFS_HAS_FRSIZE HAVE_STRUCT_STATVFS_F_FRSIZE
Packit 8e45bd
Packit 8e45bd
#elif defined(HAVE_STATVFS)  && defined(HAVE_STRUCT_STATVFS_MNT_DIR)
Packit 8e45bd
Packit 8e45bd
extern struct mntent *HRFS_entry;
Packit 8e45bd
extern int      fscount;
Packit 8e45bd
#define HRFS_statfs	statvfs
Packit 8e45bd
#define HRFS_mount	mnt_dir
Packit 8e45bd
#define HRFS_HAS_FRSIZE HAVE_STRUCT_STATVFS_F_FRSIZE
Packit 8e45bd
Packit 8e45bd
#elif defined(HAVE_GETFSSTAT) && !defined(HAVE_STATFS) && defined(HAVE_STATVFS)
Packit 8e45bd
Packit 8e45bd
extern struct statfs *HRFS_entry;
Packit 8e45bd
extern int      fscount;
Packit 8e45bd
#define HRFS_statfs	statvfs
Packit 8e45bd
#define HRFS_mount	f_mntonname
Packit 8e45bd
#define HRFS_HAS_FRSIZE STRUCT_STATVFS_HAS_F_FRSIZE
Packit 8e45bd
Packit 8e45bd
#elif defined(HAVE_GETFSSTAT)
Packit 8e45bd
Packit 8e45bd
extern struct statfs *HRFS_entry;
Packit 8e45bd
extern int      fscount;
Packit 8e45bd
#define HRFS_statfs	statfs
Packit 8e45bd
#define HRFS_mount	f_mntonname
Packit 8e45bd
#define HRFS_HAS_FRSIZE HAVE_STRUCT_STATFS_F_FRSIZE
Packit 8e45bd
Packit 8e45bd
#else
Packit 8e45bd
Packit 8e45bd
extern struct mntent *HRFS_entry;
Packit 8e45bd
#define HRFS_mount	mnt_dir
Packit 8e45bd
#define HRFS_statfs	statfs
Packit 8e45bd
#define HRFS_HAS_FRSIZE HAVE_STRUCT_STATFS_F_FRSIZE
Packit 8e45bd
Packit 8e45bd
#endif
Packit 8e45bd
	
Packit 8e45bd
#if defined(USE_MACH_HOST_STATISTICS)
Packit 8e45bd
mach_port_t myHost;
Packit 8e45bd
#endif
Packit 8e45bd
Packit 8e45bd
static void parse_storage_config(const char *, char *);
Packit 8e45bd
Packit 8e45bd
        /*********************
Packit 8e45bd
	 *
Packit 8e45bd
	 *  Initialisation & common implementation functions
Packit 8e45bd
	 *
Packit 8e45bd
	 *********************/
Packit 8e45bd
int             Get_Next_HR_Store(void);
Packit 8e45bd
void            Init_HR_Store(void);
Packit 8e45bd
int             header_hrstore(struct variable *, oid *, size_t *, int,
Packit 8e45bd
                               size_t *, WriteMethod **);
Packit 8e45bd
void*           header_hrstoreEntry(struct variable *, oid *, size_t *,
Packit 8e45bd
                                    int, size_t *, WriteMethod **);
Packit 8e45bd
Netsnmp_Node_Handler handle_memsize;
Packit 8e45bd
Packit 8e45bd
#define	HRSTORE_MEMSIZE		1
Packit 8e45bd
#define	HRSTORE_INDEX		2
Packit 8e45bd
#define	HRSTORE_TYPE		3
Packit 8e45bd
#define	HRSTORE_DESCR		4
Packit 8e45bd
#define	HRSTORE_UNITS		5
Packit 8e45bd
#define	HRSTORE_SIZE		6
Packit 8e45bd
#define	HRSTORE_USED		7
Packit 8e45bd
#define	HRSTORE_FAILS		8
Packit 8e45bd
Packit 8e45bd
struct variable2 hrstore_variables[] = {
Packit 8e45bd
    {HRSTORE_INDEX, ASN_INTEGER, NETSNMP_OLDAPI_RONLY,
Packit 8e45bd
     var_hrstore, 1, {1}},
Packit 8e45bd
    {HRSTORE_TYPE, ASN_OBJECT_ID, NETSNMP_OLDAPI_RONLY,
Packit 8e45bd
     var_hrstore, 1, {2}},
Packit 8e45bd
    {HRSTORE_DESCR, ASN_OCTET_STR, NETSNMP_OLDAPI_RONLY,
Packit 8e45bd
     var_hrstore, 1, {3}},
Packit 8e45bd
    {HRSTORE_UNITS, ASN_INTEGER, NETSNMP_OLDAPI_RONLY,
Packit 8e45bd
     var_hrstore, 1, {4}},
Packit 8e45bd
    {HRSTORE_SIZE, ASN_INTEGER, NETSNMP_OLDAPI_RONLY,
Packit 8e45bd
     var_hrstore, 1, {5}},
Packit 8e45bd
    {HRSTORE_USED, ASN_INTEGER, NETSNMP_OLDAPI_RONLY,
Packit 8e45bd
     var_hrstore, 1, {6}},
Packit 8e45bd
    {HRSTORE_FAILS, ASN_COUNTER, NETSNMP_OLDAPI_RONLY,
Packit 8e45bd
     var_hrstore, 1, {7}}
Packit 8e45bd
};
Packit 8e45bd
oid             hrMemorySize_oid[]   = { 1, 3, 6, 1, 2, 1, 25, 2, 2 };
Packit 8e45bd
oid             hrStorageTable_oid[] = { 1, 3, 6, 1, 2, 1, 25, 2, 3, 1 };
Packit 8e45bd
Packit 8e45bd
Packit 8e45bd
void
Packit 8e45bd
init_hr_storage(void)
Packit 8e45bd
{
Packit 8e45bd
    char *appname;
Packit 8e45bd
Packit 8e45bd
    netsnmp_register_scalar(
Packit 8e45bd
        netsnmp_create_handler_registration("host/hrMemorySize", handle_memsize,
Packit 8e45bd
                           hrMemorySize_oid, OID_LENGTH(hrMemorySize_oid),
Packit 8e45bd
                                             HANDLER_CAN_RONLY));
Packit 8e45bd
    REGISTER_MIB("host/hr_storage", hrstore_variables, variable2,
Packit 8e45bd
                 hrStorageTable_oid);
Packit 8e45bd
Packit 8e45bd
    appname = netsnmp_ds_get_string(NETSNMP_DS_LIBRARY_ID,
Packit 8e45bd
                                    NETSNMP_DS_LIB_APPTYPE);
Packit 8e45bd
    netsnmp_ds_register_config(ASN_BOOLEAN, appname, "skipNFSInHostResources", 
Packit 8e45bd
			       NETSNMP_DS_APPLICATION_ID,
Packit 8e45bd
			       NETSNMP_DS_AGENT_SKIPNFSINHOSTRESOURCES);
Packit 8e45bd
Packit 8e45bd
    snmpd_register_config_handler("storageUseNFS", parse_storage_config, NULL,
Packit 8e45bd
	"1 | 2\t\t(1 = enable, 2 = disable)");
Packit 8e45bd
}
Packit 8e45bd
Packit 8e45bd
static int storageUseNFS = 1;	/* Default to reporting NFS mounts as NetworkDisk */
Packit 8e45bd
Packit 8e45bd
static void
Packit 8e45bd
parse_storage_config(const char *token, char *cptr)
Packit 8e45bd
{
Packit 8e45bd
    char *val;
Packit 8e45bd
    int ival;
Packit 8e45bd
    char *st;
Packit 8e45bd
Packit 8e45bd
    val = strtok_r(cptr, " \t", &st);
Packit 8e45bd
    if (!val) {
Packit 8e45bd
        config_perror("Missing FLAG parameter in storageUseNFS");
Packit 8e45bd
        return;
Packit 8e45bd
    }
Packit 8e45bd
    ival = atoi(val);
Packit 8e45bd
    if (ival < 1 || ival > 2) {
Packit 8e45bd
        config_perror("storageUseNFS must be 1 or 2");
Packit 8e45bd
        return;
Packit 8e45bd
    }
Packit 8e45bd
    storageUseNFS = (ival == 1) ? 1 : 0;
Packit 8e45bd
}
Packit 8e45bd
Packit 8e45bd
/*
Packit 8e45bd
 * header_hrstoreEntry(...
Packit 8e45bd
 * Arguments:
Packit 8e45bd
 * vp     IN      - pointer to variable entry that points here
Packit 8e45bd
 * name    IN/OUT  - IN/name requested, OUT/name found
Packit 8e45bd
 * length  IN/OUT  - length of IN/OUT oid's 
Packit 8e45bd
 * exact   IN      - TRUE if an exact match was requested
Packit 8e45bd
 * var_len OUT     - length of variable or 0 if function returned
Packit 8e45bd
 * write_method
Packit 8e45bd
 * 
Packit 8e45bd
 */
Packit 8e45bd
Packit 8e45bd
void *
Packit 8e45bd
header_hrstoreEntry(struct variable *vp,
Packit 8e45bd
                    oid * name,
Packit 8e45bd
                    size_t * length,
Packit 8e45bd
                    int exact,
Packit 8e45bd
                    size_t * var_len, WriteMethod ** write_method)
Packit 8e45bd
{
Packit 8e45bd
#define HRSTORE_ENTRY_NAME_LENGTH	11
Packit 8e45bd
    oid             newname[MAX_OID_LEN];
Packit 8e45bd
    int             storage_idx, LowIndex = -1;
Packit 8e45bd
    int             result;
Packit 8e45bd
    int                  idx = -1;
Packit 8e45bd
    netsnmp_memory_info *mem  = NULL;
Packit 8e45bd
Packit 8e45bd
    DEBUGMSGTL(("host/hr_storage", "var_hrstoreEntry: request "));
Packit 8e45bd
    DEBUGMSGOID(("host/hr_storage", name, *length));
Packit 8e45bd
    DEBUGMSG(("host/hr_storage", " exact=%d\n", exact));
Packit 8e45bd
Packit 8e45bd
    memcpy((char *) newname, (char *) vp->name,
Packit 8e45bd
           (int) vp->namelen * sizeof(oid));
Packit 8e45bd
    result = snmp_oid_compare(name, *length, vp->name, vp->namelen);
Packit 8e45bd
Packit 8e45bd
    DEBUGMSGTL(("host/hr_storage", "var_hrstoreEntry: compare "));
Packit 8e45bd
    DEBUGMSGOID(("host/hr_storage", vp->name, vp->namelen));
Packit 8e45bd
    DEBUGMSG(("host/hr_storage", " => %d\n", result));
Packit 8e45bd
Packit 8e45bd
Packit 8e45bd
    if (result < 0 ||
Packit 8e45bd
        *length <= HRSTORE_ENTRY_NAME_LENGTH ) {
Packit 8e45bd
       /*
Packit 8e45bd
        * Requested OID too early or too short to refer
Packit 8e45bd
        *   to a valid row (for the current column object).
Packit 8e45bd
        * GET requests should fail, GETNEXT requests
Packit 8e45bd
        *   should use the first row.
Packit 8e45bd
        */
Packit 8e45bd
        if ( exact )
Packit 8e45bd
            return NULL;
Packit 8e45bd
        netsnmp_memory_load();
Packit 8e45bd
        mem = netsnmp_memory_get_first( 0 );
Packit 8e45bd
    }
Packit 8e45bd
    else {
Packit 8e45bd
        /*
Packit 8e45bd
         * Otherwise, retrieve the requested
Packit 8e45bd
         *  (or following) row as appropriate.
Packit 8e45bd
         */
Packit 8e45bd
        if ( exact && *length > HRSTORE_ENTRY_NAME_LENGTH+1 )
Packit 8e45bd
            return NULL;   /* Too long for a valid instance */
Packit 8e45bd
        idx = name[ HRSTORE_ENTRY_NAME_LENGTH ];
Packit 8e45bd
        if ( idx < NETSNMP_MEM_TYPE_MAX ) {
Packit 8e45bd
            netsnmp_memory_load();
Packit 8e45bd
            mem = ( exact ? netsnmp_memory_get_byIdx( idx, 0 ) :
Packit 8e45bd
                       netsnmp_memory_get_next_byIdx( idx, 0 ));
Packit 8e45bd
        }
Packit 8e45bd
    }
Packit 8e45bd
Packit 8e45bd
    /*
Packit 8e45bd
     * If this matched a memory-based entry, then
Packit 8e45bd
     *    update the OID parameter(s) for GETNEXT requests.
Packit 8e45bd
     */
Packit 8e45bd
    if ( mem ) {
Packit 8e45bd
        if ( !exact ) {
Packit 8e45bd
            newname[ HRSTORE_ENTRY_NAME_LENGTH ] = mem->idx;
Packit 8e45bd
            memcpy((char *) name, (char *) newname,
Packit 8e45bd
                   ((int) vp->namelen + 1) * sizeof(oid));
Packit 8e45bd
            *length = vp->namelen + 1;
Packit 8e45bd
        }
Packit 8e45bd
    }
Packit 8e45bd
    /*
Packit 8e45bd
     * If this didn't match a memory-based entry,
Packit 8e45bd
     *   then consider the disk-based storage.
Packit 8e45bd
     */
Packit 8e45bd
    else {
Packit 8e45bd
        Init_HR_Store();
Packit 8e45bd
        for (;;) {
Packit 8e45bd
            storage_idx = Get_Next_HR_Store();
Packit 8e45bd
            DEBUGMSG(("host/hr_storage", "(index %d ....", storage_idx));
Packit 8e45bd
            if (storage_idx == -1)
Packit 8e45bd
                break;
Packit 8e45bd
            newname[HRSTORE_ENTRY_NAME_LENGTH] = storage_idx;
Packit 8e45bd
            DEBUGMSGOID(("host/hr_storage", newname, *length));
Packit 8e45bd
            DEBUGMSG(("host/hr_storage", "\n"));
Packit 8e45bd
            result = snmp_oid_compare(name, *length, newname, vp->namelen + 1);
Packit 8e45bd
            if (exact && (result == 0)) {
Packit 8e45bd
                LowIndex = storage_idx;
Packit 8e45bd
                /*
Packit 8e45bd
                 * Save storage status information 
Packit 8e45bd
                 */
Packit 8e45bd
                break;
Packit 8e45bd
            }
Packit 8e45bd
            if ((!exact && (result < 0)) &&
Packit 8e45bd
                (LowIndex == -1 || storage_idx < LowIndex)) {
Packit 8e45bd
                LowIndex = storage_idx;
Packit 8e45bd
                /*
Packit 8e45bd
                 * Save storage status information 
Packit 8e45bd
                 */
Packit 8e45bd
#ifdef HRSTORE_MONOTONICALLY_INCREASING
Packit 8e45bd
                break;
Packit 8e45bd
#endif
Packit 8e45bd
            }
Packit 8e45bd
        }
Packit 8e45bd
        if ( LowIndex != -1 ) {
Packit 8e45bd
            if ( !exact ) {
Packit 8e45bd
                newname[ HRSTORE_ENTRY_NAME_LENGTH ] = LowIndex;
Packit 8e45bd
                memcpy((char *) name, (char *) newname,
Packit 8e45bd
                       ((int) vp->namelen + 1) * sizeof(oid));
Packit 8e45bd
                *length = vp->namelen + 1;
Packit 8e45bd
            }
Packit 8e45bd
            mem = (netsnmp_memory_info*)0xffffffff;   /* To indicate 'success' */
Packit 8e45bd
        }
Packit 8e45bd
    }
Packit 8e45bd
Packit 8e45bd
    *write_method = (WriteMethod*)0;
Packit 8e45bd
    *var_len = sizeof(long);    /* default to 'long' results */
Packit 8e45bd
Packit 8e45bd
    /*
Packit 8e45bd
     *  ... and return the appropriate row
Packit 8e45bd
     */
Packit 8e45bd
    DEBUGMSGTL(("host/hr_storage", "var_hrstoreEntry: process "));
Packit 8e45bd
    DEBUGMSGOID(("host/hr_storage", name, *length));
Packit 8e45bd
    DEBUGMSG(("host/hr_storage", " (%p)\n", mem));
Packit 8e45bd
    return (void*)mem;
Packit 8e45bd
}
Packit 8e45bd
Packit 8e45bd
oid             storage_type_id[] = { 1, 3, 6, 1, 2, 1, 25, 2, 1, 1 };  /* hrStorageOther */
Packit 8e45bd
int             storage_type_len =
Packit 8e45bd
    sizeof(storage_type_id) / sizeof(storage_type_id[0]);
Packit 8e45bd
Packit 8e45bd
        /*********************
Packit 8e45bd
	 *
Packit 8e45bd
	 *  System specific implementation functions
Packit 8e45bd
	 *
Packit 8e45bd
	 *********************/
Packit 8e45bd
Packit 8e45bd
int
Packit 8e45bd
handle_memsize(netsnmp_mib_handler *handler,
Packit 8e45bd
                netsnmp_handler_registration *reginfo,
Packit 8e45bd
                netsnmp_agent_request_info *reqinfo,
Packit 8e45bd
                netsnmp_request_info *requests)
Packit 8e45bd
{
Packit 8e45bd
    netsnmp_memory_info *mem_info;
Packit 8e45bd
    int val;
Packit 8e45bd
Packit 8e45bd
    /*
Packit 8e45bd
     * We just need to handle valid GET requests, as invalid instances
Packit 8e45bd
     *   are rejected automatically, and (valid) GETNEXT requests are
Packit 8e45bd
     *   converted into the appropriate GET request.
Packit 8e45bd
     *
Packit 8e45bd
     * We also only ever receive one request at a time.
Packit 8e45bd
     */
Packit 8e45bd
    switch (reqinfo->mode) {
Packit 8e45bd
    case MODE_GET:
Packit 8e45bd
        netsnmp_memory_load();
Packit 8e45bd
        mem_info = netsnmp_memory_get_byIdx( NETSNMP_MEM_TYPE_PHYSMEM, 0 );
Packit 8e45bd
        if ( !mem_info || mem_info->size == -1 || mem_info->units == -1 )
Packit 8e45bd
            netsnmp_set_request_error( reqinfo, requests, SNMP_NOSUCHOBJECT );
Packit 8e45bd
	else {
Packit 8e45bd
            val  =  mem_info->size;     /* memtotal */
Packit 8e45bd
            val *= (mem_info->units/1024);
Packit 8e45bd
            snmp_set_var_typed_value(requests->requestvb, ASN_INTEGER,
Packit 8e45bd
                                     (u_char *)&val, sizeof(val));
Packit 8e45bd
        }
Packit 8e45bd
        return SNMP_ERR_NOERROR;
Packit 8e45bd
Packit 8e45bd
    default:
Packit 8e45bd
        /*
Packit 8e45bd
         * we should never get here, so this is a really bad error 
Packit 8e45bd
         */
Packit 8e45bd
        snmp_log(LOG_ERR, "unknown mode (%d) in handle_memsize\n",
Packit 8e45bd
                 reqinfo->mode);
Packit 8e45bd
        return SNMP_ERR_GENERR;
Packit 8e45bd
    }
Packit 8e45bd
Packit 8e45bd
    return SNMP_ERR_NOERROR;
Packit 8e45bd
}
Packit 8e45bd
Packit 8e45bd
Packit 8e45bd
u_char         *
Packit 8e45bd
var_hrstore(struct variable *vp,
Packit 8e45bd
            oid * name,
Packit 8e45bd
            size_t * length,
Packit 8e45bd
            int exact, size_t * var_len, WriteMethod ** write_method)
Packit 8e45bd
{
Packit 8e45bd
    int             store_idx = 0;
Packit 8e45bd
    static char     string[1024];
Packit 8e45bd
    struct HRFS_statfs stat_buf;
Packit 8e45bd
    void                *ptr;
Packit 8e45bd
    netsnmp_memory_info *mem = NULL;
Packit 8e45bd
Packit 8e45bd
really_try_next:
Packit 8e45bd
	ptr = header_hrstoreEntry(vp, name, length, exact, var_len,
Packit 8e45bd
					write_method);
Packit 8e45bd
	if (ptr == NULL)
Packit 8e45bd
	    return NULL;
Packit 8e45bd
Packit 8e45bd
        store_idx = name[ HRSTORE_ENTRY_NAME_LENGTH ];
Packit 8e45bd
        if (store_idx > NETSNMP_MEM_TYPE_MAX ) {
Packit 8e45bd
            if ( netsnmp_ds_get_boolean(NETSNMP_DS_APPLICATION_ID,
Packit 8e45bd
                                        NETSNMP_DS_AGENT_SKIPNFSINHOSTRESOURCES) &&
Packit 8e45bd
                 Check_HR_FileSys_NFS())
Packit 8e45bd
                return NULL;  /* or goto try_next; */
Packit 8e45bd
	    if (HRFS_statfs(HRFS_entry->HRFS_mount, &stat_buf) < 0) {
Packit 8e45bd
		snmp_log_perror(HRFS_entry->HRFS_mount);
Packit 8e45bd
		goto try_next;
Packit 8e45bd
	    }
Packit 8e45bd
	} else {
Packit 8e45bd
	    mem = (netsnmp_memory_info*)ptr;
Packit 8e45bd
        }
Packit 8e45bd
Packit 8e45bd
Packit 8e45bd
Packit 8e45bd
    switch (vp->magic) {
Packit 8e45bd
    case HRSTORE_INDEX:
Packit 8e45bd
        long_return = store_idx;
Packit 8e45bd
        return (u_char *) & long_return;
Packit 8e45bd
    case HRSTORE_TYPE:
Packit 8e45bd
        if (store_idx > NETSNMP_MEM_TYPE_MAX)
Packit 8e45bd
            if (storageUseNFS && Check_HR_FileSys_NFS())
Packit 8e45bd
                storage_type_id[storage_type_len - 1] = 10;     /* Network Disk */
Packit 8e45bd
#if HAVE_HASMNTOPT && !(defined(aix4) || defined(aix5) || defined(aix6) || defined(aix7))
Packit 8e45bd
            /* 
Packit 8e45bd
             * hasmntopt takes "const struct mntent*", but HRFS_entry has been
Packit 8e45bd
             * defined differently for AIX, so skip this for AIX
Packit 8e45bd
             */
Packit 8e45bd
            else if (hasmntopt(HRFS_entry, "loop") != NULL)
Packit 8e45bd
                storage_type_id[storage_type_len - 1] = 5;      /* Removable Disk */
Packit 8e45bd
#endif
Packit 8e45bd
            else
Packit 8e45bd
                storage_type_id[storage_type_len - 1] = 4;      /* Assume fixed */
Packit 8e45bd
        else
Packit 8e45bd
            switch (store_idx) {
Packit 8e45bd
            case NETSNMP_MEM_TYPE_PHYSMEM:
Packit 8e45bd
            case NETSNMP_MEM_TYPE_USERMEM:
Packit 8e45bd
                storage_type_id[storage_type_len - 1] = 2;      /* RAM */
Packit 8e45bd
                break;
Packit 8e45bd
            case NETSNMP_MEM_TYPE_VIRTMEM:
Packit 8e45bd
            case NETSNMP_MEM_TYPE_SWAP:
Packit 8e45bd
                storage_type_id[storage_type_len - 1] = 3;      /* Virtual Mem */
Packit 8e45bd
                break;
Packit 8e45bd
            default:
Packit 8e45bd
                storage_type_id[storage_type_len - 1] = 1;      /* Other */
Packit 8e45bd
                break;
Packit 8e45bd
            }
Packit 8e45bd
        *var_len = sizeof(storage_type_id);
Packit 8e45bd
        return (u_char *) storage_type_id;
Packit 8e45bd
    case HRSTORE_DESCR:
Packit 8e45bd
        if (store_idx > NETSNMP_MEM_TYPE_MAX) {
Packit 8e45bd
            strlcpy(string, HRFS_entry->HRFS_mount, sizeof(string));
Packit 8e45bd
            *var_len = strlen(string);
Packit 8e45bd
            return (u_char *) string;
Packit 8e45bd
        } else {
Packit 8e45bd
            if ( !mem || !mem->descr )
Packit 8e45bd
                goto try_next;
Packit 8e45bd
            *var_len = strlen(mem->descr);
Packit 8e45bd
            return (u_char *) mem->descr;
Packit 8e45bd
        }
Packit 8e45bd
    case HRSTORE_UNITS:
Packit 8e45bd
        if (store_idx > NETSNMP_MEM_TYPE_MAX)
Packit 8e45bd
#if HRFS_HAS_FRSIZE
Packit 8e45bd
            long_return = stat_buf.f_frsize;
Packit 8e45bd
#else
Packit 8e45bd
            long_return = stat_buf.f_bsize;
Packit 8e45bd
#endif
Packit 8e45bd
        else {
Packit 8e45bd
            if ( !mem || mem->units == -1 )
Packit 8e45bd
                goto try_next;
Packit 8e45bd
            long_return = mem->units;
Packit 8e45bd
        }
Packit 8e45bd
        return (u_char *) & long_return;
Packit 8e45bd
    case HRSTORE_SIZE:
Packit 8e45bd
        if (store_idx > NETSNMP_MEM_TYPE_MAX)
Packit 8e45bd
            long_return = stat_buf.f_blocks;
Packit 8e45bd
        else {
Packit 8e45bd
            if ( !mem || mem->size == -1 )
Packit 8e45bd
                goto try_next;
Packit 8e45bd
            long_return = mem->size;
Packit 8e45bd
        }
Packit 8e45bd
        return (u_char *) & long_return;
Packit 8e45bd
    case HRSTORE_USED:
Packit 8e45bd
        if (store_idx > NETSNMP_MEM_TYPE_MAX)
Packit 8e45bd
            long_return = (stat_buf.f_blocks - stat_buf.f_bfree);
Packit 8e45bd
        else {
Packit 8e45bd
            if ( !mem || mem->size == -1 || mem->free == -1 )
Packit 8e45bd
                goto try_next;
Packit 8e45bd
            long_return = mem->size - mem->free;
Packit 8e45bd
        }
Packit 8e45bd
        return (u_char *) & long_return;
Packit 8e45bd
    case HRSTORE_FAILS:
Packit 8e45bd
        if (store_idx > NETSNMP_MEM_TYPE_MAX)
Packit 8e45bd
#if NETSNMP_NO_DUMMY_VALUES
Packit 8e45bd
	    goto try_next;
Packit 8e45bd
#else
Packit 8e45bd
            long_return = 0;
Packit 8e45bd
#endif
Packit 8e45bd
        else {
Packit 8e45bd
            if ( !mem || mem->other == -1 )
Packit 8e45bd
                goto try_next;
Packit 8e45bd
            long_return = mem->other;
Packit 8e45bd
        }
Packit 8e45bd
        return (u_char *) & long_return;
Packit 8e45bd
    default:
Packit 8e45bd
        DEBUGMSGTL(("snmpd", "unknown sub-id %d in var_hrstore\n",
Packit 8e45bd
                    vp->magic));
Packit 8e45bd
    }
Packit 8e45bd
    return NULL;
Packit 8e45bd
Packit 8e45bd
  try_next:
Packit 8e45bd
    if (!exact)
Packit 8e45bd
        goto really_try_next;
Packit 8e45bd
Packit 8e45bd
    return NULL;
Packit 8e45bd
}
Packit 8e45bd
Packit 8e45bd
Packit 8e45bd
        /*********************
Packit 8e45bd
	 *
Packit 8e45bd
	 *  Internal implementation functions
Packit 8e45bd
	 *
Packit 8e45bd
	 *********************/
Packit 8e45bd
Packit 8e45bd
static int      HRS_index;
Packit 8e45bd
Packit 8e45bd
void
Packit 8e45bd
Init_HR_Store(void)
Packit 8e45bd
{
Packit 8e45bd
    HRS_index = 0;
Packit 8e45bd
    Init_HR_FileSys();
Packit 8e45bd
}
Packit 8e45bd
Packit 8e45bd
int
Packit 8e45bd
Get_Next_HR_Store(void)
Packit 8e45bd
{
Packit 8e45bd
    /*
Packit 8e45bd
     * File-based storage 
Packit 8e45bd
     */
Packit 8e45bd
	for (;;) {
Packit 8e45bd
    	HRS_index = Get_Next_HR_FileSys();
Packit 8e45bd
		if (HRS_index >= 0) {
Packit 8e45bd
			if (!(netsnmp_ds_get_boolean(NETSNMP_DS_APPLICATION_ID, 
Packit 8e45bd
							NETSNMP_DS_AGENT_SKIPNFSINHOSTRESOURCES) && 
Packit 8e45bd
						Check_HR_FileSys_NFS())) {
Packit 8e45bd
				return HRS_index + NETSNMP_MEM_TYPE_MAX;	
Packit 8e45bd
			}
Packit 8e45bd
		} else {
Packit 8e45bd
			return -1;
Packit 8e45bd
		}	
Packit 8e45bd
	}
Packit 8e45bd
}
Packit 8e45bd
Packit 8e45bd
#if 0
Packit 8e45bd
void
Packit 8e45bd
sol_get_swapinfo(int *totalP, int *usedP)
Packit 8e45bd
{
Packit 8e45bd
    struct anoninfo ainfo;
Packit 8e45bd
Packit 8e45bd
    if (swapctl(SC_AINFO, &ainfo) < 0) {
Packit 8e45bd
        *totalP = *usedP = 0;
Packit 8e45bd
        return;
Packit 8e45bd
    }
Packit 8e45bd
Packit 8e45bd
    *totalP = ainfo.ani_max;
Packit 8e45bd
    *usedP = ainfo.ani_resv;
Packit 8e45bd
}
Packit 8e45bd
#endif                          /* solaris2 */
Packit 8e45bd
Packit 8e45bd
#ifdef WIN32
Packit 8e45bd
char *win_realpath(const char *file_name, char *resolved_name)
Packit 8e45bd
{
Packit 8e45bd
	char szFile[_MAX_PATH + 1];
Packit 8e45bd
	char *pszRet;
Packit 8e45bd
 	
Packit 8e45bd
	pszRet = _fullpath(szFile, resolved_name, MAX_PATH);
Packit 8e45bd
 	
Packit 8e45bd
	return pszRet;  
Packit 8e45bd
}
Packit 8e45bd
Packit 8e45bd
static int win_statfs (const char *path, struct win_statfs *buf)
Packit 8e45bd
{
Packit 8e45bd
    HINSTANCE h;
Packit 8e45bd
    FARPROC f;
Packit 8e45bd
    int retval = 0;
Packit 8e45bd
    char tmp [MAX_PATH], resolved_path [MAX_PATH];
Packit 8e45bd
    GetFullPathName(path, MAX_PATH, resolved_path, NULL);
Packit 8e45bd
    /* TODO - Fix this! The realpath macro needs defined
Packit 8e45bd
     * or rewritten into the function.
Packit 8e45bd
     */
Packit 8e45bd
    
Packit 8e45bd
    win_realpath(path, resolved_path);
Packit 8e45bd
    
Packit 8e45bd
    if (!resolved_path)
Packit 8e45bd
    	retval = - 1;
Packit 8e45bd
    else {
Packit 8e45bd
    	/* check whether GetDiskFreeSpaceExA is supported */
Packit 8e45bd
        h = LoadLibraryA ("kernel32.dll");
Packit 8e45bd
        if (h)
Packit 8e45bd
			f = GetProcAddress (h, "GetDiskFreeSpaceExA");
Packit 8e45bd
        else
Packit 8e45bd
        	f = NULL;
Packit 8e45bd
		
Packit 8e45bd
        if (f) {
Packit 8e45bd
			ULARGE_INTEGER bytes_free, bytes_total, bytes_free2;
Packit 8e45bd
            if (!f (resolved_path, &bytes_free2, &bytes_total, &bytes_free)) {
Packit 8e45bd
				errno = ENOENT;
Packit 8e45bd
				retval = - 1;
Packit 8e45bd
			} else {
Packit 8e45bd
				buf -> f_bsize = FAKED_BLOCK_SIZE;
Packit 8e45bd
				buf -> f_bfree = (bytes_free.QuadPart) / FAKED_BLOCK_SIZE;
Packit 8e45bd
				buf -> f_files = buf -> f_blocks = (bytes_total.QuadPart) / FAKED_BLOCK_SIZE;
Packit 8e45bd
				buf -> f_ffree = buf -> f_bavail = (bytes_free2.QuadPart) / FAKED_BLOCK_SIZE;
Packit 8e45bd
			}
Packit 8e45bd
		} else {
Packit 8e45bd
			DWORD sectors_per_cluster, bytes_per_sector;
Packit 8e45bd
			if (h) FreeLibrary (h);
Packit 8e45bd
			if (!GetDiskFreeSpaceA (resolved_path, &sectors_per_cluster,
Packit 8e45bd
					&bytes_per_sector, &buf -> f_bavail, &buf -> f_blocks)) {
Packit 8e45bd
                errno = ENOENT;
Packit 8e45bd
                retval = - 1;
Packit 8e45bd
            } else {
Packit 8e45bd
                buf -> f_bsize = sectors_per_cluster * bytes_per_sector;
Packit 8e45bd
                buf -> f_files = buf -> f_blocks;
Packit 8e45bd
                buf -> f_ffree = buf -> f_bavail;
Packit 8e45bd
                buf -> f_bfree = buf -> f_bavail;
Packit 8e45bd
            }
Packit 8e45bd
		}
Packit 8e45bd
		if (h) FreeLibrary (h);
Packit 8e45bd
	}
Packit 8e45bd
Packit 8e45bd
	/* get the FS volume information */
Packit 8e45bd
	if (strspn (":", resolved_path) > 0) resolved_path [3] = '\0'; /* we want only the root */    
Packit 8e45bd
	if (GetVolumeInformation (resolved_path, NULL, 0, &buf -> f_fsid, &buf -> f_namelen, 
Packit 8e45bd
									NULL, tmp, MAX_PATH)) {
Packit 8e45bd
		if (strcasecmp ("NTFS", tmp) == 0) {
Packit 8e45bd
			buf -> f_type = NTFS_SUPER_MAGIC;
Packit 8e45bd
		} else {
Packit 8e45bd
			buf -> f_type = MSDOS_SUPER_MAGIC;
Packit 8e45bd
		}
Packit 8e45bd
	} else {
Packit 8e45bd
		errno = ENOENT;
Packit 8e45bd
		retval = - 1;
Packit 8e45bd
	}
Packit 8e45bd
	return retval;
Packit 8e45bd
}
Packit 8e45bd
#endif	/* WIN32 */