r10490: - allow deferred irpc replies to set the status
authorAndrew Tridgell <tridge@samba.org>
Sun, 25 Sep 2005 13:17:03 +0000 (13:17 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 18:38:54 +0000 (13:38 -0500)
- add an example of deferred reply for echodata in LOCAL-IRPC

source/lib/messaging/irpc.h
source/lib/messaging/messaging.c
source/torture/local/irpc.c

index aa06a2de0648a95cc8732ff07164f76e713ae41b..e83e7dce651c69029b08d50cfb6d3ebeab622820 100644 (file)
@@ -34,6 +34,7 @@ struct irpc_message {
        struct messaging_context *msg_ctx;
        struct irpc_list *irpc;
        void *data;
+       struct event_context *ev;
 };
 
 /* don't allow calls to take too long */
@@ -108,6 +109,6 @@ NTSTATUS irpc_call(struct messaging_context *msg_ctx,
 NTSTATUS irpc_add_name(struct messaging_context *msg_ctx, const char *name);
 uint32_t *irpc_servers_byname(struct messaging_context *msg_ctx, const char *name);
 void irpc_remove_name(struct messaging_context *msg_ctx, const char *name);
-NTSTATUS irpc_send_reply(struct irpc_message *m);
+NTSTATUS irpc_send_reply(struct irpc_message *m, NTSTATUS status);
 
 
index 9fcfd589728fcd22b0b5381f2392bdf99c26da17..c3d3ba78993b892de20beaac1481a875922774b3 100644 (file)
@@ -512,12 +512,13 @@ static void irpc_handler_reply(struct messaging_context *msg_ctx, struct irpc_me
 /*
   send a irpc reply
 */
-NTSTATUS irpc_send_reply(struct irpc_message *m)
+NTSTATUS irpc_send_reply(struct irpc_message *m, NTSTATUS status)
 {
        struct ndr_push *push;
-       NTSTATUS status;
        DATA_BLOB packet;
 
+       m->header.status = status;
+
        /* setup the reply */
        push = ndr_push_init_ctx(m->ndr);
        if (push == NULL) {
@@ -582,6 +583,7 @@ static void irpc_handler_request(struct messaging_context *msg_ctx,
        m->msg_ctx     = msg_ctx;
        m->irpc        = i;
        m->data        = r;
+       m->ev          = msg_ctx->event.ev;
 
        m->header.status = i->fn(m, r);
 
@@ -591,7 +593,7 @@ static void irpc_handler_request(struct messaging_context *msg_ctx,
                return;
        }
 
-       irpc_send_reply(m);
+       irpc_send_reply(m, m->header.status);
        return;
 
 failed:
index 3d529fcc492add2bd66a8031938cbcb0bb27792e..861edc42fae3599943ed36c228501c421f1bfee0 100644 (file)
@@ -42,13 +42,30 @@ static NTSTATUS irpc_AddOne(struct irpc_message *irpc, struct echo_AddOne *r)
        return NT_STATUS_OK;
 }
 
+/*
+  a deferred reply to echodata
+*/
+static void deferred_echodata(struct event_context *ev, struct timed_event *te, 
+                             struct timeval t, void *private)
+{
+       struct irpc_message *irpc = talloc_get_type(private, struct irpc_message);
+       struct echo_EchoData *r = irpc->data;
+       r->out.out_data = talloc_memdup(r, r->in.in_data, r->in.len);
+       if (r->out.out_data == NULL) {
+               irpc_send_reply(irpc, NT_STATUS_NO_MEMORY);
+       }
+       printf("sending deferred reply\n");
+       irpc_send_reply(irpc, NT_STATUS_OK);
+}
+
+
 /*
   serve up EchoData over the irpc system
 */
 static NTSTATUS irpc_EchoData(struct irpc_message *irpc, struct echo_EchoData *r)
 {
-       r->out.out_data = talloc_memdup(r, r->in.in_data, r->in.len);
-       NT_STATUS_HAVE_NO_MEMORY(r->out.out_data);
+       irpc->defer_reply = True;
+       event_add_timed(irpc->ev, irpc, timeval_zero(), deferred_echodata, irpc);
        return NT_STATUS_OK;
 }
 
@@ -98,8 +115,8 @@ static BOOL test_echodata(TALLOC_CTX *mem_ctx,
        NTSTATUS status;
 
        /* make the call */
-       r.in.in_data = talloc_strdup(mem_ctx, "0123456789");
-       r.in.len = strlen(r.in.in_data);
+       r.in.in_data = (unsigned char *)talloc_strdup(mem_ctx, "0123456789");
+       r.in.len = strlen((char *)r.in.in_data);
 
        status = IRPC_CALL(msg_ctx1, MSG_ID2, rpcecho, ECHO_ECHODATA, &r, mem_ctx);
        if (!NT_STATUS_IS_OK(status)) {