找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 5342|回复: 0

ASNMP wpu 对IPAddress 编码的BUG

[复制链接]
发表于 2009-5-7 14:00:09 | 显示全部楼层 |阅读模式
int wpdu::convert_vb_to_smival( Vb &tempvb, SmiVALUE *smival )
{
  smival->syntax = tempvb.get_syntax();
  switch ( smival->syntax ) {
  case sNMP_SYNTAX_NULL:
    break;
    // case sNMP_SYNTAX_INT32:
  case sNMP_SYNTAX_INT:
    {
      SnmpInt32 tmp;
      tempvb.get_value(tmp);
      smival->value.sNumber = tmp;
    }
    break;
    //    case sNMP_SYNTAX_UINT32:
  case sNMP_SYNTAX_GAUGE32:
  case sNMP_SYNTAX_CNTR32:
  case sNMP_SYNTAX_TIMETICKS:
    {
      SnmpUInt32 tmp;
      tempvb.get_value(tmp);
      smival->value.uNumber = tmp;
    }
    break;
    // case Counter64
  case sNMP_SYNTAX_CNTR64:
    {
      Counter64 c64;
      tempvb.get_value(c64);
      smival->value.hNumber.hipart = c64.high();
      smival->value.hNumber.lopart = c64.low();
    }
    break;
   // OID syntax
  case sNMP_SYNTAX_OID:
    {
      Oid tmpoid;
      tmpoid.oidval();
      tempvb.get_value(tmpoid);
      SmiLPOID smi = tmpoid.oidval();
      smival->value.oid.len = tmpoid.length();
      ACE_NEW_RETURN(smival->value.oid.ptr,
                SmiUINT32 [smival->value.oid.len], 1);
      ACE_OS::memcpy(smival->value.oid.ptr, smi->ptr,
                     smival->value.oid.len *sizeof(SmiUINT32));
    }
    break;
  case sNMP_SYNTAX_BITS:
  // case sNMP_SYNTAX_IPADDR: // 不能和OCTETS一起编码IPADDR,要独立编码
  case sNMP_SYNTAX_OCTETS:
    {
      OctetStr os;
      tempvb.get_value(os);
      smival->value.string.ptr = 0;
      smival->value.string.len = os.length();
      if ( smival->value.string.len > 0 ) {
        ACE_NEW_RETURN(smival->value.string.ptr,
                SmiBYTE [smival->value.string.len], 1);
        if ( smival->value.string.ptr )  {
          for (int i=0; i<(int) smival->value.string.len ; i++)
            smival->value.string.ptr = os;
        }
        else   {
          smival->syntax = sNMP_SYNTAX_NULL;  // invalidate the smival
          return SNMP_CLASS_RESOURCE_UNAVAIL;
        }
      }
    }
    break;
  case sNMP_SYNTAX_IPADDR: // 独立编码IPADDR
      {
          IpAddress address;
          OctetStr os;
          tempvb.get_value(address);
          address.to_octet(os);
          smival->value.string.ptr = 0;
          smival->value.string.len = os.length();
          if ( smival->value.string.len > 0 )
          {
              ACE_NEW_RETURN(smival->value.string.ptr,
                  SmiBYTE [smival->value.string.len], 1);
              if ( smival->value.string.ptr )  
              {
                  for (int i=0; i<(int) smival->value.string.len ; i++)
                      smival->value.string.ptr = os;
              }
              else   {
                  smival->syntax = sNMP_SYNTAX_NULL;  // invalidate the smival
                  return SNMP_CLASS_RESOURCE_UNAVAIL;
              }
          }
      }
    default:
     ACE_DEBUG((LM_DEBUG, "wpdu::convert_vb_to_smival did not convert vb\n"));
     // ACE_ASSERT(0);
  } // switch
  return 0;
}
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-5-6 14:00 , Processed in 0.058447 second(s), 12 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表