394 lines
8.4 KiB
C
394 lines
8.4 KiB
C
|
/*++
|
|||
|
|
|||
|
Copyright (c) 1992-1997 Microsoft Corporation
|
|||
|
|
|||
|
Module Name:
|
|||
|
|
|||
|
oid.c
|
|||
|
|
|||
|
Abstract:
|
|||
|
|
|||
|
Contains routines to manipulatee object identifiers.
|
|||
|
|
|||
|
SnmpUtilOidCpy
|
|||
|
SnmpUtilOidAppend
|
|||
|
SnmpUtilOidNCmp
|
|||
|
SnmpUtilOidCmp
|
|||
|
SnmpUtilOidFree
|
|||
|
|
|||
|
Environment:
|
|||
|
|
|||
|
User Mode - Win32
|
|||
|
|
|||
|
Revision History:
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
///////////////////////////////////////////////////////////////////////////////
|
|||
|
// //
|
|||
|
// Include files //
|
|||
|
// //
|
|||
|
///////////////////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
#include <snmp.h>
|
|||
|
#include <snmputil.h>
|
|||
|
|
|||
|
|
|||
|
///////////////////////////////////////////////////////////////////////////////
|
|||
|
// //
|
|||
|
// Public Procedures //
|
|||
|
// //
|
|||
|
///////////////////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
SNMPAPI
|
|||
|
SNMP_FUNC_TYPE
|
|||
|
SnmpUtilOidCpy(
|
|||
|
AsnObjectIdentifier * pOidDst,
|
|||
|
AsnObjectIdentifier * pOidSrc
|
|||
|
)
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Copy an object identifier.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
pOidDst - pointer to structure to receive OID.
|
|||
|
|
|||
|
pOidSrc - pointer to OID to copy.
|
|||
|
|
|||
|
Return Values:
|
|||
|
|
|||
|
Returns SNMPAPI_NOERROR if successful.
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
SNMPAPI nResult = SNMPAPI_ERROR;
|
|||
|
|
|||
|
// validate pointers
|
|||
|
if (pOidDst != NULL) {
|
|||
|
|
|||
|
// initialize
|
|||
|
pOidDst->ids = NULL;
|
|||
|
pOidDst->idLength = 0;
|
|||
|
|
|||
|
// check for subids
|
|||
|
if ((pOidSrc != NULL) &&
|
|||
|
(pOidSrc->ids != NULL) &&
|
|||
|
(pOidSrc->idLength != 0)) {
|
|||
|
|
|||
|
// attempt to allocate the subids
|
|||
|
pOidDst->ids = (UINT *)SnmpUtilMemAlloc(
|
|||
|
pOidSrc->idLength * sizeof(UINT)
|
|||
|
);
|
|||
|
|
|||
|
// validate pointer
|
|||
|
if (pOidDst->ids != NULL) {
|
|||
|
|
|||
|
// transfer the oid length
|
|||
|
pOidDst->idLength = pOidSrc->idLength;
|
|||
|
|
|||
|
// transfer subids
|
|||
|
memcpy(pOidDst->ids,
|
|||
|
pOidSrc->ids,
|
|||
|
pOidSrc->idLength * sizeof(UINT)
|
|||
|
);
|
|||
|
|
|||
|
nResult = SNMPAPI_NOERROR; // success...
|
|||
|
|
|||
|
} else {
|
|||
|
|
|||
|
SNMPDBG((
|
|||
|
SNMP_LOG_ERROR,
|
|||
|
"SNMP: API: could not allocate oid.\n"
|
|||
|
));
|
|||
|
|
|||
|
SetLastError(SNMP_MEM_ALLOC_ERROR);
|
|||
|
}
|
|||
|
|
|||
|
} else {
|
|||
|
|
|||
|
SNMPDBG((
|
|||
|
SNMP_LOG_WARNING,
|
|||
|
"SNMP: API: copying a null oid.\n"
|
|||
|
));
|
|||
|
|
|||
|
nResult = SNMPAPI_NOERROR; // success...
|
|||
|
}
|
|||
|
|
|||
|
} else {
|
|||
|
|
|||
|
SNMPDBG((
|
|||
|
SNMP_LOG_ERROR,
|
|||
|
"SNMP: API: null oid pointer during copy.\n"
|
|||
|
));
|
|||
|
|
|||
|
SetLastError(ERROR_INVALID_PARAMETER);
|
|||
|
}
|
|||
|
|
|||
|
return nResult;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
SNMPAPI
|
|||
|
SNMP_FUNC_TYPE
|
|||
|
SnmpUtilOidAppend(
|
|||
|
AsnObjectIdentifier * pOidDst,
|
|||
|
AsnObjectIdentifier * pOidSrc
|
|||
|
)
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Append source OID to destination OID
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
pOidDst - pointer to structure to receive combined OID.
|
|||
|
|
|||
|
pOidSrc - pointer to OID to append.
|
|||
|
|
|||
|
Return Values:
|
|||
|
|
|||
|
Returns SNMPAPI_NOERROR if successful.
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
SNMPAPI nResult = SNMPAPI_ERROR;
|
|||
|
|
|||
|
// validate pointers
|
|||
|
if (pOidDst != NULL) {
|
|||
|
|
|||
|
// check if there are subids
|
|||
|
if ((pOidSrc != NULL) &&
|
|||
|
(pOidSrc->ids != NULL) &&
|
|||
|
(pOidSrc->idLength != 0)) {
|
|||
|
|
|||
|
// calculate the total number of subidentifiers
|
|||
|
UINT nIds = pOidDst->idLength + pOidSrc->idLength;
|
|||
|
|
|||
|
// validate number of subids
|
|||
|
if (nIds <= SNMP_MAX_OID_LEN) {
|
|||
|
|
|||
|
// attempt to allocate the subidentifiers
|
|||
|
UINT * pIds = (UINT *)SnmpUtilMemReAlloc(
|
|||
|
pOidDst->ids,
|
|||
|
nIds * sizeof(UINT)
|
|||
|
);
|
|||
|
|
|||
|
// validate pointer
|
|||
|
if (pIds != NULL) {
|
|||
|
|
|||
|
// transfer pointer
|
|||
|
pOidDst->ids = pIds;
|
|||
|
|
|||
|
// transfer subids
|
|||
|
memcpy(&pOidDst->ids[pOidDst->idLength],
|
|||
|
pOidSrc->ids,
|
|||
|
pOidSrc->idLength * sizeof(UINT)
|
|||
|
);
|
|||
|
|
|||
|
// transfer oid length
|
|||
|
pOidDst->idLength = nIds;
|
|||
|
|
|||
|
nResult = SNMPAPI_NOERROR; // success...
|
|||
|
|
|||
|
} else {
|
|||
|
|
|||
|
SNMPDBG((
|
|||
|
SNMP_LOG_ERROR,
|
|||
|
"SNMP: API: could not allocate oid.\n"
|
|||
|
));
|
|||
|
|
|||
|
SetLastError(SNMP_MEM_ALLOC_ERROR);
|
|||
|
}
|
|||
|
|
|||
|
} else {
|
|||
|
|
|||
|
SNMPDBG((
|
|||
|
SNMP_LOG_ERROR,
|
|||
|
"SNMP: API: combined oid too large.\n"
|
|||
|
));
|
|||
|
|
|||
|
SetLastError(SNMP_BERAPI_OVERFLOW);
|
|||
|
}
|
|||
|
|
|||
|
} else {
|
|||
|
|
|||
|
SNMPDBG((
|
|||
|
SNMP_LOG_WARNING,
|
|||
|
"SNMP: API: appending a null oid.\n"
|
|||
|
));
|
|||
|
|
|||
|
nResult = SNMPAPI_NOERROR; // success...
|
|||
|
}
|
|||
|
|
|||
|
} else {
|
|||
|
|
|||
|
SNMPDBG((
|
|||
|
SNMP_LOG_ERROR,
|
|||
|
"SNMP: API: null oid pointer during copy.\n"
|
|||
|
));
|
|||
|
|
|||
|
SetLastError(ERROR_INVALID_PARAMETER);
|
|||
|
}
|
|||
|
|
|||
|
return nResult;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
SNMPAPI
|
|||
|
SNMP_FUNC_TYPE
|
|||
|
SnmpUtilOidNCmp(
|
|||
|
AsnObjectIdentifier * pOid1,
|
|||
|
AsnObjectIdentifier * pOid2,
|
|||
|
UINT nSubIds
|
|||
|
)
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Compares two OIDs up to a certain subidentifier.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
pOid1 - pointer to first OID.
|
|||
|
|
|||
|
pOid2 - pointer to second OID.
|
|||
|
|
|||
|
nSubIds - maximum subidentifiers to compare.
|
|||
|
|
|||
|
Return Values:
|
|||
|
|
|||
|
< 0 first parameter is 'less than' second.
|
|||
|
0 first parameter is 'equal to' second.
|
|||
|
> 0 first parameter is 'greater than' second.
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
UINT i = 0;
|
|||
|
// INT nResult = 0;
|
|||
|
|
|||
|
// validate pointers
|
|||
|
if ((pOid1 != NULL) &&
|
|||
|
(pOid2 != NULL)) {
|
|||
|
|
|||
|
// calculate maximum number of subidentifiers to compare
|
|||
|
UINT nMaxIds = min(nSubIds, min(pOid1->idLength, pOid2->idLength));
|
|||
|
|
|||
|
/*
|
|||
|
// loop through the subidentifiers
|
|||
|
while((nResult == 0) && (i < nMaxIds)) {
|
|||
|
|
|||
|
// compare each subidentifier
|
|||
|
nResult = pOid1->ids[i] - pOid2->ids[i++];
|
|||
|
}
|
|||
|
*/
|
|||
|
while(i < nMaxIds)
|
|||
|
{
|
|||
|
if (pOid1->ids[i] != pOid2->ids[i])
|
|||
|
break;
|
|||
|
i++;
|
|||
|
}
|
|||
|
|
|||
|
// comparision length less then either OID lengths; components equals
|
|||
|
if (i == nSubIds)
|
|||
|
return 0;
|
|||
|
|
|||
|
// difference encountered before either OID endings and before the
|
|||
|
// requested comparision length
|
|||
|
if (i < nMaxIds)
|
|||
|
return (pOid1->ids[i] < pOid2->ids[i])? -1 : 1;
|
|||
|
|
|||
|
// one OID is shorter than the requested comparision length
|
|||
|
return pOid1->idLength - pOid2->idLength;
|
|||
|
/*
|
|||
|
// check for second being subset
|
|||
|
if ((nResult == 0) && (i < nSubIds)) {
|
|||
|
|
|||
|
// determine order by length of oid
|
|||
|
nResult = pOid1->idLength - pOid2->idLength;
|
|||
|
}
|
|||
|
*/
|
|||
|
}
|
|||
|
|
|||
|
// return nResult;
|
|||
|
return 0;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
SNMPAPI
|
|||
|
SNMP_FUNC_TYPE
|
|||
|
SnmpUtilOidCmp(
|
|||
|
AsnObjectIdentifier * pOid1,
|
|||
|
AsnObjectIdentifier * pOid2
|
|||
|
)
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Compares two OIDs.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
pOid1 - pointer to first OID.
|
|||
|
|
|||
|
pOid2 - pointer to second OID.
|
|||
|
|
|||
|
Return Values:
|
|||
|
|
|||
|
< 0 first parameter is 'less than' second.
|
|||
|
0 first parameter is 'equal to' second.
|
|||
|
> 0 first parameter is 'greater than' second.
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
// forward request to the function above
|
|||
|
return SnmpUtilOidNCmp(pOid1,pOid2,max(pOid1->idLength,pOid2->idLength));
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
VOID
|
|||
|
SNMP_FUNC_TYPE
|
|||
|
SnmpUtilOidFree(
|
|||
|
AsnObjectIdentifier * pOid
|
|||
|
)
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Releases memory associated with OID.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
pOid - pointer to OID to free.
|
|||
|
|
|||
|
Return Values:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
// validate
|
|||
|
if (pOid != NULL) {
|
|||
|
|
|||
|
// release subids memory
|
|||
|
SnmpUtilMemFree(pOid->ids);
|
|||
|
|
|||
|
// re-initialize
|
|||
|
pOid->idLength = 0;
|
|||
|
pOid->ids = NULL;
|
|||
|
}
|
|||
|
}
|