s4 dns: Allow changing the dns operation flags in handlers
authorKai Blin <kai@samba.org>
Tue, 27 Mar 2012 11:59:03 +0000 (13:59 +0200)
committerKai Blin <kai@samba.org>
Tue, 27 Mar 2012 14:03:16 +0000 (16:03 +0200)
source4/dns_server/dns_query.c
source4/dns_server/dns_server.c
source4/dns_server/dns_server.h
source4/dns_server/dns_update.c

index 9d287bd3a421b07f2309cd2574eced1125e1ac22..e1deff49386d77034e86b0513c401de15e00c05f 100644 (file)
@@ -207,6 +207,7 @@ static WERROR handle_question(struct dns_server *dns,
 }
 
 WERROR dns_server_process_query(struct dns_server *dns,
+                               struct dns_request_state *state,
                                TALLOC_CTX *mem_ctx,
                                struct dns_name_packet *in,
                                struct dns_res_rec **answers,    uint16_t *ancount,
@@ -227,6 +228,7 @@ WERROR dns_server_process_query(struct dns_server *dns,
        }
 
        if (dns_authorative_for_zone(dns, in->questions[0].name)) {
+               state->flags |= DNS_FLAG_AUTHORITATIVE;
                werror = handle_question(dns, mem_ctx, &in->questions[0], &ans, &num_answers);
        } else {
                DEBUG(2, ("I don't feel responsible for '%s', forwarding\n", in->questions[0].name));
index cf43590b63f2bb5dc0cc2b243011484fb8a444e7..9e88bd9ebf1b7a9f53321e65c267f7503799a2d4 100644 (file)
@@ -100,6 +100,7 @@ static NTSTATUS dns_process(struct dns_server *dns,
 {
        enum ndr_err_code ndr_err;
        WERROR ret;
+       struct dns_request_state *state;
        struct dns_name_packet *in_packet;
        struct dns_name_packet *out_packet;
        struct dns_res_rec *answers = NULL, *nsrecs = NULL, *additional = NULL;
@@ -109,9 +110,11 @@ static NTSTATUS dns_process(struct dns_server *dns,
                return NT_STATUS_INVALID_PARAMETER;
        }
 
-       in_packet = talloc_zero(mem_ctx, struct dns_name_packet);
+       state = talloc_zero(mem_ctx, struct dns_request_state);
+
+       in_packet = talloc_zero(state, struct dns_name_packet);
        /* TODO: We don't really need an out_packet. */
-       out_packet = talloc_zero(mem_ctx, struct dns_name_packet);
+       out_packet = talloc_zero(state, struct dns_name_packet);
 
        if (in_packet == NULL) return NT_STATUS_NO_MEMORY;
        if (out_packet == NULL) return NT_STATUS_NO_MEMORY;
@@ -134,19 +137,24 @@ static NTSTATUS dns_process(struct dns_server *dns,
                NDR_PRINT_DEBUG(dns_name_packet, in_packet);
        }
        *out_packet = *in_packet;
-       out_packet->operation |= DNS_FLAG_REPLY;
+       state->flags |= in_packet->operation | DNS_FLAG_REPLY;
+
+       /* TODO: Allow setting the forwarding in smb.conf or the like */
+       state->flags |= DNS_FLAG_RECURSION_AVAIL;
 
        switch (in_packet->operation & DNS_OPCODE) {
        case DNS_OPCODE_QUERY:
 
-               ret = dns_server_process_query(dns, out_packet, in_packet,
+               ret = dns_server_process_query(dns, state,
+                                              out_packet, in_packet,
                                               &answers, &num_answers,
                                               &nsrecs,  &num_nsrecs,
                                               &additional, &num_additional);
 
                break;
        case DNS_OPCODE_UPDATE:
-               ret = dns_server_process_update(dns, out_packet, in_packet,
+               ret = dns_server_process_update(dns, state,
+                                               out_packet, in_packet,
                                                &answers, &num_answers,
                                                &nsrecs,  &num_nsrecs,
                                                &additional, &num_additional);
@@ -169,6 +177,8 @@ static NTSTATUS dns_process(struct dns_server *dns,
                out_packet->operation |= werr_to_dns_err(ret);
        }
 
+       out_packet->operation |= state->flags;
+
        if (DEBUGLVL(2)) {
                NDR_PRINT_DEBUG(dns_name_packet, out_packet);
        }
index 718df00dd8bf6e783c693a8858736d3c7bb17371..c6f5fb319e176e994b3e5cdcd9d53088c11f12ee 100644 (file)
@@ -39,8 +39,12 @@ struct dns_server {
        struct dns_server_zone *zones;
 };
 
+struct dns_request_state {
+       uint16_t flags;
+};
 
 WERROR dns_server_process_query(struct dns_server *dns,
+                               struct dns_request_state *state,
                                TALLOC_CTX *mem_ctx,
                                struct dns_name_packet *in,
                                struct dns_res_rec **answers,    uint16_t *ancount,
@@ -48,6 +52,7 @@ WERROR dns_server_process_query(struct dns_server *dns,
                                struct dns_res_rec **additional, uint16_t *arcount);
 
 WERROR dns_server_process_update(struct dns_server *dns,
+                                struct dns_request_state *state,
                                 TALLOC_CTX *mem_ctx,
                                 struct dns_name_packet *in,
                                 struct dns_res_rec **prereqs,    uint16_t *prereq_count,
index 3d7ecce12631a9c2d4ff1ac7862c978764b65a5a..d6b764087e25968bbc0139de35eb09b40d2f910b 100644 (file)
@@ -680,6 +680,7 @@ failed:
 }
 
 WERROR dns_server_process_update(struct dns_server *dns,
+                                struct dns_request_state *state,
                                 TALLOC_CTX *mem_ctx,
                                 struct dns_name_packet *in,
                                 struct dns_res_rec **prereqs,    uint16_t *prereq_count,