int Hosts_InitContainer(HostsContainer *Container) { if( StringList_Init(&(Container -> Domains), NULL, ',') != 0 ) { return -1; } if( StringChunk_Init(&(Container -> Ipv4Hosts), &(Container -> Domains)) != 0 ) { return -2; } if( StringChunk_Init(&(Container -> Ipv6Hosts), &(Container -> Domains)) != 0 ) { return -3; } if( StringChunk_Init(&(Container -> CNameHosts), &(Container -> Domains)) != 0 ) { return -4; } if( StringChunk_Init(&(Container -> ExcludedDomains), &(Container -> Domains)) != 0 ) { return -4; } if( ExtendableBuffer_Init(&(Container ->IPs), 0, -1) != 0 ) { return -6; } return 0; }
int StringChunk_Init(StringChunk *dl, int InitialCount /* For no-wildcard domain */) { if( StringList_Init(&(dl -> List), NULL, 0) != 0 ) { return -1; } if( HashTable_Init(&(dl -> List_Pos), sizeof(EntryForString), InitialCount, NULL) != 0 ) { StringList_Free(&(dl -> List)); return -2; } if( StringList_Init(&(dl -> List_W), NULL, 0) != 0 ) { StringList_Free(&(dl -> List)); HashTable_Free(&(dl -> List_Pos)); return -3; } if( Array_Init(&(dl -> List_W_Pos), sizeof(EntryForString), 0, FALSE, NULL) != 0 ) { StringList_Free(&(dl -> List)); HashTable_Free(&(dl -> List_Pos)); StringList_Free(&(dl -> List_W)); return -4; } if( ExtendableBuffer_Init(&(dl -> AdditionalDataChunk), 0, -1) != 0 ) { StringList_Free(&(dl -> List)); HashTable_Free(&(dl -> List_Pos)); StringList_Free(&(dl -> List_W)); Array_Free(&(dl -> List_W_Pos)); return -5; } return 0; }
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); }