address.cpp

来自「HP公司的SNMP++的Win32版本源码」· C++ 代码 · 共 2,016 行 · 第 1/4 页

CPP
2,016
字号
// using the currently defined address, do a DNS
// and try to fill up the name
int IpAddress::addr_to_friendly()
{
    IN_ADDR ipAddr;
    hostent *lookupResult;
    char    *namePtr = NULL;
    char    ds[30];

    // can't look up an invalid address
    if ( !valid_flag) return -1;

    // otherwise lets look it up
    // lets try and get the friendly name
    // from the DNS
    strcpy( ds, this->IpAddress::get_printable());

    if ((ipAddr.s_addr = inet_addr((char *) ds)) == -1)
      return -1;    // bad address

    lookupResult = gethostbyaddr((char *) &ipAddr, sizeof(in_addr), AF_INET);

    // if we found the name, then update the
    // iv friendly name
    if ( lookupResult)
    {
      namePtr = lookupResult->h_name;
      strcpy( iv_friendly_name, namePtr);
      return 0;
    }
    else
    {
      iv_friendly_name_status = h_errno;
      return iv_friendly_name_status;
    }

};

//----[ IP address char * cast ]--------------------------------------
IpAddress::operator const char *() const
{
  return (char *)output_buffer;
}
//----[ IP address get char representation ]--------------------------
char * WINFAR IpAddress::get_printable()
{
  return (char *)output_buffer;
}

//----[ IP address format output ]------------------------------------
void IpAddress::format_output()
{
  // if valid format else null it
  if ( valid_flag)
    sprintf( (char *) output_buffer,"%d.%d.%d.%d",address_buffer[0],
	     address_buffer[1], address_buffer[2], address_buffer[3]);
  else
    output_buffer[0]=0;
};

//------[ return the type ]----------------------------------
addr_type IpAddress::get_type()	const
{ return type_ip; };

//-----------------------------------------------------------------
// logically and two IPaddresses and
// return the new one
void IpAddress::mask( const IpAddress& ipaddr)
{ 
  if ( this->valid() && ipaddr.valid())
  {
     this->address_buffer[0] = this->address_buffer[0] & ipaddr.address_buffer[0];
     this->address_buffer[1] = this->address_buffer[1] & ipaddr.address_buffer[1];
     this->address_buffer[2] = this->address_buffer[2] & ipaddr.address_buffer[2];
     this->address_buffer[3] = this->address_buffer[3] & ipaddr.address_buffer[3];
     format_output();
  };
 
};


//=======================================================================
//========== Udp Address Implementation =================================
//=======================================================================

//-----------[ syntax type ]----------------------------------------------
SmiUINT32 UdpAddress::get_syntax()
{ return sNMP_SYNTAX_OCTETS; };

//-------[ construct an IP address with no agrs ]----------------------
UdpAddress::UdpAddress( void):IpAddress()
{ 
  // Inherits IP Address attributes
  // Always initialize (override) what type this object is
  smival.syntax = sNMP_SYNTAX_OCTETS;
  smival.value.string.len = UDPIPLEN;
  smival.value.string.ptr = address_buffer;

  set_port(0);
  format_output();
};

//-----------------[ construct an Udp address with another Udp address ]---
UdpAddress::UdpAddress( const UdpAddress  &udpaddr):IpAddress(udpaddr)
{
  // always initialize SMI info
  smival.syntax = sNMP_SYNTAX_OCTETS;
  smival.value.string.len = UDPIPLEN;
  smival.value.string.ptr = address_buffer;

  // Copy the port value
  set_port(udpaddr.get_port());
  format_output();
};

// constructor with a dotted string
UdpAddress::UdpAddress( const char *inaddr):IpAddress()
{
  // always initialize SMI info
  smival.syntax = sNMP_SYNTAX_OCTETS;
  smival.value.string.len = UDPIPLEN;
  smival.value.string.ptr = address_buffer;

   valid_flag = parse_address( (char *)inaddr); 
   format_output();
}

//-----------------[ construct a UdpAddress from a GenAddress ]--------------
UdpAddress::UdpAddress( const GenAddress &genaddr):IpAddress()
{
  // always initialize SMI info
  smival.syntax = sNMP_SYNTAX_OCTETS;
  smival.value.string.len = UDPIPLEN;
  smival.value.string.ptr = address_buffer;

  unsigned int port = 0;
  valid_flag = FALSE;

  // allow use of an ip or udp genaddress
  if (genaddr.get_type() == type_udp)
  {
    valid_flag = genaddr.valid();
    if ( valid_flag)
    {
      // copy in the IP address data
      UdpAddress temp_udp( (const char *) genaddr);
      *this = temp_udp;

      //  port info since are making an UpAddress
      port = temp_udp.get_port();
    }
  }
  else
  if (genaddr.get_type() == type_ip)
  {
    valid_flag = genaddr.valid();
    if ( valid_flag)
    {
      // copy in the IP address data
      IpAddress temp_ip( (const char *) genaddr);
      *this = temp_ip;
    }
  }
  set_port(port);
  format_output();
};


//--------[ construct a udp from an IpAddress ]--------------------------
UdpAddress::UdpAddress( const IpAddress &ipaddr):IpAddress(ipaddr)
{
  // always initialize SMI info
  smival.syntax = sNMP_SYNTAX_OCTETS;
  smival.value.string.len = UDPIPLEN;
  smival.value.string.ptr = address_buffer;

  set_port(0);
  format_output();
};


//-----[ destructor ]--------------------------------------------------
UdpAddress::~UdpAddress()
{};


  // copy an instance of this Value
SnmpSyntax& UdpAddress::operator=( SnmpSyntax &val)
{
  // protect against assignment from itself
  if ( this == &val )
      return *this;

  valid_flag=0;		// will get set TRUE if really valid
  if (val.valid()){
    switch (val.get_syntax()){
    case sNMP_SYNTAX_IPADDR: 
    {
      UdpAddress temp_udp(val.get_printable());
      *this = temp_udp;	// valid_flag is set by the udp assignment
    }
    break;

    case sNMP_SYNTAX_OCTETS:
      if (((UdpAddress &)val).smival.value.string.len == UDPIPLEN){
         MEMCPY(address_buffer,((UdpAddress &)val).smival.value.string.ptr,UDPIPLEN);
         iv_friendly_name[0]=0;
         valid_flag=1;
      }
    break;

    // NOTE: as a value add, other types could have "logical"
    // mappings, i.e. integer32 and unsigned32 
    }
  }
  format_output();
  return *this;
}

  // assignment to another UdpAddress object overloaded
UdpAddress& UdpAddress::operator=( const UdpAddress &udpaddr)
{
  // protect against assignment from itself
  if ( this == &udpaddr )
      return *this;

  (IpAddress &)*this = udpaddr; // use ancestor assignment for ipaddr value
  set_port(udpaddr.get_port());	// copy to port value
  format_output();
  return *this;
}


//-----[ IP Address parse Address ]---------------------------------
int UdpAddress::parse_address( const char *inaddr)
{
   char buffer[MAX_FRIENDLY_NAME];

   unsigned short port = 0;
   if (inaddr && (strlen( inaddr)< MAX_FRIENDLY_NAME))
     strcpy( buffer, inaddr);
   else
   {
     valid_flag = FALSE;
     return FALSE;
   }
   // look for port info @ the end of the string
   // port can be delineated by a ':' or a '/'
   // if neither are present then just treat it 
   // like a normal IpAddress
   char *tmp;
   tmp = strstr( buffer,":");
   if (tmp==NULL) 
     tmp = strstr(buffer,"/");

   if ( tmp != NULL)
   {
     *tmp=0;   // new null terminator
     tmp++;
     port = atoi( tmp);
	 set_port( port);
     return IpAddress::parse_address( buffer);
   }
   else
   {
       port = 0;
	   set_port( port);
	   return IpAddress::parse_address ( buffer);
   }
};


//----------[ create a new instance of this Value ]------------------------
SnmpSyntax WINFAR *UdpAddress::clone() const 
{ return (SnmpSyntax *) new UdpAddress(*this); };

//--------[ set the port number ]---------------------------------------
void UdpAddress::set_port( const unsigned short p)
{ 
  unsigned short port_nbo = htons(p);
  MEMCPY(&address_buffer[IPLEN], &port_nbo, 2);
  format_output();
};

//---------[ get the port number ]--------------------------------------
unsigned short UdpAddress::get_port() const
{ 
  if (valid_flag) 
  {
    unsigned short port_nbo;
    MEMCPY(&port_nbo, &address_buffer[IPLEN], 2);
    return ntohs(port_nbo); 
  }
  else
    return 0;// don't use uninitialized memory
};

//------[ return the type ]--------------------------------------------
addr_type UdpAddress::get_type() const
{ return type_udp; };

//----[ UDP address char * cast ]--------------------------------------
UdpAddress::operator const char *() const
{
  return (char *)output_buffer;
}
//----[ UDP address get char representation ]--------------------------
char * WINFAR UdpAddress::get_printable()
{
  return (char *)output_buffer;
}

//----[ UDP address format output ]------------------------------------
void UdpAddress::format_output()
{
  IpAddress::format_output(); // allow ancestors to format their buffers

  // if valid format else null it
  if ( valid_flag)
    sprintf( (char *) output_buffer,"%s/%d",
	     IpAddress::get_printable(), 
	     get_port() );
  else
    output_buffer[0]=0;
};



//=======================================================================
//=========== IPX Address Implementation ================================
//=======================================================================

//-----------[ syntax type ]----------------------------------------------
SmiUINT32 IpxAddress::get_syntax()
{ return sNMP_SYNTAX_OCTETS; };

//----------[ constructor no args ]--------------------------------------
IpxAddress::IpxAddress( void):Address()
{
  // always initialize SMI info
  smival.syntax = sNMP_SYNTAX_OCTETS;
  smival.value.string.len = IPXLEN;
  smival.value.string.ptr = address_buffer;

  separator = '\0'; 
  valid_flag=FALSE;
  IpxAddress::format_output();
};


//----------[ constructor with a string arg ]---------------------------
IpxAddress::IpxAddress( const char  *inaddr):Address( )
{ 
  // always initialize SMI info
  smival.syntax = sNMP_SYNTAX_OCTETS;
  smival.value.string.len = IPXLEN;
  smival.value.string.ptr = address_buffer;

  separator = '\0';
  valid_flag = parse_address( (char *) inaddr); 
  IpxAddress::format_output();
};


//-----[ IPX Address copy constructor ]----------------------------------
IpxAddress::IpxAddress(const IpxAddress &ipxaddr)
{
  // always initialize SMI info
  smival.syntax = sNMP_SYNTAX_OCTETS;
  smival.value.string.len = IPXLEN;
  smival.value.string.ptr = address_buffer;

  separator = '\0';
  valid_flag = ipxaddr.valid_flag;
  if (valid_flag)
     MEMCPY(address_buffer, ipxaddr.address_buffer, IPXLEN);
  IpxAddress::format_output();
};


//----[ construct an IpxAddress from a GenAddress ]---------------------------
IpxAddress::IpxAddress( const GenAddress &genaddr)
{
  // always initialize SMI info
  smival.syntax = sNMP_SYNTAX_OCTETS;
  smival.value.string.len = IPXLEN;
  smival.value.string.ptr = address_buffer;

  valid_flag = FALSE;
  // allow use of an ipx or ipxsock address
  if ( (genaddr.get_type() == type_ipx) )
  {
    valid_flag = genaddr.valid();
    if ( valid_flag)
    {
      // copy in the Ipx address data
      IpxAddress temp_ipx( (const char *) genaddr);
      *this = temp_ipx;
    }
  }
  else
  if ( (genaddr.get_type() == type_ipxsock) )
  {
    valid_flag = genaddr.valid();
    if ( valid_flag)
    {
      // copy in the Ipx address data
      IpxSockAddress temp_ipxsock( (const char *) genaddr);
      *this = temp_ipxsock;
    }
  }
  IpxAddress::format_output();
};


//-----[ destructor ]--------------------------------------------------
IpxAddress::~IpxAddress()
{};


//-----[ IPX Address general = operator ]-------------------------------
SnmpSyntax& IpxAddress::operator=( SnmpSyntax &val)
{
  // protect against assignment from itself
  if ( this == &val )
      return *this;

  valid_flag=0;      	// will set to TRUE if really valid
  if (val.valid()){
    switch (val.get_syntax()){
    case sNMP_SYNTAX_OCTETS: 
      if (((IpxAddress &)val).smival.value.string.len == IPXLEN){
	MEMCPY(address_buffer, ((IpxAddress &)val).smival.value.string.ptr, IPXLEN);
	valid_flag=1;
      }
    break;
    }
  }
  IpxAddress::format_output();
  return *this;
};

//--------[ assignment to another IpAddress object overloaded ]----------
IpxAddress& IpxAddress::operator=( const IpxAddress &ipxaddress)
{
  // protect against assignment from itself
  if ( this == &ipxaddress )
      return *this;

  valid_flag = ipxaddress.valid_flag; 
  if (valid_flag)
    MEMCPY(address_buffer, ipxaddress.address_buffer, IPXLEN);
  IpxAddress::format_output();
  return *this;
};


// create a new instance of this Value
SnmpSyntax WINFAR *IpxAddress::clone() const 
{ return (SnmpSyntax *) new IpxAddress(*this); };

//-----[ IPX Address parse Address ]-----------------------------------
// Convert a string to a ten byte ipx address
// On success sets validity  TRUE or FALSE
//
//     IPX address format
//
//  NETWORK ID| MAC ADDRESS
// 01 02 03 04|05 06 07 08 09 10
// XX XX XX XX|XX XX XX XX XX XX
//
//   Valid input format
//
//   XXXXXXXX.XXXXXXXXXXXX
//   Total length must be 21
//   Must have a separator in it
//   First string length must be 8
//   Second string length must be 12
//   Each char must take on value 0-F
//
//
// Input formats recognized
// 
//  XXXXXXXX.XXXXXXXXXXXX
//  XXXXXXXX:XXXXXXXXXXXX
//  XXXXXXXX-XXXXXXXXXXXX
//  XXXXXXXX.XXXXXX-XXXXXX
//  XXXXXXXX:XXXXXX-XXXXXX
//  XXXXXXXX-XXXXXX-XXXXXX
int IpxAddress::parse_address( const char *inaddr)
{
  char unsigned *str1,*str2;
  char temp[30];    // don't destroy original
  char unsigned *tmp;
  size_t z, tmplen;


  // save the orginal source
  if (!inaddr || (strlen( inaddr) >(sizeof(temp)-1))) return FALSE;
  strcpy( temp, inaddr);
  trim_white_space( temp);
  tmplen = strlen(temp);

  // bad total length check

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?