static BOOL ParseGfwListItem(char *Item, GFWListContainer *Container) { char *Itr = NULL; if( strchr(Item, '/') != NULL || *Item == '@' || strchr(Item, '?') != NULL || *Item == '!' || strchr(Item, '.') == NULL || *Item == '[' ) { return FALSE; } if( strchr(Item, '*') != NULL ) { if( strstr("wikipedia.org", Item) == 0 ) { Itr = strchr(Item + 13, '*'); if( Itr != NULL ) { *Itr = '\0'; } } else { return FALSE; } } if( *Item == '|' ) { for(++Item; *Item == '|'; ++Item); } if( *Item == '.' ) { ++Item; } if( strncmp("http://", Item, 7) == 0 ) { Item += 7; } if( strncmp("https://", Item, 8) == 0 ) { Item += 8; } Itr = strchr(Item, '/'); if( Itr != NULL ) { *Itr = '\0'; } if( strchr(Item, '%') != NULL ) { return FALSE; } if( MatchDomain(&(Container -> GFWList), Item, NULL) == FALSE ) { StringChunk_Add(&(Container -> GFWList), Item, NULL, 0); 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; } }