update code
This commit is contained in:
16
dns.c
16
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)
|
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;
|
||||||
|
struct dns_rrs *rrs_next;
|
||||||
struct dns_head *head = &packet->head;
|
struct dns_head *head = &packet->head;
|
||||||
unsigned char *end = packet->data + packet->len;
|
unsigned char *end = packet->data + packet->len;
|
||||||
rrs = (struct dns_rrs *)end;
|
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;
|
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;
|
*count += 1;
|
||||||
rrs->next = *start;
|
|
||||||
rrs->len = len;
|
rrs->len = len;
|
||||||
rrs->type = rrtype;
|
rrs->type = rrtype;
|
||||||
*start = packet->len;
|
//*start = packet->len;
|
||||||
packet->len += len + sizeof(*rrs);
|
packet->len += len + sizeof(*rrs);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -518,7 +529,6 @@ int _dns_decode_head(struct dns_context *context)
|
|||||||
head->nscount = dns_read_short(&context->ptr);
|
head->nscount = dns_read_short(&context->ptr);
|
||||||
head->nrcount = dns_read_short(&context->ptr);
|
head->nrcount = dns_read_short(&context->ptr);
|
||||||
|
|
||||||
printf("qd = %d, an = %d\n", head->qdcount, head->ancount);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
32
dns_server.c
32
dns_server.c
@@ -56,7 +56,7 @@ void _dns_server_period_run()
|
|||||||
memset(&head, 0, sizeof(head));
|
memset(&head, 0, sizeof(head));
|
||||||
head.rcode = 0;
|
head.rcode = 0;
|
||||||
head.qr = 0;
|
head.qr = 0;
|
||||||
head.ra = 1;
|
head.ra = 0;
|
||||||
head.id = 1;
|
head.id = 1;
|
||||||
|
|
||||||
int len;
|
int len;
|
||||||
@@ -85,12 +85,14 @@ static int _dns_server_process(struct timeval *now)
|
|||||||
struct dns_packet *packet = (struct dns_packet *)rsppacket;
|
struct dns_packet *packet = (struct dns_packet *)rsppacket;
|
||||||
struct sockaddr_storage from;
|
struct sockaddr_storage from;
|
||||||
socklen_t from_len = sizeof(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);
|
len = recvfrom(server.fd, inpacket, sizeof(inpacket), 0, (struct sockaddr *)&from, (socklen_t *)&from_len);
|
||||||
if (len < 0) {
|
if (len < 0) {
|
||||||
fprintf(stderr, "recvfrom failed, %s\n", strerror(errno));
|
fprintf(stderr, "recvfrom failed, %s\n", strerror(errno));
|
||||||
goto errout;
|
goto errout;
|
||||||
}
|
}
|
||||||
|
data_len = len;
|
||||||
|
|
||||||
len = dns_decode(packet, DNS_INPACKET_SIZE, inpacket, len);
|
len = dns_decode(packet, DNS_INPACKET_SIZE, inpacket, len);
|
||||||
if (len) {
|
if (len) {
|
||||||
@@ -107,6 +109,22 @@ static int _dns_server_process(struct timeval *now)
|
|||||||
int qtype;
|
int qtype;
|
||||||
int qclass;
|
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);
|
rrs = dns_get_rrs_start(packet, DNS_RRS_AN, &count);
|
||||||
for (i = 0; i < count && rrs; i++, rrs = dns_get_rrs_next(packet, rrs)) {
|
for (i = 0; i < count && rrs; i++, rrs = dns_get_rrs_next(packet, rrs)) {
|
||||||
switch (rrs->type) {
|
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");
|
printf("\n");
|
||||||
return 0;
|
return 0;
|
||||||
errout:
|
errout:
|
||||||
|
|||||||
Reference in New Issue
Block a user