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;
	}	
}
Beispiel #3
0
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;
}