BOOL StringChunk_Match_NoWildCard(StringChunk *dl, const char *Str, int *HashValue, char **Data ) { EntryForString *FoundEntry; const char *FoundString; FoundEntry = HashTable_Get(&(dl -> List_Pos), Str, 0, NULL, HashValue); while( FoundEntry != NULL ) { FoundString = StringList_GetByOffset(&(dl -> List), FoundEntry -> OffsetOfString ); if( strcmp(FoundString, Str) == 0 ) { if( FoundEntry -> OffsetOfData >=0 && Data != NULL ) { *Data = ExtendableBuffer_GetPositionByOffset( &(dl -> AdditionalDataChunk), FoundEntry -> OffsetOfData ); } return TRUE; } FoundEntry = HashTable_Get(&(dl -> List_Pos), Str, 0, FoundEntry, HashValue); } return FALSE; }
void ShowNormalMassage(ThreadContext *Context, int32_t Offset, char ProtocolCharacter) { char DateAndTime[32]; char InfoBuffer[1024]; if( ShowMassages == TRUE || DEBUGMODE ) { GetCurDateAndTime(DateAndTime, sizeof(DateAndTime)); InfoBuffer[0] = '\0'; GetAllAnswers(ExtendableBuffer_GetPositionByOffset(Context -> ResponseBuffer, Offset), InfoBuffer, sizeof(InfoBuffer)); } if( ShowMassages == TRUE ) { printf("%s[%c][%s][%s][%s] : %d bytes\n%s", DateAndTime, ProtocolCharacter, Context -> ClientIP, DNSGetTypeName(Context -> RequestingType), Context -> RequestingDomain, ExtendableBuffer_GetUsedBytes(Context -> ResponseBuffer) - Offset, InfoBuffer ); } DEBUG_FILE("[%c][%s][%s][%s] :%d bytes\n%s", ProtocolCharacter, Context -> ClientIP, DNSGetTypeName(Context -> RequestingType), Context -> RequestingDomain, ExtendableBuffer_GetUsedBytes(Context -> ResponseBuffer) - Offset, InfoBuffer ); }
static const char *Hosts_FindFromContainer(HostsContainer *Container, StringChunk *SubContainer, const char *Name) { OffsetOfHosts *IP; if( StringChunk_Match(SubContainer, Name, NULL, (char **)&IP) == TRUE ) { return ExtendableBuffer_GetPositionByOffset(&(Container -> IPs), IP -> Offset); } else { return NULL; } }
static int32_t Hosts_IdenticalToLast(HostsContainer *Container, HostsRecordType CurrentType, const char *CurrentContent, int CurrentLength ) { static HostsContainer *LastContainer = NULL; static HostsRecordType LastType = HOSTS_TYPE_UNKNOWN; static int32_t LastOffset = 0; static int32_t LastLength = 0; if( LastContainer == NULL || LastContainer != Container ) { LastContainer = Container; LastType = CurrentType; LastOffset = 0; LastLength = CurrentLength; return -1; } if( LastType == HOSTS_TYPE_UNKNOWN ) { LastType = CurrentType; LastOffset = 0; LastLength = CurrentLength; return -1; } if( LastType == CurrentType ) { if( memcmp(ExtendableBuffer_GetPositionByOffset(&(Container -> IPs), LastOffset), CurrentContent, CurrentLength ) == 0 ) { return LastOffset; } else { LastOffset += LastLength; LastLength = CurrentLength; return -1; } } else { LastType = CurrentType; LastOffset += LastLength; LastLength = CurrentLength; return -1; } }
BOOL StringChunk_Match_OnlyWildCard(StringChunk *dl, const char *Str, char **Data ) { EntryForString *FoundEntry; const char *FoundString; int loop; for( loop = 0; loop != Array_GetUsed(&(dl -> List_W_Pos)); ++loop ) { FoundEntry = (EntryForString *)Array_GetBySubscript(&(dl -> List_W_Pos), loop); if( FoundEntry != NULL ) { FoundString = StringList_GetByOffset(&(dl -> List_W), FoundEntry -> OffsetOfString); if( WILDCARD_MATCH(FoundString, Str) == WILDCARD_MATCHED ) { if( FoundEntry -> OffsetOfData >=0 && Data != NULL ) { *Data = ExtendableBuffer_GetPositionByOffset( &(dl -> AdditionalDataChunk), FoundEntry -> OffsetOfData ); } return TRUE; } } else { return FALSE; } } return FALSE; }
static int QueryFromServer(ThreadContext *Context) { char ProtocolCharacter; int StateOfReceiving; SOCKET *SocketUsed; DNSQuaryProtocol ProtocolUsed; struct sockaddr *ServerAddr; int NumberOfAddresses; sa_family_t Family; BOOL UseSecondary; int32_t StartOffset = ExtendableBuffer_GetEndOffset(Context -> ResponseBuffer); int AnswerCount; /* Determine whether the secondaries are used */ if( NullSecondary != TRUE && (IsExcludedDomain(Context -> RequestingDomain, &(Context -> RequestingDomainHashValue)) || GfwList_Match(Context -> RequestingDomain, &(Context -> RequestingDomainHashValue))) ) { UseSecondary = TRUE; } else { UseSecondary = FALSE; } SelectSocketAndProtocol(Context, &SocketUsed, &ProtocolUsed, UseSecondary); SetAddressAndPrococolLetter(Context, ProtocolUsed, &ServerAddr, &NumberOfAddresses, &Family, &ProtocolCharacter ); StateOfReceiving = QueryFromServerBase(SocketUsed, ServerAddr, NumberOfAddresses, ProtocolUsed, Context -> RequestEntity, Context -> RequestLength, Context -> ResponseBuffer, Context -> RequestingDomain ); if(StateOfReceiving < 0) /* Failed */ { ShowErrorMassage(Context, ProtocolCharacter); /* Move pointer to the next */ AddressChunk_Advance(&Addresses, ProtocolUsed); if( UseSecondary == FALSE && NullSecondary != TRUE && AllowFallBack == TRUE ) { INFO("Fallback from %c for %s .\n", ProtocolCharacter, Context -> RequestingDomain ); SelectSocketAndProtocol(Context, &SocketUsed, &ProtocolUsed, TRUE ); SetAddressAndPrococolLetter(Context, ProtocolUsed, &ServerAddr, &NumberOfAddresses, &Family, &ProtocolCharacter ); StateOfReceiving = QueryFromServerBase(SocketUsed, ServerAddr, NumberOfAddresses, ProtocolUsed, Context -> RequestEntity, Context -> RequestLength, Context -> ResponseBuffer, Context -> RequestingDomain ); if( StateOfReceiving < 0 ) { ShowErrorMassage(Context, ProtocolCharacter); /* Move pointer to the next */ AddressChunk_Advance(&Addresses, ProtocolUsed); return QUERY_RESULT_ERROR; } } else { return QUERY_RESULT_ERROR; } } AnswerCount = DNSGetAnswerCount(ExtendableBuffer_GetPositionByOffset(Context -> ResponseBuffer, StartOffset)); if( AnswerCount < 1 ) { AddressChunk_Advance(&Addresses, ProtocolUsed); } ShowNormalMassage(Context, StartOffset, ProtocolCharacter); return StateOfReceiving; }
static int Hosts_RecursivelyQuery(const char *IPOrCName, int *AnswerCount, ThreadContext *Context) { int PrependLength = 2 + 2 + 2 + 4 + 2 + strlen(IPOrCName) + 2; BOOL OriCompress = Context -> Compress; int State; int StartOffset = ExtendableBuffer_GetEndOffset(Context -> ResponseBuffer); char *StartPos; int EndOffset; const char *AnswerPos; int MoreSpaceNeeded = 0; char *HereSaved; HereSaved = ExtendableBuffer_Expand(Context -> ResponseBuffer, PrependLength, NULL); if( HereSaved == NULL ) { return -1; } Context -> Compress = FALSE; DNSGenResourceRecord(HereSaved + 1, INT_MAX, "", DNS_TYPE_CNAME, DNS_CLASS_IN, 60, IPOrCName, strlen(IPOrCName) + 1, TRUE); HereSaved[0] = 0xC0; HereSaved[1] = 0x0C; StartOffset = ExtendableBuffer_GetEndOffset(Context -> ResponseBuffer); State = GetAnswersByName(Context, IPOrCName, Context -> RequestingType, "CNameRedirect"); if( State < 0 ) { Context -> Compress = OriCompress; return -1; } StartPos = ExtendableBuffer_GetPositionByOffset(Context -> ResponseBuffer, StartOffset); EndOffset = DNSJumpOverAnswerRecords(StartPos) - ExtendableBuffer_GetData(Context -> ResponseBuffer); (*AnswerCount) = (int)DNSGetAnswerCount(StartPos) + 1; ExtendableBuffer_Eliminate(Context -> ResponseBuffer, EndOffset, StartOffset + State - EndOffset); MoreSpaceNeeded = DNSExpandCName_MoreSpaceNeeded(StartPos); if( ExtendableBuffer_Expand(Context -> ResponseBuffer, MoreSpaceNeeded, NULL) == NULL ) { Context -> Compress = OriCompress; return -1; } EndOffset += MoreSpaceNeeded; StartPos = ExtendableBuffer_GetPositionByOffset(Context -> ResponseBuffer, StartOffset); DNSExpandCName(StartPos); AnswerPos = DNSJumpOverQuestionRecords(StartPos); ExtendableBuffer_Eliminate(Context -> ResponseBuffer, StartOffset, AnswerPos - StartPos); Context -> Compress = OriCompress; return EndOffset - StartOffset - (AnswerPos - StartPos) + PrependLength; }