📄 wsnmp_vb.c
字号:
if (TaskData.hTask == 0)
{
lError = SNMPAPI_NOT_INITIALIZED;
goto ERROR_OUT;
}
if (!snmpValidTableEntry(&SessDescr, HandleToUlong(hSession)-1))
{
lError = SNMPAPI_SESSION_INVALID;
goto ERROR_OUT;
}
// We have a valid session at this point...
lSession = hSession; // save it for possible error return
lVbl = HandleToUlong(hVbl) - 1;
if (!snmpValidTableEntry(&VBLsDescr, lVbl))
{
lError = SNMPAPI_VBL_INVALID;
goto ERROR_OUT;
}
pVblOld = snmpGetTableEntry(&VBLsDescr, lVbl);
EnterCriticalSection (&cs_VBL);
lError = snmpAllocTableEntry(&VBLsDescr, &nVbl);
if (lError != SNMPAPI_SUCCESS)
goto ERROR_PRECHECK;
pVblNew = snmpGetTableEntry(&VBLsDescr, nVbl);
if (pVblOld->vbList)
{ // Deliberate assignment follows
if (!(pVblNew->vbList = SnmpCopyVbl (pVblOld->vbList)))
{ // Inherit error code from SnmpCopy Vbl
snmpFreeTableEntry(&VBLsDescr, nVbl);
lError = SNMPAPI_ALLOC_ERROR;
goto ERROR_PRECHECK;
}
}
pVblNew->Session = hSession;
ERROR_PRECHECK:
LeaveCriticalSection (&cs_VBL);
if (lError == SNMPAPI_SUCCESS)
return ((HSNMP_VBL)(nVbl+1));
ERROR_OUT:
return ((HSNMP_VBL)SaveError (lSession, lError));
} // end_SnmpDuplicateVbl
// SnmpFreeVbl
SNMPAPI_STATUS SNMPAPI_CALL
SnmpFreeVbl (IN HSNMP_VBL hVbl)
{
DWORD nVbl = HandleToUlong(hVbl) - 1;
SNMPAPI_STATUS lError = 0;
DWORD i;
LPVBLS pVbl;
if (TaskData.hTask == 0)
{
lError = SNMPAPI_NOT_INITIALIZED;
goto ERROR_OUT;
}
if (!snmpValidTableEntry(&VBLsDescr, nVbl))
{
lError = SNMPAPI_VBL_INVALID;
goto ERROR_OUT;
}
pVbl = snmpGetTableEntry(&VBLsDescr, nVbl);
EnterCriticalSection (&cs_PDU);
if (PDUsDescr.Used)
{
for (i = 0; i < PDUsDescr.Allocated; i++)
{
LPPDUS pPdu = snmpGetTableEntry(&PDUsDescr, i);
if (pPdu->VBL == hVbl)
pPdu->VBL = 0;
}
}
LeaveCriticalSection (&cs_PDU);
EnterCriticalSection (&cs_VBL);
// Free all substructures
FreeVarBindList (pVbl->vbList);
// Clean VBL List
snmpFreeTableEntry(&VBLsDescr, nVbl);
LeaveCriticalSection (&cs_VBL);
return (SNMPAPI_SUCCESS);
//
ERROR_OUT:
return (SaveError (0, lError));
} // end_SnmpFreeVbl
// SnmpCountVbl
SNMPAPI_STATUS SNMPAPI_CALL
SnmpCountVbl (IN HSNMP_VBL hVbl)
{
DWORD nVbl;
smiUINT32 count;
SNMPAPI_STATUS lError;
LPVARBIND VarBindPtr;
HSNMP_SESSION lSession = 0;
LPVBLS pVbl;
if (TaskData.hTask == 0)
{
lError = SNMPAPI_NOT_INITIALIZED;
goto ERROR_OUT;
}
nVbl = HandleToUlong(hVbl) - 1;
if (!snmpValidTableEntry(&VBLsDescr, nVbl))
{
lError = SNMPAPI_VBL_INVALID;
goto ERROR_OUT;
}
pVbl = snmpGetTableEntry(&VBLsDescr, nVbl);
count = 0;
VarBindPtr = pVbl->vbList;
lSession = pVbl->Session;
while (VarBindPtr)
{
VarBindPtr = VarBindPtr->next_var;
count++;
}
if (!count) // No varbinds
{
lError = SNMPAPI_NOOP;
goto ERROR_OUT;
}
return (count);
//
ERROR_OUT:
return (SaveError (lSession, lError));
} // end_SnmpCountVbl
// SnmpDeleteVb
SNMPAPI_STATUS SNMPAPI_CALL
SnmpDeleteVb (IN HSNMP_VBL hVbl, IN smiUINT32 index)
{
DWORD nVbl = HandleToUlong(hVbl) - 1;
HSNMP_SESSION hSession;
smiUINT32 status;
smiUINT32 lError = 0;
HSNMP_SESSION lSession = 0;
UINT i= 0;
LPVARBIND VarBindList;
LPVARBIND VarBindPtr;
LPVARBIND VarBindPrev;
LPVBLS pVbl;
if (TaskData.hTask == 0)
{
lError = SNMPAPI_NOT_INITIALIZED;
goto ERROR_OUT;
}
if (!snmpValidTableEntry(&VBLsDescr, nVbl))
{
lError = SNMPAPI_VBL_INVALID;
goto ERROR_OUT;
}
pVbl = snmpGetTableEntry(&VBLsDescr, nVbl);
hSession = pVbl->Session;
if (!snmpValidTableEntry(&SessDescr, HandleToUlong(hSession)-1))
{
lError = SNMPAPI_SESSION_INVALID;
goto ERROR_OUT;
}
lSession = hSession; // Load for SaveError() return
status = SnmpCountVbl (hVbl);
if ((!index) || (index > status))
{
lError = SNMPAPI_INDEX_INVALID;
goto ERROR_OUT;
}
EnterCriticalSection (&cs_VBL);
// Following cannot be NULL due to passing above test
VarBindPtr = VarBindList = pVbl->vbList;
// Deleting a VarBind
for (i = 1; i <= index; i++)
{ // Position
VarBindPrev = VarBindPtr;
VarBindPtr = VarBindList;
VarBindList = VarBindList->next_var;
} // end_for
if (index == 1)
{ // Replace
pVbl->vbList = VarBindList;
}
else
{ // Skip
VarBindPrev->next_var = VarBindList;
} // end_else
FreeVarBind (VarBindPtr);
LeaveCriticalSection (&cs_VBL);
return (SNMPAPI_SUCCESS);
//
ERROR_OUT:
return (SaveError (lSession, lError));
} // end_SnmpDeleteVb
// SnmpGetVb
SNMPAPI_STATUS SNMPAPI_CALL
SnmpGetVb (IN HSNMP_VBL hVbl,
IN smiUINT32 index,
OUT smiLPOID name,
OUT smiLPVALUE value)
{
DWORD nVbl = HandleToUlong(hVbl) - 1;
LPVARBIND VarBindPtr;
SNMPAPI_STATUS lError = 0;
HSNMP_SESSION lSession = 0;
smiUINT32 nLength;
LPVBLS pVbl;
if (TaskData.hTask == 0)
{
lError = SNMPAPI_NOT_INITIALIZED;
goto ERROR_OUT;
}
if (!snmpValidTableEntry(&VBLsDescr, nVbl))
{
lError = SNMPAPI_VBL_INVALID;
goto ERROR_OUT;
}
pVbl = snmpGetTableEntry(&VBLsDescr, nVbl);
lSession = pVbl->Session;
if (!name && !value)
{
lError = SNMPAPI_NOOP;
goto ERROR_OUT;
}
// Test for output descriptor address validity
if ((name && IsBadWritePtr (name, sizeof(smiOID))) ||
(value && IsBadWritePtr (value, sizeof(smiVALUE))))
{
lError = SNMPAPI_ALLOC_ERROR;
goto ERROR_OUT;
}
nLength = SnmpCountVbl (hVbl);
if ((!index) || (index > nLength))
{
lError = SNMPAPI_INDEX_INVALID;
goto ERROR_OUT;
}
if (!(VarBindPtr = pVbl->vbList))
{
lError = SNMPAPI_VBL_INVALID;
goto ERROR_OUT;
}
// SnmpFillOidValue
for (nLength = 1; nLength < index; nLength++)
VarBindPtr = VarBindPtr->next_var;
if (name != NULL)
{
ZeroMemory (name, sizeof(smiOID));
// Copy the name OID
if ((VarBindPtr->name.len == 0) || (VarBindPtr->name.len > MAXOBJIDSIZE))
{
lError = SNMPAPI_OID_INVALID;
goto ERROR_OUT;
}
nLength = VarBindPtr->name.len * sizeof(smiUINT32);
// App must free following alloc via SnmpFreeDescriptor()
if (!(name->ptr = (smiLPUINT32)GlobalAlloc (GPTR, nLength)))
{
lError = SNMPAPI_ALLOC_ERROR;
goto ERROR_OUT;
}
CopyMemory (name->ptr, VarBindPtr->name.ptr, nLength);
name->len = VarBindPtr->name.len;
}
if (value != NULL)
{
// Initialize output structure
ZeroMemory (value, sizeof(smiVALUE));
// Copy the VALUE structure
switch (VarBindPtr->value.syntax)
{
case SNMP_SYNTAX_OCTETS:
case SNMP_SYNTAX_IPADDR:
case SNMP_SYNTAX_OPAQUE:
case SNMP_SYNTAX_NSAPADDR:
// Do copy only if nLength is non-zero
if (nLength = VarBindPtr->value.value.string.len) // Deliberate assignment
{ // App must free following alloc via SnmpFreeDescriptor()
if (!(value->value.string.ptr = (smiLPBYTE)GlobalAlloc (GPTR, nLength)))
{
lError = SNMPAPI_ALLOC_ERROR;
goto ERROR_PRECHECK;
}
CopyMemory (value->value.string.ptr, VarBindPtr->value.value.string.ptr, nLength);
value->value.string.len = nLength;
}
break;
case SNMP_SYNTAX_OID:
nLength = VarBindPtr->value.value.oid.len;
if (nLength > MAXOBJIDSIZE)
{
lError = SNMPAPI_OID_INVALID;
goto ERROR_PRECHECK;
}
if (nLength)
{ // Do copy only if nLength is non-zero
nLength *= sizeof(smiUINT32);
// App must free following alloc via SnmpFreeDescriptor()
if (!(value->value.oid.ptr = (smiLPUINT32)GlobalAlloc (GPTR, nLength)))
{
lError = SNMPAPI_ALLOC_ERROR;
goto ERROR_PRECHECK;
}
CopyMemory (value->value.oid.ptr,
VarBindPtr->value.value.oid.ptr, nLength);
value->value.oid.len = VarBindPtr->value.value.oid.len;
}
break;
case SNMP_SYNTAX_NULL:
case SNMP_SYNTAX_NOSUCHOBJECT:
case SNMP_SYNTAX_NOSUCHINSTANCE:
case SNMP_SYNTAX_ENDOFMIBVIEW:
// Use initialized (NULL) smiVALUE
break;
case SNMP_SYNTAX_INT:
value->value.sNumber = VarBindPtr->value.value.sNumber;
break;
case SNMP_SYNTAX_CNTR32:
case SNMP_SYNTAX_GAUGE32:
case SNMP_SYNTAX_TIMETICKS:
case SNMP_SYNTAX_UINT32:
value->value.uNumber = VarBindPtr->value.value.uNumber;
break;
case SNMP_SYNTAX_CNTR64:
value->value.hNumber = VarBindPtr->value.value.hNumber;
break;
default:
lError = SNMPAPI_SYNTAX_INVALID;
goto ERROR_PRECHECK;
} // end_switch
value->syntax = VarBindPtr->value.syntax;
}
return (SNMPAPI_SUCCESS);
// Post-name allocation failure modes
ERROR_PRECHECK:
if (name && name->ptr)
{
GlobalFree (name->ptr);
ZeroMemory (name, sizeof(smiOID));
}
if (value && value->value.string.ptr)
{
GlobalFree (value->value.string.ptr);
ZeroMemory (value, sizeof(smiVALUE));
}
ERROR_OUT:
return (SaveError (lSession, lError));
} // end_SnmpGetVb
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -