Sinful::Sinful(char const *sinful) { if( !sinful ) { // default constructor m_valid = true; } else { char *host=NULL; char *port=NULL; char *params=NULL; if( *sinful != '<' ) { m_sinful = "<"; // should be careful here // if sinful is IPv6 address, it should be embraced by [ ] if(*sinful == '[') { // IPv6 m_sinful += sinful; } else { // Double check it's not IPv6 lacking [brackets] const char * first_colon = strchr(sinful, ':'); if(first_colon && strchr(first_colon+1, ':')) { // Why not treat it as an IPv6 address? Because // We can't tell if 12AB::CDEF:1000 means // 12AB:0000:0000:0000:0000:0000:0000:CDEF port 1000 or // 12AB:0000:0000:0000:0000:0000:CDEF:1000 unknown port m_valid = false; return; } m_sinful += sinful; } m_sinful += ">"; } else { m_sinful = sinful; } m_valid = split_sin(m_sinful.c_str(),&host,&port,¶ms); if( m_valid ) { if( host ) { m_host = host; } if( port ) { m_port = port; } if( params ) { if( !parseUrlEncodedParams(params,m_params) ) { m_valid = false; } } } free( host ); free( port ); free( params ); } }
void Sinful::parseSinfulString() { char * host = NULL; char * port = NULL; char * params = NULL; m_valid = split_sin( m_sinfulString.c_str(), & host, & port, & params ); if(! m_valid) { return; } if( host ) { m_host = host; free( host ); } if( port ) { m_port = port; free( port ); } if( params ) { if( !parseUrlEncodedParams(params,m_params) ) { m_valid = false; } else { char const * addrsString = getParam( "addrs" ); if( addrsString != NULL ) { StringList sl( addrsString, "+" ); sl.rewind(); char * addrString = NULL; while( (addrString = sl.next()) != NULL ) { condor_sockaddr sa; if( sa.from_ccb_safe_string( addrString ) ) { addrs.push_back( sa ); } else { m_valid = false; } } } } free( params ); } }