summaryrefslogtreecommitdiff
path: root/source4/libcli/resolve/bcast.c
diff options
context:
space:
mode:
authorAndrew Tridgell <tridge@samba.org>2005-01-21 13:13:24 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 13:09:04 -0500
commit6f0aef31cdfa9b486d1f2e0f097e071830f5600d (patch)
tree01891cccf49ab3bde362968bf10af93796c20107 /source4/libcli/resolve/bcast.c
parent757a063a134ab466f437e60b1eed5215b992d80c (diff)
downloadsamba-6f0aef31cdfa9b486d1f2e0f097e071830f5600d.tar.gz
samba-6f0aef31cdfa9b486d1f2e0f097e071830f5600d.tar.bz2
samba-6f0aef31cdfa9b486d1f2e0f097e071830f5600d.zip
r4898: - removed the unused wins_srv_*() code
- expanded the generic async name resolver to try multiple methods - added wins resolutions to the list of methods tried - fixed up the random trn id generation to use the good random generator (This used to be commit 266fd2751c01808e5a18d4094032af50554ceb7a)
Diffstat (limited to 'source4/libcli/resolve/bcast.c')
-rw-r--r--source4/libcli/resolve/bcast.c116
1 files changed, 15 insertions, 101 deletions
diff --git a/source4/libcli/resolve/bcast.c b/source4/libcli/resolve/bcast.c
index d424b5303a..9aefa32fae 100644
--- a/source4/libcli/resolve/bcast.c
+++ b/source4/libcli/resolve/bcast.c
@@ -23,112 +23,36 @@
#include "includes.h"
#include "system/network.h"
#include "libcli/raw/libcliraw.h"
-#include "libcli/nbt/libnbt.h"
#include "libcli/composite/composite.h"
-struct bcast_state {
- 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;
-};
-
-/*
- handle events during broadcast name resolution
-*/
-static void bcast_handler(struct nbt_name_request *req)
-{
- struct smbcli_composite *c = talloc_get_type(req->async.private,
- struct smbcli_composite);
- struct bcast_state *state = talloc_get_type(c->private, struct bcast_state);
- int i;
-
- for (i=0;i<state->num_queries;i++) {
- if (req == state->queries[i]) break;
- }
- if (i == state->num_queries) {
- /* not for us?! */
- c->status = NT_STATUS_INTERNAL_ERROR;
- c->state = SMBCLI_REQUEST_ERROR;
- goto done;
- }
-
- c->status = nbt_name_query_recv(req, state, &state->io_queries[i]);
- if (!NT_STATUS_IS_OK(c->status)) {
- c->state = SMBCLI_REQUEST_ERROR;
- } else {
- c->state = SMBCLI_REQUEST_DONE;
- state->reply_addr = talloc_steal(state, state->io_queries[i].out.reply_addr);
- }
-
-done:
- talloc_free(state->nbtsock);
- if (c->async.fn) {
- c->async.fn(c);
- }
-}
-
/*
broadcast name resolution method - async send
*/
struct smbcli_composite *resolve_name_bcast_send(struct nbt_name *name,
struct event_context *event_ctx)
{
+ int num_interfaces = iface_count();
+ const char **address_list;
struct smbcli_composite *c;
- struct bcast_state *state;
int i;
- NTSTATUS status;
-
- c = talloc_zero(NULL, struct smbcli_composite);
- if (c == NULL) goto failed;
- state = talloc(c, struct bcast_state);
- if (state == NULL) goto failed;
+ address_list = talloc_array(NULL, const char *, num_interfaces+1);
+ if (address_list == NULL) return NULL;
- status = nbt_name_dup(state, name, &state->name);
- if (!NT_STATUS_IS_OK(status)) goto failed;
-
- state->nbtsock = nbt_name_socket_init(state, event_ctx);
- if (state->nbtsock == NULL) goto failed;
-
- state->num_queries = iface_count();
-
- state->io_queries = talloc_array(state, struct nbt_name_query, state->num_queries);
- if (!state->io_queries) goto failed;
-
- state->queries = talloc_array(state, struct nbt_name_request *, state->num_queries);
- if (!state->queries) goto failed;
-
- for (i=0;i<state->num_queries;i++) {
+ for (i=0;i<num_interfaces;i++) {
struct ipv4_addr *ip = iface_n_bcast(i);
- const char *addr = sys_inet_ntoa(*ip);
- if (!addr) goto failed;
-
- state->io_queries[i].in.name = state->name;
- state->io_queries[i].in.dest_addr = talloc_strdup(state->io_queries, addr);
- if (!state->io_queries[i].in.dest_addr) goto failed;
- state->io_queries[i].in.broadcast = True;
- state->io_queries[i].in.wins_lookup = False;
- state->io_queries[i].in.timeout = lp_parm_int(-1, "nbt", "bcastTimeout", 5);
-
- state->queries[i] = nbt_name_query_send(state->nbtsock, &state->io_queries[i]);
- if (!state->queries[i]) goto failed;
-
- state->queries[i]->async.fn = bcast_handler;
- state->queries[i]->async.private = c;
+ address_list[i] = talloc_strdup(address_list, sys_inet_ntoa(*ip));
+ if (address_list[i] == NULL) {
+ talloc_free(address_list);
+ return NULL;
+ }
}
+ address_list[i] = NULL;
- c->state = SMBCLI_REQUEST_SEND;
- c->private = state;
- c->event_ctx = talloc_reference(c, state->nbtsock->event_ctx);
-
- return c;
+ c = resolve_name_nbtlist_send(name, event_ctx, address_list, True, False);
+ talloc_free(address_list);
-failed:
- talloc_free(c);
- return NULL;
+ return c;
}
/*
@@ -137,17 +61,7 @@ failed:
NTSTATUS resolve_name_bcast_recv(struct smbcli_composite *c,
TALLOC_CTX *mem_ctx, const char **reply_addr)
{
- NTSTATUS status;
-
- status = smb_composite_wait(c);
-
- if (NT_STATUS_IS_OK(status)) {
- struct bcast_state *state = talloc_get_type(c->private, struct bcast_state);
- *reply_addr = talloc_steal(mem_ctx, state->reply_addr);
- }
-
- talloc_free(c);
- return status;
+ return resolve_name_nbtlist_recv(c, mem_ctx, reply_addr);
}
/*