summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--librpc/idl/dns.idl2
-rw-r--r--source4/dns_server/dns_server.c26
2 files changed, 26 insertions, 2 deletions
diff --git a/librpc/idl/dns.idl b/librpc/idl/dns.idl
index 486b16e50b3..90ac47a8311 100644
--- a/librpc/idl/dns.idl
+++ b/librpc/idl/dns.idl
@@ -160,7 +160,7 @@ interface dns
dns_qtype rr_type;
dns_qclass rr_class;
uint32 ttl;
- uint16 length;
+ uint16 length; /* Should be set to either UINT16_MAX or 0 */
[switch_is(rr_type)] dns_rdata rdata;
DATA_BLOB unexpected;
} dns_res_rec;
diff --git a/source4/dns_server/dns_server.c b/source4/dns_server/dns_server.c
index fc759a48326..1c45691efc0 100644
--- a/source4/dns_server/dns_server.c
+++ b/source4/dns_server/dns_server.c
@@ -286,6 +286,8 @@ static NTSTATUS handle_question(struct dns_server *dns,
continue;
}
+ /* TODO: if the record actually is a DNS_QTYPE_A */
+
ZERO_STRUCT(ans[ai]);
ans[ai].name = talloc_strdup(ans, question->name);
ans[ai].rr_type = DNS_QTYPE_A;
@@ -425,15 +427,37 @@ static NTSTATUS dns_server_process_update(struct dns_server *dns,
struct dns_res_rec **additional, uint16_t *arcount)
{
struct dns_name_question *zone;
+ const struct dns_server_zone *z;
+ size_t host_part_len = 0;
if (in->qdcount != 1) {
- return NT_STATUS_NOT_IMPLEMENTED;
+ return NT_STATUS_INVALID_PARAMETER;
}
zone = in->questions;
+ if (zone->question_type != DNS_QTYPE_SOA) {
+ return NT_STATUS_INVALID_PARAMETER;
+ }
+
DEBUG(0, ("Got a dns update request.\n"));
+ for (z = dns->zones; z != NULL; z = z->next) {
+ bool match;
+
+ match = dns_name_match(z->name, zone->name, &host_part_len);
+ if (match) {
+ break;
+ }
+ }
+
+ if (z == NULL) {
+ return NT_STATUS_FOOBAR;
+ }
+
+ if (host_part_len != 0) {
+ return NT_STATUS_NOT_IMPLEMENTED;
+ }
return NT_STATUS_NOT_IMPLEMENTED;
}