diff --git a/dns.c b/dns.c index f636817..97f3eb0 100644 --- a/dns.c +++ b/dns.c @@ -109,6 +109,7 @@ unsigned char *_dns_add_rrs_start(struct dns_packet *packet, int *maxlen) int dns_rr_add_end(struct dns_packet *packet, int type, dns_type_t rrtype, int len) { struct dns_rrs *rrs; + struct dns_rrs *rrs_next; struct dns_head *head = &packet->head; unsigned char *end = packet->data + packet->len; rrs = (struct dns_rrs *)end; @@ -141,11 +142,21 @@ int dns_rr_add_end(struct dns_packet *packet, int type, dns_type_t rrtype, int l break; } + if (*start != DNS_RR_END) { + rrs_next = (struct dns_rrs *)(packet->data + *start); + while (rrs_next->next != DNS_RR_END) { + rrs_next = (struct dns_rrs *)(packet->data + rrs_next->next); + } + rrs_next->next = packet->len; + } else { + *start = packet->len; + } + + rrs->next = DNS_RR_END;//*start; *count += 1; - rrs->next = *start; rrs->len = len; rrs->type = rrtype; - *start = packet->len; + //*start = packet->len; packet->len += len + sizeof(*rrs); return 0; } @@ -518,7 +529,6 @@ int _dns_decode_head(struct dns_context *context) head->nscount = dns_read_short(&context->ptr); head->nrcount = dns_read_short(&context->ptr); - printf("qd = %d, an = %d\n", head->qdcount, head->ancount); return 0; } diff --git a/dns_server.c b/dns_server.c index 245938f..8942b88 100644 --- a/dns_server.c +++ b/dns_server.c @@ -56,7 +56,7 @@ void _dns_server_period_run() memset(&head, 0, sizeof(head)); head.rcode = 0; head.qr = 0; - head.ra = 1; + head.ra = 0; head.id = 1; int len; @@ -85,12 +85,14 @@ static int _dns_server_process(struct timeval *now) struct dns_packet *packet = (struct dns_packet *)rsppacket; struct sockaddr_storage from; socklen_t from_len = sizeof(from); + int data_len; len = recvfrom(server.fd, inpacket, sizeof(inpacket), 0, (struct sockaddr *)&from, (socklen_t *)&from_len); if (len < 0) { fprintf(stderr, "recvfrom failed, %s\n", strerror(errno)); goto errout; } + data_len = len; len = dns_decode(packet, DNS_INPACKET_SIZE, inpacket, len); if (len) { @@ -107,6 +109,22 @@ static int _dns_server_process(struct timeval *now) int qtype; int qclass; + printf("qdcount = %d, ancount = %d, nscount = %d, nrcount = %d, len = %d\n", + packet->head.qdcount, packet->head.ancount, packet->head.nscount, + packet->head.nrcount, data_len); + + rrs = dns_get_rrs_start(packet, DNS_RRS_QD, &count); + for (i = 0; i < count && rrs; i++, rrs = dns_get_rrs_next(packet, rrs)) { + switch (rrs->type) { + case DNS_T_CNAME: { + dns_get_domain(rrs, name, 128, &qtype, &qclass); + printf("domain: %s qtype: %d qclass: %d\n", name, qtype, qclass); + } break; + default: + break; + } + } + rrs = dns_get_rrs_start(packet, DNS_RRS_AN, &count); for (i = 0; i < count && rrs; i++, rrs = dns_get_rrs_next(packet, rrs)) { switch (rrs->type) { @@ -125,18 +143,6 @@ static int _dns_server_process(struct timeval *now) } } - rrs = dns_get_rrs_start(packet, DNS_RRS_QD, &count); - for (i = 0; i < count && rrs; i++, rrs = dns_get_rrs_next(packet, rrs)) { - switch (rrs->type) { - case DNS_T_CNAME: { - dns_get_domain(rrs, name, 128, &qtype, &qclass); - printf("domain: %s qtype: %d qclass: %d\n", name, qtype, qclass); - } break; - default: - break; - } - } - printf("\n"); return 0; errout: