int resource_from_network(dns_resource_t * resource, char * buff, int max_size, char* full_msg) { char * c = buff; int tmp; tmp = get_NAME_from_net(resource->NAME, buff, max_size, full_msg); if (tmp < 0) return -1; max_size -= tmp; buff += tmp; if(max_size < 2) return -1; resource->TYPE = get_uint16_t(buff); buff += 2; max_size -= 2; if(max_size < 2) return -1; resource->CLASS = get_uint16_t(buff); buff += 2; max_size -= 2; if(max_size < 4) return -1; resource->TTL = get_uint32_t(buff); buff += 4; max_size -= 4; if(max_size < 2) return -1; resource->RDLENGTH = get_uint16_t(buff); buff += 2; max_size -= 2; int i; if(resource->TYPE != TYPE_PTR) { for (i = 0; i < resource->RDLENGTH; ++i) { if(max_size == 0) return -1; resource->RDATA[i] = *buff; buff++; max_size--; } } else { get_NAME_from_net(resource->RDATA,buff, max_size, full_msg); buff += resource->RDLENGTH; } return buff - c; }
int header_from_network(dns_header_t * header, char * buff, int max_size) { if (max_size < 12) return -1; int i; for(i = 0; i < 6; ++i) { (header->h)[i] = get_uint16_t(buff); buff += 2; } (header->h)[0] = (header->h)[0]; return 12; }
int question_from_network(dns_question_t * question, char * buff, int max_size, char * full_msg){ char * tmp = buff; question->qname_length = get_NAME_from_net(question->QNAME, buff, max_size, full_msg); if (question->qname_length < 0) return -1; max_size -= question->qname_length; buff += question->qname_length; if(max_size < 2) return -1; question->QTYPE = get_uint16_t(buff); buff += 2; max_size -= 2; if(max_size < 2) return -1; question->QCLASS = get_uint16_t(buff); buff += 2; max_size -= 2; return buff - tmp; }
void pack_value(char* payload,int wlength,int offset, char* port_value) { char* ptr = payload + (offset*wlength/8); char* ss = NULL; switch(wlength) { case 8: *((uint8_t*)ptr) = get_uint8_t(port_value,&ss); break; case 16: *((uint16_t*)ptr) = get_uint16_t(port_value,&ss); break; case 32: *((uint32_t*)ptr) = get_uint32_t(port_value,&ss); break; case 64: *((uint64_t*)ptr) = get_uint64_t(port_value,&ss); break; default: fprintf(stderr,"Error: unsupported data width %d\n", wlength); return; } }