Finish removal of iconv_convenience in public API's.
[bbaumbach/samba-autobuild/.git] / source4 / libcli / resolve / nbtlist.c
index ec4cfb81b414fe5b2a368c4f896d18112c24a5a3..64d72bcc51aa4f2a93d8ed94b040c7c6b2eace30 100644 (file)
@@ -26,6 +26,7 @@
 #include "includes.h"
 #include "libcli/composite/composite.h"
 #include "system/network.h"
+#include "lib/socket/socket.h"
 #include "lib/socket/netif.h"
 #include "librpc/gen_ndr/ndr_nbt.h"
 #include "../libcli/nbt/libnbt.h"
 #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;
-       const char *reply_addr;
+       struct socket_address **addrs;
+       char **names;
        struct interface *ifaces;
 };
 
@@ -71,25 +75,30 @@ static void nbtlist_handler(struct nbt_name_request *req)
        talloc_free(state->nbtsock);
        if (!composite_is_ok(c)) return;
 
-       if (state->io_queries[i].out.num_addrs < 1) {
+       if (q->out.num_addrs < 1) {
                composite_error(c, NT_STATUS_UNEXPECTED_NETWORK_ERROR);
                return;
        }
 
-       /* favor a local address if possible */
-       state->reply_addr = NULL;
-       for (i=0;i<q->out.num_addrs;i++) {
-               if (iface_is_local(state->ifaces, q->out.reply_addrs[i])) {
-                       state->reply_addr = talloc_steal(state, 
-                                                        q->out.reply_addrs[i]);
-                       break;
-               }
-       }
+       state->addrs = talloc_array(state, struct socket_address *,
+                                   q->out.num_addrs + 1);
+       if (composite_nomem(state->addrs, c)) return;
 
-       if (state->reply_addr == NULL) {
-               state->reply_addr = talloc_steal(state, 
-                                                q->out.reply_addrs[0]);
+       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],
+                                                             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,7 +107,9 @@ static void nbtlist_handler(struct nbt_name_request *req)
   nbtlist name resolution method - async send
  */
 struct composite_context *resolve_name_nbtlist_send(TALLOC_CTX *mem_ctx,
-                                                   struct event_context *event_ctx,
+                                                   struct tevent_context *event_ctx,
+                                                   uint32_t flags,
+                                                   uint16_t port,
                                                    struct nbt_name *name, 
                                                    const char **address_list,
                                                    struct interface *ifaces,
@@ -114,12 +125,23 @@ struct composite_context *resolve_name_nbtlist_send(TALLOC_CTX *mem_ctx,
        c = composite_create(mem_ctx, event_ctx);
        if (c == NULL) return NULL;
 
-       if (composite_nomem(c->event_ctx, c)) return c;
+       if (flags & RESOLVE_NAME_FLAG_FORCE_DNS) {
+               composite_error(c, NT_STATUS_OBJECT_NAME_NOT_FOUND);
+               return c;
+       }
+
+       if (strlen(name->name) > 15) {
+               composite_error(c, NT_STATUS_OBJECT_NAME_NOT_FOUND);
+               return c;
+       }
 
        state = talloc(c, struct nbtlist_state);
        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;
 
@@ -141,8 +163,7 @@ struct composite_context *resolve_name_nbtlist_send(TALLOC_CTX *mem_ctx,
                return c;
        }
 
-       state->nbtsock = nbt_name_socket_init(state, event_ctx, 
-                                             global_iconv_convenience);
+       state->nbtsock = nbt_name_socket_init(state, event_ctx);
        if (composite_nomem(state->nbtsock, c)) return c;
 
        /* count the address_list size */
@@ -180,7 +201,9 @@ struct composite_context *resolve_name_nbtlist_send(TALLOC_CTX *mem_ctx,
   nbt list of addresses name resolution method - recv side
  */
 NTSTATUS resolve_name_nbtlist_recv(struct composite_context *c, 
-                                  TALLOC_CTX *mem_ctx, const char **reply_addr)
+                                  TALLOC_CTX *mem_ctx,
+                                  struct socket_address ***addrs,
+                                  char ***names)
 {
        NTSTATUS status;
 
@@ -188,30 +211,13 @@ 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);
-               *reply_addr = talloc_steal(mem_ctx, state->reply_addr);
+               *addrs = talloc_steal(mem_ctx, state->addrs);
+               if (names) {
+                       *names = talloc_steal(mem_ctx, state->names);
+               }
        }
 
        talloc_free(c);
        return status;
 }
 
-/*
-  nbt list of addresses name resolution method - sync call
- */
-NTSTATUS resolve_name_nbtlist(struct nbt_name *name, 
-                             TALLOC_CTX *mem_ctx,
-                             const char **address_list,
-                             struct interface *ifaces, 
-                             uint16_t nbt_port,
-                             int nbt_timeout,
-                             bool broadcast, bool wins_lookup,
-                             const char **reply_addr)
-{
-       struct composite_context *c = resolve_name_nbtlist_send(mem_ctx, NULL, 
-                                                               name, address_list, 
-                                                               ifaces, nbt_port,
-                                                               nbt_timeout,
-                                                               broadcast, wins_lookup);
-       return resolve_name_nbtlist_recv(c, mem_ctx, reply_addr);
-}
-