r22486: add a flag to ignore timeouts of a request and don't close
authorStefan Metzmacher <metze@samba.org>
Mon, 23 Apr 2007 12:31:12 +0000 (12:31 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 19:51:32 +0000 (14:51 -0500)
the connection on timeout

metze

source/librpc/rpc/dcerpc.c
source/librpc/rpc/dcerpc.h
source/torture/rpc/echo.c

index 79e897313dd842a5a26078974c5cf3e4571d1d73..e422fa5444ed94cdb599a2951edcfca155f95886 100644 (file)
@@ -673,6 +673,17 @@ static void dcerpc_timeout_handler(struct event_context *ev, struct timed_event
                                   struct timeval t, void *private)
 {
        struct rpc_request *req = talloc_get_type(private, struct rpc_request);
+
+       if (req->ignore_timeout) {
+               dcerpc_req_dequeue(req);
+               req->state = RPC_REQUEST_DONE;
+               req->status = NT_STATUS_IO_TIMEOUT;
+               if (req->async.callback) {
+                       req->async.callback(req);
+               }
+               return;
+       }
+
        dcerpc_connection_dead(req->p->conn, NT_STATUS_IO_TIMEOUT);
 }
 
@@ -945,6 +956,7 @@ static struct rpc_request *dcerpc_request_send(struct dcerpc_pipe *p,
        req->flags = 0;
        req->fault_code = 0;
        req->async_call = async;
+       req->ignore_timeout = False;
        req->async.callback = NULL;
        req->async.private = NULL;
        req->recv_handler = NULL;
index c6dbc3547780decbc4ea691754eb38e9347542b1..ea6c68b28e1a699fe25a758ce112ab3e163a0720 100644 (file)
@@ -246,6 +246,7 @@ struct rpc_request {
        uint16_t opnum;
        DATA_BLOB request_data;
        BOOL async_call;
+       BOOL ignore_timeout;
 
        /* use by the ndr level async recv call */
        struct {
index f2a40912e66df030aa90df4aecf23ad070dfed22..21f8eed00d0eb37692c3896e31215170f8b691a1 100644 (file)
@@ -388,8 +388,12 @@ static bool test_timeout(struct torture_context *tctx,
        r.in.seconds = 2;
        p->request_timeout = 1;
 
-       torture_assert(tctx, req = dcerpc_echo_TestSleep_send(p, tctx, &r), 
-               "Failed to send async sleep request");
+       req = dcerpc_echo_TestSleep_send(p, tctx, &r);
+       if (!req) {
+               torture_comment(tctx, "Failed to send async sleep request\n");
+               goto failed;
+       }
+       req->ignore_timeout = True;
 
        status  = dcerpc_ndr_request_recv(req);
        torture_assert_ntstatus_equal(tctx, status, NT_STATUS_IO_TIMEOUT, 
@@ -408,6 +412,7 @@ static bool test_timeout(struct torture_context *tctx,
                torture_comment(tctx, "Failed to send async sleep request\n");
                goto failed;
        }
+       req->ignore_timeout = True;
        status  = dcerpc_ndr_request_recv(req);
        torture_assert_ntstatus_equal(tctx, status, NT_STATUS_IO_TIMEOUT, 
                "request should have timed out");