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 <me...@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 <me...@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 <me...@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

Reply via email to