/* * P2P plaintext format: "comment:x.x.x.x-y.y.y.y" * http://wiki.phoenixlabs.org/wiki/P2P_Format * http://en.wikipedia.org/wiki/PeerGuardian#P2P_plaintext_format */ static tr_bool parseLine1( const char * line, struct tr_ip_range * range ) { char * walk; int b[4]; int e[4]; char str[64]; tr_address addr; walk = strrchr( line, ':' ); if( !walk ) return FALSE; ++walk; /* walk past the colon */ if( sscanf( walk, "%d.%d.%d.%d-%d.%d.%d.%d", &b[0], &b[1], &b[2], &b[3], &e[0], &e[1], &e[2], &e[3] ) != 8 ) return FALSE; tr_snprintf( str, sizeof( str ), "%d.%d.%d.%d", b[0], b[1], b[2], b[3] ); if( tr_pton( str, &addr ) == NULL ) return FALSE; range->begin = ntohl( addr.addr.addr4.s_addr ); tr_snprintf( str, sizeof( str ), "%d.%d.%d.%d", e[0], e[1], e[2], e[3] ); if( tr_pton( str, &addr ) == NULL ) return FALSE; range->end = ntohl( addr.addr.addr4.s_addr ); return TRUE; }
/* * DAT format: "000.000.000.000 - 000.255.255.255 , 000 , invalid ip" * http://wiki.phoenixlabs.org/wiki/DAT_Format */ static tr_bool parseLine2( const char * line, struct tr_ip_range * range ) { int unk; int a[4]; int b[4]; char str[32]; tr_address addr; if( sscanf( line, "%3d.%3d.%3d.%3d - %3d.%3d.%3d.%3d , %3d , ", &a[0], &a[1], &a[2], &a[3], &b[0], &b[1], &b[2], &b[3], &unk ) != 9 ) return FALSE; tr_snprintf( str, sizeof(str), "%d.%d.%d.%d", a[0], a[1], a[2], a[3] ); if( tr_pton( str, &addr ) == NULL ) return FALSE; range->begin = ntohl( addr.addr.addr4.s_addr ); tr_snprintf( str, sizeof(str), "%d.%d.%d.%d", b[0], b[1], b[2], b[3] ); if( tr_pton( str, &addr ) == NULL ) return FALSE; range->end = ntohl( addr.addr.addr4.s_addr ); return TRUE; }
static void doDNS( void * vtask ) { tr_address addr; int port = -1; char * host = NULL; struct hostent *he; struct sockaddr_in adr; struct tr_web_task * task = vtask; tr_dns_result lookup_result = TR_DNS_UNTESTED; assert( task->resolved_host == NULL ); if( !tr_urlParse( task->url, -1, NULL, &host, &port, NULL ) ) { task->port = port; task->host = host; /* If 'host' is an IPv4 or IPv6 address in text form, use it as-is. * Otherwise, see if its resolved name is in our DNS cache */ if( tr_pton( task->host, &addr ) != NULL ) { task->resolved_host = task->host; lookup_result = TR_DNS_OK; } else { if( (he = gethostbyname(host)) ) { memcpy(&adr.sin_addr, he->h_addr_list[0], he->h_length); task->resolved_host = strdup(inet_ntoa(adr.sin_addr)); lookup_result = TR_DNS_OK; } } } if( lookup_result != TR_DNS_UNTESTED ) { addTask( task ); } else if( !host || evdns_resolve_ipv4( host, 0, dns_ipv4_done_cb, task ) ) { dns_ipv4_done_cb( DNS_ERR_UNKNOWN, DNS_IPv4_A, 0, 0, NULL, task ); } }
int _tr_blocklistSetContent( tr_blocklist * b, const char * filename ) { FILE * in; FILE * out; char * line; int lineCount = 0; const char * err_fmt = _( "Couldn't read \"%1$s\": %2$s" ); if( !filename ) { blocklistDelete( b ); return 0; } in = fopen( filename, "r" ); if( !in ) { tr_err( err_fmt, filename, tr_strerror( errno ) ); return 0; } blocklistClose( b ); out = fopen( b->filename, "wb+" ); if( !out ) { tr_err( err_fmt, b->filename, tr_strerror( errno ) ); fclose( in ); return 0; } while( !fggets( &line, in ) ) { char * rangeBegin; char * rangeEnd; char * crpos; tr_address addr; struct tr_ip_range range; rangeBegin = strrchr( line, ':' ); if( !rangeBegin ) { free( line ); continue; } ++rangeBegin; rangeEnd = strchr( rangeBegin, '-' ); if( !rangeEnd ) { free( line ); continue; } *rangeEnd++ = '\0'; if(( crpos = strchr( rangeEnd, '\r' ))) *crpos = '\0'; if( !tr_pton( rangeBegin, &addr ) ) tr_err( "blocklist skipped invalid address [%s]\n", rangeBegin ); range.begin = ntohl( addr.addr.addr4.s_addr ); if( !tr_pton( rangeEnd, &addr ) ) tr_err( "blocklist skipped invalid address [%s]\n", rangeEnd ); range.end = ntohl( addr.addr.addr4.s_addr ); free( line ); if( fwrite( &range, sizeof( struct tr_ip_range ), 1, out ) != 1 ) { tr_err( _( "Couldn't save file \"%1$s\": %2$s" ), b->filename, tr_strerror( errno ) ); break; } ++lineCount; } { char * base = tr_basename( b->filename ); tr_inf( _( "Blocklist \"%1$s\" updated with %2$'d entries" ), base, lineCount ); tr_free( base ); } fclose( out ); fclose( in ); blocklistLoad( b ); return lineCount; }