windows-nt/Source/XPSP1/NT/net/snmp/subagent/lmmib2/resolve.c
2020-09-26 16:20:57 +08:00

259 lines
6.9 KiB
C

/*++
Copyright (c) 1992-1996 Microsoft Corporation
Module Name:
resolve.c
Abstract:
High level routines to process the variable binding list.
Environment:
User Mode - Win32
Revision History:
10-May-1996 DonRyan
Removed banner from Technology Dynamics, Inc.
--*/
//--------------------------- WINDOWS DEPENDENCIES --------------------------
//--------------------------- STANDARD DEPENDENCIES -- #include<xxxxx.h> ----
#include <stdio.h>
//--------------------------- MODULE DEPENDENCIES -- #include"xxxxx.h" ------
#include <snmp.h>
#include <snmputil.h>
#include "mib.h"
#include "mibfuncs.h"
//--------------------------- SELF-DEPENDENCY -- ONE #include"module.h" -----
//--------------------------- PUBLIC VARIABLES --(same as in module.h file)--
//--------------------------- PRIVATE CONSTANTS -----------------------------
//--------------------------- PRIVATE STRUCTS -------------------------------
//--------------------------- PRIVATE VARIABLES -----------------------------
//--------------------------- PRIVATE PROTOTYPES ----------------------------
AsnInteger ResolveVarBind(
IN RFC1157VarBind *VarBind, // Variable Binding to resolve
IN UINT PduAction // Action specified in PDU
);
SNMPAPI SnmpExtensionQuery(
IN BYTE ReqType, // 1157 Request type
IN OUT RFC1157VarBindList *VarBinds, // Var Binds to resolve
OUT AsnInteger *ErrorStatus, // Error status returned
OUT AsnInteger *ErrorIndex // Var Bind containing error
);
//--------------------------- PRIVATE PROCEDURES ----------------------------
//
// ResolveVarBind
// Resolve a variable binding.
//
// Notes:
//
// Return Codes:
// None.
//
// Error Codes:
// None.
//
AsnInteger ResolveVarBind(
IN RFC1157VarBind *VarBind, // Variable Binding to resolve
IN UINT PduAction // Action specified in PDU
)
{
MIB_ENTRY *MibPtr;
AsnObjectIdentifier TempOid;
AsnInteger nResult;
// Lookup OID in MIB
MibPtr = MIB_get_entry( &VarBind->name );
// Check to see if OID is between LM variables
if ( MibPtr == NULL && PduAction == MIB_ACTION_GETNEXT )
{
UINT I;
//
// OPENISSUE - Should change to binary search
//
// Search through MIB to see if OID is within the LM MIB's scope
I = 0;
while ( MibPtr == NULL && I < MIB_num_variables )
{
// Construct OID with complete prefix for comparison purposes
if (SnmpUtilOidCpy( &TempOid, &MIB_OidPrefix ) == SNMPAPI_ERROR)
{
nResult = SNMP_ERRORSTATUS_RESOURCEUNAVAILABLE;
goto Exit;
}
if (SnmpUtilOidAppend( &TempOid, &Mib[I].Oid ) == SNMPAPI_ERROR)
{
SnmpUtilOidFree( &TempOid );
nResult = SNMP_ERRORSTATUS_RESOURCEUNAVAILABLE;
goto Exit;
}
// Check for OID in MIB
if ( 0 > SnmpUtilOidCmp(&VarBind->name, &TempOid) )
{
MibPtr = &Mib[I];
PduAction = MIB_ACTION_GETFIRST;
}
// Free OID memory before copying another
SnmpUtilOidFree( &TempOid );
I++;
} // while
} // if
// If OID not within scope of LM MIB, then no such name
if ( MibPtr == NULL )
{
nResult = SNMP_ERRORSTATUS_NOSUCHNAME;
goto Exit;
}
// Call MIB function to apply requested operation
if ( MibPtr->MibFunc == NULL )
{
// If not GET-NEXT, then error
if ( PduAction != MIB_ACTION_GETNEXT && PduAction != MIB_ACTION_GETFIRST )
{
nResult = SNMP_ERRORSTATUS_NOSUCHNAME;
goto Exit;
}
// Since this is AGGREGATE, use GET-FIRST on next variable, then return
nResult = (*MibPtr->MibNext->MibFunc)( MIB_ACTION_GETFIRST,
MibPtr->MibNext, VarBind );
}
else
{
// Make complete OID of MIB name
if (SnmpUtilOidCpy( &TempOid, &MIB_OidPrefix ) == SNMPAPI_ERROR)
{
nResult = SNMP_ERRORSTATUS_RESOURCEUNAVAILABLE;
goto Exit;
}
if (SnmpUtilOidAppend( &TempOid, &MibPtr->Oid ) == SNMPAPI_ERROR)
{
SnmpUtilOidFree( &TempOid );
nResult = SNMP_ERRORSTATUS_RESOURCEUNAVAILABLE;
goto Exit;
}
if ( MibPtr->Type == MIB_TABLE && !SnmpUtilOidCmp(&TempOid, &VarBind->name) )
{
if ( PduAction == MIB_ACTION_GETNEXT )
{
// Supports GET-NEXT on a MIB table's root node
PduAction = MIB_ACTION_GETFIRST;
}
else
{
nResult = SNMP_ERRORSTATUS_NOSUCHNAME;
SnmpUtilOidFree( &TempOid );
goto Exit;
}
}
nResult = (*MibPtr->MibFunc)( PduAction, MibPtr, VarBind );
// Free temp memory
SnmpUtilOidFree( &TempOid );
}
Exit:
return nResult;
} // ResolveVarBind
//--------------------------- PUBLIC PROCEDURES -----------------------------
//
// SnmpExtensionQuery
// Loop through var bind list resolving each var bind name to an entry
// in the LAN Manager MIB.
//
// Notes:
// Table sets are handled on a case by case basis, because in some cases
// more than one entry in the Var Bind list will be needed to perform a
// single SET on the LM MIB. This is due to the LM API calls.
//
// Return Codes:
// SNMPAPI_NOERROR
// SNMPAPI_ERROR
//
// Error Codes:
// None.
//
SNMPAPI SnmpExtensionQuery(
IN BYTE ReqType, // 1157 Request type
IN OUT RFC1157VarBindList *VarBinds, // Var Binds to resolve
OUT AsnInteger *ErrorStatus, // Error status returned
OUT AsnInteger *ErrorIndex // Var Bind containing error
)
{
UINT I;
SNMPAPI nResult;
//
//
// OPENISSUE - Support is not available for TABLE SETS.
//
//
nResult = SNMPAPI_NOERROR;
*ErrorIndex = 0;
// Loop through Var Bind list resolving var binds
for ( I=0;I < VarBinds->len;I++ )
{
*ErrorStatus = ResolveVarBind( &VarBinds->list[I], ReqType );
// Check for GET-NEXT past end of MIB
if ( *ErrorStatus == SNMP_ERRORSTATUS_NOSUCHNAME &&
ReqType == MIB_ACTION_GETNEXT )
{
*ErrorStatus = SNMP_ERRORSTATUS_NOERROR;
// Set Var Bind pointing to next enterprise past LM MIB
SnmpUtilOidFree( &VarBinds->list[I].name );
SnmpUtilOidCpy( &VarBinds->list[I].name, &MIB_OidPrefix );
VarBinds->list[I].name.ids[MIB_PREFIX_LEN-1] ++;
}
if ( *ErrorStatus != SNMP_ERRORSTATUS_NOERROR )
{
*ErrorIndex = I+1;
goto Exit;
}
}
Exit:
return nResult;
} // SnmpExtensionQuery
//-------------------------------- END --------------------------------------