[SCM] Samba Shared Repository - branch master updated - 116fbd6b5a82a2e9f2440aae4ad56cf8a457c85b

Stefan Metzmacher metze at samba.org
Wed Dec 17 19:42:48 GMT 2008


The branch, master has been updated
       via  116fbd6b5a82a2e9f2440aae4ad56cf8a457c85b (commit)
       via  7d0e78a52cfed797100696725611655227cf01ac (commit)
       via  937fdb8a7e348103708adbdafcff28b05cc1fda3 (commit)
      from  c8565c0e7acc6febf1b4015bde6baa1c5b7adddc (commit)

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


- Log -----------------------------------------------------------------
commit 116fbd6b5a82a2e9f2440aae4ad56cf8a457c85b
Author: Stefan Metzmacher <metze at samba.org>
Date:   Wed Dec 17 17:25:40 2008 +0100

    s4:libcli/resolve: specify the port for the resulting socket_addresses
    
    metze

commit 7d0e78a52cfed797100696725611655227cf01ac
Author: Stefan Metzmacher <metze at samba.org>
Date:   Sat Dec 13 20:50:36 2008 +0100

    s4:libcli/resolve: optionally return the name that belongs to the returned address
    
    E.g. this helps for DNS CNAME and SRV results.
    
    metze

commit 937fdb8a7e348103708adbdafcff28b05cc1fda3
Author: Stefan Metzmacher <metze at samba.org>
Date:   Sat Dec 13 11:03:52 2008 +0100

    s4:libcli/resolve: pass down flags to the resolver backends
    
    metze

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

Summary of changes:
 source4/libcli/resolve/bcast.c     |   12 ++++--
 source4/libcli/resolve/dns_ex.c    |   65 +++++++++++++++++++++++++++++-------
 source4/libcli/resolve/host.c      |   12 ++++---
 source4/libcli/resolve/nbtlist.c   |   23 +++++++++++-
 source4/libcli/resolve/resolve.c   |   31 ++++++++++++++---
 source4/libcli/resolve/resolve.h   |    5 ++-
 source4/libcli/resolve/testsuite.c |    4 +-
 source4/libcli/resolve/wins.c      |   12 +++++--
 8 files changed, 130 insertions(+), 34 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source4/libcli/resolve/bcast.c b/source4/libcli/resolve/bcast.c
index a572e87..866ce7a 100644
--- a/source4/libcli/resolve/bcast.c
+++ b/source4/libcli/resolve/bcast.c
@@ -37,7 +37,8 @@ struct resolve_bcast_data {
  */
 struct composite_context *resolve_name_bcast_send(TALLOC_CTX *mem_ctx, 
 						  struct event_context *event_ctx,
-						  void *userdata,
+						  void *userdata, uint32_t flags,
+						  uint16_t port,
 						  struct nbt_name *name)
 {
 	int num_interfaces;
@@ -63,7 +64,9 @@ struct composite_context *resolve_name_bcast_send(TALLOC_CTX *mem_ctx,
 	}
 	address_list[count] = NULL;
 
-	c = resolve_name_nbtlist_send(mem_ctx, event_ctx, name, address_list, data->ifaces, data->nbt_port, data->nbt_timeout, true, false);
+	c = resolve_name_nbtlist_send(mem_ctx, event_ctx, flags, port, name,
+				      address_list, data->ifaces, data->nbt_port,
+				      data->nbt_timeout, true, false);
 	talloc_free(address_list);
 
 	return c;	
@@ -74,9 +77,10 @@ struct composite_context *resolve_name_bcast_send(TALLOC_CTX *mem_ctx,
  */
 NTSTATUS resolve_name_bcast_recv(struct composite_context *c, 
 				 TALLOC_CTX *mem_ctx,
-				 struct socket_address ***addrs)
+				 struct socket_address ***addrs,
+				 char ***names)
 {
-	NTSTATUS status = resolve_name_nbtlist_recv(c, mem_ctx, addrs);
+	NTSTATUS status = resolve_name_nbtlist_recv(c, mem_ctx, addrs, names);
 	if (NT_STATUS_EQUAL(status, NT_STATUS_IO_TIMEOUT)) {
 		/* this makes much more sense for a bcast name resolution
 		   timeout */
diff --git a/source4/libcli/resolve/dns_ex.c b/source4/libcli/resolve/dns_ex.c
index 4bcf50a..5f08201 100644
--- a/source4/libcli/resolve/dns_ex.c
+++ b/source4/libcli/resolve/dns_ex.c
@@ -43,8 +43,11 @@ struct dns_ex_state {
 	bool do_getaddrinfo;
 	bool do_fallback;
 	bool do_srv;
+	uint32_t flags;
+	uint16_t port;
 	struct nbt_name name;
 	struct socket_address **addrs;
+	char **names;
 	pid_t child;
 	int child_fd;
 	struct fd_event *fde;
@@ -230,10 +233,11 @@ static void run_child_dns_lookup(struct dns_ex_state *state, int fd)
 		if (!addrs_rr[i]) {
 			continue;
 		}
-		addrs = talloc_asprintf_append_buffer(addrs, "%s%s:%u",
+		addrs = talloc_asprintf_append_buffer(addrs, "%s%s:%u/%s",
 						      first?"":",",
 						      inet_ntoa(*addrs_rr[i]->u.a),
-						      srv_rr[i]?srv_rr[i]->u.srv->port:0);
+						      state->port,
+						      addrs_rr[i]->domain);
 		if (!addrs) {
 			goto done;
 		}
@@ -288,10 +292,11 @@ static void run_child_getaddrinfo(struct dns_ex_state *state, int fd)
 		}
 		in = (struct sockaddr_in *)res->ai_addr;
 
-		addrs = talloc_asprintf_append_buffer(addrs, "%s%s:%u",
+		addrs = talloc_asprintf_append_buffer(addrs, "%s%s:%u/%s",
 						      first?"":",",
 						      inet_ntoa(in->sin_addr),
-						      0);
+						      state->port,
+						      state->name.name);
 		if (!addrs) {
 			goto done;
 		}
@@ -317,21 +322,31 @@ static void pipe_handler(struct event_context *ev, struct fd_event *fde,
 	struct composite_context *c = talloc_get_type(private_data, struct composite_context);
 	struct dns_ex_state *state = talloc_get_type(c->private_data,
 				     struct dns_ex_state);
-	char address[2048];
+	char *address;
 	uint32_t num_addrs, i;
 	char **addrs;
 	int ret;
 	int status;
+	int value = 0;
 
 	/* if we get any event from the child then we know that we
 	   won't need to kill it off */
 	talloc_set_destructor(state, NULL);
 
-	/* yes, we don't care about EAGAIN or other niceities
-	   here. They just can't happen with this parent/child
-	   relationship, and even if they did then giving an error is
-	   the right thing to do */
-	ret = read(state->child_fd, address, sizeof(address)-1);
+	if (ioctl(state->child_fd, FIONREAD, &value) != 0) {
+		value = 8192;
+	}
+
+	address = talloc_array(state, char, value+1);
+	if (address) {
+		/* yes, we don't care about EAGAIN or other niceities
+		   here. They just can't happen with this parent/child
+		   relationship, and even if they did then giving an error is
+		   the right thing to do */
+		ret = read(state->child_fd, address, value);
+	} else {
+		ret = -1;
+	}
 	close(state->child_fd);
 	if (waitpid(state->child, &status, WNOHANG) == 0) {
 		kill(state->child, SIGKILL);
@@ -355,9 +370,13 @@ static void pipe_handler(struct event_context *ev, struct fd_event *fde,
 				    num_addrs+1);
 	if (composite_nomem(state->addrs, c)) return;
 
+	state->names = talloc_array(state, char *, num_addrs+1);
+	if (composite_nomem(state->names, c)) return;
+
 	for (i=0; i < num_addrs; i++) {
 		uint32_t port = 0;
 		char *p = strrchr(addrs[i], ':');
+		char *n;
 
 		if (!p) {
 			composite_error(c, NT_STATUS_OBJECT_NAME_NOT_FOUND);
@@ -367,6 +386,15 @@ static void pipe_handler(struct event_context *ev, struct fd_event *fde,
 		*p = '\0';
 		p++;
 
+		n = strrchr(p, '/');
+		if (!n) {
+			composite_error(c, NT_STATUS_OBJECT_NAME_NOT_FOUND);
+			return;
+		}
+
+		*n = '\0';
+		n++;
+
 		if (strcmp(addrs[i], "0.0.0.0") == 0 ||
 		    inet_addr(addrs[i]) == INADDR_NONE) {
 			composite_error(c, NT_STATUS_OBJECT_NAME_NOT_FOUND);
@@ -374,15 +402,20 @@ static void pipe_handler(struct event_context *ev, struct fd_event *fde,
 		}
 		port = strtoul(p, NULL, 10);
 		if (port > UINT16_MAX) {
-			port = 0;
+			composite_error(c, NT_STATUS_OBJECT_NAME_NOT_FOUND);
+			return;
 		}
 		state->addrs[i] = socket_address_from_strings(state->addrs,
 							      "ipv4",
 							      addrs[i],
 							      port);
 		if (composite_nomem(state->addrs[i], c)) return;
+
+		state->names[i] = talloc_strdup(state->names, n);
+		if (composite_nomem(state->names[i], c)) return;
 	}
 	state->addrs[i] = NULL;
+	state->names[i] = NULL;
 
 	composite_done(c);
 }
@@ -393,6 +426,8 @@ static void pipe_handler(struct event_context *ev, struct fd_event *fde,
 struct composite_context *resolve_name_dns_ex_send(TALLOC_CTX *mem_ctx,
 						   struct event_context *event_ctx,
 						   void *privdata,
+						   uint32_t flags,
+						   uint16_t port,
 						   struct nbt_name *name,
 						   bool do_getaddrinfo,
 						   bool do_fallback,
@@ -425,6 +460,8 @@ struct composite_context *resolve_name_dns_ex_send(TALLOC_CTX *mem_ctx,
 	state->do_getaddrinfo = do_getaddrinfo;
 	state->do_fallback = do_fallback;
 	state->do_srv = do_srv;
+	state->flags = flags;
+	state->port = port;
 
 	state->child_fd = fd[0];
 	state->event_ctx = c->event_ctx;
@@ -467,7 +504,8 @@ struct composite_context *resolve_name_dns_ex_send(TALLOC_CTX *mem_ctx,
 */
 NTSTATUS resolve_name_dns_ex_recv(struct composite_context *c, 
 				  TALLOC_CTX *mem_ctx,
-				  struct socket_address ***addrs)
+				  struct socket_address ***addrs,
+				  char ***names)
 {
 	NTSTATUS status;
 
@@ -477,6 +515,9 @@ NTSTATUS resolve_name_dns_ex_recv(struct composite_context *c,
 		struct dns_ex_state *state = talloc_get_type(c->private_data,
 					     struct dns_ex_state);
 		*addrs = talloc_steal(mem_ctx, state->addrs);
+		if (names) {
+			*names = talloc_steal(mem_ctx, state->names);
+		}
 	}
 
 	talloc_free(c);
diff --git a/source4/libcli/resolve/host.c b/source4/libcli/resolve/host.c
index 2facb54..908d173 100644
--- a/source4/libcli/resolve/host.c
+++ b/source4/libcli/resolve/host.c
@@ -34,11 +34,12 @@
  */
 struct composite_context *resolve_name_host_send(TALLOC_CTX *mem_ctx,
 						 struct event_context *event_ctx,
-						 void *privdata,
+						 void *privdata, uint32_t flags,
+						 uint16_t port,
 						 struct nbt_name *name)
 {
-	return resolve_name_dns_ex_send(mem_ctx, event_ctx, NULL,
-					name, true, true, false);
+	return resolve_name_dns_ex_send(mem_ctx, event_ctx, NULL, flags,
+					port, name, true, true, false);
 }
 
 /*
@@ -46,9 +47,10 @@ struct composite_context *resolve_name_host_send(TALLOC_CTX *mem_ctx,
 */
 NTSTATUS resolve_name_host_recv(struct composite_context *c, 
 				TALLOC_CTX *mem_ctx,
-				struct socket_address ***addrs)
+				struct socket_address ***addrs,
+				char ***names)
 {
-	return resolve_name_dns_ex_recv(c, mem_ctx, addrs);
+	return resolve_name_dns_ex_recv(c, mem_ctx, addrs, names);
 }
 
 bool resolve_context_add_host_method(struct resolve_context *ctx)
diff --git a/source4/libcli/resolve/nbtlist.c b/source4/libcli/resolve/nbtlist.c
index 76721e2..2c128e2 100644
--- a/source4/libcli/resolve/nbtlist.c
+++ b/source4/libcli/resolve/nbtlist.c
@@ -34,12 +34,15 @@
 #include "libcli/resolve/resolve.h"
 
 struct nbtlist_state {
+	uint16_t flags;
+	uint16_t port;
 	struct nbt_name name;
 	struct nbt_name_socket *nbtsock;
 	int num_queries;
 	struct nbt_name_request **queries;
 	struct nbt_name_query *io_queries;
 	struct socket_address **addrs;
+	char **names;
 	struct interface *ifaces;
 };
 
@@ -81,14 +84,21 @@ static void nbtlist_handler(struct nbt_name_request *req)
 				    q->out.num_addrs + 1);
 	if (composite_nomem(state->addrs, c)) return;
 
+	state->names = talloc_array(state, char *, q->out.num_addrs + 1);
+	if (composite_nomem(state->names, c)) return;
+
 	for (i=0;i<q->out.num_addrs;i++) {
 		state->addrs[i] = socket_address_from_strings(state->addrs,
 							      "ipv4",
 							      q->out.reply_addrs[i],
-							      0);
+							      state->port);
 		if (composite_nomem(state->addrs[i], c)) return;
+
+		state->names[i] = talloc_strdup(state->names, state->name.name);
+		if (composite_nomem(state->names[i], c)) return;
 	}
 	state->addrs[i] = NULL;
+	state->names[i] = NULL;
 
 	composite_done(c);
 }
@@ -98,6 +108,8 @@ static void nbtlist_handler(struct nbt_name_request *req)
  */
 struct composite_context *resolve_name_nbtlist_send(TALLOC_CTX *mem_ctx,
 						    struct event_context *event_ctx,
+						    uint32_t flags,
+						    uint16_t port,
 						    struct nbt_name *name, 
 						    const char **address_list,
 						    struct interface *ifaces,
@@ -119,6 +131,9 @@ struct composite_context *resolve_name_nbtlist_send(TALLOC_CTX *mem_ctx,
 	if (composite_nomem(state, c)) return c;
 	c->private_data = state;
 
+	state->flags = flags;
+	state->port = port;
+
 	c->status = nbt_name_dup(state, name, &state->name);
 	if (!composite_is_ok(c)) return c;
 
@@ -180,7 +195,8 @@ struct composite_context *resolve_name_nbtlist_send(TALLOC_CTX *mem_ctx,
  */
 NTSTATUS resolve_name_nbtlist_recv(struct composite_context *c, 
 				   TALLOC_CTX *mem_ctx,
-				   struct socket_address ***addrs)
+				   struct socket_address ***addrs,
+				   char ***names)
 {
 	NTSTATUS status;
 
@@ -189,6 +205,9 @@ NTSTATUS resolve_name_nbtlist_recv(struct composite_context *c,
 	if (NT_STATUS_IS_OK(status)) {
 		struct nbtlist_state *state = talloc_get_type(c->private_data, struct nbtlist_state);
 		*addrs = talloc_steal(mem_ctx, state->addrs);
+		if (names) {
+			*names = talloc_steal(mem_ctx, state->names);
+		}
 	}
 
 	talloc_free(c);
diff --git a/source4/libcli/resolve/resolve.c b/source4/libcli/resolve/resolve.c
index 68b8065..752678a 100644
--- a/source4/libcli/resolve/resolve.c
+++ b/source4/libcli/resolve/resolve.c
@@ -31,9 +31,12 @@
 struct resolve_state {
 	struct resolve_context *ctx;
 	struct resolve_method *method;
+	uint32_t flags;
+	uint16_t port;
 	struct nbt_name name;
 	struct composite_context *creq;
 	struct socket_address **addrs;
+	char **names;
 };
 
 static struct composite_context *setup_next_method(struct composite_context *c);
@@ -83,7 +86,7 @@ static void resolve_handler(struct composite_context *creq)
 	struct resolve_state *state = talloc_get_type(c->private_data, struct resolve_state);
 	const struct resolve_method *method = state->method;
 
-	c->status = method->recv_fn(creq, state, &state->addrs);
+	c->status = method->recv_fn(creq, state, &state->addrs, &state->names);
 	
 	if (!NT_STATUS_IS_OK(c->status)) {
 		state->method = state->method->next;
@@ -111,7 +114,11 @@ static struct composite_context *setup_next_method(struct composite_context *c)
 
 	do {
 		if (state->method) {
-			creq = state->method->send_fn(c, c->event_ctx, state->method->privdata, &state->name);
+			creq = state->method->send_fn(c, c->event_ctx,
+						      state->method->privdata,
+						      state->flags,
+						      state->port,
+						      &state->name);
 		}
 		if (creq == NULL && state->method) state->method = state->method->next;
 
@@ -129,6 +136,8 @@ static struct composite_context *setup_next_method(struct composite_context *c)
   general name resolution - async send
  */
 struct composite_context *resolve_name_all_send(struct resolve_context *ctx,
+						uint32_t flags,
+						uint16_t port,
 						struct nbt_name *name,
 						struct event_context *event_ctx)
 {
@@ -148,6 +157,9 @@ struct composite_context *resolve_name_all_send(struct resolve_context *ctx,
 	if (composite_nomem(state, c)) return c;
 	c->private_data = state;
 
+	state->flags = flags;
+	state->port = port;
+
 	c->status = nbt_name_dup(state, name, &state->name);
 	if (!composite_is_ok(c)) return c;
 	
@@ -164,6 +176,11 @@ struct composite_context *resolve_name_all_send(struct resolve_context *ctx,
 							      inet_ntoa(ip), 0);
 		if (composite_nomem(state->addrs[0], c)) return c;
 		state->addrs[1] = NULL;
+		state->names = talloc_array(state, char *, 2);
+		if (composite_nomem(state->names, c)) return c;
+		state->names[0] = talloc_strdup(state->names, state->name.name);
+		if (composite_nomem(state->names[0], c)) return c;
+		state->names[1] = NULL;
 		composite_done(c);
 		return c;
 	}
@@ -184,7 +201,8 @@ struct composite_context *resolve_name_all_send(struct resolve_context *ctx,
  */
 NTSTATUS resolve_name_all_recv(struct composite_context *c,
 			       TALLOC_CTX *mem_ctx,
-			       struct socket_address ***addrs)
+			       struct socket_address ***addrs,
+			       char ***names)
 {
 	NTSTATUS status;
 
@@ -193,6 +211,9 @@ NTSTATUS resolve_name_all_recv(struct composite_context *c,
 	if (NT_STATUS_IS_OK(status)) {
 		struct resolve_state *state = talloc_get_type(c->private_data, struct resolve_state);
 		*addrs = talloc_steal(mem_ctx, state->addrs);
+		if (names) {
+			*names = talloc_steal(mem_ctx, state->names);
+		}
 	}
 
 	talloc_free(c);
@@ -203,7 +224,7 @@ struct composite_context *resolve_name_send(struct resolve_context *ctx,
 					    struct nbt_name *name,
 					    struct event_context *event_ctx)
 {
-	return resolve_name_all_send(ctx, name, event_ctx);
+	return resolve_name_all_send(ctx, 0, 0, name, event_ctx);
 }
 
 NTSTATUS resolve_name_recv(struct composite_context *c,
@@ -213,7 +234,7 @@ NTSTATUS resolve_name_recv(struct composite_context *c,
 	NTSTATUS status;
 	struct socket_address **addrs = NULL;
 
-	status = resolve_name_all_recv(c, mem_ctx, &addrs);
+	status = resolve_name_all_recv(c, mem_ctx, &addrs, NULL);
 
 	if (NT_STATUS_IS_OK(status)) {
 		*reply_addr = talloc_steal(mem_ctx, addrs[0]->addr);
diff --git a/source4/libcli/resolve/resolve.h b/source4/libcli/resolve/resolve.h
index f83db3f..072a8a1 100644
--- a/source4/libcli/resolve/resolve.h
+++ b/source4/libcli/resolve/resolve.h
@@ -29,10 +29,13 @@ struct event_context;
 typedef struct composite_context *(*resolve_name_send_fn)(TALLOC_CTX *mem_ctx,
 							  struct event_context *,
 							  void *privdata,
+							  uint32_t flags,
+							  uint16_t port,
 							  struct nbt_name *);
 typedef NTSTATUS (*resolve_name_recv_fn)(struct composite_context *creq,
 					 TALLOC_CTX *mem_ctx,
-					 struct socket_address ***addrs);
+					 struct socket_address ***addrs,
+					 char ***names);
 #include "libcli/resolve/proto.h"
 struct interface;
 #include "libcli/resolve/lp_proto.h"
diff --git a/source4/libcli/resolve/testsuite.c b/source4/libcli/resolve/testsuite.c
index 34de115..f1d1fbc 100644
--- a/source4/libcli/resolve/testsuite.c
+++ b/source4/libcli/resolve/testsuite.c
@@ -44,9 +44,9 @@ static bool test_async_resolve(struct torture_context *tctx)
 			host, timelimit);
 	while (timeval_elapsed(&tv) < timelimit) {
 		struct socket_address **s;
-		struct composite_context *c = resolve_name_host_send(mem_ctx, ev, NULL, &n);
+		struct composite_context *c = resolve_name_host_send(mem_ctx, ev, NULL, 0, 0, &n);
 		torture_assert(tctx, c != NULL, "resolve_name_host_send");
-		torture_assert_ntstatus_ok(tctx, resolve_name_host_recv(c, mem_ctx, &s),
+		torture_assert_ntstatus_ok(tctx, resolve_name_host_recv(c, mem_ctx, &s, NULL),
 								   "async resolve failed");
 		count++;
 	}
diff --git a/source4/libcli/resolve/wins.c b/source4/libcli/resolve/wins.c
index ba25b6c..1940688 100644
--- a/source4/libcli/resolve/wins.c
+++ b/source4/libcli/resolve/wins.c
@@ -40,11 +40,16 @@ struct composite_context *resolve_name_wins_send(
 				TALLOC_CTX *mem_ctx, 
 				struct event_context *event_ctx,
 				void *userdata,
+				uint32_t flags,
+				uint16_t port,
 				struct nbt_name *name)
 {
 	struct resolve_wins_data *wins_data = talloc_get_type(userdata, struct resolve_wins_data);
 	if (wins_data->address_list == NULL) return NULL;
-	return resolve_name_nbtlist_send(mem_ctx, event_ctx, name, wins_data->address_list, wins_data->ifaces, wins_data->nbt_port, wins_data->nbt_timeout, false, true);
+	return resolve_name_nbtlist_send(mem_ctx, event_ctx, flags, port, name,
+					 wins_data->address_list, wins_data->ifaces,
+					 wins_data->nbt_port, wins_data->nbt_timeout,
+					 false, true);
 }
 
 /*
@@ -52,9 +57,10 @@ struct composite_context *resolve_name_wins_send(
  */
 NTSTATUS resolve_name_wins_recv(struct composite_context *c, 
 				TALLOC_CTX *mem_ctx,
-				struct socket_address ***addrs)
+				struct socket_address ***addrs,
+				char ***names)
 {
-	return resolve_name_nbtlist_recv(c, mem_ctx, addrs);
+	return resolve_name_nbtlist_recv(c, mem_ctx, addrs, names);


-- 
Samba Shared Repository


More information about the samba-cvs mailing list