std::string SNMPObject::getOID() const { if(!_bInit) { return ""; } char szName[MAXOBJIDSTRSIZE+1]; szName[0] = szName[MAXOBJIDSTRSIZE] = '\0'; if(SnmpOidToStr (&_oid, sizeof(szName), szName) == SNMPAPI_FAILURE) { SNMP_THROW_ERROR("Failed to convert OID to string", SnmpGetLastError(NULL), SNMP_ERROR); } return std::string(szName); }
void SNMPObject::setValue(smiVALUE * smiVal) { _syntax = (DWORD)smiVal->syntax; switch(smiVal->syntax) { case SNMP_SYNTAX_INT: setInt((__int64)smiVal->value.sNumber); break; case SNMP_SYNTAX_OCTETS: case SNMP_SYNTAX_OPAQUE: case SNMP_SYNTAX_BITS: { unsigned int i; unsigned char cB; bool binary = false; for (i=0; i<smiVal->value.string.len; i++) { cB = (unsigned char)smiVal->value.string.ptr[i]; if((cB < 0x20 && (cB != 0x0A && cB != 0x0D)) || cB > 0x7E) { binary = true; break; } } _binary = binary; if(binary) { setOctets(smiVal->value.string.ptr, smiVal->value.string.len); } else { std::stringstream ss; for (i=0; i<smiVal->value.string.len; i++) { ss << (unsigned char)smiVal->value.string.ptr[i]; } setString(ss.str()); } } break; case SNMP_SYNTAX_CNTR64: setUInt( (((unsigned __int64)(smiVal->value.hNumber.hipart)) << 32) | ((unsigned __int64)(smiVal->value.hNumber.lopart)) ); break; case SNMP_SYNTAX_CNTR32: case SNMP_SYNTAX_GAUGE32: case SNMP_SYNTAX_TIMETICKS: case SNMP_SYNTAX_UINT32: setUInt((unsigned __int64)smiVal->value.uNumber); break; case SNMP_SYNTAX_OID: { char szName[MAXOBJIDSTRSIZE+1]; szName[0] = szName[MAXOBJIDSTRSIZE] = '\0'; if(SnmpOidToStr (&smiVal->value.oid, sizeof(szName), szName) == SNMPAPI_FAILURE) { szName[0] = '\0'; } setString(szName); } break; case SNMP_SYNTAX_NSAPADDR: case SNMP_SYNTAX_IPADDR: { unsigned int i; std::stringstream ss; for (i=0; i<smiVal->value.string.len; i++) { ss << ((unsigned int)smiVal->value.string.ptr[i]); if(i+1 < smiVal->value.string.len) { ss << "."; } } setString(ss.str()); } break; case SNMP_SYNTAX_NULL: case SNMP_SYNTAX_NOSUCHOBJECT: case SNMP_SYNTAX_NOSUCHINSTANCE: case SNMP_SYNTAX_ENDOFMIBVIEW: default: break; } }
SNMPAPI_STATUS SNMPSession::processNotification(WPARAM wParam, LPARAM lParam) { if(wParam == 0) { HSNMP_PDU hPdu; HSNMP_CONTEXT hContext; HSNMP_ENTITY hDstEntity; HSNMP_ENTITY hSrcEntity; SNMPAPI_STATUS ret = SnmpRecvMsg(_hSession, &hSrcEntity, &hDstEntity, &hContext, &hPdu); SNMPRemoteAgent * pRa = getRemoteAgent(hContext); int requestId = (DWORD)lParam; SNMPRequest * pRequest = NULL; if(pRa) { pRequest = pRa->getRequest(requestId); } if(ret == SNMPAPI_FAILURE) { if(pRequest) { pRequest->setResult(SNMP_ERROR_GENERR); } SnmpFreeVbl(hPdu); return SNMPAPI_SUCCESS; } smiINT32 lReqId, lType, lErr, lIdx; HSNMP_VBL hVbl; ret = SnmpGetPduData(hPdu, &lType, &lReqId, &lErr, &lIdx, &hVbl); if(ret == SNMPAPI_FAILURE) { if(pRequest) { pRequest->setResult(SNMP_ERROR_GENERR); } SnmpFreeVbl(hPdu); return SNMPAPI_SUCCESS; } #ifdef SMNP_TRACER if(SNMPTRACEAENABLED()) { std::stringstream trace; trace << "rx " << SNMPManager::pduToStr(hDstEntity, hSrcEntity, hContext, lType, lReqId, lErr, hVbl, false); SNMPTRACE(trace.str()); } #endif if(lType != SNMP_PDU_RESPONSE) { pRequest = NULL; } if(pRequest == NULL && lType != SNMP_PDU_TRAP && lType != SNMP_PDU_INFORM) { SnmpFreeVbl(hVbl); SnmpFreeVbl(hPdu); return SNMPAPI_SUCCESS; } smiOID dRetName; smiVALUE dRetValue; int count = SnmpCountVbl(hVbl); if(count) { char szName[MAXOBJIDSTRSIZE+1]; szName[0] = szName[MAXOBJIDSTRSIZE] = '\0'; for(int i=0; i<count; i++) { if(SnmpGetVb(hVbl, i+1, &dRetName, &dRetValue) == SNMPAPI_FAILURE) { SnmpFreeVbl(hVbl); SnmpFreePdu(hPdu); if(pRequest) { pRequest->setResult(SNMP_ERROR_GENERR); } return SNMPAPI_SUCCESS; } if(SnmpOidToStr(&dRetName, sizeof(szName), szName) == SNMPAPI_FAILURE) { szName[0] = '\0'; } SNMPObject obj; obj.setValue(&dRetValue); obj.setOID(szName); if(pRequest) { pRequest->addToResult(obj); } else { processTrap(obj); } SnmpFreeDescriptor(SNMP_SYNTAX_OID, (smiLPOPAQUE)&dRetName); if(dRetValue.syntax == SNMP_SYNTAX_OID) { SnmpFreeDescriptor(dRetValue.syntax, (smiLPOPAQUE)&dRetValue.value.oid); } else if( dRetValue.syntax == SNMP_SYNTAX_OPAQUE || dRetValue.syntax == SNMP_SYNTAX_OCTETS || dRetValue.syntax == SNMP_SYNTAX_BITS || dRetValue.syntax == SNMP_SYNTAX_IPADDR || dRetValue.syntax == SNMP_SYNTAX_NSAPADDR) { SnmpFreeDescriptor(dRetValue.syntax, (smiLPOPAQUE)&dRetValue.value.string); } } } SnmpFreeVbl(hVbl); SnmpFreePdu(hPdu); if(pRequest) { pRequest->setResult(lErr, false); } return SNMPAPI_SUCCESS; } return SNMPAPI_SUCCESS; }