libcli/nbt: convert nbt_name_register_bcast_send/recv to tevent_req
authorStefan Metzmacher <metze@samba.org>
Mon, 11 Oct 2010 19:18:15 +0000 (21:18 +0200)
committerStefan Metzmacher <metze@samba.org>
Mon, 18 Oct 2010 15:36:16 +0000 (15:36 +0000)
metze

libcli/nbt/libnbt.h
libcli/nbt/nameregister.c
source4/nbt_server/register.c

index dfc3b92f962592c6229d88aa3bcca0ea491d0f2c..21fd8597fe4724d47a4a9c9a8fcbca7d83b5b61d 100644 (file)
@@ -339,13 +339,13 @@ 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 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,
index d0a652d751d0e724f5fbd5accf7d4af2b9c06aec..204fb6f3284fb032c875956bfa6149157d93a095 100644 (file)
@@ -23,7 +23,6 @@
 #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"
@@ -152,120 +151,113 @@ _PUBLIC_ NTSTATUS nbt_name_register(struct nbt_name_socket *nbtsock,
 */
 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 *req);
+static void nbt_name_register_bcast_handler(struct nbt_name_request *subreq);
 
 /*
   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)
+_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;
+       struct tevent_req *req;
        struct nbt_name_register_bcast_state *state;
+       struct nbt_name_request *subreq;
 
-       c = talloc_zero(nbtsock, struct composite_context);
-       if (c == NULL) goto failed;
-
-       state = talloc(c, struct nbt_name_register_bcast_state);
-       if (state == NULL) goto failed;
-
-       state->io = talloc(state, struct nbt_name_register);
-       if (state->io == NULL) goto failed;
+       req = tevent_req_create(mem_ctx, &state,
+                               struct nbt_name_register_bcast_state);
+       if (req == NULL) {
+               return NULL;
+       }
 
-       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;
+       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;
 
        state->nbtsock = nbtsock;
 
-       state->req = nbt_name_register_send(nbtsock, state->io);
-       if (state->req == NULL) goto failed;
-
-       state->req->async.fn = nbt_name_register_bcast_handler;
-       state->req->async.private_data = c;
-
-       c->private_data = state;
-       c->state        = COMPOSITE_STATE_IN_PROGRESS;
-       c->event_ctx    = nbtsock->event_ctx;
+       subreq = nbt_name_register_send(nbtsock, &state->io);
+       if (tevent_req_nomem(subreq, req)) {
+               return tevent_req_post(req, ev);
+       }
 
-       return c;
+       subreq->async.fn = nbt_name_register_bcast_handler;
+       subreq->async.private_data = req;
 
-failed:
-       talloc_free(c);
-       return NULL;
+       return req;
 }
 
-
-/*
-  state handler for 4 stage name registration
-*/
-static void nbt_name_register_bcast_handler(struct nbt_name_request *req)
+static void nbt_name_register_bcast_handler(struct nbt_name_request *subreq)
 {
-       struct composite_context *c = talloc_get_type(req->async.private_data, struct composite_context);
-       struct nbt_name_register_bcast_state *state = talloc_get_type(c->private_data, struct nbt_name_register_bcast_state);
+       struct tevent_req *req =
+               talloc_get_type_abort(subreq->async.private_data,
+               struct tevent_req);
+       struct nbt_name_register_bcast_state *state =
+               tevent_req_data(req,
+               struct nbt_name_register_bcast_state);
        NTSTATUS status;
 
-       status = nbt_name_register_recv(state->req, state, state->io);
+       status = nbt_name_register_recv(subreq, 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;
+               if (state->io.in.register_demand == true) {
+                       tevent_req_done(req);
+                       return;
                }
 
                /* 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 = nbt_name_register_bcast_handler;
-                       state->req->async.private_data = c;
+               state->io.in.register_demand = true;
+               state->io.in.retries         = 0;
+
+               subreq = nbt_name_register_send(state->nbtsock, &state->io);
+               if (tevent_req_nomem(subreq, req)) {
+                       return;
                }
-       } 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));
+
+               subreq->async.fn = nbt_name_register_bcast_handler;
+               subreq->async.private_data = req;
+               return;
        }
 
-done:
-       if (c->state >= COMPOSITE_STATE_DONE &&
-           c->async.fn) {
-               c->async.fn(c);
+       if (!NT_STATUS_IS_OK(status)) {
+               tevent_req_nterror(req, status);
+               return;
        }
+
+       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));
+
+       tevent_req_nterror(req, NT_STATUS_CONFLICTING_ADDRESSES);
 }
 
 /*
   broadcast 4 part name register - recv
 */
-_PUBLIC_ NTSTATUS nbt_name_register_bcast_recv(struct composite_context *c)
+_PUBLIC_ NTSTATUS nbt_name_register_bcast_recv(struct tevent_req *req)
 {
        NTSTATUS status;
-       status = composite_wait(c);
-       talloc_free(c);
-       return status;
+
+       if (tevent_req_is_nterror(req, &status)) {
+               tevent_req_received(req);
+               return status;
+       }
+
+       tevent_req_received(req);
+       return NT_STATUS_OK;
 }
 
 /*
@@ -274,8 +266,36 @@ _PUBLIC_ NTSTATUS nbt_name_register_bcast_recv(struct composite_context *c)
 NTSTATUS nbt_name_register_bcast(struct nbt_name_socket *nbtsock,
                                 struct nbt_name_register_bcast *io)
 {
-       struct composite_context *c = nbt_name_register_bcast_send(nbtsock, io);
-       return nbt_name_register_bcast_recv(c);
+       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_register_bcast_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_register_bcast_recv(subreq);
+       if (!NT_STATUS_IS_OK(status)) {
+               talloc_free(frame);
+               return status;
+       }
+
+       TALLOC_FREE(frame);
+       return NT_STATUS_OK;
 }
 
 
index 48a6319f6e86feedf63b8bd35734fc4c344795da..b166d46b7f9731c24f7b5a978b2fd152c4b59af9 100644 (file)
@@ -136,15 +136,16 @@ struct nbtd_register_name_state {
 /*
   a name registration has completed
 */
-static void nbtd_register_name_handler(struct composite_context *subreq)
+static void nbtd_register_name_handler(struct tevent_req *subreq)
 {
        struct nbtd_register_name_state *state =
-               talloc_get_type_abort(subreq->async.private_data,
+               tevent_req_callback_data(subreq,
                struct nbtd_register_name_state);
        struct nbtd_iface_name *iname = state->iname;
        NTSTATUS status;
 
        status = nbt_name_register_bcast_recv(subreq);
+       TALLOC_FREE(subreq);
        if (NT_STATUS_IS_OK(status)) {
                /* good - nobody complained about our registration */
                iname->nb_flags |= NBT_NM_ACTIVE;
@@ -178,7 +179,7 @@ static void nbtd_register_name_iface(struct nbtd_interface *iface,
        struct nbtd_iface_name *iname;
        const char *scope = lpcfg_netbios_scope(iface->nbtsrv->task->lp_ctx);
        struct nbtd_register_name_state *state;
-       struct composite_context *subreq;
+       struct tevent_req *subreq;
        struct nbtd_server *nbtsrv = iface->nbtsrv;
 
        iname = talloc(iface, struct nbtd_iface_name);
@@ -230,13 +231,13 @@ static void nbtd_register_name_iface(struct nbtd_interface *iface,
 
        nbtsrv->stats.total_sent++;
 
-       subreq = nbt_name_register_bcast_send(iface->nbtsock, &state->io);
+       subreq = nbt_name_register_bcast_send(state, nbtsrv->task->event_ctx,
+                                             iface->nbtsock, &state->io);
        if (subreq == NULL) {
                return;
        }
 
-       subreq->async.fn = nbtd_register_name_handler;
-       subreq->async.private_data = state;
+       tevent_req_set_callback(subreq, nbtd_register_name_handler, state);
 }