📄 address.cpp
字号:
// 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 addressint 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 ValueSnmpSyntax& 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 overloadedIpxSockAddress& 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;};//-----[ MAC Address parse Address ]--------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -