s3:libsmb: split out cli_state_receive_next() from cli_smb_req_set_pending()
authorStefan Metzmacher <metze@samba.org>
Thu, 11 Aug 2011 10:16:02 +0000 (12:16 +0200)
committerStefan Metzmacher <metze@samba.org>
Fri, 12 Aug 2011 09:08:00 +0000 (11:08 +0200)
metze

source3/libsmb/async_smb.c

index b2856f6779fcaa570fecf1eb84c71d1110768bf0..60ba1e550f34b0e1502679cae21f1a49c9a75c88 100644 (file)
@@ -187,7 +187,8 @@ static int cli_smb_req_destructor(struct tevent_req *req)
        return 0;
 }
 
-static void cli_smb_received(struct tevent_req *subreq);
+static bool cli_state_receive_next(struct cli_state *cli);
+static void cli_state_notify_pending(struct cli_state *cli, NTSTATUS status);
 
 bool cli_smb_req_set_pending(struct tevent_req *req)
 {
@@ -209,10 +210,33 @@ bool cli_smb_req_set_pending(struct tevent_req *req)
        cli->conn.pending = pending;
        talloc_set_destructor(req, cli_smb_req_destructor);
 
+       if (!cli_state_receive_next(cli)) {
+               cli_smb_req_unset_pending(req);
+               return false;
+       }
+
+       return true;
+}
+
+static void cli_smb_received(struct tevent_req *subreq);
+
+static bool cli_state_receive_next(struct cli_state *cli)
+{
+       size_t num_pending = talloc_array_length(cli->conn.pending);
+       struct tevent_req *req;
+       struct cli_smb_state *state;
+
        if (cli->conn.read_smb_req != NULL) {
                return true;
        }
 
+       if (num_pending == 0) {
+               return true;
+       }
+
+       req = cli->conn.pending[0];
+       state = tevent_req_data(req, struct cli_smb_state);
+
        /*
         * We're the first ones, add the read_smb request that waits for the
         * answer from the server
@@ -220,7 +244,6 @@ bool cli_smb_req_set_pending(struct tevent_req *req)
        cli->conn.read_smb_req = read_smb_send(cli->conn.pending, state->ev,
                                               cli->conn.fd);
        if (cli->conn.read_smb_req == NULL) {
-               cli_smb_req_unset_pending(req);
                return false;
        }
        tevent_req_set_callback(cli->conn.read_smb_req, cli_smb_received, cli);