diff --git a/src/dns.h b/src/dns.h index 2802902..69ba75d 100644 --- a/src/dns.h +++ b/src/dns.h @@ -61,6 +61,7 @@ typedef enum dns_type { DNS_T_SRV = 33, DNS_T_OPT = 41, DNS_T_SSHFP = 44, + DNS_T_HTTPS = 65, DNS_T_SPF = 99, DNS_T_AXFR = 252, DNS_T_ALL = 255 diff --git a/src/dns_server.c b/src/dns_server.c index 976abf9..444649f 100644 --- a/src/dns_server.c +++ b/src/dns_server.c @@ -1049,7 +1049,7 @@ errout: return -1; } -static int _dns_cache_error_packet(struct dns_server_post_context *context) +static int _dns_cache_packet(struct dns_server_post_context *context) { struct dns_request *request = context->request; struct dns_cache_data *cache_packet = @@ -1060,12 +1060,12 @@ static int _dns_cache_error_packet(struct dns_server_post_context *context) /* if doing prefetch, update cache only */ if (request->prefetch) { - if (dns_cache_replace(request->domain, DNS_SERVER_FAIL_TTL, context->qtype, -1, cache_packet) != 0) { + if (dns_cache_replace(request->domain, context->reply_ttl, context->qtype, -1, cache_packet) != 0) { goto errout; } } else { /* insert result to cache */ - if (dns_cache_insert(request->domain, DNS_SERVER_FAIL_TTL, context->qtype, -1, cache_packet) != 0) { + if (dns_cache_insert(request->domain, context->reply_ttl, context->qtype, -1, cache_packet) != 0) { goto errout; } } @@ -1079,6 +1079,23 @@ errout: return -1; } + +static int _dns_cache_specify_packet(struct dns_server_post_context *context) +{ + switch (context->qtype) { + case DNS_T_PTR: + case DNS_T_HTTPS: + case DNS_T_TXT: + case DNS_T_SRV: + break; + default: + return 0; + break; + } + + return _dns_cache_packet(context); +} + static int _dns_cache_reply_packet(struct dns_server_post_context *context) { struct dns_request *request = context->request; @@ -1088,11 +1105,12 @@ static int _dns_cache_reply_packet(struct dns_server_post_context *context) } if (context->packet->head.rcode == DNS_RC_SERVFAIL || context->packet->head.rcode == DNS_RC_NXDOMAIN) { - return _dns_cache_error_packet(context); + context->reply_ttl = DNS_SERVER_FAIL_TTL; + return _dns_cache_packet(context); } if (context->qtype != DNS_T_AAAA && context->qtype != DNS_T_A) { - return 0; + return _dns_cache_specify_packet(context); } if (context->ip_num == 0 && request->has_soa == 0) {