BOOL StringChunk_Match(StringChunk *dl, const char *Str, int *HashValue, char **Data) { /*printf("--------StringChunk_Match------String : %s------HashValue_ptr : %d\n", Str, HashValue);*/ if( StringChunk_Match_NoWildCard(dl, Str, HashValue, Data) == TRUE || StringChunk_Match_OnlyWildCard(dl, Str, Data) == TRUE ) { return TRUE; } else { return FALSE; } }
void Probe(int Threshold) { static const char *Servers[] = { "8.8.8.8", "208.67.220.220", "199.85.126.10", "4.2.2.1", "8.26.56.26", }; static const char *Domains[] = { "www.youtube.com", "www.googlevideo.com", "twitter.com", "www.facebook.com" }; int Pass = 0; StringList l; StringChunk s; StringList_Init(&l, NULL, ','); StringChunk_Init(&s, NULL); while( Threshold > 0 ) { printf("; Pass %d:\n", Pass + 1); if( ProbeFakeAddresses(Servers[Pass % (sizeof(Servers) / sizeof(const char *))], Domains[Pass % (sizeof(Domains) / sizeof(const char *))], &l) > 0 ) { const char *Itr = NULL; int NumberOfNew = 0; Itr = StringList_GetNext(&l, NULL); while( Itr != NULL ) { if( StringChunk_Match_NoWildCard(&s, Itr, NULL, NULL) == FALSE ) { StringChunk_Add(&s, Itr, NULL, 0); printf("%s\n", Itr); ++NumberOfNew; } Itr = StringList_GetNext(&l, Itr); } if( NumberOfNew == 0 ) { --Threshold; } else { Threshold += 2; } } else { --Threshold; } StringList_Clear(&l); ++Pass; } StringList_Free(&l); StringChunk_Free(&s, TRUE); }
static HostsRecordType Hosts_AddToContainer(HostsContainer *Container, const char *IPOrCName, const char *Domain) { OffsetOfHosts r; char NumericIP[16]; switch( Hosts_DetermineIPTypes(IPOrCName) ) { case HOSTS_TYPE_AAAA: if( StringChunk_Match_NoWildCard(&(Container -> Ipv6Hosts), Domain, NULL, NULL) == TRUE ) { INFO("IPv6 Host is duplicated : %s, take only the first occurrence.\n", Domain); return HOSTS_TYPE_UNKNOWN; } IPv6AddressToNum(IPOrCName, NumericIP); r.Offset = Hosts_IdenticalToLast(Container, HOSTS_TYPE_AAAA, NumericIP, 16); if( r.Offset < 0 ) { r.Offset = ExtendableBuffer_Add(&(Container -> IPs), NumericIP, 16); if( r.Offset < 0 ) { return HOSTS_TYPE_UNKNOWN; } } StringChunk_Add(&(Container -> Ipv6Hosts), Domain, (const char *)&r, sizeof(OffsetOfHosts)); return HOSTS_TYPE_AAAA; break; case HOSTS_TYPE_A: if( StringChunk_Match_NoWildCard(&(Container -> Ipv4Hosts), Domain, NULL, NULL) == TRUE ) { INFO("IPv4 Host domain is duplicated : %s, take only the first occurrence.\n", Domain); return HOSTS_TYPE_UNKNOWN; } IPv4AddressToNum(IPOrCName, NumericIP); r.Offset = Hosts_IdenticalToLast(Container, HOSTS_TYPE_A, NumericIP, 4); if( r.Offset < 0 ) { r.Offset = ExtendableBuffer_Add(&(Container -> IPs), NumericIP, 4); if( r.Offset < 0 ) { return HOSTS_TYPE_UNKNOWN; } } StringChunk_Add(&(Container -> Ipv4Hosts), Domain, (const char *)&r, sizeof(OffsetOfHosts)); return HOSTS_TYPE_A; break; case HOSTS_TYPE_CNAME: if( StringChunk_Match_NoWildCard(&(Container -> CNameHosts), Domain, NULL, NULL) == TRUE ) { INFO("CName redirection domain is duplicated : %s, take only the first occurrence.\n", Domain); return HOSTS_TYPE_UNKNOWN; } r.Offset = Hosts_IdenticalToLast(Container, HOSTS_TYPE_CNAME, IPOrCName, strlen(IPOrCName) + 1); if( r.Offset < 0 ) { r.Offset = ExtendableBuffer_Add(&(Container -> IPs), IPOrCName, strlen(IPOrCName) + 1); if( r.Offset < 0 ) { return HOSTS_TYPE_UNKNOWN; } } StringChunk_Add(&(Container -> CNameHosts), Domain, (const char *)&r, sizeof(OffsetOfHosts)); return HOSTS_TYPE_CNAME; break; case HOSTS_TYPE_EXCLUEDE: if( StringChunk_Match_NoWildCard(&(Container -> ExcludedDomains), Domain, NULL, NULL) == TRUE ) { INFO("Excluded Host domain is duplicated : %s, take only the first occurrence.\n", Domain); return HOSTS_TYPE_UNKNOWN; } StringChunk_Add(&(Container -> ExcludedDomains), Domain, NULL, 0); return HOSTS_TYPE_EXCLUEDE; break; default: INFO("Unrecognisable hosts : %s %s\n", IPOrCName, Domain); return HOSTS_TYPE_UNKNOWN; break; } }