[SCM] Samba Shared Repository - branch master updated

Stefan Metzmacher metze at samba.org
Tue Dec 21 09:44:02 MST 2010


The branch, master has been updated
       via  7a47aed s3:cli_np_tstream: if SMBtrans is desired, the readv needs to wait for the last writev chunk.
      from  41c3bda ldb: Add ldb.Message.add and ldb.Message.elements.

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


- Log -----------------------------------------------------------------
commit 7a47aed770c60af56be65bf7c8c64cdb162754ae
Author: Stefan Metzmacher <metze at samba.org>
Date:   Tue Dec 21 15:43:44 2010 +0100

    s3:cli_np_tstream: if SMBtrans is desired, the readv needs to wait for the last writev chunk.
    
    metze
    
    Autobuild-User: Stefan Metzmacher <metze at samba.org>
    Autobuild-Date: Tue Dec 21 17:43:06 CET 2010 on sn-devel-104

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

Summary of changes:
 source3/libsmb/cli_np_tstream.c |   93 +++++++++++++++++++++++++++++----------
 1 files changed, 70 insertions(+), 23 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/libsmb/cli_np_tstream.c b/source3/libsmb/cli_np_tstream.c
index 409b40d..898b405 100644
--- a/source3/libsmb/cli_np_tstream.c
+++ b/source3/libsmb/cli_np_tstream.c
@@ -39,6 +39,7 @@ struct tstream_cli_np {
 
 	struct {
 		bool active;
+		struct tevent_req *read_req;
 		struct tevent_req *write_req;
 		uint16_t setup[2];
 	} trans;
@@ -182,6 +183,7 @@ NTSTATUS _tstream_cli_np_open_recv(struct tevent_req *req,
 	talloc_set_destructor(cli_nps, tstream_cli_np_destructor);
 
 	cli_nps->trans.active = false;
+	cli_nps->trans.read_req = NULL;
 	cli_nps->trans.write_req = NULL;
 	SSVAL(cli_nps->trans.setup+0, 0, TRANSACT_DCERPCCMD);
 	SSVAL(cli_nps->trans.setup+1, 0, cli_nps->fnum);
@@ -222,6 +224,10 @@ NTSTATUS tstream_cli_np_use_trans(struct tstream_context *stream)
 	struct tstream_cli_np *cli_nps = tstream_context_data(stream,
 					 struct tstream_cli_np);
 
+	if (cli_nps->trans.read_req) {
+		return NT_STATUS_PIPE_BUSY;
+	}
+
 	if (cli_nps->trans.write_req) {
 		return NT_STATUS_PIPE_BUSY;
 	}
@@ -329,6 +335,7 @@ static struct tevent_req *tstream_cli_np_writev_send(TALLOC_CTX *mem_ctx,
 	return req;
 }
 
+static void tstream_cli_np_readv_trans_start(struct tevent_req *req);
 static void tstream_cli_np_writev_write_done(struct tevent_req *subreq);
 
 static void tstream_cli_np_writev_write_next(struct tevent_req *req)
@@ -379,6 +386,12 @@ static void tstream_cli_np_writev_write_next(struct tevent_req *req)
 		return;
 	}
 
+	if (cli_nps->trans.read_req && state->count == 0) {
+		cli_nps->trans.write_req = req;
+		tstream_cli_np_readv_trans_start(cli_nps->trans.read_req);
+		return;
+	}
+
 	subreq = cli_write_andx_send(state, state->ev, cli_nps->cli,
 				     cli_nps->fnum,
 				     8, /* 8 means message mode. */
@@ -512,6 +525,17 @@ struct tstream_cli_np_readv_state {
 	} error;
 };
 
+static int tstream_cli_np_readv_state_destructor(struct tstream_cli_np_readv_state *state)
+{
+	struct tstream_cli_np *cli_nps =
+		tstream_context_data(state->stream,
+		struct tstream_cli_np);
+
+	cli_nps->trans.read_req = NULL;
+
+	return 0;
+}
+
 static void tstream_cli_np_readv_read_next(struct tevent_req *req);
 
 static struct tevent_req *tstream_cli_np_readv_send(TALLOC_CTX *mem_ctx,
@@ -534,6 +558,8 @@ static struct tevent_req *tstream_cli_np_readv_send(TALLOC_CTX *mem_ctx,
 	state->ev = ev;
 	state->ret = 0;
 
+	talloc_set_destructor(state, tstream_cli_np_readv_state_destructor);
+
 	if (!cli_state_is_connected(cli_nps->cli)) {
 		tevent_req_error(req, ENOTCONN);
 		return tevent_req_post(req, ev);
@@ -557,7 +583,6 @@ static struct tevent_req *tstream_cli_np_readv_send(TALLOC_CTX *mem_ctx,
 	return req;
 }
 
-static void tstream_cli_np_readv_trans_done(struct tevent_req *subreq);
 static void tstream_cli_np_readv_read_done(struct tevent_req *subreq);
 
 static void tstream_cli_np_readv_read_next(struct tevent_req *req)
@@ -599,29 +624,15 @@ static void tstream_cli_np_readv_read_next(struct tevent_req *req)
 		return;
 	}
 
-	if (cli_nps->trans.write_req) {
-		state->trans.im = tevent_create_immediate(state);
-		if (tevent_req_nomem(state->trans.im, req)) {
-			return;
-		}
+	if (cli_nps->trans.active) {
+		cli_nps->trans.active = false;
+		cli_nps->trans.read_req = req;
+		return;
+	}
 
-		subreq = cli_trans_send(state, state->ev,
-					cli_nps->cli,
-					SMBtrans,
-					"\\PIPE\\",
-					0, 0, 0,
-					cli_nps->trans.setup, 2,
-					0,
-					NULL, 0, 0,
-					cli_nps->write.buf,
-					cli_nps->write.ofs,
-					TSTREAM_CLI_NP_BUF_SIZE);
-		if (tevent_req_nomem(subreq, req)) {
-			return;
-		}
-		tevent_req_set_callback(subreq,
-					tstream_cli_np_readv_trans_done,
-					req);
+	if (cli_nps->trans.write_req) {
+		cli_nps->trans.read_req = req;
+		tstream_cli_np_readv_trans_start(req);
 		return;
 	}
 
@@ -635,6 +646,42 @@ static void tstream_cli_np_readv_read_next(struct tevent_req *req)
 				req);
 }
 
+static void tstream_cli_np_readv_trans_done(struct tevent_req *subreq);
+
+static void tstream_cli_np_readv_trans_start(struct tevent_req *req)
+{
+	struct tstream_cli_np_readv_state *state =
+		tevent_req_data(req,
+		struct tstream_cli_np_readv_state);
+	struct tstream_cli_np *cli_nps =
+		tstream_context_data(state->stream,
+		struct tstream_cli_np);
+	struct tevent_req *subreq;
+
+	state->trans.im = tevent_create_immediate(state);
+	if (tevent_req_nomem(state->trans.im, req)) {
+		return;
+	}
+
+	subreq = cli_trans_send(state, state->ev,
+				cli_nps->cli,
+				SMBtrans,
+				"\\PIPE\\",
+				0, 0, 0,
+				cli_nps->trans.setup, 2,
+				0,
+				NULL, 0, 0,
+				cli_nps->write.buf,
+				cli_nps->write.ofs,
+				TSTREAM_CLI_NP_BUF_SIZE);
+	if (tevent_req_nomem(subreq, req)) {
+		return;
+	}
+	tevent_req_set_callback(subreq,
+				tstream_cli_np_readv_trans_done,
+				req);
+}
+
 static void tstream_cli_np_readv_disconnect_now(struct tevent_req *req,
 						int error,
 						const char *location);


-- 
Samba Shared Repository


More information about the samba-cvs mailing list