Simplify async programming a bit with helper routines
authorVolker Lendecke <vl@sernet.de>
Mon, 1 Dec 2008 07:23:35 +0000 (08:23 +0100)
committerVolker Lendecke <vl@samba.org>
Mon, 8 Dec 2008 21:09:33 +0000 (22:09 +0100)
Introduce async_req_is_error() and async_req_simple_recv()

source3/include/async_req.h
source3/lib/async_req.c
source3/lib/async_sock.c
source3/libsmb/clientgen.c
source3/libsmb/clifile.c
source3/libsmb/clireadwrite.c
source3/libsmb/clitrans.c

index 2d01b53814cbe60d8bb28f67fb56dc8e9496573d..14a30696c4d0c906ccf404b54573e3449bdb021d 100644 (file)
@@ -134,4 +134,8 @@ bool async_post_status(struct async_req *req, NTSTATUS status);
 
 bool async_req_nomem(const void *p, struct async_req *req);
 
+bool async_req_is_error(struct async_req *req, NTSTATUS *status);
+
+NTSTATUS async_req_simple_recv(struct async_req *req);
+
 #endif
index 501a6b5524f470e1f2169f661d48f82b5ffdc286..159666f15c874abbf0ac859afc019e7b0459ec90 100644 (file)
@@ -172,3 +172,26 @@ bool async_req_nomem(const void *p, struct async_req *req)
        async_req_error(req, NT_STATUS_NO_MEMORY);
        return true;
 }
+
+bool async_req_is_error(struct async_req *req, NTSTATUS *status)
+{
+       if (req->state < ASYNC_REQ_DONE) {
+               *status = NT_STATUS_INTERNAL_ERROR;
+               return true;
+       }
+       if (req->state == ASYNC_REQ_ERROR) {
+               *status = req->status;
+               return true;
+       }
+       return false;
+}
+
+NTSTATUS async_req_simple_recv(struct async_req *req)
+{
+       NTSTATUS status;
+
+       if (async_req_is_error(req, &status)) {
+               return status;
+       }
+       return NT_STATUS_OK;
+}
index ba860e8e78be4b6963f7cace47b1aef5329b2d8a..225cc7b195e38ff2599ce603fb5ddfd5544f2480 100644 (file)
@@ -364,11 +364,7 @@ struct async_req *sendall_send(TALLOC_CTX *mem_ctx, struct event_context *ev,
 
 NTSTATUS sendall_recv(struct async_req *req)
 {
-       SMB_ASSERT(req->state >= ASYNC_REQ_DONE);
-       if (req->state == ASYNC_REQ_ERROR) {
-               return req->status;
-       }
-       return NT_STATUS_OK;
+       return async_req_simple_recv(req);
 }
 
 /**
@@ -518,11 +514,7 @@ struct async_req *recvall_send(TALLOC_CTX *mem_ctx, struct event_context *ev,
 
 NTSTATUS recvall_recv(struct async_req *req)
 {
-       SMB_ASSERT(req->state >= ASYNC_REQ_DONE);
-       if (req->state == ASYNC_REQ_ERROR) {
-               return req->status;
-       }
-       return NT_STATUS_OK;
+       return async_req_simple_recv(req);
 }
 
 /**
index 8a5aedfde5697d0907d931c15e10cc3e2595e626..d94427809cecd7d479d1fb7d45f19d335b89fb6a 100644 (file)
@@ -732,12 +732,7 @@ struct async_req *cli_echo_send(TALLOC_CTX *mem_ctx, struct event_context *ev,
 
 NTSTATUS cli_echo_recv(struct async_req *req)
 {
-       SMB_ASSERT(req->state >= ASYNC_REQ_DONE);
-       if (req->state == ASYNC_REQ_ERROR) {
-               return req->status;
-       }
-
-       return NT_STATUS_OK;
+       return async_req_simple_recv(req);
 }
 
 /**
index a9e81082eafc0f11b123f4f11db7c154f22c6758..733abb6510ce6f2523005440b5c236ba3b51fc83 100644 (file)
@@ -908,9 +908,8 @@ NTSTATUS cli_open_recv(struct async_req *req, int *fnum)
        uint8_t *bytes;
        NTSTATUS status;
 
-       SMB_ASSERT(req->state >= ASYNC_REQ_DONE);
-       if (req->state == ASYNC_REQ_ERROR) {
-               return req->status;
+       if (async_req_is_error(req, &status)) {
+               return status;
        }
 
        status = cli_pull_reply(req, &wct, &vwv, &num_bytes, &bytes);
@@ -985,10 +984,10 @@ NTSTATUS cli_close_recv(struct async_req *req)
        uint16_t *vwv;
        uint16_t num_bytes;
        uint8_t *bytes;
+       NTSTATUS status;
 
-       SMB_ASSERT(req->state >= ASYNC_REQ_DONE);
-       if (req->state == ASYNC_REQ_ERROR) {
-               return req->status;
+       if (async_req_is_error(req, &status)) {
+               return status;
        }
 
        return cli_pull_reply(req, &wct, &vwv, &num_bytes, &bytes);
index cc982683d0896807cef3b1fb51142f9aaf842cf3..ecf49396d119a0e23122bfb3da2c5fc6cf4a0192 100644 (file)
@@ -112,9 +112,8 @@ NTSTATUS cli_read_andx_recv(struct async_req *req, ssize_t *received,
        NTSTATUS status;
        size_t size;
 
-       SMB_ASSERT(req->state >= ASYNC_REQ_DONE);
-       if (req->state == ASYNC_REQ_ERROR) {
-               return req->status;
+       if (async_req_is_error(req, &status)) {
+               return status;
        }
 
        status = cli_pull_reply(req, &wct, &vwv, &num_bytes, &bytes);
@@ -405,10 +404,10 @@ NTSTATUS cli_pull_recv(struct async_req *req, SMB_OFF_T *received)
 {
        struct cli_pull_state *state = talloc_get_type_abort(
                req->private_data, struct cli_pull_state);
+       NTSTATUS status;
 
-       SMB_ASSERT(req->state >= ASYNC_REQ_DONE);
-       if (req->state == ASYNC_REQ_ERROR) {
-               return req->status;
+       if (async_req_is_error(req, &status)) {
+               return status;
        }
        *received = state->pushed;
        return NT_STATUS_OK;
index bbdfb75fcd1863d3d0e0aba3a53ff78c0064fa89..120b6c0e293b83c7dc7a25d130608de134b15540 100644 (file)
@@ -1316,10 +1316,10 @@ NTSTATUS cli_trans_recv(struct async_req *req, TALLOC_CTX *mem_ctx,
                req->private_data, struct cli_request);
        struct cli_trans_state *state = talloc_get_type_abort(
                cli_req->recv_helper.priv, struct cli_trans_state);
+       NTSTATUS status;
 
-       SMB_ASSERT(req->state >= ASYNC_REQ_DONE);
-       if (req->state == ASYNC_REQ_ERROR) {
-               return req->status;
+       if (async_req_is_error(req, &status)) {
+               return status;
        }
 
        if (setup != NULL) {