address.cpp
来自「HP公司的SNMP++的Win32版本源码」· C++ 代码 · 共 2,016 行 · 第 1/4 页
CPP
2,016 行
// 123456789012345678901
// XXXXXXXX-XXXXXXXXXXXX 21 len
//
// XXXXXXXX-XXXXXX-XXXXXX 22 len
// need at least 21 chars and no more than 22
if ( (tmplen <21) || (tmplen >22))
return FALSE;
// convert the string to all lower case
// this allows hex values to be in upper or lower
for (z=0;z< tmplen;z++)
temp[z] = tolower(temp[z]);
// check for separated nodeid
// if found remove it
if (temp[15] == '-')
{
for(z=16;z<tmplen;z++)
temp[z-1] = temp[z];
temp[tmplen-1] = 0;
}
// no dot or colon separator check
separator = temp[8];
if (( separator != ':') &&
( separator != '.') &&
( separator != '-') &&
( separator != ' '))
return FALSE;
// separate the strings
str1 = ( unsigned char *) temp;
while( *str1 != separator) str1++;
str2 = str1 + 1;
*str1 = 0;
str1= ( unsigned char *) temp;
// check len of the network portion
if ( strlen((char *) str1) != 8) return FALSE;
// check len of mac portion
if ( strlen( (char *) str2) != 12) return FALSE;
// ok we like then lens, make sure that all chars are 0-f
// check out the net id
tmp = str1;
while( *tmp != 0)
if (((*tmp >= '0') && (*tmp <= '9'))|| // good 0-9
((*tmp >= 'a') && (*tmp <= 'f'))) // or a-f
tmp++;
else
return FALSE;
// check out the MAC address
tmp = str2;
while( *tmp != 0)
if (((*tmp >= '0') && (*tmp <= '9'))|| // good 0-9
((*tmp >= 'a') && (*tmp <= 'f'))) // or a-f
tmp++;
else
return FALSE;
// convert to target string
tmp = str1;
while ( *tmp != 0)
{
if (( *tmp >= '0') && ( *tmp <= '9'))
*tmp = *tmp - (char unsigned )'0';
else
*tmp = *tmp - (char unsigned) 'a' + (char unsigned) 10;
tmp++;
}
// network id portion
address_buffer[0] = (str1[0]*16) + str1[1];
address_buffer[1] = (str1[2]*16) + str1[3];
address_buffer[2] = (str1[4]*16) + str1[5];
address_buffer[3] = (str1[6]*16) + str1[7];
tmp = str2;
while ( *tmp != 0)
{
if (( *tmp >= '0') && ( *tmp <= '9'))
*tmp = *tmp - (char unsigned) '0';
else
*tmp = *tmp - (char unsigned) 'a'+ (char unsigned) 10;
tmp++;
}
address_buffer[4] = (str2[0]*16) + str2[1];
address_buffer[5] = (str2[2]*16) + str2[3];
address_buffer[6] = (str2[4]*16) + str2[5];
address_buffer[7] = (str2[6]*16) + str2[7];
address_buffer[8] = (str2[8]*16) + str2[9];
address_buffer[9] = (str2[10]*16) + str2[11];
return TRUE;
};
//----[ IPX address char * cast ]--------------------------------------
IpxAddress::operator const char *() const
{
return (char *)output_buffer;
}
//----[ IPX address get char representation ]--------------------------
char * WINFAR IpxAddress::get_printable()
{
return (char *)output_buffer;
}
//----[ IPX address format output ]-------------------------------------
void IpxAddress::format_output()
{
if ( valid_flag)
sprintf((char *) output_buffer,
"%02x%02x%02x%02x%c%02x%02x%02x%02x%02x%02x",
address_buffer[0],address_buffer[1],
address_buffer[2],address_buffer[3],'-',
address_buffer[4],address_buffer[5],
address_buffer[6],address_buffer[7],
address_buffer[8],address_buffer[9]);
else
output_buffer[0] = 0;
};
// get the host id portion of an ipx address
int IpxAddress::get_hostid( MacAddress& mac)
{
if ( valid_flag)
{
char buffer[18];
sprintf( buffer,"%02x:%02x:%02x:%02x:%02x:%02x", address_buffer[4],
address_buffer[5], address_buffer[6], address_buffer[7],
address_buffer[8], address_buffer[9]);
MacAddress temp( buffer);
// mac = (SnmpSyntax&) temp;
mac = temp;
if ( mac.valid())
return TRUE;
else
return FALSE;
}
else
return FALSE;
};
//------[ return the type ]----------------------------------
addr_type IpxAddress::get_type() const
{ return type_ipx; };
//========================================================================
//======== IpxSockAddress Implementation =================================
//========================================================================
//-----------[ syntax type ]----------------------------------------------
SmiUINT32 IpxSockAddress::get_syntax()
{ return sNMP_SYNTAX_OCTETS; };
//----------[ constructor no args ]--------------------------------------
IpxSockAddress::IpxSockAddress( void):IpxAddress()
{
// always initialize SMI info
smival.syntax = sNMP_SYNTAX_OCTETS;
smival.value.string.len = IPXSOCKLEN;
smival.value.string.ptr = address_buffer;
set_socket(0);
format_output();
};
//-----------[ construct an IpxSockAddress with another IpxSockAddress]----
IpxSockAddress::IpxSockAddress( const IpxSockAddress &ipxaddr):IpxAddress(ipxaddr)
{
// always initialize SMI info
smival.syntax = sNMP_SYNTAX_OCTETS;
smival.value.string.len = IPXSOCKLEN;
smival.value.string.ptr = address_buffer;
// copy the socket value
set_socket(ipxaddr.get_socket());
format_output();
};
//---------------[ construct a IpxSockAddress from a string ]--------------
IpxSockAddress::IpxSockAddress( const char *inaddr):IpxAddress()
{
// always initialize SMI info
smival.syntax = sNMP_SYNTAX_OCTETS;
smival.value.string.len = IPXSOCKLEN;
smival.value.string.ptr = address_buffer;
valid_flag = parse_address( (char *) inaddr);
format_output();
};
//---------------[ construct a IpxSockAddress from a GenAddress ]----------
IpxSockAddress::IpxSockAddress( const GenAddress &genaddr):IpxAddress()
{
// always initialize SMI info
smival.syntax = sNMP_SYNTAX_OCTETS;
smival.value.string.len = IPXSOCKLEN;
smival.value.string.ptr = address_buffer;
valid_flag = FALSE;
unsigned short socketid = 0;
// 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;
// socketid info since are making an IpxSockAddress
socketid = temp_ipxsock.get_socket();
}
}
set_socket(socketid);
format_output();
};
//------------[ construct an IpxSockAddress from a IpxAddress ]--------------
IpxSockAddress::IpxSockAddress( const IpxAddress &ipxaddr):IpxAddress(ipxaddr)
{
// always initialize SMI info
smival.syntax = sNMP_SYNTAX_OCTETS;
smival.value.string.len = IPXSOCKLEN;
smival.value.string.ptr = address_buffer;
set_socket(0);
format_output();
};
//-----[ destructor ]--------------------------------------------------
IpxSockAddress::~IpxSockAddress()
{};
// copy an instance of this Value
SnmpSyntax& IpxSockAddress::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:
{
// See if it is of the Ipx address family
// This handles IpxSockAddress == IpxAddress
IpxSockAddress temp_ipx(val.get_printable());
if (temp_ipx.valid()){
*this = temp_ipx; // ipxsock = ipxsock
}
// See if it is an OctetStr of appropriate length
else if (((IpxSockAddress &)val).smival.value.string.len == IPXSOCKLEN){
MEMCPY(address_buffer,
((IpxSockAddress &)val).smival.value.string.ptr,
IPXSOCKLEN);
valid_flag=1;
}
}
break;
}
}
format_output();
return *this;
};
// assignment to another IpAddress object overloaded
IpxSockAddress& IpxSockAddress::operator=( const IpxSockAddress &ipxaddr)
{
// protect against assignment from itself
if ( this == &ipxaddr )
return *this;
(IpxAddress&)*this = ipxaddr; // use ancestor assignment for ipx addr
set_socket(ipxaddr.get_socket()); // copy socket value
format_output();
return *this;
}
//----------[ create a new instance of this Value ]------------------------
SnmpSyntax WINFAR *IpxSockAddress::clone() const
{ return (SnmpSyntax *) new IpxSockAddress(*this); };
//----[ IPXSock address char * cast ]--------------------------------------
IpxSockAddress::operator const char *() const
{
return (char *)output_buffer;
}
//----[ IPXSock address get char representation ]--------------------------
char * WINFAR IpxSockAddress::get_printable()
{
return (char *)output_buffer;
}
//----[ IPX address format output ]-------------------------------------
void IpxSockAddress::format_output()
{
IpxAddress::format_output(); // allow ancestors to format their buffers
if ( valid_flag)
sprintf((char *) output_buffer,"%s/%d",
IpxAddress::get_printable(), get_socket());
else
output_buffer[0] = 0;
};
//-----[ IP Address parse Address ]---------------------------------
int IpxSockAddress::parse_address( const char *inaddr)
{
char buffer[MAX_FRIENDLY_NAME];
unsigned short socketid=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=0; // new null terminator
tmp++;
socketid = atoi( tmp);
}
set_socket(socketid);
return IpxAddress::parse_address( buffer);
};
//-------------[ set the socket number ]----------------------------------
void IpxSockAddress::set_socket( const unsigned short s)
{
unsigned short sock_nbo = htons(s);
MEMCPY(&address_buffer[IPXLEN], &sock_nbo, 2);
};
//--------------[ get the socket number ]---------------------------------
unsigned short IpxSockAddress::get_socket() const
{
if (valid_flag)
{
unsigned short sock_nbo;
MEMCPY(&sock_nbo, &address_buffer[IPXLEN], 2);
return ntohs(sock_nbo);
}
else
return 0; // don't use uninitialized memory
}
//------[ return the type ]----------------------------------------------
addr_type IpxSockAddress::get_type() const
{ return type_ipxsock; };
//========================================================================
//======== MACAddress Implementation =====================================
//========================================================================
//-----------[ syntax type ]----------------------------------------------
SmiUINT32 MacAddress::get_syntax()
{ return sNMP_SYNTAX_OCTETS; };
//--------[ constructor, no arguments ]-----------------------------------
MacAddress::MacAddress( void): Address( )
{
// always initialize SMI info
smival.syntax = sNMP_SYNTAX_OCTETS;
smival.value.string.len = MACLEN;
smival.value.string.ptr = address_buffer;
valid_flag=FALSE;
format_output();
};
//-----[ MAC Address copy constructor ]---------------------------------
MacAddress::MacAddress(const MacAddress &macaddr)
{
// always initialize SMI info
smival.syntax = sNMP_SYNTAX_OCTETS;
smival.value.string.len = MACLEN;
smival.value.string.ptr = address_buffer;
valid_flag = macaddr.valid_flag;
if (valid_flag)
MEMCPY(address_buffer, macaddr.address_buffer, MACLEN);
format_output();
};
//---------[ constructor with a string argument ]-------------------------
MacAddress::MacAddress( const char *inaddr):Address( )
{
// always initialize SMI info
smival.syntax = sNMP_SYNTAX_OCTETS;
smival.value.string.len = MACLEN;
smival.value.string.ptr = address_buffer;
valid_flag = parse_address( (char *) inaddr);
format_output();
}
//-----[ construct a MacAddress from a GenAddress ]------------------------
MacAddress::MacAddress( const GenAddress &genaddr)
{
// always initialize SMI info
smival.syntax = sNMP_SYNTAX_OCTETS;
smival.value.string.len = MACLEN;
smival.value.string.ptr = address_buffer;
valid_flag = FALSE;
// allow use of mac address
if (genaddr.get_type() == type_mac)
{
valid_flag = genaddr.valid();
if ( valid_flag)
{
// copy in the Mac address data
MacAddress temp_mac( (const char *) genaddr);
*this = temp_mac;
}
}
format_output();
};
//-----[ destructor ]--------------------------------------------------
MacAddress::~MacAddress()
{};
//---------[ MacAddress clone ]-------------------------------------------
SnmpSyntax WINFAR *MacAddress::clone() const
{
return (SnmpSyntax *) new MacAddress(*this);
};
//------[ assignment to another ipaddress object overloaded ]--------------
MacAddress& MacAddress::operator=( const MacAddress &macaddress)
{
// protect against assignment from itself
if ( this == &macaddress )
return *this;
valid_flag = macaddress.valid_flag;
if (valid_flag)
MEMCPY(address_buffer, macaddress.address_buffer, MACLEN);
format_output();
return *this;
};
//-----[ MAC Address general = operator ]---------------------------------
SnmpSyntax& MacAddress::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 (((MacAddress &)val).smival.value.string.len == MACLEN){
MEMCPY(address_buffer, ((MacAddress &)val).smival.value.string.ptr, MACLEN);
valid_flag=1;
}
break;
}
}
format_output();
return *this;
};
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?