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 ); }
void ShowErrorMassage(ThreadContext *Context, char ProtocolCharacter) { char DateAndTime[32]; int ErrorNum = GET_LAST_ERROR(); char ErrorMessage[320]; if( ErrorMessages == TRUE || DEBUGMODE ) { GetCurDateAndTime(DateAndTime, sizeof(DateAndTime)); ErrorMessage[0] ='\0'; GetErrorMsg(ErrorNum, ErrorMessage, sizeof(ErrorMessage)); } if( ErrorMessages == TRUE ) { printf("%s[%c][%s][%s][%s] An error occured : %d : %s .\n", DateAndTime, ProtocolCharacter, Context -> ClientIP, DNSGetTypeName(Context -> RequestingType), Context -> RequestingDomain, ErrorNum, ErrorMessage ); } DEBUG_FILE("[%c][%s][%s][%s] An error occured : %d : %s .\n", ProtocolCharacter, Context -> ClientIP, DNSGetTypeName(Context -> RequestingType), Context -> RequestingDomain, ErrorNum, ErrorMessage ); }
void ShowRefusingMassage(ThreadContext *Context, const char *Massage) { char DateAndTime[32]; if( ShowMassages == TRUE || DEBUGMODE ) { GetCurDateAndTime(DateAndTime, sizeof(DateAndTime)); printf("%s[R][%s][%s][%s] %s.\n", DateAndTime, Context -> ClientIP, DNSGetTypeName(Context -> RequestingType), Context -> RequestingDomain, Massage ); } DEBUG_FILE("[R][%s][%s][%s] %s.\n", Context -> ClientIP, DNSGetTypeName(Context -> RequestingType), Context -> RequestingDomain, Massage ); }
char *GetAnswer(const char *DNSBody, const char *DataBody, int DataLength, char *Buffer, DNSRecordType ResourceType) { int loop2; int DCount = 0; const ElementDescriptor *Descriptor; if( Buffer == NULL ) return NULL; DCount = DNSGetDescriptor(ResourceType, FALSE, &Descriptor); if( Descriptor == NULL ) { Buffer += sprintf(Buffer, " Unparsable type : %d : %s\n", ResourceType, DNSGetTypeName(ResourceType)); } else { char InnerBuffer[512]; DNSDataInfo Data; Buffer += sprintf(Buffer, " %s:", DNSGetTypeName(ResourceType)); if( DCount != 1 ) { Buffer += sprintf(Buffer, "\n"); } for(loop2 = 0; loop2 != DCount; ++loop2) { Data = DNSParseData(DNSBody, DataBody, DataLength, InnerBuffer, sizeof(InnerBuffer), Descriptor, DCount, loop2 + 1); if( DCount != 1 ) { if( Descriptor[loop2].description != NULL ) { Buffer += sprintf(Buffer, " %s:", Descriptor[loop2].description); } } switch(Data.DataType) { case DNS_DATA_TYPE_INT: if(Data.DataLength == 1) Buffer += sprintf(Buffer, "%d", (int)*(char *)InnerBuffer); if(Data.DataLength == 2) Buffer += sprintf(Buffer, "%d", (int)*(int16_t *)InnerBuffer); if(Data.DataLength == 4) Buffer += sprintf(Buffer, "%u", *(int32_t *)InnerBuffer); break; case DNS_DATA_TYPE_UINT: if(Data.DataLength == 1) Buffer += sprintf(Buffer, "%d", (int)*(unsigned char *)InnerBuffer); if(Data.DataLength == 2) Buffer += sprintf(Buffer, "%d", (int)*(uint16_t *)InnerBuffer); if(Data.DataLength == 4) Buffer += sprintf(Buffer, "%u", *(uint32_t *)InnerBuffer); break; case DNS_DATA_TYPE_STRING: Buffer += sprintf(Buffer, "%s", InnerBuffer); break; default: break; } if( Descriptor[loop2].description != NULL ) { Buffer += sprintf(Buffer, "\n"); } } } return Buffer; }
static int Query( SOCKET *PrimarySocket, SOCKET *SecondarySocket, DNSQuaryProtocol PrimaryProtocol, char *QueryContent, int QueryContentLength, SOCKET *ClientSocket, CompatibleAddr *ClientAddr, ExtendableBuffer *Buffer ) { int State; DNSRecordType SourceType; char *DNSBody = DNSGetDNSBody(QueryContent); char ProtocolCharacter = ' '; char QueryDomain[256]; char DateAndTime[32]; QueryContext Context; GetCurDateAndTime(DateAndTime, sizeof(DateAndTime)); QueryDomain[0] = '\0'; DNSGetHostName(DNSBody, DNSJumpHeader(DNSBody), QueryDomain); SourceType = (DNSRecordType)DNSGetRecordType(DNSJumpHeader(DNSBody)); Context.PrimarySocket = PrimarySocket; Context.SecondarySocket = SecondarySocket; Context.PrimaryProtocolToServer = PrimaryProtocol; Context.ProtocolToSrc = DNS_QUARY_PROTOCOL_TCP; Context.Compress = TRUE; State = QueryBase(&Context, QueryContent, QueryContentLength, Buffer, QueryDomain, SourceType, &ProtocolCharacter ); switch( State ) { case QUERY_RESULT_DISABLE: ((DNSHeader *)DNSBody) -> Flags.Direction = 1; ((DNSHeader *)DNSBody) -> Flags.ResponseCode = 5; send(*ClientSocket, QueryContent, QueryContentLength, 0); if( Family == AF_INET ) { PRINT("%s[R][%s:%d][%s][%s] Refused.\n", DateAndTime, inet_ntoa(ClientAddr -> Addr4.sin_addr), ClientAddr -> Addr4.sin_port, DNSGetTypeName(SourceType), QueryDomain); } else { char Addr[LENGTH_OF_IPV6_ADDRESS_ASCII] = {0}; IPv6AddressToAsc(&(ClientAddr -> Addr6.sin6_addr), Addr); PRINT("%s[R][%s:%d][%s][%s] Refused.\n", DateAndTime, Addr, ClientAddr -> Addr6.sin6_port, DNSGetTypeName(SourceType), QueryDomain); } return -1; break; case QUERY_RESULT_ERROR: if( ErrorMessages == TRUE ) { int ErrorNum = GET_LAST_ERROR(); char ErrorMessage[320]; ErrorMessage[0] ='\0'; GetErrorMsg(ErrorNum, ErrorMessage, sizeof(ErrorMessage)); if( Family == AF_INET ) { printf("%s[%c][%s][%s][%s] Error occured : %d : %s .\n", DateAndTime, ProtocolCharacter, inet_ntoa(ClientAddr -> Addr4.sin_addr), DNSGetTypeName(SourceType), QueryDomain, ErrorNum, ErrorMessage ); } else { char Addr[LENGTH_OF_IPV6_ADDRESS_ASCII] = {0}; IPv6AddressToAsc(&(ClientAddr -> Addr6.sin6_addr), Addr); printf("%s[%c][%s][%s][%s] Error occured : %d : %s .\n", DateAndTime, ProtocolCharacter, Addr, DNSGetTypeName(SourceType), QueryDomain, ErrorNum, ErrorMessage ); } } return -1; break; default: /* Succeed */ send(*ClientSocket, ExtendableBuffer_GetData(Buffer), State, 0); if( ShowMassages == TRUE ) { char InfoBuffer[3072]; InfoBuffer[0] = '\0'; GetAllAnswers(DNSGetDNSBody(ExtendableBuffer_GetData(Buffer)), InfoBuffer); if( Family == AF_INET ) { PRINT("%s[%c][%s][%s][%s] :\n%s", DateAndTime, ProtocolCharacter, inet_ntoa(ClientAddr ->Addr4.sin_addr), DNSGetTypeName(SourceType), QueryDomain, InfoBuffer); } else { char Addr[LENGTH_OF_IPV6_ADDRESS_ASCII] = {0}; IPv6AddressToAsc(&(ClientAddr -> Addr6.sin6_addr), Addr); PRINT("%s[%c][%s][%s][%s] :\n%s", DateAndTime, ProtocolCharacter, Addr, DNSGetTypeName(SourceType), QueryDomain, InfoBuffer); } } return 0; break; } }