The branch, master has been updated
       via  a610ce4 libcli/nbt: we don't need LIBCLI_COMPOSITE anymore
       via  820ae3d libcli/nbt: convert nbt_name_register_bcast_send/recv to 
tevent_req
       via  0b8056d libcli/nbt: 
s/name_register_bcast_handler/nbt_name_register_bcast_handler
       via  c654a6c libcli/nbt: 
s/register_bcast_state/nbt_name_register_bcast_state/
       via  77d82fe libcli/nbt: move nbt_name_register_bcast_send to the top of 
nbt_name_register_bcast_*
       via  6f2d94b s4:nbt_server/register: add a nbtd_register_name_state
       via  e3a0463 libcli/nbt: convert nbt_name_register_wins_send/recv to 
tevent_req
       via  4f233c7 libcli/nbt: 
s/name_register_wins_handler/nbt_name_register_wins_handler
       via  b166813 libcli/nbt: 
s/register_wins_state/nbt_name_register_wins_state
       via  549b594 libcli/nbt: move nbt_name_register_wins_send() to the top 
of all nbt_name_register_wins_* related code
       via  12c3880 s4:nbt_server/winsclient: add a nbtd_wins_register_state
       via  43fb7f1 libcli/nbt: convert nbt_name_refresh_wins_send/recv to 
tevent_req
       via  332f261 libcli/nbt: 
s/name_refresh_wins_handler/nbt_name_refresh_wins_handler
       via  3ded1da libcli/nbt: s/refresh_wins_state/nbt_name_refresh_wins_state
       via  e36e729 libcli/nbt: move nbt_name_refresh_wins_send() to the top of 
all nbt_name_refresh_wins_* related code
       via  5f19a24 s4:nbt_server/winsclient: add a nbtd_wins_refresh_state
       via  2ae3bb0 s4:nbt_server/wins: fix compiler warnings
      from  a10b341 Include misc.idl for policy_handle in srvsvc.idl.

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


- Log -----------------------------------------------------------------
commit a610ce4aa63b5bbe0886e510f7ccd9a6f95e266d
Author: Stefan Metzmacher <me...@samba.org>
Date:   Mon Oct 11 22:29:30 2010 +0200

    libcli/nbt: we don't need LIBCLI_COMPOSITE anymore
    
    metze
    
    Autobuild-User: Stefan Metzmacher <me...@samba.org>
    Autobuild-Date: Mon Oct 18 16:18:32 UTC 2010 on sn-devel-104

commit 820ae3d9a36e031027be163d22eec468a6da8603
Author: Stefan Metzmacher <me...@samba.org>
Date:   Mon Oct 11 21:18:15 2010 +0200

    libcli/nbt: convert nbt_name_register_bcast_send/recv to tevent_req
    
    metze

commit 0b8056d580e2d2475b208c73ffb698b0bcd487eb
Author: Stefan Metzmacher <me...@samba.org>
Date:   Mon Oct 11 21:01:23 2010 +0200

    libcli/nbt: s/name_register_bcast_handler/nbt_name_register_bcast_handler
    
    metze

commit c654a6c02bbd7c7a245b2a06e405d88724c12fc7
Author: Stefan Metzmacher <me...@samba.org>
Date:   Mon Oct 11 20:59:35 2010 +0200

    libcli/nbt: s/register_bcast_state/nbt_name_register_bcast_state/
    
    metze

commit 77d82fe944fa1f02c150cc2e0967cca654cd4dae
Author: Stefan Metzmacher <me...@samba.org>
Date:   Mon Oct 11 20:57:58 2010 +0200

    libcli/nbt: move nbt_name_register_bcast_send to the top of 
nbt_name_register_bcast_*
    
    metze

commit 6f2d94b960bb6d23ff8932eff2b44722cf335280
Author: Stefan Metzmacher <me...@samba.org>
Date:   Mon Oct 11 22:17:02 2010 +0200

    s4:nbt_server/register: add a nbtd_register_name_state
    
    metze

commit e3a0463414ba7759d332d5bebf6222bfa17ed037
Author: Stefan Metzmacher <me...@samba.org>
Date:   Mon Oct 11 21:58:29 2010 +0200

    libcli/nbt: convert nbt_name_register_wins_send/recv to tevent_req
    
    metze

commit 4f233c7ff8b23b0dd4797e08d7dc680598e1b844
Author: Stefan Metzmacher <me...@samba.org>
Date:   Mon Oct 11 21:23:58 2010 +0200

    libcli/nbt: s/name_register_wins_handler/nbt_name_register_wins_handler
    
    metze

commit b16681374c6c4d010a74bb2cb914ac226643c634
Author: Stefan Metzmacher <me...@samba.org>
Date:   Mon Oct 11 21:21:26 2010 +0200

    libcli/nbt: s/register_wins_state/nbt_name_register_wins_state
    
    metze

commit 549b594c5798954de056cf7e3858e94f1b965bdb
Author: Stefan Metzmacher <me...@samba.org>
Date:   Mon Oct 11 21:19:59 2010 +0200

    libcli/nbt: move nbt_name_register_wins_send() to the top of all 
nbt_name_register_wins_* related code
    
    metze

commit 12c38806af46da329e2f370d32a4fa964ceeb23f
Author: Stefan Metzmacher <me...@samba.org>
Date:   Mon Oct 11 20:49:28 2010 +0200

    s4:nbt_server/winsclient: add a nbtd_wins_register_state
    
    We now keep the nbtd_wins_register_state around between
    nbt_name_register_wins_send() and nbt_name_register_wins_recv()
    
    metze

commit 43fb7f1698c0c8aaa7f1e5d6a0f924396a9a12fe
Author: Stefan Metzmacher <me...@samba.org>
Date:   Mon Oct 11 08:54:27 2010 +0200

    libcli/nbt: convert nbt_name_refresh_wins_send/recv to tevent_req
    
    metze

commit 332f261bbf5a3179cbab6cb7aa8b490d0072b7af
Author: Stefan Metzmacher <me...@samba.org>
Date:   Mon Oct 11 08:33:06 2010 +0200

    libcli/nbt: s/name_refresh_wins_handler/nbt_name_refresh_wins_handler
    
    metze

commit 3ded1da8e99a628530d0a45256e012b7553c094c
Author: Stefan Metzmacher <me...@samba.org>
Date:   Mon Oct 11 08:18:16 2010 +0200

    libcli/nbt: s/refresh_wins_state/nbt_name_refresh_wins_state
    
    metze

commit e36e7295da42743519470f5b5c06e65071707db5
Author: Stefan Metzmacher <me...@samba.org>
Date:   Mon Oct 11 08:15:01 2010 +0200

    libcli/nbt: move nbt_name_refresh_wins_send() to the top of all 
nbt_name_refresh_wins_* related code
    
    metze

commit 5f19a24c500c17de9159f721c75077a162fa8bac
Author: Stefan Metzmacher <me...@samba.org>
Date:   Mon Oct 11 09:41:16 2010 +0200

    s4:nbt_server/winsclient: add a nbtd_wins_refresh_state
    
    We now keep the nbtd_wins_refresh_state around between
    nbt_name_refresh_wins_send() and nbt_name_refresh_wins_recv()
    
    metze

commit 2ae3bb0b160c8c1cc0f500bfdd39125292db5f59
Author: Stefan Metzmacher <me...@samba.org>
Date:   Mon Oct 11 22:26:09 2010 +0200

    s4:nbt_server/wins: fix compiler warnings
    
    metze

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

Summary of changes:
 libcli/nbt/libnbt.h                  |   32 ++-
 libcli/nbt/namerefresh.c             |  254 +++++++++++--------
 libcli/nbt/nameregister.c            |  483 +++++++++++++++++++--------------
 libcli/nbt/wscript_build             |    2 +-
 source4/nbt_server/register.c        |   58 +++--
 source4/nbt_server/wins/winsclient.c |  175 +++++++------
 source4/nbt_server/wins/winsserver.h |    1 +
 7 files changed, 586 insertions(+), 419 deletions(-)


Changeset truncated at 500 lines:

diff --git a/libcli/nbt/libnbt.h b/libcli/nbt/libnbt.h
index 6165548..21fd859 100644
--- a/libcli/nbt/libnbt.h
+++ b/libcli/nbt/libnbt.h
@@ -339,19 +339,27 @@ NDR_SCALAR_PROTO(nbt_string, const char *)
 NDR_BUFFER_PROTO(nbt_name, struct nbt_name)
 NTSTATUS nbt_rcode_to_ntstatus(uint8_t rcode);
 
-struct composite_context;
-struct composite_context *nbt_name_register_bcast_send(struct nbt_name_socket 
*nbtsock,
-                                                      struct 
nbt_name_register_bcast *io);
-NTSTATUS nbt_name_register_bcast_recv(struct composite_context *c);
-struct composite_context *nbt_name_register_wins_send(struct nbt_name_socket 
*nbtsock,
-                                                     struct 
nbt_name_register_wins *io);
-NTSTATUS nbt_name_refresh_wins_recv(struct composite_context *c, TALLOC_CTX 
*mem_ctx,
-                                    struct nbt_name_refresh_wins *io);
-struct composite_context *nbt_name_refresh_wins_send(struct nbt_name_socket 
*nbtsock,
-                                                     struct 
nbt_name_refresh_wins *io);
-NTSTATUS nbt_name_register_wins_recv(struct composite_context *c, TALLOC_CTX 
*mem_ctx,
+struct tevent_context;
+struct tevent_req;
+struct tevent_req *nbt_name_register_bcast_send(TALLOC_CTX *mem_ctx,
+                                       struct tevent_context *ev,
+                                       struct nbt_name_socket *nbtsock,
+                                       struct nbt_name_register_bcast *io);
+NTSTATUS nbt_name_register_bcast_recv(struct tevent_req *req);
+struct tevent_req *nbt_name_register_wins_send(TALLOC_CTX *mem_ctx,
+                                              struct tevent_context *ev,
+                                              struct nbt_name_socket *nbtsock,
+                                              struct nbt_name_register_wins 
*io);
+NTSTATUS nbt_name_register_wins_recv(struct tevent_req *req,
+                                    TALLOC_CTX *mem_ctx,
                                     struct nbt_name_register_wins *io);
-
+struct tevent_req *nbt_name_refresh_wins_send(TALLOC_CTX *mem_ctx,
+                                             struct tevent_context *ev,
+                                             struct nbt_name_socket *nbtsock,
+                                             struct nbt_name_refresh_wins *io);
+NTSTATUS nbt_name_refresh_wins_recv(struct tevent_req *req,
+                                   TALLOC_CTX *mem_ctx,
+                                   struct nbt_name_refresh_wins *io);
 
 XFILE *startlmhosts(const char *fname);
 bool getlmhostsent(TALLOC_CTX *ctx, XFILE *fp, char **pp_name, int *name_type,
diff --git a/libcli/nbt/namerefresh.c b/libcli/nbt/namerefresh.c
index ec63df9..79c6c1f 100644
--- a/libcli/nbt/namerefresh.c
+++ b/libcli/nbt/namerefresh.c
@@ -20,10 +20,11 @@
 */
 
 #include "includes.h"
+#include <tevent.h>
 #include "../libcli/nbt/libnbt.h"
 #include "../libcli/nbt/nbt_proto.h"
-#include "libcli/composite/composite.h"
 #include "lib/socket/socket.h"
+#include "lib/util/tevent_ntstatus.h"
 
 /*
   send a nbt name refresh request
@@ -142,104 +143,70 @@ _PUBLIC_ NTSTATUS nbt_name_refresh(struct 
nbt_name_socket *nbtsock,
   addresses to refresh. Try each WINS server in turn, until we get a
   reply for each address
 */
-struct refresh_wins_state {
+struct nbt_name_refresh_wins_state {
        struct nbt_name_socket *nbtsock;
        struct nbt_name_refresh *io;
-       const char **wins_servers;
+       char **wins_servers;
        uint16_t wins_port;
-       const char **addresses;
+       char **addresses;
        int address_idx;
-       struct nbt_name_request *req;
 };
 
+static void nbt_name_refresh_wins_handler(struct nbt_name_request *subreq);
 
 /**
-  state handler for WINS multi-homed multi-server name refresh
+  the async send call for a multi-server WINS refresh
 */
-static void name_refresh_wins_handler(struct nbt_name_request *req)
+_PUBLIC_ struct tevent_req *nbt_name_refresh_wins_send(TALLOC_CTX *mem_ctx,
+                                               struct tevent_context *ev,
+                                               struct nbt_name_socket *nbtsock,
+                                               struct nbt_name_refresh_wins 
*io)
 {
-       struct composite_context *c = talloc_get_type(req->async.private_data,
-                                                     struct composite_context);
-       struct refresh_wins_state *state = talloc_get_type(c->private_data,
-                                                           struct 
refresh_wins_state);
-       NTSTATUS status;
-
-       status = nbt_name_refresh_recv(state->req, state, state->io);
-       if (NT_STATUS_EQUAL(status, NT_STATUS_IO_TIMEOUT)) {
-               /* the refresh timed out - try the next WINS server */
-               state->wins_servers++;
-               state->address_idx = 0;
-               if (state->wins_servers[0] == NULL) {
-                       c->state = COMPOSITE_STATE_ERROR;
-                       c->status = status;
-                       goto done;
-               }
-               state->io->in.dest_addr = state->wins_servers[0];
-               state->io->in.dest_port = state->wins_port;
-               state->io->in.address   = state->addresses[0];
-               state->req = nbt_name_refresh_send(state->nbtsock, state->io);
-               if (state->req == NULL) {
-                       c->state = COMPOSITE_STATE_ERROR;
-                       c->status = NT_STATUS_NO_MEMORY;
-               } else {
-                       state->req->async.fn      = name_refresh_wins_handler;
-                       state->req->async.private_data = c;
-               }
-       } else if (!NT_STATUS_IS_OK(status)) {
-               c->state = COMPOSITE_STATE_ERROR;
-               c->status = status;
-       } else {
-               if (state->io->out.rcode == 0 &&
-                   state->addresses[state->address_idx+1] != NULL) {
-                       /* refresh our next address */
-                       state->io->in.address = 
state->addresses[++(state->address_idx)];
-                       state->req = nbt_name_refresh_send(state->nbtsock, 
state->io);
-                       if (state->req == NULL) {
-                               c->state = COMPOSITE_STATE_ERROR;
-                               c->status = NT_STATUS_NO_MEMORY;
-                       } else {
-                               state->req->async.fn      = 
name_refresh_wins_handler;
-                               state->req->async.private_data = c;
-                       }
-               } else {
-                       c->state = COMPOSITE_STATE_DONE;
-                       c->status = NT_STATUS_OK;
-               }
+       struct tevent_req *req;
+       struct nbt_name_refresh_wins_state *state;
+       struct nbt_name_request *subreq;
+
+       req = tevent_req_create(mem_ctx, &state,
+                               struct nbt_name_refresh_wins_state);
+       if (req == NULL) {
+               return NULL;
        }
 
-done:
-       if (c->state >= COMPOSITE_STATE_DONE &&
-           c->async.fn) {
-               c->async.fn(c);
+       state->io = talloc(state, struct nbt_name_refresh);
+       if (tevent_req_nomem(state->io, req)) {
+               return tevent_req_post(req, ev);
        }
-}
 
-/**
-  the async send call for a multi-server WINS refresh
-*/
-_PUBLIC_ struct composite_context *nbt_name_refresh_wins_send(struct 
nbt_name_socket *nbtsock,
-                                                     struct 
nbt_name_refresh_wins *io)
-{
-       struct composite_context *c;
-       struct refresh_wins_state *state;
+       if (io->in.wins_servers == NULL) {
+               tevent_req_nterror(req, NT_STATUS_INVALID_PARAMETER);
+               return tevent_req_post(req, ev);
+       }
 
-       c = talloc_zero(nbtsock, struct composite_context);
-       if (c == NULL) goto failed;
+       if (io->in.wins_servers[0] == NULL) {
+               tevent_req_nterror(req, NT_STATUS_INVALID_PARAMETER);
+               return tevent_req_post(req, ev);
+       }
 
-       state = talloc(c, struct refresh_wins_state);
-       if (state == NULL) goto failed;
+       if (io->in.addresses == NULL) {
+               tevent_req_nterror(req, NT_STATUS_INVALID_PARAMETER);
+               return tevent_req_post(req, ev);
+       }
 
-       state->io = talloc(state, struct nbt_name_refresh);
-       if (state->io == NULL) goto failed;
+       if (io->in.addresses[0] == NULL) {
+               tevent_req_nterror(req, NT_STATUS_INVALID_PARAMETER);
+               return tevent_req_post(req, ev);
+       }
 
        state->wins_port = io->in.wins_port;
-       state->wins_servers = (const char **)str_list_copy(state, 
io->in.wins_servers);
-       if (state->wins_servers == NULL ||
-           state->wins_servers[0] == NULL) goto failed;
+       state->wins_servers = str_list_copy(state, io->in.wins_servers);
+       if (tevent_req_nomem(state->wins_servers, req)) {
+               return tevent_req_post(req, ev);
+       }
 
-       state->addresses = (const char **)str_list_copy(state, 
io->in.addresses);
-       if (state->addresses == NULL ||
-           state->addresses[0] == NULL) goto failed;
+       state->addresses = str_list_copy(state, io->in.addresses);
+       if (tevent_req_nomem(state->addresses, req)) {
+               return tevent_req_post(req, ev);
+       }
 
        state->io->in.name            = io->in.name;
        state->io->in.dest_addr       = state->wins_servers[0];
@@ -254,48 +221,127 @@ _PUBLIC_ struct composite_context 
*nbt_name_refresh_wins_send(struct nbt_name_so
        state->nbtsock     = nbtsock;
        state->address_idx = 0;
 
-       state->req = nbt_name_refresh_send(nbtsock, state->io);
-       if (state->req == NULL) goto failed;
+       subreq = nbt_name_refresh_send(nbtsock, state->io);
+       if (tevent_req_nomem(subreq, req)) {
+               return tevent_req_post(req, ev);
+       }
 
-       state->req->async.fn      = name_refresh_wins_handler;
-       state->req->async.private_data = c;
+       subreq->async.fn = nbt_name_refresh_wins_handler;
+       subreq->async.private_data = req;
 
-       c->private_data = state;
-       c->state        = COMPOSITE_STATE_IN_PROGRESS;
-       c->event_ctx    = nbtsock->event_ctx;
+       return req;
+}
 
-       return c;
+static void nbt_name_refresh_wins_handler(struct nbt_name_request *subreq)
+{
+       struct tevent_req *req =
+               talloc_get_type_abort(subreq->async.private_data,
+               struct tevent_req);
+       struct nbt_name_refresh_wins_state *state =
+               tevent_req_data(req,
+               struct nbt_name_refresh_wins_state);
+       NTSTATUS status;
 
-failed:
-       talloc_free(c);
-       return NULL;
+       status = nbt_name_refresh_recv(subreq, state, state->io);
+       if (NT_STATUS_EQUAL(status, NT_STATUS_IO_TIMEOUT)) {
+               /* the refresh timed out - try the next WINS server */
+               state->wins_servers++;
+               if (state->wins_servers[0] == NULL) {
+                       tevent_req_nterror(req, status);
+                       return;
+               }
+
+               state->address_idx = 0;
+               state->io->in.dest_addr = state->wins_servers[0];
+               state->io->in.dest_port = state->wins_port;
+               state->io->in.address   = state->addresses[0];
+
+               subreq = nbt_name_refresh_send(state->nbtsock, state->io);
+               if (tevent_req_nomem(subreq, req)) {
+                       return;
+               }
+               subreq->async.fn = nbt_name_refresh_wins_handler;
+               subreq->async.private_data = req;
+       } else if (!NT_STATUS_IS_OK(status)) {
+               tevent_req_nterror(req, status);
+               return;
+       }
+
+       if (state->io->out.rcode == 0 &&
+           state->addresses[state->address_idx+1] != NULL) {
+               /* refresh our next address */
+               state->io->in.address = 
state->addresses[++(state->address_idx)];
+               subreq = nbt_name_refresh_send(state->nbtsock, state->io);
+               if (tevent_req_nomem(subreq, req)) {
+                       return;
+               }
+               subreq->async.fn = nbt_name_refresh_wins_handler;
+               subreq->async.private_data = req;
+               return;
+       }
+
+       tevent_req_done(req);
 }
 
 /*
   multi-homed WINS name refresh - recv side
 */
-_PUBLIC_ NTSTATUS nbt_name_refresh_wins_recv(struct composite_context *c, 
TALLOC_CTX *mem_ctx,
-                                    struct nbt_name_refresh_wins *io)
+_PUBLIC_ NTSTATUS nbt_name_refresh_wins_recv(struct tevent_req *req,
+                                            TALLOC_CTX *mem_ctx,
+                                            struct nbt_name_refresh_wins *io)
 {
+       struct nbt_name_refresh_wins_state *state =
+               tevent_req_data(req,
+               struct nbt_name_refresh_wins_state);
        NTSTATUS status;
-       status = composite_wait(c);
-       if (NT_STATUS_IS_OK(status)) {
-               struct refresh_wins_state *state =
-                       talloc_get_type(c->private_data, struct 
refresh_wins_state);
-               io->out.wins_server = talloc_steal(mem_ctx, 
state->wins_servers[0]);
-               io->out.rcode = state->io->out.rcode;
+
+       if (tevent_req_is_nterror(req, &status)) {
+               tevent_req_received(req);
+               return status;
        }
-       talloc_free(c);
-       return status;
+
+       io->out.wins_server = talloc_move(mem_ctx, &state->wins_servers[0]);
+       io->out.rcode = state->io->out.rcode;
+
+       tevent_req_received(req);
+       return NT_STATUS_OK;
 }
 
 /*
   multi-homed WINS refresh - sync interface
 */
 _PUBLIC_ NTSTATUS nbt_name_refresh_wins(struct nbt_name_socket *nbtsock,
-                               TALLOC_CTX *mem_ctx,
-                               struct nbt_name_refresh_wins *io)
+                                       TALLOC_CTX *mem_ctx,
+                                       struct nbt_name_refresh_wins *io)
 {
-       struct composite_context *c = nbt_name_refresh_wins_send(nbtsock, io);
-       return nbt_name_refresh_wins_recv(c, mem_ctx, io);
+       TALLOC_CTX *frame = talloc_stackframe();
+       struct tevent_context *ev;
+       struct tevent_req *subreq;
+       NTSTATUS status;
+
+       /*
+        * TODO: create a temporary event context
+        */
+       ev = nbtsock->event_ctx;
+
+       subreq = nbt_name_refresh_wins_send(frame, ev, nbtsock, io);
+       if (subreq == NULL) {
+               talloc_free(frame);
+               return NT_STATUS_NO_MEMORY;
+       }
+
+       if (!tevent_req_poll(subreq, ev)) {
+               status = map_nt_error_from_unix(errno);
+               talloc_free(frame);
+               return status;
+       }
+
+       status = nbt_name_refresh_wins_recv(subreq, mem_ctx, io);
+       if (!NT_STATUS_IS_OK(status)) {
+               talloc_free(frame);
+               return status;
+       }
+
+       TALLOC_FREE(frame);
+       return NT_STATUS_OK;
 }
diff --git a/libcli/nbt/nameregister.c b/libcli/nbt/nameregister.c
index 39ef056..204fb6f 100644
--- a/libcli/nbt/nameregister.c
+++ b/libcli/nbt/nameregister.c
@@ -20,11 +20,12 @@
 */
 
 #include "includes.h"
+#include <tevent.h>
 #include "../libcli/nbt/libnbt.h"
 #include "../libcli/nbt/nbt_proto.h"
-#include "libcli/composite/composite.h"
 #include "lib/socket/socket.h"
 #include "librpc/gen_ndr/ndr_nbt.h"
+#include "../lib/util/tevent_ntstatus.h"
 
 /*
   send a nbt name registration request
@@ -148,120 +149,115 @@ _PUBLIC_ NTSTATUS nbt_name_register(struct 
nbt_name_socket *nbtsock,
   a 4 step broadcast registration. 3 lots of name registration requests, 
followed by
   a name registration demand
 */
-struct register_bcast_state {
+struct nbt_name_register_bcast_state {
        struct nbt_name_socket *nbtsock;
-       struct nbt_name_register *io;
-       struct nbt_name_request *req;
+       struct nbt_name_register io;
 };
 
+static void nbt_name_register_bcast_handler(struct nbt_name_request *subreq);
 
 /*
-  state handler for 4 stage name registration
+  the async send call for a 4 stage name registration
 */
-static void name_register_bcast_handler(struct nbt_name_request *req)
+_PUBLIC_ struct tevent_req *nbt_name_register_bcast_send(TALLOC_CTX *mem_ctx,
+                                       struct tevent_context *ev,
+                                       struct nbt_name_socket *nbtsock,
+                                       struct nbt_name_register_bcast *io)
 {
-       struct composite_context *c = talloc_get_type(req->async.private_data, 
struct composite_context);
-       struct register_bcast_state *state = talloc_get_type(c->private_data, 
struct register_bcast_state);
-       NTSTATUS status;
+       struct tevent_req *req;
+       struct nbt_name_register_bcast_state *state;
+       struct nbt_name_request *subreq;
+
+       req = tevent_req_create(mem_ctx, &state,
+                               struct nbt_name_register_bcast_state);
+       if (req == NULL) {
+               return NULL;
+       }
 
-       status = nbt_name_register_recv(state->req, state, state->io);
-       if (NT_STATUS_EQUAL(status, NT_STATUS_IO_TIMEOUT)) {
-               if (state->io->in.register_demand == true) {
-                       /* all done */
-                       c->state = COMPOSITE_STATE_DONE;
-                       c->status = NT_STATUS_OK;
-                       goto done;
-               }
+       state->io.in.name            = io->in.name;
+       state->io.in.dest_addr       = io->in.dest_addr;
+       state->io.in.dest_port       = io->in.dest_port;
+       state->io.in.address         = io->in.address;
+       state->io.in.nb_flags        = io->in.nb_flags;
+       state->io.in.register_demand = false;
+       state->io.in.broadcast       = true;
+       state->io.in.multi_homed     = false;
+       state->io.in.ttl             = io->in.ttl;
+       state->io.in.timeout         = 1;
+       state->io.in.retries         = 2;
 
-               /* the registration timed out - good, send the demand */
-               state->io->in.register_demand = true;
-               state->io->in.retries         = 0;
-               state->req = nbt_name_register_send(state->nbtsock, state->io);
-               if (state->req == NULL) {
-                       c->state = COMPOSITE_STATE_ERROR;
-                       c->status = NT_STATUS_NO_MEMORY;
-               } else {
-                       state->req->async.fn      = name_register_bcast_handler;
-                       state->req->async.private_data = c;
-               }
-       } else if (!NT_STATUS_IS_OK(status)) {
-               c->state = COMPOSITE_STATE_ERROR;
-               c->status = status;
-       } else {
-               c->state = COMPOSITE_STATE_ERROR;
-               c->status = NT_STATUS_CONFLICTING_ADDRESSES;
-               DEBUG(3,("Name registration conflict from %s for %s with ip %s 
- rcode %d\n",
-                        state->io->out.reply_from,
-                        nbt_name_string(state, &state->io->out.name),
-                        state->io->out.reply_addr,
-                        state->io->out.rcode));
-       }
+       state->nbtsock = nbtsock;
 
-done:
-       if (c->state >= COMPOSITE_STATE_DONE &&
-           c->async.fn) {
-               c->async.fn(c);
+       subreq = nbt_name_register_send(nbtsock, &state->io);
+       if (tevent_req_nomem(subreq, req)) {
+               return tevent_req_post(req, ev);
        }
+
+       subreq->async.fn = nbt_name_register_bcast_handler;
+       subreq->async.private_data = req;
+
+       return req;
 }
 
-/*
-  the async send call for a 4 stage name registration
-*/
-_PUBLIC_ struct composite_context *nbt_name_register_bcast_send(struct 
nbt_name_socket *nbtsock,
-                                                      struct 
nbt_name_register_bcast *io)
+static void nbt_name_register_bcast_handler(struct nbt_name_request *subreq)
 {
-       struct composite_context *c;
-       struct register_bcast_state *state;
-
-       c = talloc_zero(nbtsock, struct composite_context);
-       if (c == NULL) goto failed;
-
-       state = talloc(c, struct register_bcast_state);
-       if (state == NULL) goto failed;
-
-       state->io = talloc(state, struct nbt_name_register);
-       if (state->io == NULL) goto failed;
-
-       state->io->in.name            = io->in.name;
-       state->io->in.dest_addr       = io->in.dest_addr;
-       state->io->in.dest_port       = io->in.dest_port;


-- 
Samba Shared Repository

Reply via email to