diff options
author | Andrew Tridgell <tridge@samba.org> | 2005-01-21 11:18:56 +0000 |
---|---|---|
committer | Gerald (Jerry) Carter <jerry@samba.org> | 2007-10-10 13:09:03 -0500 |
commit | 2383787f199c51cdc202a3cef5822a9fe6b8774c (patch) | |
tree | 52419b4e736f5ae1727561a3c9831e899edb35c5 /source4/libcli/composite | |
parent | f1aaef3015864f9323711127a4964a8eceff6a52 (diff) | |
download | samba-2383787f199c51cdc202a3cef5822a9fe6b8774c.tar.gz samba-2383787f199c51cdc202a3cef5822a9fe6b8774c.tar.bz2 samba-2383787f199c51cdc202a3cef5822a9fe6b8774c.zip |
r4891: - added a generic resolve_name() async interface in libcli/resolve/,
which will eventually try all resolution methods setup in smb.conf
- only resolution backend at the moment is bcast, which does a
parallel broadcast to all configured network interfaces, and takes
the first reply that comes in (this nicely demonstrates how to do
parallel requests using the async APIs)
- converted all the existing code to use the new resolve_name() api
- removed all the old nmb code (yay!)
(This used to be commit 239c310f255e43dd2d1c2433f666c9faaacbdce3)
Diffstat (limited to 'source4/libcli/composite')
-rw-r--r-- | source4/libcli/composite/connect.c | 47 |
1 files changed, 41 insertions, 6 deletions
diff --git a/source4/libcli/composite/connect.c b/source4/libcli/composite/connect.c index 891d16b4e6..7e08aab0d5 100644 --- a/source4/libcli/composite/connect.c +++ b/source4/libcli/composite/connect.c @@ -26,7 +26,8 @@ #include "libcli/composite/composite.h" /* the stages of this call */ -enum connect_stage {CONNECT_SOCKET, +enum connect_stage {CONNECT_RESOLVE, + CONNECT_SOCKET, CONNECT_SESSION_REQUEST, CONNECT_NEGPROT, CONNECT_SESSION_SETUP, @@ -209,7 +210,7 @@ static NTSTATUS connect_socket(struct smbcli_composite *c, { struct connect_state *state = talloc_get_type(c->private, struct connect_state); NTSTATUS status; - struct nmb_name calling, called; + struct nbt_name calling, called; status = smbcli_sock_connect_recv(state->creq); NT_STATUS_NOT_OK_RETURN(status); @@ -225,8 +226,11 @@ static NTSTATUS connect_socket(struct smbcli_composite *c, return connect_send_negprot(c, io); } - make_nmb_name(&calling, io->in.calling_name, 0x0); - choose_called_name(&called, io->in.called_name, 0x20); + calling.name = io->in.calling_name; + calling.type = NBT_NAME_CLIENT; + calling.scope = NULL; + + nbt_choose_called_name(state, &called, io->in.called_name, NBT_NAME_SERVER); state->req = smbcli_transport_connect_send(state->transport, &calling, &called); NT_STATUS_HAVE_NO_MEMORY(state->req); @@ -239,6 +243,29 @@ static NTSTATUS connect_socket(struct smbcli_composite *c, } +/* + called when name resolution is finished +*/ +static NTSTATUS connect_resolve(struct smbcli_composite *c, + struct smb_composite_connect *io) +{ + struct connect_state *state = talloc_get_type(c->private, struct connect_state); + NTSTATUS status; + const char *address; + + status = resolve_name_recv(state->creq, state, &address); + NT_STATUS_NOT_OK_RETURN(status); + + state->creq = smbcli_sock_connect_send(state->sock, address, state->io->in.port); + NT_STATUS_HAVE_NO_MEMORY(state->creq); + + c->stage = CONNECT_SOCKET; + state->creq->async.private = c; + state->creq->async.fn = composite_handler; + + return NT_STATUS_OK; +} + /* handle and dispatch state transitions @@ -248,6 +275,9 @@ static void state_handler(struct smbcli_composite *c) struct connect_state *state = talloc_get_type(c->private, struct connect_state); switch (c->stage) { + case CONNECT_RESOLVE: + c->status = connect_resolve(c, state->io); + break; case CONNECT_SOCKET: c->status = connect_socket(c, state->io); break; @@ -301,6 +331,7 @@ struct smbcli_composite *smb_composite_connect_send(struct smb_composite_connect { struct smbcli_composite *c; struct connect_state *state; + struct nbt_name name; c = talloc_zero(NULL, struct smbcli_composite); if (c == NULL) goto failed; @@ -314,11 +345,15 @@ struct smbcli_composite *smb_composite_connect_send(struct smb_composite_connect state->io = io; c->state = SMBCLI_REQUEST_SEND; - c->stage = CONNECT_SOCKET; + c->stage = CONNECT_RESOLVE; c->event_ctx = state->sock->event.ctx; c->private = state; - state->creq = smbcli_sock_connect_send(state->sock, io->in.dest_host, io->in.port); + name.name = io->in.dest_host; + name.type = NBT_NAME_SERVER; + name.scope = NULL; + + state->creq = resolve_name_send(&name, c->event_ctx); if (state->creq == NULL) goto failed; state->creq->async.private = c; |