[SCM] Samba Shared Repository - branch master updated

Kai Blin kai at samba.org
Tue May 29 18:36:03 MDT 2012


The branch, master has been updated
       via  aa01908 libcli/dns: Rename UDP-based calls to reflect their use
       via  42e1b94 Add myself as libcli/dns maintainer
       via  6a1ad76 s4-dns: Use W_ERROR_HAVE_NO_MEMORY in create_response_rr
       via  9d128bb s4-dns: Use proper talloc hierarchy for NS records in create_response_rr
       via  ffc568e s4-dns: Use proper talloc hierarchy for AAAA records in create_response_rr
       via  d5ce36b s4-dns: Remove sync dns_process
       via  d4998cc s4-dns: Make the TCP dns server async
       via  230f933b s4-dns: Make the UDP dns server async
       via  4dbbd30 s4-dns: Remove sync dns_server_process_query
       via  2b6b7c6 s4-dns: Make dns_process_send asyn
       via  28b5219 s4-dns: Remove unused sync ask_forwarder wrapper
       via  03b3521 s4-dns: Make dns_server_process_query async
       via  e2c1a8b s4-dns: Make ask_forwarder async
       via  54cde76 lib: add tevent_req_poll_werror
       via  6cdbce2 s4-dns: Create a proper talloc hierarchy in create_response_rr
       via  1171c56 s4-dns: Add debug output for unmappable WERROR to DNS errcode
       via  0b2743c s4-dns: Fix some typos
       via  5bc261f librpc: Fix some typos
       via  da74d54 s4-dns: Remove some break; statements
       via  577a065 s4-dns: Fix an unlikely potential memleak
       via  1bdaf4b s4-dns: Use talloc_asprintf_append_buffer in create_response_rr
       via  1bbdf22 s4-dns: Add some NULL checks to create_response_rr
      from  40e47d0 s4:dbchecker - handle the "none" case correctly

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit aa0190825d4dcd9d6680638a06df5b4b7d89fd29
Author: Kai Blin <kai at samba.org>
Date:   Tue May 29 23:05:14 2012 +0200

    libcli/dns: Rename UDP-based calls to reflect their use
    
    Autobuild-User: Kai Blin <kai at samba.org>
    Autobuild-Date: Wed May 30 02:35:27 CEST 2012 on sn-devel-104

commit 42e1b94f88dd47e4999af751b6d6c3278de3e422
Author: Kai Blin <kai at samba.org>
Date:   Fri May 25 07:54:39 2012 +0200

    Add myself as libcli/dns maintainer

commit 6a1ad76c5ef7f77475192cb17a26dd0ecc26aade
Author: Kai Blin <kai at samba.org>
Date:   Wed May 30 00:30:29 2012 +0200

    s4-dns: Use W_ERROR_HAVE_NO_MEMORY in create_response_rr

commit 9d128bbb628bb2240cc95695c114d8befa331a6e
Author: Kai Blin <kai at samba.org>
Date:   Wed May 30 00:23:33 2012 +0200

    s4-dns: Use proper talloc hierarchy for NS records in create_response_rr

commit ffc568eb4202e50d7ac203d491a6716bdea74e9a
Author: Kai Blin <kai at samba.org>
Date:   Wed May 30 00:23:14 2012 +0200

    s4-dns: Use proper talloc hierarchy for AAAA records in create_response_rr

commit d5ce36b1487d679ef22198427d298ecad38b8af6
Author: Volker Lendecke <vl at samba.org>
Date:   Tue May 29 10:03:13 2012 +0200

    s4-dns: Remove sync dns_process
    
    Signed-off-by: Kai Blin <kai at samba.org>

commit d4998ccce73e1ca782b8bd40430be1a625a4c8fb
Author: Volker Lendecke <vl at samba.org>
Date:   Mon May 28 18:42:54 2012 +0200

    s4-dns: Make the TCP dns server async
    
    Signed-off-by: Kai Blin <kai at samba.org>

commit 230f933babe72536a1bbb930b6c9d71df8b2b903
Author: Volker Lendecke <vl at samba.org>
Date:   Mon May 28 18:42:54 2012 +0200

    s4-dns: Make the UDP dns server async
    
    Signed-off-by: Kai Blin <kai at samba.org>

commit 4dbbd304e65cc9687fa4eaf1a1f3422588720ac4
Author: Volker Lendecke <vl at samba.org>
Date:   Mon May 28 18:23:50 2012 +0200

    s4-dns: Remove sync dns_server_process_query
    
    Signed-off-by: Kai Blin <kai at samba.org>

commit 2b6b7c64e137145dc5c3786eb8acb85645c51ba2
Author: Volker Lendecke <vl at samba.org>
Date:   Thu May 24 17:02:57 2012 +0200

    s4-dns: Make dns_process_send asyn
    
    Signed-off-by: Kai Blin <kai at samba.org>

commit 28b5219ad9abcefbee7c466ae42901d0e0d207ca
Author: Volker Lendecke <vl at samba.org>
Date:   Thu May 24 16:46:29 2012 +0200

    s4-dns: Remove unused sync ask_forwarder wrapper
    
    Signed-off-by: Kai Blin <kai at samba.org>

commit 03b35211ab7ca659edf1f23fe84b49f0b3ee6ab5
Author: Volker Lendecke <vl at samba.org>
Date:   Thu May 24 14:53:47 2012 +0200

    s4-dns: Make dns_server_process_query async
    
    Signed-off-by: Kai Blin <kai at samba.org>

commit e2c1a8b87ae9fc563711e9fe5d02b915eec2cd3b
Author: Volker Lendecke <vl at samba.org>
Date:   Thu May 24 13:49:41 2012 +0200

    s4-dns: Make ask_forwarder async
    
    Signed-off-by: Kai Blin <kai at samba.org>

commit 54cde76e376b7e6a781ff2841234d7f37eb6ea93
Author: Volker Lendecke <vl at samba.org>
Date:   Thu May 24 13:49:26 2012 +0200

    lib: add tevent_req_poll_werror
    
    Signed-off-by: Kai Blin <kai at samba.org>

commit 6cdbce266b6ecccf181429949104df700d58351c
Author: Volker Lendecke <vl at samba.org>
Date:   Tue May 29 15:20:21 2012 +0200

    s4-dns: Create a proper talloc hierarchy in create_response_rr
    
    Pair-Programmed-With: Michael Adam <obnox at samba.org>
    
    Signed-off-by: Kai Blin <kai at samba.org>

commit 1171c562f6ba074413b730086c97787661ec9634
Author: Volker Lendecke <vl at samba.org>
Date:   Tue May 29 09:45:44 2012 +0200

    s4-dns: Add debug output for unmappable WERROR to DNS errcode
    
    Signed-off-by: Kai Blin <kai at samba.org>

commit 0b2743c71e509d40a587e278a4227950205bf50c
Author: Volker Lendecke <vl at samba.org>
Date:   Tue May 29 08:53:44 2012 +0200

    s4-dns: Fix some typos
    
    Signed-off-by: Kai Blin <kai at samba.org>

commit 5bc261fff10746e0b8e35512f8bb85d39dde4bac
Author: Volker Lendecke <vl at samba.org>
Date:   Tue May 29 08:45:07 2012 +0200

    librpc: Fix some typos
    
    Signed-off-by: Kai Blin <kai at samba.org>

commit da74d5462d77b090b8bba4669df7a0d914d111b5
Author: Volker Lendecke <vl at samba.org>
Date:   Thu May 24 16:15:41 2012 +0200

    s4-dns: Remove some break; statements
    
    We fall through implicitly, and that pattern is used elsewhere in Samba as
    well.
    
    Signed-off-by: Kai Blin <kai at samba.org>

commit 577a065f216a7d434082eded84c0642e7adff043
Author: Volker Lendecke <vl at samba.org>
Date:   Thu May 24 15:59:32 2012 +0200

    s4-dns: Fix an unlikely potential memleak
    
    If state was alloc'ed to NULL, in_packet to != NULL and out_packet to NULL, we
    leak in_packet.
    
    Signed-off-by: Kai Blin <kai at samba.org>

commit 1bdaf4b31b6e9dac92e70ff8e34a20984e235888
Author: Volker Lendecke <vl at samba.org>
Date:   Thu May 24 14:57:49 2012 +0200

    s4-dns: Use talloc_asprintf_append_buffer in create_response_rr
    
    Signed-off-by: Kai Blin <kai at samba.org>

commit 1bbdf224bbed0ba85556ad31062c854a2775add7
Author: Volker Lendecke <vl at samba.org>
Date:   Thu May 24 14:57:11 2012 +0200

    s4-dns: Add some NULL checks to create_response_rr
    
    Signed-off-by: Kai Blin <kai at samba.org>

-----------------------------------------------------------------------

Summary of changes:
 MAINTAINERS.txt                 |    7 +
 lib/util/tevent_werror.c        |   13 ++
 lib/util/tevent_werror.h        |    3 +
 libcli/dns/dns.c                |   12 +-
 librpc/ndr/ndr_dns.c            |    6 +-
 source4/dns_server/dns_query.c  |  279 +++++++++++++++++++++++++------------
 source4/dns_server/dns_server.c |  292 ++++++++++++++++++++++++---------------
 source4/dns_server/dns_server.h |   16 ++-
 source4/dns_server/dns_update.c |   10 +--
 source4/dns_server/dns_utils.c  |    2 +-
 10 files changed, 417 insertions(+), 223 deletions(-)


Changeset truncated at 500 lines:

diff --git a/MAINTAINERS.txt b/MAINTAINERS.txt
index 9e40103..3b6a88a 100644
--- a/MAINTAINERS.txt
+++ b/MAINTAINERS.txt
@@ -78,6 +78,13 @@ maintainers:
 policy:
          Please ping me when changes made, so I can sync with CCAN project.
 
+files: libcli/dns
+maintainers:
+         Kai Blin <kai at samba.org>
+policy:
+         Mail/CC changes to the maintainer, commit the changes
+         unless the maintainer objects.
+
 =======================================================================
 
 Samba Maintainers System
diff --git a/lib/util/tevent_werror.c b/lib/util/tevent_werror.c
index d8956b3..47bd809 100644
--- a/lib/util/tevent_werror.c
+++ b/lib/util/tevent_werror.c
@@ -19,6 +19,7 @@
 
 #include "../replace/replace.h"
 #include "tevent_werror.h"
+#include "libcli/util/error.h"
 
 bool _tevent_req_werror(struct tevent_req *req,
 			WERROR werror,
@@ -79,3 +80,15 @@ void tevent_req_simple_finish_werror(struct tevent_req *subreq,
 	}
 	tevent_req_done(req);
 }
+
+bool tevent_req_poll_werror(struct tevent_req *req,
+			    struct tevent_context *ev,
+			    WERROR *err)
+{
+	bool ret = tevent_req_poll(req, ev);
+	if (!ret) {
+		NTSTATUS status = map_nt_error_from_unix_common(errno);
+		*err = ntstatus_to_werror(status);
+	}
+	return ret;
+}
diff --git a/lib/util/tevent_werror.h b/lib/util/tevent_werror.h
index 0e24382..1e08c3d 100644
--- a/lib/util/tevent_werror.h
+++ b/lib/util/tevent_werror.h
@@ -40,4 +40,7 @@ WERROR tevent_req_simple_recv_werror(struct tevent_req *req);
 void tevent_req_simple_finish_werror(struct tevent_req *subreq,
 				     WERROR subreq_error);
 
+bool tevent_req_poll_werror(struct tevent_req *req,
+			    struct tevent_context *ev,
+			    WERROR *err);
 #endif
diff --git a/libcli/dns/dns.c b/libcli/dns/dns.c
index ac0c9e4..da65ce4 100644
--- a/libcli/dns/dns.c
+++ b/libcli/dns/dns.c
@@ -39,8 +39,8 @@ struct dns_udp_request_state {
 };
 
 /* Declare callback functions used below. */
-static void dns_request_get_reply(struct tevent_req *subreq);
-static void dns_request_done(struct tevent_req *subreq);
+static void dns_udp_request_get_reply(struct tevent_req *subreq);
+static void dns_udp_request_done(struct tevent_req *subreq);
 
 struct tevent_req *dns_udp_request_send(TALLOC_CTX *mem_ctx,
 					struct tevent_context *ev,
@@ -92,11 +92,11 @@ struct tevent_req *dns_udp_request_send(TALLOC_CTX *mem_ctx,
 		return tevent_req_post(req, ev);
 	}
 
-	tevent_req_set_callback(subreq, dns_request_get_reply, req);
+	tevent_req_set_callback(subreq, dns_udp_request_get_reply, req);
 	return req;
 }
 
-static void dns_request_get_reply(struct tevent_req *subreq)
+static void dns_udp_request_get_reply(struct tevent_req *subreq)
 {
 	struct tevent_req *req = tevent_req_callback_data(subreq,
 						struct tevent_req);
@@ -123,11 +123,11 @@ static void dns_request_get_reply(struct tevent_req *subreq)
 		return;
 	}
 
-	tevent_req_set_callback(subreq, dns_request_done, req);
+	tevent_req_set_callback(subreq, dns_udp_request_done, req);
 	return;
 }
 
-static void dns_request_done(struct tevent_req *subreq)
+static void dns_udp_request_done(struct tevent_req *subreq)
 {
 	struct tevent_req *req = tevent_req_callback_data(subreq,
 						struct tevent_req);
diff --git a/librpc/ndr/ndr_dns.c b/librpc/ndr/ndr_dns.c
index 27d8493..0b9e3b0 100644
--- a/librpc/ndr/ndr_dns.c
+++ b/librpc/ndr/ndr_dns.c
@@ -85,7 +85,7 @@ static enum ndr_err_code ndr_pull_component(struct ndr_pull *ndr,
 			/* its a reserved length field */
 			return ndr_pull_error(ndr, NDR_ERR_STRING,
 					      "BAD DNS NAME component, " \
-					      "reserved lenght field: 0x%02x",
+					      "reserved length field: 0x%02x",
 					      (len &0xC));
 		}
 		if (*offset + len + 1 > ndr->data_size) {
@@ -256,13 +256,13 @@ _PUBLIC_ enum ndr_err_code ndr_push_dns_res_rec(struct ndr_push *ndr,
 				return ndr_push_error(ndr,
 						      NDR_ERR_LENGTH,
 						      "Invalid...Unexpected " \
-						      "blob lenght is too " \
+						      "blob length is too " \
 						      "large");
 			}
 		}
 		if (r->unexpected.length > UINT16_MAX) {
 			return ndr_push_error(ndr, NDR_ERR_LENGTH,
-					      "Unexpected blob lenght "\
+					      "Unexpected blob length "\
 					      "is too large");
 		}
 
diff --git a/source4/dns_server/dns_query.c b/source4/dns_server/dns_query.c
index b3984a4..0e63058 100644
--- a/source4/dns_server/dns_query.c
+++ b/source4/dns_server/dns_query.c
@@ -32,6 +32,7 @@
 #include "dns_server/dns_server.h"
 #include "libcli/dns/libdns.h"
 #include "lib/util/util_net.h"
+#include "lib/util/tevent_werror.h"
 
 static WERROR create_response_rr(const struct dns_name_question *question,
 				 const struct dnsp_DnssrvRpcRecord *rec,
@@ -47,25 +48,35 @@ static WERROR create_response_rr(const struct dns_name_question *question,
 	switch (rec->wType) {
 	case DNS_QTYPE_CNAME:
 		ans[ai].rdata.cname_record = talloc_strdup(ans, rec->data.cname);
+		W_ERROR_HAVE_NO_MEMORY(ans[ai].rdata.cname_record);
 		break;
 	case DNS_QTYPE_A:
 		ans[ai].rdata.ipv4_record = talloc_strdup(ans, rec->data.ipv4);
+		W_ERROR_HAVE_NO_MEMORY(ans[ai].rdata.ipv4_record);
 		break;
 	case DNS_QTYPE_AAAA:
-		ans[ai].rdata.ipv6_record = rec->data.ipv6;
+		ans[ai].rdata.ipv6_record = talloc_strdup(ans, rec->data.ipv6);
+		W_ERROR_HAVE_NO_MEMORY(ans[ai].rdata.ipv6_record);
 		break;
 	case DNS_TYPE_NS:
-		ans[ai].rdata.ns_record = rec->data.ns;
+		ans[ai].rdata.ns_record = talloc_strdup(ans, rec->data.ns);
+		W_ERROR_HAVE_NO_MEMORY(ans[ai].rdata.ns_record);
 		break;
 	case DNS_QTYPE_SRV:
 		ans[ai].rdata.srv_record.priority = rec->data.srv.wPriority;
 		ans[ai].rdata.srv_record.weight   = rec->data.srv.wWeight;
 		ans[ai].rdata.srv_record.port     = rec->data.srv.wPort;
-		ans[ai].rdata.srv_record.target   = rec->data.srv.nameTarget;
+		ans[ai].rdata.srv_record.target   = talloc_strdup(
+			ans, rec->data.srv.nameTarget);
+		W_ERROR_HAVE_NO_MEMORY(ans[ai].rdata.srv_record.target);
 		break;
 	case DNS_QTYPE_SOA:
-		ans[ai].rdata.soa_record.mname	 = rec->data.soa.mname;
-		ans[ai].rdata.soa_record.rname	 = rec->data.soa.rname;
+		ans[ai].rdata.soa_record.mname	 = talloc_strdup(
+			ans, rec->data.soa.mname);
+		W_ERROR_HAVE_NO_MEMORY(ans[ai].rdata.soa_record.mname);
+		ans[ai].rdata.soa_record.rname	 = talloc_strdup(
+			ans, rec->data.soa.rname);
+		W_ERROR_HAVE_NO_MEMORY(ans[ai].rdata.soa_record.rname);
 		ans[ai].rdata.soa_record.serial	 = rec->data.soa.serial;
 		ans[ai].rdata.soa_record.refresh = rec->data.soa.refresh;
 		ans[ai].rdata.soa_record.retry	 = rec->data.soa.retry;
@@ -77,9 +88,11 @@ static WERROR create_response_rr(const struct dns_name_question *question,
 		break;
 	case DNS_QTYPE_TXT:
 		tmp = talloc_asprintf(ans, "\"%s\"", rec->data.txt.str[0]);
+		W_ERROR_HAVE_NO_MEMORY(tmp);
 		for (i=1; i<rec->data.txt.count; i++) {
-			tmp = talloc_asprintf_append(tmp, " \"%s\"",
-						     rec->data.txt.str[i]);
+			tmp = talloc_asprintf_append_buffer(
+				tmp, " \"%s\"", rec->data.txt.str[i]);
+			W_ERROR_HAVE_NO_MEMORY(tmp);
 		}
 		ans[ai].rdata.txt_record.txt = tmp;
 		break;
@@ -89,6 +102,7 @@ static WERROR create_response_rr(const struct dns_name_question *question,
 	}
 
 	ans[ai].name = talloc_strdup(ans, question->name);
+	W_ERROR_HAVE_NO_MEMORY(ans[ai].name);
 	ans[ai].rr_type = rec->wType;
 	ans[ai].rr_class = DNS_QCLASS_IN;
 	ans[ai].ttl = rec->dwTtlSeconds;
@@ -101,66 +115,103 @@ static WERROR create_response_rr(const struct dns_name_question *question,
 	return WERR_OK;
 }
 
-static WERROR ask_forwarder(struct dns_server *dns,
-			    TALLOC_CTX *mem_ctx,
-			    struct dns_name_question *question,
-			    struct dns_res_rec **answers, uint16_t *ancount,
-			    struct dns_res_rec **nsrecs, uint16_t *nscount,
-			    struct dns_res_rec **additional, uint16_t *arcount)
+struct ask_forwarder_state {
+	struct tevent_context *ev;
+	uint16_t id;
+	struct dns_name_packet in_packet;
+};
+
+static void ask_forwarder_done(struct tevent_req *subreq);
+
+static struct tevent_req *ask_forwarder_send(
+	TALLOC_CTX *mem_ctx, struct tevent_context *ev,
+	const char *forwarder, struct dns_name_question *question)
 {
-	struct tevent_context *ev = tevent_context_init(mem_ctx);
-	struct dns_name_packet *out_packet, *in_packet;
-	uint16_t id = random();
-	DATA_BLOB out, in;
+	struct tevent_req *req, *subreq;
+	struct ask_forwarder_state *state;
+	struct dns_name_packet out_packet = { 0, };
+	DATA_BLOB out_blob;
 	enum ndr_err_code ndr_err;
-	WERROR werr = WERR_OK;
-	struct tevent_req *req;
-	const char *forwarder = lpcfg_dns_forwarder(dns->task->lp_ctx);
+
+	req = tevent_req_create(mem_ctx, &state, struct ask_forwarder_state);
+	if (req == NULL) {
+		return NULL;
+	}
+	state->ev = ev;
+	generate_random_buffer((uint8_t *)&state->id, sizeof(state->id));
 
 	if (!is_ipaddress(forwarder)) {
 		DEBUG(0, ("Invalid 'dns forwarder' setting '%s', needs to be "
 			  "an IP address\n", forwarder));
-		return DNS_ERR(NAME_ERROR);
+		tevent_req_werror(req, DNS_ERR(NAME_ERROR));
+		return tevent_req_post(req, ev);
 	}
 
-	out_packet = talloc_zero(mem_ctx, struct dns_name_packet);
-	W_ERROR_HAVE_NO_MEMORY(out_packet);
+	out_packet.id = state->id;
+	out_packet.operation |= DNS_OPCODE_QUERY | DNS_FLAG_RECURSION_DESIRED;
+	out_packet.qdcount = 1;
+	out_packet.questions = question;
 
-	out_packet->id = id;
-	out_packet->operation |= DNS_OPCODE_QUERY | DNS_FLAG_RECURSION_DESIRED;
-
-	out_packet->qdcount = 1;
-	out_packet->questions = question;
-
-	ndr_err = ndr_push_struct_blob(&out, mem_ctx, out_packet,
-			(ndr_push_flags_fn_t)ndr_push_dns_name_packet);
+	ndr_err = ndr_push_struct_blob(
+		&out_blob, state, &out_packet,
+		(ndr_push_flags_fn_t)ndr_push_dns_name_packet);
 	if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
-		return DNS_ERR(SERVER_FAILURE);
+		tevent_req_werror(req, DNS_ERR(SERVER_FAILURE));
+		return tevent_req_post(req, ev);
 	}
-
-	req = dns_udp_request_send(mem_ctx, ev, forwarder, out.data, out.length);
-	W_ERROR_HAVE_NO_MEMORY(req);
-
-	if(!tevent_req_poll(req, ev)) {
-		return DNS_ERR(SERVER_FAILURE);
+	subreq = dns_udp_request_send(state, ev, forwarder, out_blob.data,
+				      out_blob.length);
+	if (tevent_req_nomem(subreq, req)) {
+		return tevent_req_post(req, ev);
 	}
+	tevent_req_set_callback(subreq, ask_forwarder_done, req);
+	return req;
+}
 
-	werr = dns_udp_request_recv(req, mem_ctx, &in.data, &in.length);
-	W_ERROR_NOT_OK_RETURN(werr);
+static void ask_forwarder_done(struct tevent_req *subreq)
+{
+	struct tevent_req *req = tevent_req_callback_data(
+		subreq, struct tevent_req);
+	struct ask_forwarder_state *state = tevent_req_data(
+		req, struct ask_forwarder_state);
+	DATA_BLOB in_blob;
+	enum ndr_err_code ndr_err;
+	WERROR ret;
 
-	in_packet = talloc_zero(mem_ctx, struct dns_name_packet);
-	W_ERROR_HAVE_NO_MEMORY(in_packet);
+	ret = dns_udp_request_recv(subreq, state,
+				   &in_blob.data, &in_blob.length);
+	TALLOC_FREE(subreq);
+	if (tevent_req_werror(req, ret)) {
+		return;
+	}
 
-	ndr_err = ndr_pull_struct_blob(&in, in_packet, in_packet,
-			(ndr_pull_flags_fn_t)ndr_pull_dns_name_packet);
+	ndr_err = ndr_pull_struct_blob(
+		&in_blob, state, &state->in_packet,
+		(ndr_pull_flags_fn_t)ndr_pull_dns_name_packet);
 	if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
-		return DNS_ERR(SERVER_FAILURE);
+		tevent_req_werror(req, DNS_ERR(SERVER_FAILURE));
+		return;
+	}
+	if (state->in_packet.id != state->id) {
+		tevent_req_werror(req, DNS_ERR(NAME_ERROR));
+		return;
 	}
+	tevent_req_done(req);
+}
 
-	if (in_packet->id != id) {
-		DEBUG(0, ("DNS packet id mismatch: 0x%0x, expected 0x%0x\n",
-			  in_packet->id, id));
-		return DNS_ERR(NAME_ERROR);
+static WERROR ask_forwarder_recv(
+	struct tevent_req *req, TALLOC_CTX *mem_ctx,
+	struct dns_res_rec **answers, uint16_t *ancount,
+	struct dns_res_rec **nsrecs, uint16_t *nscount,
+	struct dns_res_rec **additional, uint16_t *arcount)
+{
+	struct ask_forwarder_state *state = tevent_req_data(
+		req, struct ask_forwarder_state);
+	struct dns_name_packet *in_packet = &state->in_packet;
+	WERROR err;
+
+	if (tevent_req_is_werror(req, &err)) {
+		return err;
 	}
 
 	*ancount = in_packet->ancount;
@@ -172,7 +223,7 @@ static WERROR ask_forwarder(struct dns_server *dns,
 	*arcount = in_packet->arcount;
 	*additional = talloc_move(mem_ctx, &in_packet->additional);
 
-	return werr;
+	return WERR_OK;
 }
 
 static WERROR handle_question(struct dns_server *dns,
@@ -216,59 +267,111 @@ 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,
-				struct dns_res_rec **nsrecs,     uint16_t *nscount,
-				struct dns_res_rec **additional, uint16_t *arcount)
+struct dns_server_process_query_state {
+	struct dns_res_rec *answers;
+	uint16_t ancount;
+	struct dns_res_rec *nsrecs;
+	uint16_t nscount;
+	struct dns_res_rec *additional;
+	uint16_t arcount;
+};
+
+static void dns_server_process_query_got_response(struct tevent_req *subreq);
+
+struct tevent_req *dns_server_process_query_send(
+	TALLOC_CTX *mem_ctx, struct tevent_context *ev,
+	struct dns_server *dns,	struct dns_request_state *req_state,
+	const struct dns_name_packet *in)
 {
-	uint16_t num_answers=0, num_nsrecs=0, num_additional=0;
-	struct dns_res_rec *ans=NULL, *ns=NULL, *adds=NULL;
-	WERROR werror;
+	struct tevent_req *req, *subreq;
+	struct dns_server_process_query_state *state;
 
+	req = tevent_req_create(mem_ctx, &state,
+				struct dns_server_process_query_state);
+	if (req == NULL) {
+		return NULL;
+	}
 	if (in->qdcount != 1) {
-		return DNS_ERR(FORMAT_ERROR);
+		tevent_req_werror(req, DNS_ERR(FORMAT_ERROR));
+		return tevent_req_post(req, ev);
 	}
 
 	/* Windows returns NOT_IMPLEMENTED on this as well */
 	if (in->questions[0].question_class == DNS_QCLASS_NONE) {
-		return DNS_ERR(NOT_IMPLEMENTED);
+		tevent_req_werror(req, DNS_ERR(NOT_IMPLEMENTED));
+		return tevent_req_post(req, ev);
 	}
 
 	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 {
-		if (state->flags & DNS_FLAG_RECURSION_DESIRED &&
-		    state->flags & DNS_FLAG_RECURSION_AVAIL) {
-			DEBUG(2, ("Not authorative for '%s', forwarding\n",
-				  in->questions[0].name));
-			werror = ask_forwarder(dns, mem_ctx, &in->questions[0],
-					       &ans, &num_answers,
-					       &ns, &num_nsrecs,
-					       &adds, &num_additional);
-		} else {
-			werror = DNS_ERR(NAME_ERROR);
+		WERROR err;
+
+		req_state->flags |= DNS_FLAG_AUTHORITATIVE;
+		err = handle_question(dns, state, &in->questions[0],
+				      &state->answers, &state->ancount);
+		if (tevent_req_werror(req, err)) {
+			return tevent_req_post(req, ev);
 		}
+		tevent_req_done(req);
+		return tevent_req_post(req, ev);
 	}
-	W_ERROR_NOT_OK_GOTO(werror, query_failed);
 
-	*answers = ans;
-	*ancount = num_answers;
+	if ((req_state->flags & DNS_FLAG_RECURSION_DESIRED) &&
+	    (req_state->flags & DNS_FLAG_RECURSION_AVAIL)) {
+		DEBUG(2, ("Not authoritative for '%s', forwarding\n",
+			  in->questions[0].name));
 
-	/*FIXME: Do something for these */
-	*nsrecs  = ns;
-	*nscount = num_nsrecs;
+		subreq = ask_forwarder_send(
+			state, ev, lpcfg_dns_forwarder(dns->task->lp_ctx),
+			&in->questions[0]);
+		if (tevent_req_nomem(subreq, req)) {
+			return tevent_req_post(req, ev);
+		}
+		tevent_req_set_callback(
+			subreq, dns_server_process_query_got_response, req);
+		return req;
+	}
 
-	*additional = adds;
-	*arcount    = num_additional;
+	tevent_req_werror(req, DNS_ERR(NAME_ERROR));
+	return tevent_req_post(req, ev);
+}
 
-	return WERR_OK;
+static void dns_server_process_query_got_response(struct tevent_req *subreq)
+{
+	struct tevent_req *req = tevent_req_callback_data(
+		subreq, struct tevent_req);
+	struct dns_server_process_query_state *state = tevent_req_data(
+		req, struct dns_server_process_query_state);
+	WERROR err;
+
+	err = ask_forwarder_recv(subreq, state,
+				 &state->answers, &state->ancount,
+				 &state->nsrecs, &state->nscount,
+				 &state->additional, &state->arcount);
+	TALLOC_FREE(subreq);
+	if (tevent_req_werror(req, err)) {
+		return;
+	}
+	tevent_req_done(req);
+}
 
-query_failed:
-	/*FIXME: add our SOA record to nsrecs */
-	return werror;
+WERROR dns_server_process_query_recv(
+	struct tevent_req *req, TALLOC_CTX *mem_ctx,
+	struct dns_res_rec **answers,    uint16_t *ancount,
+	struct dns_res_rec **nsrecs,     uint16_t *nscount,
+	struct dns_res_rec **additional, uint16_t *arcount)
+{
+	struct dns_server_process_query_state *state = tevent_req_data(
+		req, struct dns_server_process_query_state);
+	WERROR err;
+
+	if (tevent_req_is_werror(req, &err)) {


-- 
Samba Shared Repository


More information about the samba-cvs mailing list