Streamline cli_pull sync wrapper
authorVolker Lendecke <vl@samba.org>
Sun, 5 Apr 2009 04:33:17 +0000 (06:33 +0200)
committerVolker Lendecke <vl@samba.org>
Mon, 6 Apr 2009 19:32:07 +0000 (21:32 +0200)
source3/libsmb/clireadwrite.c

index a59b26f9610be1c655a371602a2054615563ad01..08b9684f63af9227138d251a3f165ccf76c695b6 100644 (file)
@@ -512,34 +512,43 @@ NTSTATUS cli_pull(struct cli_state *cli, uint16_t fnum,
        TALLOC_CTX *frame = talloc_stackframe();
        struct event_context *ev;
        struct async_req *req;
-       NTSTATUS result = NT_STATUS_NO_MEMORY;
+       NTSTATUS status = NT_STATUS_OK;
 
-       if (cli->fd_event != NULL) {
+       if (cli_has_async_calls(cli)) {
                /*
                 * Can't use sync call while an async call is in flight
                 */
-               return NT_STATUS_INVALID_PARAMETER;
+               status = NT_STATUS_INVALID_PARAMETER;
+               goto fail;
        }
 
        ev = event_context_init(frame);
        if (ev == NULL) {
-               goto nomem;
+               status = NT_STATUS_NO_MEMORY;
+               goto fail;
        }
 
        req = cli_pull_send(frame, ev, cli, fnum, start_offset, size,
                            window_size, sink, priv);
        if (req == NULL) {
-               goto nomem;
+               status = NT_STATUS_NO_MEMORY;
+               goto fail;
        }
 
        while (req->state < ASYNC_REQ_DONE) {
-               event_loop_once(ev);
+               if (event_loop_once(ev) == -1) {
+                       status = map_nt_error_from_unix(errno);
+                       goto fail;
+               }
        }
 
-       result = cli_pull_recv(req, received);
nomem:
+       status = cli_pull_recv(req, received);
fail:
        TALLOC_FREE(frame);
-       return result;
+       if (!NT_STATUS_IS_OK(status)) {
+               cli_set_error(cli, status);
+       }
+       return status;
 }
 
 static NTSTATUS cli_read_sink(char *buf, size_t n, void *priv)