s4:wrepl_server: use irpc_binding_handle_by_name() in r_do_challenge()
authorStefan Metzmacher <metze@samba.org>
Fri, 3 Sep 2010 10:58:10 +0000 (12:58 +0200)
committerStefan Metzmacher <metze@samba.org>
Fri, 3 Sep 2010 15:02:09 +0000 (17:02 +0200)
metze

source4/wrepl_server/wrepl_apply_records.c
source4/wrepl_server/wscript_build

index 4eed36bb674606b67de4dd0673ea4e0ad4f4030e..c039ae5fd99b400122503e8e7d400bed074c7fec 100644 (file)
 */
 
 #include "includes.h"
+#include <tevent.h>
 #include "smbd/service_task.h"
 #include "lib/messaging/irpc.h"
-#include "librpc/gen_ndr/ndr_irpc.h"
+#include "librpc/gen_ndr/ndr_irpc_c.h"
 #include "librpc/gen_ndr/ndr_winsrepl.h"
 #include "wrepl_server/wrepl_server.h"
 #include "nbt_server/wins/winsdb.h"
@@ -882,56 +883,55 @@ static NTSTATUS r_do_mhomed_merge(struct wreplsrv_partner *partner,
 }
 
 struct r_do_challenge_state {
-       struct messaging_context *msg_ctx;
+       struct dcerpc_binding_handle *irpc_handle;
        struct wreplsrv_partner *partner;
        struct winsdb_record *rec;
        struct wrepl_wins_owner owner;
        struct wrepl_name replica;
        struct nbtd_proxy_wins_challenge r;
+       struct nbtd_proxy_wins_release_demand dr;
 };
 
-static void r_do_late_release_demand_handler(struct irpc_request *ireq)
+static void r_do_late_release_demand_handler(struct tevent_req *subreq)
 {
        NTSTATUS status;
-       struct r_do_challenge_state *state = talloc_get_type(ireq->async.private_data,
-                                                            struct r_do_challenge_state);
+       struct r_do_challenge_state *state =
+               tevent_req_callback_data(subreq,
+               struct r_do_challenge_state);
+
+       status = dcerpc_nbtd_proxy_wins_release_demand_r_recv(subreq, state);
+       TALLOC_FREE(subreq);
 
-       status = irpc_call_recv(ireq);
        /* don't care about the result */
        talloc_free(state);
 }
 
 static NTSTATUS r_do_late_release_demand(struct r_do_challenge_state *state)
 {
-       struct irpc_request *ireq;
-       struct server_id *nbt_servers;
-       struct nbtd_proxy_wins_release_demand r;
+       struct tevent_req *subreq;
        uint32_t i;
 
        DEBUG(4,("late release demand record %s\n",
                 nbt_name_string(state, &state->replica.name)));
 
-       nbt_servers = irpc_servers_byname(state->msg_ctx, state, "nbt_server");
-       if ((nbt_servers == NULL) || (nbt_servers[0].id == 0)) {
-               return NT_STATUS_INTERNAL_ERROR;
-       }
-
-       r.in.name       = state->replica.name;
-       r.in.num_addrs  = state->r.out.num_addrs;
-       r.in.addrs      = talloc_array(state, struct nbtd_proxy_wins_addr, r.in.num_addrs);
-       NT_STATUS_HAVE_NO_MEMORY(r.in.addrs);
+       state->dr.in.name       = state->replica.name;
+       state->dr.in.num_addrs  = state->r.out.num_addrs;
+       state->dr.in.addrs      = talloc_array(state,
+                                              struct nbtd_proxy_wins_addr,
+                                              state->dr.in.num_addrs);
+       NT_STATUS_HAVE_NO_MEMORY(state->dr.in.addrs);
        /* TODO: fix pidl to handle inline ipv4address arrays */
-       for (i=0; i < r.in.num_addrs; i++) {
-               r.in.addrs[i].addr = state->r.out.addrs[i].addr;
+       for (i=0; i < state->dr.in.num_addrs; i++) {
+               state->dr.in.addrs[i].addr = state->r.out.addrs[i].addr;
        }
 
-       ireq = IRPC_CALL_SEND(state->msg_ctx, nbt_servers[0],
-                             irpc, NBTD_PROXY_WINS_RELEASE_DEMAND,
-                             &r, state);
-       NT_STATUS_HAVE_NO_MEMORY(ireq);
+       subreq = dcerpc_nbtd_proxy_wins_release_demand_r_send(state,
+                       state->partner->service->task->event_ctx,
+                       state->irpc_handle,
+                       &state->dr);
+       NT_STATUS_HAVE_NO_MEMORY(subreq);
 
-       ireq->async.fn          = r_do_late_release_demand_handler;
-       ireq->async.private_data= state;
+       tevent_req_set_callback(subreq, r_do_late_release_demand_handler, state);
 
        return NT_STATUS_OK;
 }
@@ -951,18 +951,20 @@ _UA_UA_DI_PRA<00>: C:BEST vs. B:BEST2 (C:BEST2,LR:BEST2) => C:BEST => NOT REPLAC
 _UA_UA_DI_A<00>: C:BEST vs. B:BEST2 (C:ALL) => B:MHOMED => MHOMED_MERGE
 _UA_MA_DI_A<00>: C:BEST vs. B:BEST2 (C:ALL) => B:MHOMED => MHOMED_MERGE
 */
-static void r_do_challenge_handler(struct irpc_request *ireq)
+static void r_do_challenge_handler(struct tevent_req *subreq)
 {
        NTSTATUS status;
-       struct r_do_challenge_state *state = talloc_get_type(ireq->async.private_data,
-                                                            struct r_do_challenge_state);
+       struct r_do_challenge_state *state =
+               tevent_req_callback_data(subreq,
+               struct r_do_challenge_state);
        bool old_is_subset = false;
        bool new_is_subset = false;
        bool found = false;
        uint32_t i,j;
        uint32_t num_rec_addrs;
 
-       status = irpc_call_recv(ireq);
+       status = dcerpc_nbtd_proxy_wins_challenge_r_recv(subreq, state);
+       TALLOC_FREE(subreq);
 
        DEBUG(4,("r_do_challenge_handler: %s: %s\n", 
                 nbt_name_string(state, &state->replica.name), nt_errstr(status)));
@@ -1033,9 +1035,8 @@ static NTSTATUS r_do_challenge(struct wreplsrv_partner *partner,
                               struct wrepl_wins_owner *owner,
                               struct wrepl_name *replica)
 {
-       struct irpc_request *ireq;
        struct r_do_challenge_state *state;
-       struct server_id *nbt_servers;
+       struct tevent_req *subreq;
        const char **addrs;
        uint32_t i;
 
@@ -1044,7 +1045,6 @@ static NTSTATUS r_do_challenge(struct wreplsrv_partner *partner,
 
        state = talloc_zero(mem_ctx, struct r_do_challenge_state);
        NT_STATUS_HAVE_NO_MEMORY(state);
-       state->msg_ctx  = partner->service->task->msg_ctx;
        state->partner  = partner;
        state->rec      = talloc_steal(state, rec);
        state->owner    = *owner;
@@ -1054,8 +1054,11 @@ static NTSTATUS r_do_challenge(struct wreplsrv_partner *partner,
        talloc_steal(state, replica->owner);
        talloc_steal(state, replica->addresses);
 
-       nbt_servers = irpc_servers_byname(state->msg_ctx, state, "nbt_server");
-       if ((nbt_servers == NULL) || (nbt_servers[0].id == 0)) {
+       state->irpc_handle = irpc_binding_handle_by_name(state,
+                                                        partner->service->task->msg_ctx,
+                                                        "nbt_server",
+                                                        &ndr_table_irpc);
+       if (state->irpc_handle == NULL) {
                return NT_STATUS_INTERNAL_ERROR;
        }
 
@@ -1070,13 +1073,13 @@ static NTSTATUS r_do_challenge(struct wreplsrv_partner *partner,
                state->r.in.addrs[i].addr = addrs[i];
        }
 
-       ireq = IRPC_CALL_SEND(state->msg_ctx, nbt_servers[0],
-                             irpc, NBTD_PROXY_WINS_CHALLENGE,
-                             &state->r, state);
-       NT_STATUS_HAVE_NO_MEMORY(ireq);
+       subreq = dcerpc_nbtd_proxy_wins_challenge_r_send(state,
+                       state->partner->service->task->event_ctx,
+                       state->irpc_handle,
+                       &state->r);
+       NT_STATUS_HAVE_NO_MEMORY(subreq);
 
-       ireq->async.fn          = r_do_challenge_handler;
-       ireq->async.private_data= state;
+       tevent_req_set_callback(subreq, r_do_challenge_handler, state);
 
        talloc_steal(partner, state);
        return NT_STATUS_OK;
index 9923e25d5f7ac9b0ed235df5fd9390e76ea1def0..55e0b553a085d20f27018fe8a61b0af62e384913 100644 (file)
@@ -5,6 +5,6 @@ bld.SAMBA_MODULE('WREPL_SRV',
        autoproto='wrepl_server_proto.h',
        subsystem='service',
        init_function='server_service_wrepl_init',
-       deps='LIBCLI_WREPL WINSDB process_model'
+       deps='LIBCLI_WREPL WINSDB process_model RPC_NDR_IRPC'
        )