Пример #1
0
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,&params);

		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 );
	}
}
Пример #2
0
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 );
	}
}