The branch, master has been updated
       via  283a73c... s3: Trim down smbcontrol a bit
       via  ac5b090... s3: Fix a shadowed variable warning
       via  675d5fe... s3: Fix an uninitialized variable warning
       via  37ac16a... s3: Convert cli_ulogoff to the async API
       via  99f2924... s3: Convert cli_tdis to the async API
      from  41a5149... s3: Slightly simplify winbindd_dual_ccache_ntlm_auth

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 283a73ca9f1b004513e1cf6fc91265a99501594a
Author: Volker Lendecke <[email protected]>
Date:   Sun Jan 3 13:55:54 2010 +0100

    s3: Trim down smbcontrol a bit

commit ac5b090a414e55eb91f8ee5521c1985eabaa4e03
Author: Volker Lendecke <[email protected]>
Date:   Sun Jan 3 12:58:31 2010 +0100

    s3: Fix a shadowed variable warning

commit 675d5fe981cb44e94ebbf4885fea0e976d5c038f
Author: Volker Lendecke <[email protected]>
Date:   Sun Jan 3 12:58:01 2010 +0100

    s3: Fix an uninitialized variable warning

commit 37ac16a88f20ef9a4a8d0fdfa1349a16f818696d
Author: Volker Lendecke <[email protected]>
Date:   Sun Jan 3 13:03:42 2010 +0100

    s3: Convert cli_ulogoff to the async API

commit 99f292479f1253c4cb1845461ae9edec8f155133
Author: Volker Lendecke <[email protected]>
Date:   Sun Jan 3 18:46:57 2010 +0100

    s3: Convert cli_tdis to the async API

-----------------------------------------------------------------------

Summary of changes:
 source3/Makefile.in           |    6 +-
 source3/include/proto.h       |   12 +++-
 source3/libsmb/cliconnect.c   |  176 ++++++++++++++++++++++++++++++++++------
 source3/libsmb/clidfs.c       |    6 +-
 source3/libsmb/libsmb_cache.c |    4 +-
 source3/torture/torture.c     |   41 ++++++----
 source3/utils/net_rpc.c       |   10 ++-
 7 files changed, 202 insertions(+), 53 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/Makefile.in b/source3/Makefile.in
index ad1ce6e..1376f4c 100644
--- a/source3/Makefile.in
+++ b/source3/Makefile.in
@@ -862,10 +862,8 @@ STATUS_OBJ = utils/status.o utils/status_profile.o \
              $(PROFILE_OBJ) $(LIB_NONSMBD_OBJ) $(POPT_LIB_OBJ) \
             $(LIBSAMBA_OBJ) $(FNAME_UTIL_OBJ)
 
-SMBCONTROL_OBJ = utils/smbcontrol.o $(LOCKING_OBJ) $(PARAM_OBJ) \
-       $(PROFILE_OBJ) $(LIB_NONSMBD_OBJ) $(POPT_LIB_OBJ) \
-       $(LIBSAMBA_OBJ) $(FNAME_UTIL_OBJ) \
-       $(PRINTBASE_OBJ)
+SMBCONTROL_OBJ = utils/smbcontrol.o $(PARAM_OBJ) $(LIB_NONSMBD_OBJ) \
+       $(LIBSMB_ERR_OBJ) $(POPT_LIB_OBJ) $(PRINTBASE_OBJ)
 
 SMBTREE_OBJ = utils/smbtree.o $(PARAM_OBJ) \
              $(PROFILE_OBJ) $(LIB_NONSMBD_OBJ) $(LIBSMB_OBJ) \
diff --git a/source3/include/proto.h b/source3/include/proto.h
index 87701bf..b3921c4 100644
--- a/source3/include/proto.h
+++ b/source3/include/proto.h
@@ -2165,7 +2165,11 @@ struct tevent_req 
*cli_session_setup_guest_send(TALLOC_CTX *mem_ctx,
                                                struct event_context *ev,
                                                struct cli_state *cli);
 NTSTATUS cli_session_setup_guest_recv(struct tevent_req *req);
-bool cli_ulogoff(struct cli_state *cli);
+struct tevent_req *cli_ulogoff_send(TALLOC_CTX *mem_ctx,
+                                   struct tevent_context *ev,
+                                   struct cli_state *cli);
+NTSTATUS cli_ulogoff_recv(struct tevent_req *req);
+NTSTATUS cli_ulogoff(struct cli_state *cli);
 struct tevent_req *cli_tcon_andx_create(TALLOC_CTX *mem_ctx,
                                        struct event_context *ev,
                                        struct cli_state *cli,
@@ -2180,7 +2184,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,
diff --git a/source3/libsmb/cliconnect.c b/source3/libsmb/cliconnect.c
index 7815bf9..31216b8 100644
--- a/source3/libsmb/cliconnect.c
+++ b/source3/libsmb/cliconnect.c
@@ -1463,25 +1463,88 @@ NTSTATUS cli_session_setup(struct cli_state *cli,
  Send a uloggoff.
 *****************************************************************************/
 
-bool cli_ulogoff(struct cli_state *cli)
+struct cli_ulogoff_state {
+       struct cli_state *cli;
+       uint16_t vwv[2];
+};
+
+static void cli_ulogoff_done(struct tevent_req *subreq);
+
+struct tevent_req *cli_ulogoff_send(TALLOC_CTX *mem_ctx,
+                                   struct tevent_context *ev,
+                                   struct cli_state *cli)
 {
-       memset(cli->outbuf,'\0',smb_size);
-       cli_set_message(cli->outbuf,2,0,True);
-       SCVAL(cli->outbuf,smb_com,SMBulogoffX);
-       cli_setup_packet(cli);
-       SSVAL(cli->outbuf,smb_vwv0,0xFF);
-       SSVAL(cli->outbuf,smb_vwv2,0);  /* no additional info */
+       struct tevent_req *req, *subreq;
+       struct cli_ulogoff_state *state;
 
-       cli_send_smb(cli);
-       if (!cli_receive_smb(cli))
-               return False;
+       req = tevent_req_create(mem_ctx, &state, struct cli_ulogoff_state);
+       if (req == NULL) {
+               return NULL;
+       }
+       state->cli = cli;
 
-       if (cli_is_error(cli)) {
-               return False;
+       SCVAL(state->vwv+0, 0, 0xFF);
+       SCVAL(state->vwv+1, 0, 0);
+       SSVAL(state->vwv+2, 0, 0);
+
+       subreq = cli_smb_send(state, ev, cli, SMBulogoffX, 0, 2, state->vwv,
+                             0, NULL);
+       if (tevent_req_nomem(subreq, req)) {
+               return tevent_req_post(req, ev);
        }
+       tevent_req_set_callback(subreq, cli_ulogoff_done, req);
+       return req;
+}
+
+static void cli_ulogoff_done(struct tevent_req *subreq)
+{
+       struct tevent_req *req = tevent_req_callback_data(
+               subreq, struct tevent_req);
+       struct cli_ulogoff_state *state = tevent_req_data(
+               req, struct cli_ulogoff_state);
+       NTSTATUS status;
 
-        cli->vuid = -1;
-        return True;
+       status = cli_smb_recv(subreq, 0, NULL, NULL, NULL, NULL);
+       if (!NT_STATUS_IS_OK(status)) {
+               tevent_req_nterror(req, status);
+               return;
+       }
+       state->cli->vuid = -1;
+       tevent_req_done(req);
+}
+
+NTSTATUS cli_ulogoff_recv(struct tevent_req *req)
+{
+       return tevent_req_simple_recv_ntstatus(req);
+}
+
+NTSTATUS cli_ulogoff(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_ulogoff_send(ev, ev, cli);
+       if (req == NULL) {
+               goto fail;
+       }
+       if (!tevent_req_poll_ntstatus(req, ev, &status)) {
+               goto fail;
+       }
+       status = cli_ulogoff_recv(req);
+fail:
+       TALLOC_FREE(ev);
+       if (!NT_STATUS_IS_OK(status)) {
+               cli_set_error(cli, status);
+       }
+       return status;
 }
 
 /****************************************************************************
@@ -1748,24 +1811,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;
 }
 
 /****************************************************************************
diff --git a/source3/libsmb/clidfs.c b/source3/libsmb/clidfs.c
index afae4ff..99f52f4 100644
--- a/source3/libsmb/clidfs.c
+++ b/source3/libsmb/clidfs.c
@@ -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;
        }
 
diff --git a/source3/libsmb/libsmb_cache.c b/source3/libsmb/libsmb_cache.c
index 53cd3d5..f9770d3 100644
--- a/source3/libsmb/libsmb_cache.c
+++ b/source3/libsmb/libsmb_cache.c
@@ -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;
diff --git a/source3/torture/torture.c b/source3/torture/torture.c
index 5a0a300..c7a69ae 100644
--- a/source3/torture/torture.c
+++ b/source3/torture/torture.c
@@ -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;
        }
 
@@ -5321,9 +5325,10 @@ static bool run_sesssetup_bench(int dummy)
 
                d_printf("\r%d   ", (int)c->vuid);
 
-               if (!cli_ulogoff(c)) {
+               status = cli_ulogoff(c);
+               if (!NT_STATUS_IS_OK(status)) {
                        d_printf("(%s) cli_ulogoff failed: %s\n",
-                                __location__, cli_errstr(c));
+                                __location__, nt_errstr(status));
                        return false;
                }
                c->vuid = 0;
@@ -5796,7 +5801,8 @@ static bool run_notify_bench(int dummy)
        struct tevent_context *ev;
        NTSTATUS status;
        uint16_t dnum;
-       struct tevent_req *req1, *req2;
+       struct tevent_req *req1;
+       struct tevent_req *req2 = NULL;
        int i, num_unc_names;
        int num_finished = 0;
 
@@ -5964,7 +5970,7 @@ static bool run_windows_write(int dummy)
        int i;
        bool ret = false;
        const char *fname = "\\writetest.txt";
-       struct timeval start;
+       struct timeval start_time;
        double seconds;
        double kbytes;
 
@@ -5980,7 +5986,7 @@ static bool run_windows_write(int dummy)
 
        cli_sockopt(cli1, sockops);
 
-       start = timeval_current();
+       start_time = timeval_current();
 
        for (i=0; i<torture_numops; i++) {
                char c = 0;
@@ -6002,7 +6008,7 @@ static bool run_windows_write(int dummy)
                }
        }
 
-       seconds = timeval_elapsed(&start);
+       seconds = timeval_elapsed(&start_time);
        kbytes = (double)torture_blocksize * torture_numops;
        kbytes /= 1024;
 
@@ -6042,6 +6048,7 @@ static bool run_uid_regression_test(int dummy)
        int16_t old_vuid;
        int16_t old_cnum;
        bool correct = True;
+       NTSTATUS status;
 
        printf("starting uid regression test\n");
 
@@ -6054,9 +6061,10 @@ static bool run_uid_regression_test(int dummy)
        /* Ok - now save then logoff our current user. */
        old_vuid = cli->vuid;
 
-       if (!cli_ulogoff(cli)) {
+       status = cli_ulogoff(cli);
+       if (!NT_STATUS_IS_OK(status)) {
                d_printf("(%s) cli_ulogoff failed: %s\n",
-                       __location__, cli_errstr(cli));
+                        __location__, nt_errstr(status));
                correct = false;
                goto out;
        }
@@ -6078,17 +6086,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. */
diff --git a/source3/utils/net_rpc.c b/source3/utils/net_rpc.c
index 5b3b1e3..7dc8c1d 100644
--- a/source3/utils/net_rpc.c
+++ b/source3/utils/net_rpc.c
@@ -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;
 }


-- 
Samba Shared Repository

Reply via email to