/*
 *  HrFSEntry.c v0.10
 *  Generated in conjunction with Management Factory scripts: 
 *      script version: SNMPv1, 0.16, Apr 25, 1996
 *      project:        D:\TEMP\EXAMPLE\HOSTMIB
 ****************************************************************************
 *                                                                          *
 *      (C) Copyright 1995 DIGITAL EQUIPMENT CORPORATION                    *
 *                                                                          *
 *      This  software  is  an  unpublished work protected under the        *
 *      the copyright laws of the  United  States  of  America,  all        *
 *      rights reserved.                                                    *
 *                                                                          *
 *      In the event this software is licensed for use by the United        *
 *      States Government, all use, duplication or disclosure by the        *
 *      United States Government is subject to restrictions  as  set        *
 *      forth in either subparagraph  (c)(1)(ii)  of the  Rights  in        *
 *      Technical  Data  And  Computer  Software  Clause  at   DFARS        *
 *      252.227-7013, or the Commercial Computer Software Restricted        *
 *      Rights Clause at FAR 52.221-19, whichever is applicable.            *
 *                                                                          *
 ****************************************************************************
 *
 *  Facility:
 *
 *    Windows NT SNMP Extension Agent
 *
 *  Abstract:
 *  
 *    This module contains the code for dealing with the get, set, and
 *    instance name routines for the HrFSEntry.  Actual instrumentation code is
 *    supplied by the developer.
 *
 *  Functions:
 *
 *    A get and set routine for each attribute in the class.
 *
 *    The routines for instances within the class.
 *
 *  Author:
 *
 *	D. D. Burns @ Webenable Inc
 *
 *  Revision History:
 *
 *    V1.00 - 04/18/97  D. D. Burns     Genned: Thu Nov 07 16:44:44 1996
 *    V1.01 - 06/17/97  D. D. Burns     Fix bug in Gen_HrFSTable_Cache() that
 *                                        precluded finding "hrFSStorageIndex"
 *                                        for drives w/volume labels.
 *	
 */


#include <windows.h>
#include <malloc.h>

#include <snmp.h>

#include "mib.h"
#include "smint.h"
#include "hostmsmi.h"
#include "user.h"         /* Developer supplied include file */
#include "HMCACHE.H"      /* Cache-related definitions */
#include "string.h"       /* For string manipulation in "Gen_Hrstorage_Cache"*/
#include "stdio.h"        /* For sprintf */
#include <winioctl.h>     /* For PARTITION_INFORMATION */


/*
|==============================================================================
| Function prototypes for this module.
|
*/
/* debug_print_hrFSTable - Prints a Row from HrFSTable sub-table */
static void
debug_print_hrFSTable(
                      CACHEROW     *row  /* Row in hrFSTable table */
                      );


/*
|==============================================================================
| Create the list-head for the HrFStable cache.
|
| - Global so that code in "ProcessPartitions()" in "HRDISKST.C" can search
|   this cache.
|
| - This macro is defined in "HMCACHE.H".
*/
CACHEHEAD_INSTANCE(hrFSTable_cache, debug_print_hrFSTable);



/*
 *  GetHrFSIndex
 *    A unique value for each file system local to this host.  The value for 
 *    each file system must remain constant at least from one r
 *    
 *    Gets the value for HrFSIndex.
 *
 *  Arguments:
 *
 *    outvalue                   address to return variable value
 *    accesss                    Reserved for future security use
 *    instance                   address of instance name as ordered native
 *                               data type(s)
 *
 *  Return Codes:
 *
 *    Standard PDU error codes.
 *
 *    SNMP_ERRORSTATUS_NOERROR    Successful get
 *    SNMP_ERRORSTATUS_GENERR     Catch-all failure code
 * mibtget.c v0.10
 *
 | =============== From WebEnable Design Spec Rev 3 04/11/97==================
 | hrFSIndex
 | 
 |  ACCESS         SYNTAX
 |  read-only      INTEGER (1..2147483647)
 | 
 | "A unique value for each file system local to this host.  The value for each
 | file system must remain constant at least from one re-initialization of the
 | agent to the next re-initialization."
 | 
 | 
 | DISCUSSION:
 | 
 | An entry is generated for each drive (network or not) returned by
 | "GetLogicalDrives".
 | 
 |============================================================================
 | 1.3.6.1.2.1.25.3.8.1.1.<instance>
 |                | | | |
 |                | | | *hrFSIndex
 |                | | *hrFSEntry
 |                | *-hrFSTable
 |                *-hrDevice
 */

UINT
GetHrFSIndex( 
        OUT Integer *outvalue ,
        IN Access_Credential *access ,
        IN InstanceName *instance )

{
ULONG           index;          /* As fetched from instance structure */
CACHEROW        *row;           /* Row entry fetched from cache       */


/*
| Grab the instance information
*/
index = GET_INSTANCE(0);

/*
| Use it to find the right entry in the cache
*/
if ((row = FindTableRow(index, &hrFSTable_cache)) == NULL) {
    return SNMP_ERRORSTATUS_GENERR;
    }

/*
| Return the "hrFSIndex" value from this entry
*/
*outvalue = row->attrib_list[HRFS_INDEX].u.unumber_value;

return SNMP_ERRORSTATUS_NOERROR ;

} /* end of GetHrFSIndex() */


/*
 *  GetHrFSMountPoint
 *    The path name of the root of this file system.
 *    
 *    Gets the value for HrFSMountPoint.
 *
 *  Arguments:
 *
 *    outvalue                   address to return variable value
 *    accesss                    Reserved for future security use
 *    instance                   address of instance name as ordered native
 *                               data type(s)
 *
 *  Return Codes:
 *
 *    Standard PDU error codes.
 *
 *    SNMP_ERRORSTATUS_NOERROR    Successful get
 *    SNMP_ERRORSTATUS_GENERR     Catch-all failure code
 * mibtget.c v0.10
 *
 | =============== From WebEnable Design Spec Rev 3 04/11/97==================
 | hrFSMountPoint
 | 
 |  ACCESS         SYNTAX
 |  read-only      InternationalDisplayString (SIZE(0..128))
 | 
 | "The path name of the root of this file system."
 | 
 | DISCUSSION:
 | 
 | The value of this attribute is the proper value returned by
 | "GetLogicalDriveStrings" for the selected entry.
 | 
 | RESOLVED >>>>>>>>
 | <POA-15>  Just return an empty string for the Mount Point variables.
 | RESOLVED >>>>>>>>
 | 
 |============================================================================
 | 1.3.6.1.2.1.25.3.8.1.2.<instance>
 |                | | | |
 |                | | | *hrFSMountPoint
 |                | | *hrFSEntry
 |                | *-hrFSTable
 |                *-hrDevice
 */

UINT
GetHrFSMountPoint( 
        OUT InternationalDisplayString *outvalue ,
        IN Access_Credential *access ,
        IN InstanceName *instance )

{

ULONG           index;          /* As fetched from instance structure */
CACHEROW        *row;           /* Row entry fetched from cache       */


/*
| Grab the instance information
*/
index = GET_INSTANCE(0);

/*
| Use it to find the right entry in the cache
*/
if ((row = FindTableRow(index, &hrFSTable_cache)) == NULL) {
    return SNMP_ERRORSTATUS_GENERR;
    }

/*
| The cache has the device string in it, but we return the empty string
| per the spec.
*/
#if 1
    /* Return the empty string */
    outvalue->string = "";
    outvalue->length = 0;
#else
    /* Return the cached string */
    outvalue->string = row->attrib_list[HRFS_MOUNTPT].u.string_value;
    outvalue->length = strlen(outvalue->string);

    /* "Truncate" here to meet RFC as needed*/
    if ((outvalue->length = strlen(outvalue->string)) > 128) {
        outvalue->length = 128;
        }
#endif

return SNMP_ERRORSTATUS_NOERROR ;

} /* end of GetHrFSMountPoint() */


/*
 *  GetHrFSRemoteMountPoint
 *    A description of the name and/or address of the server that this file 
 *    system is mounted from.  This may also include parameters 
 *    
 *    Gets the value for HrFSRemoteMountPoint.
 *
 *  Arguments:
 *
 *    outvalue                   address to return variable value
 *    accesss                    Reserved for future security use
 *    instance                   address of instance name as ordered native
 *                               data type(s)
 *
 *  Return Codes:
 *
 *    Standard PDU error codes.
 *
 *    SNMP_ERRORSTATUS_NOERROR    Successful get
 *    SNMP_ERRORSTATUS_GENERR     Catch-all failure code
 * mibtget.c v0.10
 *
 | =============== From WebEnable Design Spec Rev 3 04/11/97==================
 | hrFSRemoteMountPoint
 | 
 |  ACCESS         SYNTAX
 |  read-only      InternationalDisplayString (SIZE(0..128))
 | 
 | "A description of the name and/or address of the server that this file system
 | is mounted from.  This may also include parameters such as the mount point on
 | the remote file system.  If this is not a remote file system, this string
 | should have a length of zero."
 | 
 | DISCUSSION:
 | 
 | <POA-15> The starting point for deriving this attribute's value is the logical
 | drive name, which would already be known to represent a network drive.  I can
 | find no Win32 API function that maps a network logical drive to it's server.
 | 
 | RESOLVED >>>>>>>>
 | <POA-15>  Just return an empty string for the Mount Point variables.
 | RESOLVED >>>>>>>>
 | 
 |============================================================================
 | 1.3.6.1.2.1.25.3.8.1.3.<instance>
 |                | | | |
 |                | | | *hrFSRemoteMountPoint
 |                | | *hrFSEntry
 |                | *-hrFSTable
 |                *-hrDevice
 */

UINT
GetHrFSRemoteMountPoint( 
        OUT InternationalDisplayString *outvalue ,
        IN Access_Credential *access ,
        IN InstanceName *instance )

{

/* Return the empty string */
outvalue->string = "";
outvalue->length = 0;

return SNMP_ERRORSTATUS_NOERROR ;

} /* end of GetHrFSRemoteMountPoint() */


/*
 *  GetHrFSType
 *    The value of this object identifies the type of this file system.
 *    
 *    Gets the value for HrFSType.
 *
 *  Arguments:
 *
 *    outvalue                   address to return variable value
 *    accesss                    Reserved for future security use
 *    instance                   address of instance name as ordered native
 *                               data type(s)
 *
 *  Return Codes:
 *
 *    Standard PDU error codes.
 *
 *    SNMP_ERRORSTATUS_NOERROR    Successful get
 *    SNMP_ERRORSTATUS_GENERR     Catch-all failure code
 * mibtget.c v0.10
 *
 | =============== From WebEnable Design Spec Rev 3 04/11/97==================
 | hrFSType
 | 
 |  ACCESS         SYNTAX
 |  read-only      OBJECT IDENTIFIER
 | 
 | "The value of this object identifies the type of this file system."
 | 
 | DISCUSSION:
 | 
 |    -- Registration for some popular File System types,
 |    -- for use with hrFSType.
 | 
 |    hrFSTypes               OBJECT IDENTIFIER ::= { hrDevice 9 }
 | 
 |    hrFSOther               OBJECT IDENTIFIER ::= { hrFSTypes 1 }
 |    hrFSUnknown             OBJECT IDENTIFIER ::= { hrFSTypes 2 }
 |    hrFSBerkeleyFFS         OBJECT IDENTIFIER ::= { hrFSTypes 3 }
 |    hrFSSys5FS              OBJECT IDENTIFIER ::= { hrFSTypes 4 }
 |    -- DOS
 |    hrFSFat                 OBJECT IDENTIFIER ::= { hrFSTypes 5 }
 |    -- OS/2 High Performance File System
 |    hrFSHPFS                OBJECT IDENTIFIER ::= { hrFSTypes 6 }
 |    --  Macintosh Hierarchical File System
 |    hrFSHFS                 OBJECT IDENTIFIER ::= { hrFSTypes 7 }
 | 
 | 
 |    -- Macintosh File System
 |    hrFSMFS                 OBJECT IDENTIFIER ::= { hrFSTypes 8 }
 |    -- Windows NT
 |    hrFSNTFS                OBJECT IDENTIFIER ::= { hrFSTypes 9 }
 |    hrFSVNode               OBJECT IDENTIFIER ::= { hrFSTypes 10 }
 |    hrFSJournaled           OBJECT IDENTIFIER ::= { hrFSTypes 11 }
 |    -- CD File systems
 |    hrFSiso9660             OBJECT IDENTIFIER ::= { hrFSTypes 12 }
 |    hrFSRockRidge           OBJECT IDENTIFIER ::= { hrFSTypes 13 }
 | 
 |    hrFSNFS                 OBJECT IDENTIFIER ::= { hrFSTypes 14 }
 |    hrFSNetware             OBJECT IDENTIFIER ::= { hrFSTypes 15 }
 |    -- Andrew File System
 |    hrFSAFS                 OBJECT IDENTIFIER ::= { hrFSTypes 16 }
 |    -- OSF DCE Distributed File System
 |    hrFSDFS                 OBJECT IDENTIFIER ::= { hrFSTypes 17 }
 |    hrFSAppleshare          OBJECT IDENTIFIER ::= { hrFSTypes 18 }
 |    hrFSRFS                 OBJECT IDENTIFIER ::= { hrFSTypes 19 }
 |    -- Data General
 |    hrFSDGCFS               OBJECT IDENTIFIER ::= { hrFSTypes 20 }
 |    -- SVR4 Boot File System
 |    hrFSBFS                 OBJECT IDENTIFIER ::= { hrFSTypes 21 }
 | 
 | Win32 API function "GetVolumeInformation" can provide us with the 
 | information needed to select the correct OID for this attribute's value.
 | 
 |============================================================================
 | 1.3.6.1.2.1.25.3.9.n
 |                | | |
 |                | | *-Type indicator
 |                | *-hrFSTypes
 |                *-hrDevice
 |
 | 1.3.6.1.2.1.25.3.8.1.4.<instance>
 |                | | | |
 |                | | | *hrFSType
 |                | | *hrFSEntry
 |                | *-hrFSTable
 |                *-hrDevice
 */

UINT
GetHrFSType( 
        OUT ObjectIdentifier *outvalue ,
        IN Access_Credential *access ,
        IN InstanceName *instance )

{
ULONG           index;          /* As fetched from instance structure */
CACHEROW        *row;           /* Row entry fetched from cache       */


/*
| Grab the instance information
*/
index = GET_INSTANCE(0);

/*
| Use it to find the right entry in the cache
*/
if ((row = FindTableRow(index, &hrFSTable_cache)) == NULL) {
    return SNMP_ERRORSTATUS_GENERR;
    }

/*
| By convention with the cache-building function "Gen_HrFSTable_Cache()",
| the cached value is the right-most arc we must return as the value.
|
| Hence whatever cache entry we retrieve, we tack the number retrieved
| from the cache for this attribute onto { hrFSTypes ... }.
*/
if ( (outvalue->ids = SNMP_malloc(10 * sizeof( UINT ))) == NULL) {
    return SNMP_ERRORSTATUS_GENERR;
    }
outvalue->idLength = 10;


/*
| Load in the full hrFSType OID:
|
| 1.3.6.1.2.1.25.3.9.n
|                | | |
|                | | *-Type indicator
|                | *-hrFSTypes
|                *-hrDevice
*/
outvalue->ids[0] = 1;
outvalue->ids[1] = 3;
outvalue->ids[2] = 6;
outvalue->ids[3] = 1;
outvalue->ids[4] = 2;
outvalue->ids[5] = 1;
outvalue->ids[6] = 25;
outvalue->ids[7] = 3;
outvalue->ids[8] = 9;

/* Cached FS Type indicator */
outvalue->ids[9] = row->attrib_list[HRFS_TYPE].u.unumber_value;

return SNMP_ERRORSTATUS_NOERROR ;

} /* end of GetHrFSType() */


/*
 *  GetHrFSAccess
 *    An indication if this file system is logically configured by the 
 *    operating system to be readable and writable or only readable. 
 *    
 *    Gets the value for HrFSAccess.
 *
 *  Arguments:
 *
 *    outvalue                   address to return variable value
 *    accesss                    Reserved for future security use
 *    instance                   address of instance name as ordered native
 *                               data type(s)
 *
 *  Return Codes:
 *
 *    Standard PDU error codes.
 *
 *    SNMP_ERRORSTATUS_NOERROR    Successful get
 *    SNMP_ERRORSTATUS_GENERR     Catch-all failure code
 * mibtget.c v0.10
 *
 | =============== From WebEnable Design Spec Rev 3 04/11/97==================
 | hrFSAccess
 | 
 |  ACCESS         SYNTAX
 |  read-only      INTEGER {readWrite(1),readOnly(2)}
 | 
 | "An indication if this file system is logically configured by the operating
 | system to be readable and writable or only readable.  This does not represent
 | any local access-control policy, except one that is applied to the file system
 | as a whole."
 | 
 | DISCUSSION:
 | 
 | Win32 API function "GetVolumeInformation" can provide us with the information
 | needed to select the correct OID for this attribute's value.
 | 
 |============================================================================
 | 1.3.6.1.2.1.25.3.8.1.5.<instance>
 |                | | | |
 |                | | | *hrFSAccess
 |                | | *hrFSEntry
 |                | *-hrFSTable
 |                *-hrDevice
 */

UINT
GetHrFSAccess( 
        OUT INTAccess *outvalue ,
        IN Access_Credential *access ,
        IN InstanceName *instance )

{
ULONG           index;          /* As fetched from instance structure */
CACHEROW        *row;           /* Row entry fetched from cache       */


/*
| Grab the instance information
*/
index = GET_INSTANCE(0);

/*
| Use it to find the right entry in the cache
*/
if ((row = FindTableRow(index, &hrFSTable_cache)) == NULL) {
    return SNMP_ERRORSTATUS_GENERR;
    }

/*
| Return the "hrFSAccess" value from this entry
*/
*outvalue = row->attrib_list[HRFS_ACCESS].u.unumber_value;


return SNMP_ERRORSTATUS_NOERROR ;

} /* end of GetHrFSAccess() */


/*
 *  GetHrFSBootable
 *    A falg indicating whether this file system is bootable.
 *    
 *    Gets the value for HrFSBootable.
 *
 *  Arguments:
 *
 *    outvalue                   address to return variable value
 *    accesss                    Reserved for future security use
 *    instance                   address of instance name as ordered native
 *                               data type(s)
 *
 *  Return Codes:
 *
 *    Standard PDU error codes.
 *
 *    SNMP_ERRORSTATUS_NOERROR    Successful get
 *    SNMP_ERRORSTATUS_GENERR     Catch-all failure code
 * mibtget.c v0.10
 *
 | =============== From WebEnable Design Spec Rev 3 04/11/97==================
 | hrFSBootable
 | 
 |  ACCESS         SYNTAX
 |  read-only      Boolean
 | 
 | "A flag indicating whether this file system is bootable."
 | 
 | DISCUSSION:
 | 
 | Win32 API function "CreatFile" and DeviceIoControlcan provide us with the
 | information needed to select the correct OID for this attribute's value.
 | 
 |============================================================================
 | 1.3.6.1.2.1.25.3.8.1.6.<instance>
 |                | | | |
 |                | | | *hrFSBootable
 |                | | *hrFSEntry
 |                | *-hrFSTable
 |                *-hrDevice
 */

UINT
GetHrFSBootable( 
        OUT Boolean *outvalue ,
        IN Access_Credential *access ,
        IN InstanceName *instance )

{
ULONG           index;          /* As fetched from instance structure */
CACHEROW        *row;           /* Row entry fetched from cache       */


/*
| Grab the instance information
*/
index = GET_INSTANCE(0);

/*
| Use it to find the right entry in the cache
*/
if ((row = FindTableRow(index, &hrFSTable_cache)) == NULL) {
    return SNMP_ERRORSTATUS_GENERR;
    }

/*
| Return the "hrFSBootable" value from this entry
*/
*outvalue = row->attrib_list[HRFS_BOOTABLE].u.unumber_value;

return SNMP_ERRORSTATUS_NOERROR ;

} /* end of GetHrFSBootable() */


/*
 *  GetHrFSStorageIndex
 *    The index of the hrStorageEntry that represents information about this 
 *    file system.  If there is no such information available, 
 *    
 *    Gets the value for HrFSStorageIndex.
 *
 *  Arguments:
 *
 *    outvalue                   address to return variable value
 *    accesss                    Reserved for future security use
 *    instance                   address of instance name as ordered native
 *                               data type(s)
 *
 *  Return Codes:
 *
 *    Standard PDU error codes.
 *
 *    SNMP_ERRORSTATUS_NOERROR    Successful get
 *    SNMP_ERRORSTATUS_GENERR     Catch-all failure code
 * mibtget.c v0.10
 *
 | =============== From WebEnable Design Spec Rev 3 04/11/97==================
 | hrFSStorageIndex
 | 
 |  ACCESS         SYNTAX
 |  read-only      INTEGER (0..2147483647)
 | 
 | "The index of the hrStorageEntry that represents information about this file
 | system.  If there is no such information available, then this value shall be
 | zero.  The relevant storage entry will be useful in tracking the percent usage
 | of this file system and diagnosing errors that may occur when it runs out of
 | space."
 | 
 | DISCUSSION:
 | 
 |============================================================================
 | 1.3.6.1.2.1.25.3.8.1.7.<instance>
 |                | | | |
 |                | | | *hrFSStorageIndex
 |                | | *hrFSEntry
 |                | *-hrFSTable
 |                *-hrDevice
 */

UINT
GetHrFSStorageIndex( 
        OUT Integer *outvalue ,
        IN Access_Credential *access ,
        IN InstanceName *instance )

{
ULONG           index;          /* As fetched from instance structure */
CACHEROW        *row;           /* Row entry fetched from cache       */


/*
| Grab the instance information
*/
index = GET_INSTANCE(0);

/*
| Use it to find the right entry in the cache
*/
if ((row = FindTableRow(index, &hrFSTable_cache)) == NULL) {
    return SNMP_ERRORSTATUS_GENERR;
    }

/*
| Return the "hrFSStorageIndex" value from this entry
*/
*outvalue = row->attrib_list[HRFS_STORINDX].u.unumber_value;


return SNMP_ERRORSTATUS_NOERROR ;

} /* end of GetHrFSStorageIndex() */


/*
 *  GetHrFSLastFullBackupDate
 *    The last date at which this complete file system was copied to another 
 *    storage device for backup.  This information is useful fo
 *    
 *    Gets the value for HrFSLastFullBackupDate.
 *
 *  Arguments:
 *
 *    outvalue                   address to return variable value
 *    accesss                    Reserved for future security use
 *    instance                   address of instance name as ordered native
 *                               data type(s)
 *
 *  Return Codes:
 *
 *    Standard PDU error codes.
 *
 *    SNMP_ERRORSTATUS_NOERROR    Successful get
 *    SNMP_ERRORSTATUS_GENERR     Catch-all failure code
 * mibtget.c v0.10
 *
 | =============== From WebEnable Design Spec Rev 3 04/11/97==================
 | hrFSLastFullBackupDate
 | 
 |  ACCESS         SYNTAX
 |  read-write     DateAndTime
 | 
 | "The last date at which this complete file system was copied to another
 | storage device for backup.  This information is useful for ensuring that
 | backups are being performed regularly.  If this information is not known, then
 | this variable shall have the value corresponding to January 1, year 0000,
 | 00:00:00.0, which is encoded as (hex)'00 00 01 01 00 00 00 00'."
 | 
 | DISCUSSION:
 | 
 | This metric is apparently not recorded and is not made available through
 | any documented Win32 API function.  Consequently, we return the appropriate
 | "not known" value.
 | 
 |============================================================================
 | 1.3.6.1.2.1.25.3.8.1.8.<instance>
 |                | | | |
 |                | | | *hrFSLastFullBackupDate
 |                | | *hrFSEntry
 |                | *-hrFSTable
 |                *-hrDevice
 */

UINT
GetHrFSLastFullBackupDate( 
        OUT DateAndTime *outvalue ,
        IN Access_Credential *access ,
        IN InstanceName *instance )

{

outvalue->length = 8;
outvalue->string = "\0\0\1\1\0\0\0\0";


return SNMP_ERRORSTATUS_NOERROR ;

} /* end of GetHrFSLastFullBackupDate() */


/*
 *  SetHrFSLastFullBackupDate
 *    The last date at which this complete file system was copied to another 
 *    storage device for backup.  This information is useful fo
 *    
 *    Sets the HrFSLastFullBackupDate value.
 *
 *  Arguments:
 *
 *    invalue                    address of value to set the variable
 *    outvalue                   address to return the set variable value
 *    access                     Reserved for future security use
 *    instance                   address of instance name as ordered native
 *                               data type(s)
 *
 *  Return Codes:
 *
 *    Standard PDU error codes.
 *
 *    SNMP_ERRORSTATUS_NOERROR    Successful get
 *    SNMP_ERRORSTATUS_BADVALUE   Set value not in range
 *    SNMP_ERRORSTATUS_GENERR     Catch-all failure code
 * mibtset.ntc v0.10
 */

UINT
SetHrFSLastFullBackupDate( 
        IN DateAndTime *invalue ,
        OUT DateAndTime *outvalue ,
        IN Access_Credential *access ,
        IN InstanceName *instance )

{

    return SNMP_ERRORSTATUS_NOSUCHNAME ;

} /* end of SetHrFSLastFullBackupDate() */


/*
 *  GetHrFSLastPartialBackupDate
 *    The last date at which a portion of thes file system was copied to 
 *    another storage device for backup.  This information is usefu
 *    
 *    Gets the value for HrFSLastPartialBackupDate.
 *
 *  Arguments:
 *
 *    outvalue                   address to return variable value
 *    accesss                    Reserved for future security use
 *    instance                   address of instance name as ordered native
 *                               data type(s)
 *
 *  Return Codes:
 *
 *    Standard PDU error codes.
 *
 *    SNMP_ERRORSTATUS_NOERROR    Successful get
 *    SNMP_ERRORSTATUS_GENERR     Catch-all failure code
 * mibtget.c v0.10
 *
 | =============== From WebEnable Design Spec Rev 3 04/11/97==================
 | hrFSLastPartialBackupDate
 | 
 |  ACCESS         SYNTAX
 |  read-write     DateAndTime
 | 
 | "The last date at which a portion of this file system was copied to another
 | storage device for backup.  This information is useful for ensuring that
 | backups are being performed regularly.  If this information is not known, 
 | then this variable shall have the value corresponding to 
 | January 1, year 0000, 00:00:00.0, which is encoded as
 | (hex)'00 00 01 01 00 00 00 00'."
 | 
 | DISCUSSION:
 | 
 | This metric is apparently not recorded and is not made available through
 | any documented Win32 API function.  Consequently, we return the appropriate
 | "not known" value.
 | 
 |============================================================================
 | 1.3.6.1.2.1.25.3.8.1.9.<instance>
 |                | | | |
 |                | | | *hrFSLastPartialBackupDate
 |                | | *hrFSEntry
 |                | *-hrFSTable
 |                *-hrDevice
 */

UINT
GetHrFSLastPartialBackupDate( 
        OUT DateAndTime *outvalue ,
        IN Access_Credential *access ,
        IN InstanceName *instance )

{

outvalue->length = 8;
outvalue->string = "\0\0\1\1\0\0\0\0";

return SNMP_ERRORSTATUS_NOERROR ;

} /* end of GetHrFSLastPartialBackupDate() */


/*
 *  SetHrFSLastPartialBackupDate
 *    The last date at which a portion of thes file system was copied to 
 *    another storage device for backup.  This information is usefu
 *    
 *    Sets the HrFSLastPartialBackupDate value.
 *
 *  Arguments:
 *
 *    invalue                    address of value to set the variable
 *    outvalue                   address to return the set variable value
 *    access                     Reserved for future security use
 *    instance                   address of instance name as ordered native
 *                               data type(s)
 *
 *  Return Codes:
 *
 *    Standard PDU error codes.
 *
 *    SNMP_ERRORSTATUS_NOERROR    Successful get
 *    SNMP_ERRORSTATUS_BADVALUE   Set value not in range
 *    SNMP_ERRORSTATUS_GENERR     Catch-all failure code
 * mibtset.ntc v0.10
 */

UINT
SetHrFSLastPartialBackupDate( 
        IN DateAndTime *invalue ,
        OUT DateAndTime *outvalue ,
        IN Access_Credential *access ,
        IN InstanceName *instance )

{

    return SNMP_ERRORSTATUS_NOSUCHNAME ;

} /* end of SetHrFSLastPartialBackupDate() */


/*
 *  HrFSEntryFindInstance
 *
 *     This routine is used to verify that the specified instance is
 *     valid.
 *
 *  Arguments:
 *
 *     FullOid                 Address for the full oid - group, variable,
 *                             and instance information
 *     instance                Address for instance specification as an oid
 *
 *  Return Codes:
 *
 *     SNMP_ERRORSTATUS_NOERROR     Instance found and valid
 *     SNMP_ERRORSTATUS_NOSUCHNAME  Invalid instance
 *
 */

UINT
HrFSEntryFindInstance( IN ObjectIdentifier *FullOid ,
                       IN OUT ObjectIdentifier *instance )
{
    UINT tmp_instance ;

    //
    //  Developer instrumentation code to find appropriate instance goes here.
    //  For non-tables, it is not necessary to modify this routine.  However, if
    //  there is any context that needs to be set, it can be done here.
    //

    if ( FullOid->idLength <= HRFSENTRY_VAR_INDEX )
	// No instance was specified
	return SNMP_ERRORSTATUS_NOSUCHNAME ;
    else  if ( FullOid->idLength != HRFSENTRY_VAR_INDEX + 1 )
	// Instance length is more than 1
	return SNMP_ERRORSTATUS_NOSUCHNAME ;
    else
	// The only valid instance for a non-table are instance 0.  If this
	// is a non-table, the following code validates the instances.  If this
	// is a table, developer modification is necessary below.

	tmp_instance = FullOid->ids[ HRFSENTRY_VAR_INDEX ] ;

        /*
        | For hrFSTable, the instance arc(s) is a single arc, and it must
        | correctly select an entry in the hrFSTable cache.
        | Check that here.
        */
	if ( FindTableRow(tmp_instance, &hrFSTable_cache) == NULL ) {
	    return SNMP_ERRORSTATUS_NOSUCHNAME ;
            }
	else
	{
	    // the instance is valid.  Create the instance portion of the OID
	    // to be returned from this call.
	    instance->ids[ 0 ] = tmp_instance ;
	    instance->idLength = 1 ;
	}

    return SNMP_ERRORSTATUS_NOERROR ;

} /* end of HrFSEntryFindInstance() */



/*
 *  HrFSEntryFindNextInstance
 *
 *     This routine is called to get the next instance.  If no instance
 *     was passed than return the first instance (1).
 *
 *  Arguments:
 *
 *     FullOid                 Address for the full oid - group, variable,
 *                             and instance information
 *     instance                Address for instance specification as an oid
 *
 *  Return Codes:
 *
 *     SNMP_ERRORSTATUS_NOERROR     Instance found and valid
 *     SNMP_ERRORSTATUS_NOSUCHNAME  Invalid instance
 *
 */

UINT
HrFSEntryFindNextInstance( IN ObjectIdentifier *FullOid ,
                           IN OUT ObjectIdentifier *instance )
{
    //
    //  Developer supplied code to find the next instance of class goes here.
    //  If this is a class with cardinality 1, no modification of this routine
    //  is necessary unless additional context needs to be set.
    //  If the FullOid does not specify an instance, then the only instance
    //  of the class is returned.  If this is a table, the first row of the
    //  table is returned.
    //
    //  If an instance is specified and this is a non-table class, then NOSUCHNAME
    //  is returned so that correct MIB rollover processing occurs.  If this is
    //  a table, then the next instance is the one following the current instance.
    //  If there are no more instances in the table, return NOSUCHNAME.
    //

    CACHEROW        *row;
    ULONG           tmp_instance;


    if ( FullOid->idLength <= HRFSENTRY_VAR_INDEX )
    {
        /*
        | Too short: must return the instance arc that selects the first 
        |            entry in the table if there is one.
        */
        tmp_instance = 0;
    }
    else {
        /*
        | There is at least one instance arc.  Even if it is the only arc
        | we use it as the "index" in a request for the "NEXT" one.
        */
        tmp_instance = FullOid->ids[ HRFSENTRY_VAR_INDEX ] ;
        }

    /* Now go off and try to find the next instance in the table */
    if ((row = FindNextTableRow(tmp_instance, &hrFSTable_cache)) == NULL) {
        return SNMP_ERRORSTATUS_NOSUCHNAME ;
        }

    instance->ids[ 0 ] = row->index ;
    instance->idLength = 1 ;

    return SNMP_ERRORSTATUS_NOERROR ;

} /* end of HrFSEntryFindNextInstance() */



/*
 *  HrFSEntryConvertInstance
 *
 *     This routine is used to convert the object id specification of an
 *     instance into an ordered native representation.  The object id format
 *     is that object identifier that is returned from the Find Instance
 *     or Find Next Instance routines.  It is NOT the full object identifier
 *     that contains the group and variable object ids as well.  The native
 *     representation is an argc/argv-like structure that contains the
 *     ordered variables that define the instance.  This is specified by
 *     the MIB's INDEX clause.  See RFC 1212 for information about the INDEX
 *     clause.
 *
 *
 *  Arguments:
 *
 *     oid_spec                Address of the object id instance specification
 *     native_spec             Address to return the ordered native instance
 *                             specification
 *
 *  Return Codes:
 *
 *     SUCCESS                 Conversion complete successfully
 *     FAILURE                 Unable to convert object id into native format
 *
 */

UINT
HrFSEntryConvertInstance( IN ObjectIdentifier *oid_spec ,
                          IN OUT InstanceName *native_spec )
{
static char    *array;  /* The address of this (char *) is passed back     */
                        /* as though it were an array of length 1 of these */
                        /* types.                                          */

static ULONG    inst;   /* The address of this ULONG is passed back  */
                        /* (Obviously, no "free()" action is needed) */

    /* We only expect the one arc in "oid_spec" */
    inst = oid_spec->ids[0];
    array = (char *) &inst;

    native_spec->count = 1;
    native_spec->array = &array;
    return SUCCESS ;

} /* end of HrFSEntryConvertInstance() */




/*
 *  HrFSEntryFreeInstance
 *
 *     This routine is used to free an ordered native representation of an
 *     instance name.
 *
 *  Arguments:
 *
 *     instance                Address to return the ordered native instance
 *                             specification
 *
 *  Return Codes:
 *
 *
 */

void
HrFSEntryFreeInstance( IN OUT InstanceName *instance )
{

  /* No action needed for hrFSTable */
} /* end of HrFSEntryFreeInstance() */

/*
| End of Generated Code
*/

/* Gen_HrFSTable_Cache - Generate a initial cache for HrFSTable */
/* Gen_HrFSTable_Cache - Generate a initial cache for HrFSTable */
/* Gen_HrFSTable_Cache - Generate a initial cache for HrFSTable */

BOOL
Gen_HrFSTable_Cache(
                    void
                    )

/*
|  EXPLICIT INPUTS:
|
|       None.
|
|  IMPLICIT INPUTS:
|
|       The module-local head of the cache for the HrFSTable,
|       "hrFSTable_cache".
|
|  OUTPUTS:
|
|     On Success:
|       Function returns TRUE indicating that the cache has been fully
|       populated with all "static" cache-able values.
|
|     On any Failure:
|       Function returns FALSE (indicating "not enough storage").
|
|  THE BIG PICTURE:
|
|       At subagent startup time, the cache for each table in the MIB is
|       populated with rows for each row in the table.  This function is
|       invoked by the start-up code in "UserMibInit()" ("MIB.C") to 
|       populate the cache for the HrStorage table.
|
|  OTHER THINGS TO KNOW:
|
|       There is one of these function for every table that has a cache.
|       Each is found in the respective source file.
|
|=============== From WebEnable Design Spec Rev 3 04/11/97==================
| DISCUSSION:
| 
| It appears that there is a one-to-one correspondence between NT logical drives
| and "file systems" as defined by this table.  As a consequence, the contents
| of this table is almost identical to the hrStorageTable except that remote
| network drives (in unix-speak, remotely mounted file systems) are included
| in this table while excluded from hrStorageTable.
| 
| To this end, a combination of Win32 API functions "GetLogicalDrives",
| "GetVolumeInformation", "GetDriveType" and "GetDiskFreeSpace" are used to
| acquire the information for the SNMP attributes in this table.
| 
|============================================================================
| 1.3.6.1.2.1.25.3.8.1...
|                | | |
|                | | *hrFSEntry
|                | *-hrFSTable
|                *-hrDevice
|
*/
{
CHAR    temp[8];                /* Temporary buffer for first call         */
LPSTR   pDrvStrings;            /* --> allocated storage for drive strings */
LPSTR   pOriginal_DrvStrings;   /* (Needed for final deallocation          */
DWORD   DS_request_len;         /* Storage actually needed                 */
DWORD   DS_current_len;         /* Storage used on 2nd call                */
ULONG   table_index=0;          /* hrFSTable index counter                 */
CACHEROW *row;                  /* --> Cache structure for row-being built */
UINT    i;                      /* Handy-Dandy loop index                  */

#define PHYS_SIZE 32
CHAR    phys_name[PHYS_SIZE];   /* Buffer where a string like "\\.C:" (for */
                                /*  example) is built for drive access.    */
/*
| Blow away any old copy of the cache
*/
DestroyTable(&hrFSTable_cache);

/*
| We're going to call GetLogicalDriveStrings() twice, once to get the proper
| buffer size, and the second time to actually get the drive strings.
*/
if ((DS_request_len = GetLogicalDriveStrings(2, temp)) == 0) {

    /* Request failed altogether, can't initialize */
    return ( FALSE );
    }

/*
| Grab enough storage for the drive strings plus one null byte at the end
*/

if ( (pOriginal_DrvStrings = pDrvStrings = malloc( (DS_request_len + 1) ) )
    == NULL) {

    /* Storage Request failed altogether, can't initialize */
    return ( FALSE );
    }

/* Go for all of the strings */
if ((DS_current_len = GetLogicalDriveStrings(DS_request_len, pDrvStrings))
    == 0) {

    /* Request failed altogether, can't initialize */
    free( pOriginal_DrvStrings );
    return ( FALSE );
    }


/*
|==============================================================================
| As long as we've got an unprocessed drive-string which may correspond to
| a File-System for which we need a table-row entry . . . 
*/
while ( strlen(pDrvStrings) > 0 ) {

    UINT        drivetype;      /* Type of the drive from "GetDriveType()"   */
    ULONG       fs_type;        /* derived File-System type (last-arc value) */
    UINT        bootable;       /* derived "bootable" value (Boolean)        */
    UINT        readwrite;      /* derived "readwrite" value (0 or 1)        */
    UINT        storage_index;  /* Index into hrStorageTable to matching slot*/
    CACHEROW   *row_hrstorage;  /* As returned by FindNextTableRow()         */


    /*
    | Get the drive-type so we can decide whether it should participate in
    | this table.  We do both locals and remotes (unlike hrStorage, from
    | which this code was ripped off).
    */
    drivetype = GetDriveType(pDrvStrings);

    if (   drivetype == DRIVE_UNKNOWN
        || drivetype == DRIVE_NO_ROOT_DIR
        ) {

        /* Step to next string, if any */
        pDrvStrings += strlen(pDrvStrings) + 1;

        continue;
        }

    /*
    | OK, we want this one in the table, get a row-entry created.
    */
    if ((row = CreateTableRow( HRFS_ATTRIB_COUNT ) ) == NULL) {
        return ( FALSE );       // Out of memory
        }

    /* =========== hrFSIndex ==========*/
    row->attrib_list[HRFS_INDEX].attrib_type = CA_NUMBER;
    row->attrib_list[HRFS_INDEX].u.unumber_value = (table_index += 1) ;


    /* =========== hrFSMountPoint ==========
    | Note: We store the device string in the cache, but the "GET" function
    |       always returns an empty string, per the spec.
    */
    row->attrib_list[HRFS_MOUNTPT].attrib_type = CA_STRING;

    /* Get some space */
    if ( (row->attrib_list[HRFS_MOUNTPT].u.string_value
          = ( LPSTR ) malloc(strlen(pDrvStrings) + 1)) == NULL) {
        return ( FALSE );       /* out of memory */
        }
    /* Copy the Value into the space */
    strcpy(row->attrib_list[HRFS_MOUNTPT].u.string_value, pDrvStrings);

    /*
    | The GET functions for "computed" attributes expect to be able to use
    | the value of the "hrFSMountPoint" cache value stored above to lookup
    | (using system calls) their respective values.  We may or may not actually
    | report this stored-value as the value of the attribute in initial
    | release.
    */


    /* =========== hrFSRemoteMountPoint ==========*/
    row->attrib_list[HRFS_RMOUNTPT].attrib_type = CA_COMPUTED;


    /* =========== hrFSType     ==========
    |  =========== hrFSAccess   ==========
    |  =========== hrFSBootable ==========
    |
    | We use the first two characters of the drive string (e.g. "C:") to
    | create the special string (e.g. "\\.\C:") needed to obtain a "CreateFile"
    | handle to the device "C" or partition "C".
    |
    | With that, a DeviceIoControl call for partition information gives
    | us an idea as to the type and bootability of the device or partition.
    |
    | If any step in this process fails, the type is "hrFSUnknown", bootable
    | is "FALSE" and Access is presumed "read-write".
    |
    | For hrFSType we store a single number as the cached value of the 
    | hrFSType attribute.  When this attribute is fetched, the cached number 
    | forms the last arc in the OBJECT IDENTIFIER that actually specifies the
    | type: { hrFSTypes x }, where "x" is what gets stored.
    */
    fs_type = 2;        /* 2 = last arc value for "hrFSUnknown" */
    bootable = 0;       /* if unknown, "not bootable"           */
    readwrite = 1;      /* if unknown, "read-write"             */

    /* If we have room in the buffer to build the handle-name string */
    if ((strlen(pDrvStrings) + strlen("\\\\.\\")) < PHYS_SIZE) {

        HANDLE                  hdrv;       /* Handle to device           */
        PARTITION_INFORMATION   part_info;  /* Partition Info from device */
        DWORD                   bytes_out;  /* Bytes retnd into part_info */


        /* Build it for device A: "\\.\A:" */
        sprintf(phys_name, "\\\\.\\%2.2s", pDrvStrings);

        /*
        | Suppress any attempt by the system to make the user put a volume in a
        | removable drive ("CreateFile" will just fail).
        */
        SetErrorMode(SEM_FAILCRITICALERRORS);

        /* Attempt to get a handle using this physical name string */
        if ((hdrv = CreateFile(phys_name,             // Device
                               GENERIC_READ,          // Access
                               FILE_SHARE_READ   |
                               FILE_SHARE_WRITE,      // Share Mode
                               NULL,                  // Security
                               OPEN_EXISTING,         // CreationDistribution
                               FILE_ATTRIBUTE_NORMAL, // FlagsandAttributes
                               NULL                   // Template file
                               )) != INVALID_HANDLE_VALUE) {
            /*
            | Device is Open
            |
            | Try for Partition Information on the "device" we opened
            |
            | (Not supported by Floppy drivers, so this'll probably fail).
            */
            if (DeviceIoControl(hdrv,           // device handle
                                                // IoControlCode (op-code)
                                IOCTL_DISK_GET_PARTITION_INFO,

                                NULL,           // "input buffer"
                                0,              // "input buffer size"
                                &part_info,     // "output buffer"
                                                // "output buffer size"
                                sizeof(PARTITION_INFORMATION),

                                &bytes_out,     // bytes written to part_info
                                NULL            // no Overlapped I/o
                                )) {

                /*
                | We've got Partition Information for the device: use it
                */
                bootable = part_info.BootIndicator;

                /*
                | Assign an OID Type "last-arc number" for those file system
                | types we recognize.
                */
                switch (part_info.PartitionType) {

                    case PARTITION_UNIX:             // Unix
                        fs_type = 3;    // "hrFSBerkeleyFFS"
                        break;

                    case PARTITION_FAT_12:           // 12-bit FAT entries
                    case PARTITION_FAT_16:           // 16-bit FAT entries
                    case PARTITION_HUGE:             // Huge partition MS-DOS V4
                    case PARTITION_FAT32:            // FAT32
                    case PARTITION_FAT32_XINT13:     // FAT32 using extended int13 services
                        fs_type = 5;    // "hrFSFat"
                        break;

                    case PARTITION_IFS:              // IFS Partition
                    case VALID_NTFT:                 // NTFT uses high order bits
                        fs_type = 9;    // "hrFSNTFS"
                        break;

                    case PARTITION_XENIX_1:          // Xenix
                    case PARTITION_XENIX_2:          // Xenix
                    case PARTITION_XINT13:           // Win95 partition using extended int13 services
                    case PARTITION_XINT13_EXTENDED:  // Same as type 5 but uses extended int13 services
                    case PARTITION_EXTENDED:         // Extended partition entry
                    case PARTITION_PREP:             // PowerPC Reference Platform (PReP) Boot Partition
                        fs_type = 1;    // "hrFSOther"
                        break;

                    case PARTITION_ENTRY_UNUSED:     // Entry unused
                    default:
                        /* This will translate to fs_type = 2 "unknown" */
                        break;
                    }
                }   /* If (we managed to get partition information) */

            CloseHandle(hdrv);
            }   /* if (we managed to "CreateFile" the device) */

        SetErrorMode(0);        /* Turn error suppression mode off */
        }   /* if (we managed to build a device name) */

    /* =========== hrFSType     ========== */
    row->attrib_list[HRFS_TYPE].attrib_type = CA_NUMBER;
    row->attrib_list[HRFS_TYPE].u.unumber_value = fs_type;


    /* =========== hrFSAccess   ========== */
    /* Quick check: if its a CD-ROM, we presume it is readonly */
    if (drivetype == DRIVE_CDROM) {
        readwrite = 2;
        }
    row->attrib_list[HRFS_ACCESS].attrib_type = CA_NUMBER;
    row->attrib_list[HRFS_ACCESS].u.unumber_value = readwrite;


    /* =========== hrFSBootable ========== */
    row->attrib_list[HRFS_BOOTABLE].attrib_type = CA_NUMBER;
    row->attrib_list[HRFS_BOOTABLE].u.unumber_value = bootable;


    /* =========== hrFSStorageIndex ==========
    | Strategy:
    |
    | We wander up the hrStorage table looking for an exact match between
    | the storage attribute "hrStorageDescr" (which contains the DOS drive
    | string as returned by GetLogicalDriveStrings()) and the current drive
    | string.
    |
    | The first exact match: the index of that hrStorageTable row gets
    | stored here as the value of "hrFSStorageIndex".
    |
    | No Match: Store zero per the RFC spec.
    |
    | Come PnP, this attribute has to become "computed", as entries may come
    | and go from the hrStorage table.
    |
    | NOTE: The length of the comparison of the match is limited by the
    |       drive string we generate in this function, as the "description"
    |       from the hrStorage table may have other stuff appended to the
    |       end of the drive-string.
    */
    row->attrib_list[HRFS_STORINDX].attrib_type = CA_NUMBER;
    storage_index = 0;  /* Presume failure */

    /* Scan the hrStorageTable cache */
    for (row_hrstorage = FindNextTableRow(0, &hrStorage_cache);
         row_hrstorage != NULL;
         row_hrstorage = FindNextTableRow(i, &hrStorage_cache)
         ) {

        /* Obtain the actual row index */
        i = row_hrstorage->index;

        /* If (this entry has an exact match on drive-strings) */
        if (strncmp(row_hrstorage->attrib_list[HRST_DESCR].u.string_value,
                   pDrvStrings,strlen(pDrvStrings)) == 0) {

            /* We found a match, record it and break out */
            storage_index = i;
            break;
            }
        }

    row->attrib_list[HRFS_STORINDX].u.unumber_value = storage_index;


    /* =========== hrFSLastFullBackupDate ==========*/
    row->attrib_list[HRFS_LASTFULL].attrib_type = CA_COMPUTED;


    /* =========== hrFSLastPartialBackupDate ==========*/
    row->attrib_list[HRFS_LASTPART].attrib_type = CA_COMPUTED;


    /*
    | ======================================================
    | Now insert the filled-in CACHEROW structure into the
    | cache-list for the hrFSTable.
    */
    if (AddTableRow(row->attrib_list[HRFS_INDEX].u.unumber_value,  /* Index */
                    row,                                           /* Row   */
                    &hrFSTable_cache                               /* Cache */
                    ) == FALSE) {
        return ( FALSE );       /* Internal Logic Error! */
        }

    /* Step to next string, if any */
    pDrvStrings += strlen(pDrvStrings) + 1;

    } /* while (drive-strings remain . . .) */


free( pOriginal_DrvStrings );


#if defined(CACHE_DUMP)
PrintCache(&hrFSTable_cache);
#endif


/*
| Initialization of this table's cache succeeded
*/

return (TRUE);
}


/* PartitionTypeToLastArc - Convert Partition Type to Last OID Arc value */
/* PartitionTypeToLastArc - Convert Partition Type to Last OID Arc value */
/* PartitionTypeToLastArc - Convert Partition Type to Last OID Arc value */

ULONG
PartitionTypeToLastArc (
                        BYTE p_type
                        )
/*
|  EXPLICIT INPUTS:
|
|       Disk Partition Type as returned in PARTITION_INFORMATINO
|
|  IMPLICIT INPUTS:
|
|       None.
|
|  OUTPUTS:
|
|     On Success:
|       Function returns the value that should be used as the Last-Arc "x"
|       in a "hrFSTypes" Object Identifier.
|
|     On any Failure:
|       Function returns the last-arc value for "UNKNOWN".
|
|  THE BIG PICTURE:
|
|       In more than one spot we need to be able to translate from
|       a Partition Type to our "Last-Arc" value.
|
|  OTHER THINGS TO KNOW:
|
*/
{
ULONG   last_arc = 2;           /* "2" = "UNKNOWN" */

/*
| Assign an OID Type "last-arc number" for those file system
| types we recognize.
*/
switch ( p_type ) {

    case PARTITION_UNIX:             // Unix
        last_arc = 3;    // "hrFSBerkeleyFFS"
        break;

    case PARTITION_FAT_12:           // 12-bit FAT entries
    case PARTITION_FAT_16:           // 16-bit FAT entries
    case PARTITION_HUGE:             // Huge partition MS-DOS V4
    case PARTITION_FAT32:            // FAT32
    case PARTITION_FAT32_XINT13:     // FAT32 using extended int13 services
        last_arc = 5;    // "hrFSFat"
        break;

    case PARTITION_IFS:              // IFS Partition
    case VALID_NTFT:                 // NTFT uses high order bits
        last_arc = 9;    // "hrFSNTFS"
        break;

    case PARTITION_XENIX_1:          // Xenix
    case PARTITION_XENIX_2:          // Xenix
    case PARTITION_XINT13:           // Win95 partition using extended int13 services
    case PARTITION_XINT13_EXTENDED:  // Same as type 5 but uses extended int13 services
    case PARTITION_EXTENDED:         // Extended partition entry
    case PARTITION_PREP:             // PowerPC Reference Platform (PReP) Boot Partition
        last_arc = 1;    // "hrFSOther"
        break;

    case PARTITION_ENTRY_UNUSED:     // Entry unused
    default:
        /* This will translate to "unknown" */
        break;
    }

return ( last_arc );
}

#if defined(CACHE_DUMP)

/* debug_print_hrFSTable - Prints a Row from HrFSTable sub-table */
/* debug_print_hrFSTable - Prints a Row from HrFSTable sub-table */
/* debug_print_hrFSTable - Prints a Row from HrFSTable sub-table */

static void
debug_print_hrFSTable(
                      CACHEROW     *row  /* Row in hrFSTable table */
                      )
/*
|  EXPLICIT INPUTS:
|
|       "row" - points to the row to be dumped, if NULL, the function
|       merely prints a suitable title.
|
|  IMPLICIT INPUTS:
|
|       - Symbols used to reference the attributes in the row entry.
|       - File handle defined by OFILE, presumed to be open.
|
|  OUTPUTS:
|
|     On Success:
|       Function prints a dump of the row in ASCII for debugging purposes
|       on file handle OFILE.
|
|  THE BIG PICTURE:
|
|     Debugging only.
|
|  OTHER THINGS TO KNOW:
*/
{

if (row == NULL) {
    fprintf(OFILE, "=====================\n");
    fprintf(OFILE, "hrFSTable Table Cache\n");
    fprintf(OFILE, "=====================\n");
    return;
    }


fprintf(OFILE, "hrFSIndex. . . . . . . . %d\n",
        row->attrib_list[HRFS_INDEX].u.unumber_value);

fprintf(OFILE, "hrFSMountPoint . . . . . \"%s\" (ALWAYS RETURNED AS EMPTY STRING) \n",
        row->attrib_list[HRFS_MOUNTPT].u.string_value);

fprintf(OFILE, "hrFSRemoteMountPoint . . \"%s\"\n",
        row->attrib_list[HRFS_RMOUNTPT].u.string_value);

fprintf(OFILE, "hrFSType . . . . . . . . %d ",
        row->attrib_list[HRFS_TYPE].u.unumber_value);

switch (row->attrib_list[HRFS_TYPE].u.unumber_value) {
    case 1: fprintf(OFILE, "(hrFSOther)\n");            break;
    case 2: fprintf(OFILE, "(hrFSUnknown)\n");          break;
    case 3: fprintf(OFILE, "(hrFSBerkeleyFFS)\n");      break;
    case 5: fprintf(OFILE, "(hrFSFat)\n");              break;
    case 9: fprintf(OFILE, "(hrFSNTFS)\n");             break;
    default:
            fprintf(OFILE, "(???)\n");
    }


fprintf(OFILE, "hrFSAccess . . . . . . . %d ",
        row->attrib_list[HRFS_ACCESS].u.number_value);
switch (row->attrib_list[HRFS_ACCESS].u.unumber_value) {
    case 1: fprintf(OFILE, "(readWrite)\n"); break;
    case 2: fprintf(OFILE, "(readOnly)\n"); break;
    default: 
            fprintf(OFILE, "(???)\n"); break;
    }


fprintf(OFILE, "hrFSBootable . . . . . . %d ",
        row->attrib_list[HRFS_BOOTABLE].u.number_value);

switch (row->attrib_list[HRFS_BOOTABLE].u.unumber_value) {
    case 0: fprintf(OFILE, "(FALSE)\n"); break;
    case 1: fprintf(OFILE, "(TRUE)\n"); break;
    default: 
            fprintf(OFILE, "(???)\n"); break;
    }

fprintf(OFILE, "hrFSStorageIndex . . . . %d\n",
        row->attrib_list[HRFS_STORINDX].u.number_value);
}
#endif
