s3: Convert cli_tdis to the async API
authorVolker Lendecke <vl@samba.org>
Sun, 3 Jan 2010 17:46:57 +0000 (18:46 +0100)
committerVolker Lendecke <vl@samba.org>
Sun, 3 Jan 2010 20:14:57 +0000 (21:14 +0100)
source3/include/proto.h
source3/libsmb/cliconnect.c
source3/libsmb/clidfs.c
source3/libsmb/libsmb_cache.c
source3/torture/torture.c
source3/utils/net_rpc.c

index 87701bf0b5aa6df0f57dba465e75a2d396a095f3..635cc73bb3c98a1d677de7e14c29604296024be5 100644 (file)
@@ -2180,7 +2180,11 @@ struct tevent_req *cli_tcon_andx_send(TALLOC_CTX *mem_ctx,
 NTSTATUS cli_tcon_andx_recv(struct tevent_req *req);
 NTSTATUS cli_tcon_andx(struct cli_state *cli, const char *share,
                       const char *dev, const char *pass, int passlen);
-bool cli_tdis(struct cli_state *cli);
+struct tevent_req *cli_tdis_send(TALLOC_CTX *mem_ctx,
+                                 struct tevent_context *ev,
+                                 struct cli_state *cli);
+NTSTATUS cli_tdis_recv(struct tevent_req *req);
+NTSTATUS cli_tdis(struct cli_state *cli);
 void cli_negprot_sendsync(struct cli_state *cli);
 NTSTATUS cli_negprot(struct cli_state *cli);
 struct tevent_req *cli_negprot_send(TALLOC_CTX *mem_ctx,
index 7815bf916ecb988e799d9b7a815215319b98e042..bd718bc70a5ade780d88c21bfff925b4595dce7c 100644 (file)
@@ -1748,24 +1748,83 @@ NTSTATUS cli_tcon_andx(struct cli_state *cli, const char *share,
  Send a tree disconnect.
 ****************************************************************************/
 
-bool cli_tdis(struct cli_state *cli)
+struct cli_tdis_state {
+       struct cli_state *cli;
+};
+
+static void cli_tdis_done(struct tevent_req *subreq);
+
+struct tevent_req *cli_tdis_send(TALLOC_CTX *mem_ctx,
+                                struct tevent_context *ev,
+                                struct cli_state *cli)
 {
-       memset(cli->outbuf,'\0',smb_size);
-       cli_set_message(cli->outbuf,0,0,True);
-       SCVAL(cli->outbuf,smb_com,SMBtdis);
-       SSVAL(cli->outbuf,smb_tid,cli->cnum);
-       cli_setup_packet(cli);
+       struct tevent_req *req, *subreq;
+       struct cli_tdis_state *state;
 
-       cli_send_smb(cli);
-       if (!cli_receive_smb(cli))
-               return False;
+       req = tevent_req_create(mem_ctx, &state, struct cli_tdis_state);
+       if (req == NULL) {
+               return NULL;
+       }
+       state->cli = cli;
 
-       if (cli_is_error(cli)) {
-               return False;
+       subreq = cli_smb_send(state, ev, cli, SMBtdis, 0, 0, NULL, 0, NULL);
+       if (tevent_req_nomem(subreq, req)) {
+               return tevent_req_post(req, ev);
        }
+       tevent_req_set_callback(subreq, cli_tdis_done, req);
+       return req;
+}
 
-       cli->cnum = -1;
-       return True;
+static void cli_tdis_done(struct tevent_req *subreq)
+{
+       struct tevent_req *req = tevent_req_callback_data(
+               subreq, struct tevent_req);
+       struct cli_tdis_state *state = tevent_req_data(
+               req, struct cli_tdis_state);
+       NTSTATUS status;
+
+       status = cli_smb_recv(subreq, 0, NULL, NULL, NULL, NULL);
+       TALLOC_FREE(subreq);
+       if (!NT_STATUS_IS_OK(status)) {
+               tevent_req_nterror(req, status);
+               return;
+       }
+       state->cli->cnum = -1;
+       tevent_req_done(req);
+}
+
+NTSTATUS cli_tdis_recv(struct tevent_req *req)
+{
+       return tevent_req_simple_recv_ntstatus(req);
+}
+
+NTSTATUS cli_tdis(struct cli_state *cli)
+{
+       struct tevent_context *ev;
+       struct tevent_req *req;
+       NTSTATUS status = NT_STATUS_NO_MEMORY;
+
+       if (cli_has_async_calls(cli)) {
+               return NT_STATUS_INVALID_PARAMETER;
+       }
+       ev = tevent_context_init(talloc_tos());
+       if (ev == NULL) {
+               goto fail;
+       }
+       req = cli_tdis_send(ev, ev, cli);
+       if (req == NULL) {
+               goto fail;
+       }
+       if (!tevent_req_poll_ntstatus(req, ev, &status)) {
+               goto fail;
+       }
+       status = cli_tdis_recv(req);
+fail:
+       TALLOC_FREE(ev);
+       if (!NT_STATUS_IS_OK(status)) {
+               cli_set_error(cli, status);
+       }
+       return status;
 }
 
 /****************************************************************************
index afae4ff2ab1aa98c1a51bb6027faf84d89b7f5d1..99f52f4ca7b2eaf540eb9db2aac06c871910753a 100644 (file)
@@ -993,6 +993,7 @@ bool cli_check_msdfs_proxy(TALLOC_CTX *ctx,
        bool res;
        uint16 cnum;
        char *newextrapath = NULL;
+       NTSTATUS status;
 
        if (!cli || !sharename) {
                return false;
@@ -1020,7 +1021,7 @@ bool cli_check_msdfs_proxy(TALLOC_CTX *ctx,
        }
 
        if (force_encrypt) {
-               NTSTATUS status = cli_cm_force_encryption(cli,
+               status = cli_cm_force_encryption(cli,
                                        username,
                                        password,
                                        lp_workgroup(),
@@ -1032,7 +1033,8 @@ bool cli_check_msdfs_proxy(TALLOC_CTX *ctx,
 
        res = cli_dfs_get_referral(ctx, cli, fullpath, &refs, &num_refs, &consumed);
 
-       if (!cli_tdis(cli)) {
+       status = cli_tdis(cli);
+       if (!NT_STATUS_IS_OK(status)) {
                return false;
        }
 
index 53cd3d5a77d730c301baeae0d786bf56bbe5ac71..f9770d363ca94e0ad541fbc11773c5d22dc81510 100644 (file)
@@ -151,12 +151,14 @@ SMBC_get_cached_server(SMBCCTX * context,
                          * attribute server connection) is cool.
                          */
                         if (smbc_getOptionOneSharePerServer(context)) {
+                               NTSTATUS status;
                                 /*
                                  * The currently connected share name
                                  * doesn't match the requested share, so
                                  * disconnect from the current share.
                                  */
-                                if (! cli_tdis(srv->server->cli)) {
+                               status = cli_tdis(srv->server->cli);
+                               if (!NT_STATUS_IS_OK(status)) {
                                         /* Sigh. Couldn't disconnect. */
                                         cli_shutdown(srv->server->cli);
                                        srv->server->cli = NULL;
index 5a0a3000920039f0e39a91ca72fc6732aa9e0217..4dd595dbe6207ffa81e202dd39caea520e24c3f7 100644 (file)
@@ -364,8 +364,11 @@ bool torture_cli_session_setup2(struct cli_state *cli, uint16 *new_vuid)
 bool torture_close_connection(struct cli_state *c)
 {
        bool ret = True;
-       if (!cli_tdis(c)) {
-               printf("tdis failed (%s)\n", cli_errstr(c));
+       NTSTATUS status;
+
+       status = cli_tdis(c);
+       if (!NT_STATUS_IS_OK(status)) {
+               printf("tdis failed (%s)\n", nt_errstr(status));
                ret = False;
        }
 
@@ -1192,8 +1195,9 @@ static bool run_tcon_test(int dummy)
 
        cli->cnum = cnum2;
 
-       if (!cli_tdis(cli)) {
-               printf("secondary tdis failed (%s)\n", cli_errstr(cli));
+       status = cli_tdis(cli);
+       if (!NT_STATUS_IS_OK(status)) {
+               printf("secondary tdis failed (%s)\n", nt_errstr(status));
                return False;
        }
 
@@ -6078,17 +6082,20 @@ static bool run_uid_regression_test(int dummy)
        cli->vuid = 0;
 
        /* This should succeed. */
-       if (cli_tdis(cli)) {
+       status = cli_tdis(cli);
+
+       if (NT_STATUS_IS_OK(status)) {
                printf("First tdis with invalid vuid should succeed.\n");
        } else {
-               printf("First tdis failed (%s)\n", cli_errstr(cli));
+               printf("First tdis failed (%s)\n", nt_errstr(status));
        }
 
        cli->vuid = old_vuid;
        cli->cnum = old_cnum;
 
        /* This should fail. */
-       if (cli_tdis(cli)) {
+       status = cli_tdis(cli);
+       if (NT_STATUS_IS_OK(status)) {
                printf("Second tdis with invalid vuid should fail - succeeded instead !.\n");
        } else {
                /* Should be bad tid. */
index 5b3b1e34d748d69ba628d14012bd9e9a2bb5e345..7dc8c1dd2c92daece8d00bbb61063fba87afbd77 100644 (file)
@@ -3074,13 +3074,19 @@ static int rpc_share_list(struct net_context *c, int argc, const char **argv)
 
 static bool check_share_availability(struct cli_state *cli, const char *netname)
 {
-       if (!NT_STATUS_IS_OK(cli_tcon_andx(cli, netname, "A:", "", 0))) {
+       NTSTATUS status;
+
+       status = cli_tcon_andx(cli, netname, "A:", "", 0);
+       if (!NT_STATUS_IS_OK(status)) {
                d_printf(_("skipping   [%s]: not a file share.\n"), netname);
                return false;
        }
 
-       if (!cli_tdis(cli))
+       status = cli_tdis(cli);
+       if (!NT_STATUS_IS_OK(status)) {
+               d_printf(_("cli_tdis returned %s\n"), nt_errstr(status));
                return false;
+       }
 
        return true;
 }