[SCM] Samba Shared Repository - branch v3-devel updated - release-3-2-0pre2-4084-gab41017

Volker Lendecke vlendec at samba.org
Tue Sep 9 15:35:00 GMT 2008


The branch, v3-devel has been updated
       via  ab41017896e08d32c8a87bf172654ff2db6b6f1a (commit)
       via  ddc5e77b619db7c2369b3bf72b60360051797087 (commit)
       via  4b8bc5b03d35d563104791c0d8317d9886e4f032 (commit)
       via  23e9fed28cf9998534b3c55f4b20a562da507552 (commit)
       via  c85de4b7b5db8b54b8bf0f91acbd6d08d1b0bc9d (commit)
       via  4252b32db5ef7483f2c5c52312b6e6dc68d1d687 (commit)
       via  d611f599b45ad9dad1027a16a0e8da7d4b96e608 (commit)
       via  d8259cbe666d96cc468203a64fb208c02a64849f (commit)
      from  d87c2192ab7b68b2f68442c50618d94146d77ad9 (commit)

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=v3-devel


- Log -----------------------------------------------------------------
commit ab41017896e08d32c8a87bf172654ff2db6b6f1a
Author: Volker Lendecke <vl at sernet.de>
Date:   Tue Sep 9 15:03:51 2008 +0200

    Convert cli_query_secdesc to the async trans call

commit ddc5e77b619db7c2369b3bf72b60360051797087
Author: Volker Lendecke <vl at sernet.de>
Date:   Tue Sep 9 15:03:34 2008 +0200

    Convert cli_qfileinfo to the async trans call

commit 4b8bc5b03d35d563104791c0d8317d9886e4f032
Author: Volker Lendecke <vl at sernet.de>
Date:   Tue Sep 9 14:47:23 2008 +0200

    Add async trans/trans2/nttrans calls to libsmb
    
    Logic stolen from Samba4, naturally the specific implementation differs a bit.

commit 23e9fed28cf9998534b3c55f4b20a562da507552
Author: Volker Lendecke <vl at sernet.de>
Date:   Tue Sep 9 14:43:20 2008 +0200

    Add some debug to reply_nttrans

commit c85de4b7b5db8b54b8bf0f91acbd6d08d1b0bc9d
Author: Volker Lendecke <vl at sernet.de>
Date:   Tue Sep 9 14:39:45 2008 +0200

    Move setting the mid field in req->outbuf from _cork to _uncork
    
    The async trans calls need this, as for secondary trans calls they have to
    modify the MID from what cli_request_chain() gave us.

commit 4252b32db5ef7483f2c5c52312b6e6dc68d1d687
Author: Volker Lendecke <vl at sernet.de>
Date:   Tue Sep 9 14:37:17 2008 +0200

    Add utility function cli_in_chain()
    
    This gives a hint whether a function is called from within the middle of a
    chain. In particular the trans calls don't really like this.

commit d611f599b45ad9dad1027a16a0e8da7d4b96e608
Author: Volker Lendecke <vl at sernet.de>
Date:   Tue Sep 9 14:35:42 2008 +0200

    make smb_bytes_push_str public

commit d8259cbe666d96cc468203a64fb208c02a64849f
Author: Volker Lendecke <vl at sernet.de>
Date:   Tue Sep 9 14:34:28 2008 +0200

    Add a utility function to append a DATA_BLOB to a talloc object

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

Summary of changes:
 source/include/async_smb.h |    1 +
 source/include/proto.h     |   23 ++
 source/lib/util.c          |   26 ++
 source/libsmb/async_smb.c  |   17 +-
 source/libsmb/clifile.c    |    2 +-
 source/libsmb/clirap.c     |   40 ++--
 source/libsmb/clisecdesc.c |   37 +--
 source/libsmb/clitrans.c   |  701 ++++++++++++++++++++++++++++++++++++++++++++
 source/smbd/nttrans.c      |   11 +
 9 files changed, 814 insertions(+), 44 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source/include/async_smb.h b/source/include/async_smb.h
index e9e1002..4e20618 100644
--- a/source/include/async_smb.h
+++ b/source/include/async_smb.h
@@ -124,6 +124,7 @@ struct async_req *cli_request_send(TALLOC_CTX *mem_ctx,
 bool cli_chain_cork(struct cli_state *cli, struct event_context *ev,
 		    size_t size_hint);
 void cli_chain_uncork(struct cli_state *cli);
+bool cli_in_chain(struct cli_state *cli);
 
 NTSTATUS cli_pull_reply(struct async_req *req,
 			uint8_t *pwct, uint16_t **pvwv,
diff --git a/source/include/proto.h b/source/include/proto.h
index e94a217..2901911 100644
--- a/source/include/proto.h
+++ b/source/include/proto.h
@@ -1354,6 +1354,7 @@ bool mask_match_list(const char *string, char **list, int listLen, bool is_case_
 bool unix_wild_match(const char *pattern, const char *string);
 bool name_to_fqdn(fstring fqdn, const char *name);
 void *talloc_check_name_abort(const void *ptr, const char *name);
+void *talloc_append_blob(TALLOC_CTX *mem_ctx, void *buf, DATA_BLOB blob);
 uint32 map_share_mode_to_deny_mode(uint32 share_access, uint32 private_options);
 pid_t procid_to_pid(const struct server_id *proc);
 void set_my_vnn(uint32 vnn);
@@ -4381,6 +4382,7 @@ int cli_nt_create_full(struct cli_state *cli, const char *fname,
 		 uint32 CreateDisposition, uint32 CreateOptions,
 		 uint8 SecuityFlags);
 int cli_nt_create(struct cli_state *cli, const char *fname, uint32 DesiredAccess);
+uint8_t *smb_bytes_push_str(uint8_t *buf, bool ucs2, const char *str);
 struct async_req *cli_open_send(TALLOC_CTX *mem_ctx, struct event_context *ev,
 				struct cli_state *cli,
 				const char *fname, int flags, int share_mode);
@@ -4730,6 +4732,27 @@ bool cli_send_nt_trans(struct cli_state *cli,
 bool cli_receive_nt_trans(struct cli_state *cli,
 			  char **param, unsigned int *param_len,
 			  char **data, unsigned int *data_len);
+struct async_req *cli_trans_send(
+	TALLOC_CTX *mem_ctx, struct event_context *ev,
+	struct cli_state *cli, uint8_t trans_cmd,
+	const char *pipe_name, uint16_t fid, uint16_t function, int flags,
+	uint16_t *setup, uint8_t num_setup, uint8_t max_setup,
+	uint8_t *param, uint32_t num_param, uint32_t max_param,
+	uint8_t *data, uint32_t num_data, uint32_t max_data);
+NTSTATUS cli_trans_recv(struct async_req *req, TALLOC_CTX *mem_ctx,
+			uint16_t **setup, uint8_t *num_setup,
+			uint8_t **param, uint32_t *num_param,
+			uint8_t **data, uint32_t *num_data);
+NTSTATUS cli_trans(TALLOC_CTX *mem_ctx, struct cli_state *cli,
+		   uint8_t trans_cmd,
+		   const char *pipe_name, uint16_t fid, uint16_t function,
+		   int flags,
+		   uint16_t *setup, uint8_t num_setup, uint8_t max_setup,
+		   uint8_t *param, uint32_t num_param, uint32_t max_param,
+		   uint8_t *data, uint32_t num_data, uint32_t max_data,
+		   uint16_t **rsetup, uint8_t *num_rsetup,
+		   uint8_t **rparam, uint32_t *num_rparam,
+		   uint8_t **rdata, uint32_t *num_rdata);
 
 /* The following definitions come from libsmb/conncache.c  */
 
diff --git a/source/lib/util.c b/source/lib/util.c
index 201d87a..ec43ea7 100644
--- a/source/lib/util.c
+++ b/source/lib/util.c
@@ -2990,6 +2990,32 @@ void *talloc_check_name_abort(const void *ptr, const char *name)
 	return NULL;
 }
 
+/**********************************************************************
+ Append a DATA_BLOB to a talloc'ed object
+***********************************************************************/
+
+void *talloc_append_blob(TALLOC_CTX *mem_ctx, void *buf, DATA_BLOB blob)
+{
+	size_t old_size = 0;
+	char *result;
+
+	if (blob.length == 0) {
+		return buf;
+	}
+
+	if (buf != NULL) {
+		old_size = talloc_get_size(buf);
+	}
+
+	result = (char *)TALLOC_REALLOC(mem_ctx, buf, old_size + blob.length);
+	if (result == NULL) {
+		return NULL;
+	}
+
+	memcpy(result + old_size, blob.data, blob.length);
+	return result;
+}
+
 uint32 map_share_mode_to_deny_mode(uint32 share_access, uint32 private_options)
 {
 	switch (share_access & ~FILE_SHARE_DELETE) {
diff --git a/source/libsmb/async_smb.c b/source/libsmb/async_smb.c
index 435c8c1..eedc7d4 100644
--- a/source/libsmb/async_smb.c
+++ b/source/libsmb/async_smb.c
@@ -137,6 +137,21 @@ static int cli_request_destructor(struct cli_request *req)
 }
 
 /**
+ * Are there already requests waiting in the chain_accumulator?
+ * @param[in] cli	The cli_state we want to check
+ * @retval reply :-)
+ */
+
+bool cli_in_chain(struct cli_state *cli)
+{
+	if (cli->chain_accumulator == NULL) {
+		return false;
+	}
+
+	return (cli->chain_accumulator->num_async != 0);
+}
+
+/**
  * Is the SMB command able to hold an AND_X successor
  * @param[in] cmd	The SMB command in question
  * @retval Can we add a chained request after "cmd"?
@@ -422,7 +437,6 @@ bool cli_chain_cork(struct cli_state *cli, struct event_context *ev,
 	cli_setup_packet_buf(cli, req->outbuf);
 
 	req->mid = cli_new_mid(cli);
-	SSVAL(req->outbuf, smb_mid, req->mid);
 
 	cli->chain_accumulator = req;
 
@@ -453,6 +467,7 @@ void cli_chain_uncork(struct cli_state *cli)
 
 	cli->chain_accumulator = NULL;
 
+	SSVAL(req->outbuf, smb_mid, req->mid);
 	smb_setlen(req->outbuf, talloc_get_size(req->outbuf) - 4);
 
 	cli_calculate_sign_mac(cli, req->outbuf);
diff --git a/source/libsmb/clifile.c b/source/libsmb/clifile.c
index a8b3440..d3819af 100644
--- a/source/libsmb/clifile.c
+++ b/source/libsmb/clifile.c
@@ -781,7 +781,7 @@ int cli_nt_create(struct cli_state *cli, const char *fname, uint32 DesiredAccess
 				FILE_SHARE_READ|FILE_SHARE_WRITE, FILE_OPEN, 0x0, 0x0);
 }
 
-static uint8_t *smb_bytes_push_str(uint8_t *buf, bool ucs2, const char *str)
+uint8_t *smb_bytes_push_str(uint8_t *buf, bool ucs2, const char *str)
 {
 	size_t buflen = talloc_get_size(buf);
 	char *converted;
diff --git a/source/libsmb/clirap.c b/source/libsmb/clirap.c
index 3b4db2e..631bc3f 100644
--- a/source/libsmb/clirap.c
+++ b/source/libsmb/clirap.c
@@ -998,8 +998,9 @@ bool cli_qfileinfo(struct cli_state *cli, int fnum,
 	unsigned int data_len = 0;
 	unsigned int param_len = 0;
 	uint16 setup = TRANSACT2_QFILEINFO;
-	char param[4];
-	char *rparam=NULL, *rdata=NULL;
+	uint8_t param[4];
+	uint8_t *rparam=NULL, *rdata=NULL;
+	NTSTATUS status;
 
 	/* if its a win95 server then fail this - win95 totally screws it
 	   up */
@@ -1010,20 +1011,17 @@ bool cli_qfileinfo(struct cli_state *cli, int fnum,
 	SSVAL(param, 0, fnum);
 	SSVAL(param, 2, SMB_QUERY_FILE_ALL_INFO);
 
-	if (!cli_send_trans(cli, SMBtrans2,
-                            NULL,                         /* name */
-                            -1, 0,                        /* fid, flags */
-                            &setup, 1, 0,                 /* setup, length, max */
-                            param, param_len, 2,          /* param, length, max */
-                            NULL, data_len, cli->max_xmit /* data, length, max */
-                           )) {
-		return False;
-	}
+	status = cli_trans(talloc_tos(), cli, SMBtrans2,
+			   NULL, -1, 0, 0, /* name, fid, function, flags */
+			   &setup, 1, 0,          /* setup, length, max */
+			   param, param_len, 2,   /* param, length, max */
+			   NULL, 0, MIN(cli->max_xmit, 0xffff), /* data, length, max */
+			   NULL, NULL, /* rsetup, length */
+			   &rparam, &param_len,	/* rparam, length */
+			   &rdata, &data_len);
 
-	if (!cli_receive_trans(cli, SMBtrans2,
-                               &rparam, &param_len,
-                               &rdata, &data_len)) {
-		return False;
+	if (!NT_STATUS_IS_OK(status)) {
+		return false;
 	}
 
 	if (!rdata || data_len < 68) {
@@ -1031,16 +1029,16 @@ bool cli_qfileinfo(struct cli_state *cli, int fnum,
 	}
 
 	if (create_time) {
-		*create_time = interpret_long_date(rdata+0);
+		*create_time = interpret_long_date((char *)rdata+0);
 	}
 	if (access_time) {
-		*access_time = interpret_long_date(rdata+8);
+		*access_time = interpret_long_date((char *)rdata+8);
 	}
 	if (write_time) {
-		*write_time = interpret_long_date(rdata+16);
+		*write_time = interpret_long_date((char *)rdata+16);
 	}
 	if (change_time) {
-		*change_time = interpret_long_date(rdata+24);
+		*change_time = interpret_long_date((char *)rdata+24);
 	}
 	if (mode) {
 		*mode = SVAL(rdata, 32);
@@ -1052,8 +1050,8 @@ bool cli_qfileinfo(struct cli_state *cli, int fnum,
 		*ino = IVAL(rdata, 64);
 	}
 
-	SAFE_FREE(rdata);
-	SAFE_FREE(rparam);
+	TALLOC_FREE(rdata);
+	TALLOC_FREE(rparam);
 	return True;
 }
 
diff --git a/source/libsmb/clisecdesc.c b/source/libsmb/clisecdesc.c
index adc6fba..f0b786c 100644
--- a/source/libsmb/clisecdesc.c
+++ b/source/libsmb/clisecdesc.c
@@ -25,8 +25,8 @@
 SEC_DESC *cli_query_secdesc(struct cli_state *cli, int fnum, 
 			    TALLOC_CTX *mem_ctx)
 {
-	char param[8];
-	char *rparam=NULL, *rdata=NULL;
+	uint8_t param[8];
+	uint8_t *rparam=NULL, *rdata=NULL;
 	unsigned int rparam_count=0, rdata_count=0;
 	SEC_DESC *psd = NULL;
 	NTSTATUS status;
@@ -34,27 +34,22 @@ SEC_DESC *cli_query_secdesc(struct cli_state *cli, int fnum,
 	SIVAL(param, 0, fnum);
 	SIVAL(param, 4, 0x7);
 
-	if (!cli_send_nt_trans(cli, 
-			       NT_TRANSACT_QUERY_SECURITY_DESC, 
-			       0, 
-			       NULL, 0, 0,
-			       param, 8, 4,
-			       NULL, 0, 0x10000)) {
-		DEBUG(1,("Failed to send NT_TRANSACT_QUERY_SECURITY_DESC\n"));
-		goto cleanup;
-	}
-
+	status = cli_trans(talloc_tos(), cli, SMBnttrans,
+			   NULL, -1, /* name, fid */
+			   NT_TRANSACT_QUERY_SECURITY_DESC, 0, /* function, flags */
+			   NULL, 0, 0, /* setup, length, max */
+			   param, 8, 4, /* param, length, max */
+			   NULL, 0, 0x10000, /* data, length, max */
+			   NULL, NULL, /* rsetup, length */
+			   &rparam, &rparam_count,
+			   &rdata, &rdata_count);
 
-	if (!cli_receive_nt_trans(cli, 
-				  &rparam, &rparam_count,
-				  &rdata, &rdata_count)) {
-		DEBUG(1,("Failed to recv NT_TRANSACT_QUERY_SECURITY_DESC\n"));
+	if (!NT_STATUS_IS_OK(status)) {
+		DEBUG(1, ("NT_TRANSACT_QUERY_SECURITY_DESC failed: %s\n",
+			  nt_errstr(status)));
 		goto cleanup;
 	}
 
-	if (cli_is_error(cli))
-		goto cleanup;
-
 	status = unmarshall_sec_desc(mem_ctx, (uint8 *)rdata, rdata_count,
 				     &psd);
 
@@ -66,8 +61,8 @@ SEC_DESC *cli_query_secdesc(struct cli_state *cli, int fnum,
 
  cleanup:
 
-	SAFE_FREE(rparam);
-	SAFE_FREE(rdata);
+	TALLOC_FREE(rparam);
+	TALLOC_FREE(rdata);
 
 	return psd;
 }
diff --git a/source/libsmb/clitrans.c b/source/libsmb/clitrans.c
index 4bb70f1..5b84e68 100644
--- a/source/libsmb/clitrans.c
+++ b/source/libsmb/clitrans.c
@@ -701,3 +701,704 @@ bool cli_receive_nt_trans(struct cli_state *cli,
 	client_set_trans_sign_state_off(cli, SVAL(cli->inbuf,smb_mid));
 	return ret;
 }
+
+struct trans_recvblob {
+	uint8_t *data;
+	uint32_t max, total, received;
+};
+
+struct cli_trans_state {
+	struct cli_state *cli;
+	struct event_context *ev;
+	uint8_t cmd;
+	uint16_t mid;
+	const char *pipe_name;
+	uint16_t fid;
+	uint16_t function;
+	int flags;
+	uint16_t *setup;
+	uint8_t num_setup, max_setup;
+	uint8_t *param;
+	uint32_t num_param, param_sent;
+	uint8_t *data;
+	uint32_t num_data, data_sent;
+
+	uint8_t num_rsetup;
+	uint16_t *rsetup;
+	struct trans_recvblob rparam;
+	struct trans_recvblob rdata;
+
+	TALLOC_CTX *secondary_request_ctx;
+};
+
+static void cli_trans_recv_helper(struct async_req *req);
+
+static struct async_req *cli_ship_trans(TALLOC_CTX *mem_ctx,
+					struct cli_trans_state *state)
+{
+	TALLOC_CTX *frame;
+	struct async_req *result = NULL;
+	struct cli_request *cli_req;
+	uint8_t wct;
+	uint16_t *vwv;
+	uint8_t *bytes = NULL;
+	uint16_t param_offset;
+	uint16_t this_param = 0;
+	uint16_t this_data = 0;
+	uint32_t useable_space;
+	uint8_t cmd;
+
+	frame = talloc_stackframe();
+
+	cmd = state->cmd;
+
+	if ((state->param_sent != 0) || (state->data_sent != 0)) {
+		/* The secondary commands are one after the primary ones */
+		cmd += 1;
+	}
+
+	param_offset = smb_size - 4;
+
+	switch (cmd) {
+	case SMBtrans:
+		bytes = TALLOC_ZERO_P(talloc_tos(), uint8_t); /* padding */
+		if (bytes == NULL) {
+			goto fail;
+		}
+		bytes = smb_bytes_push_str(
+			bytes, (state->cli->capabilities & CAP_UNICODE) != 0,
+			state->pipe_name);
+		if (bytes == NULL) {
+			goto fail;
+		}
+		wct = 14 + state->num_setup;
+		param_offset += talloc_get_size(bytes);
+		break;
+	case SMBtrans2:
+		bytes = TALLOC_ARRAY(talloc_tos(), uint8_t, 3); /* padding */
+		if (bytes == NULL) {
+			goto fail;
+		}
+		bytes[0] = 0;
+		bytes[1] = 'D';	/* Copy this from "old" 3.0 behaviour */
+		bytes[2] = ' ';
+		wct = 14 + state->num_setup;
+		param_offset += talloc_get_size(bytes);
+		break;
+	case SMBtranss:
+		wct = 8;
+		break;
+	case SMBtranss2:
+		wct = 9;
+		break;
+	case SMBnttrans:
+		wct = 19 + state->num_setup;
+		break;
+	case SMBnttranss:
+		wct = 18;
+		break;
+	default:
+		goto fail;
+	}
+
+	useable_space = state->cli->max_xmit - smb_size - sizeof(uint16_t)*wct;
+
+	if (state->param_sent < state->num_param) {
+		this_param = MIN(state->num_param - state->param_sent,
+				 useable_space);
+	}
+
+	if (state->data_sent < state->num_data) {
+		this_data = MIN(state->num_data - state->data_sent,
+				useable_space - this_param);
+	}
+
+	vwv = TALLOC_ARRAY(talloc_tos(), uint16_t, wct);
+	if (vwv == NULL) {
+		goto fail;
+	}
+	param_offset += wct * sizeof(uint16_t);
+
+	DEBUG(10, ("num_setup=%u, max_setup=%u, "
+		   "param_total=%u, this_param=%u, max_param=%u, "
+		   "data_total=%u, this_data=%u, max_data=%u, "
+		   "param_offset=%u, param_disp=%u, data_disp=%u\n",
+		   (unsigned)state->num_setup, (unsigned)state->max_setup,
+		   (unsigned)state->num_param, (unsigned)this_param,
+		   (unsigned)state->rparam.max,
+		   (unsigned)state->num_data, (unsigned)this_data,
+		   (unsigned)state->rdata.max,
+		   (unsigned)param_offset,
+		   (unsigned)state->param_sent, (unsigned)state->data_sent));
+
+	switch (cmd) {
+	case SMBtrans:
+	case SMBtrans2:
+		SSVAL(vwv + 0, 0, state->num_param);
+		SSVAL(vwv + 1, 0, state->num_data);
+		SSVAL(vwv + 2, 0, state->rparam.max);
+		SSVAL(vwv + 3, 0, state->rdata.max);
+		SCVAL(vwv + 4, 0, state->max_setup);
+		SCVAL(vwv + 4, 1, 0);	/* reserved */
+		SSVAL(vwv + 5, 0, state->flags);
+		SIVAL(vwv + 6, 0, 0);	/* timeout */
+		SSVAL(vwv + 8, 0, 0);	/* reserved */
+		SSVAL(vwv + 9, 0, this_param);
+		SSVAL(vwv +10, 0, param_offset);
+		SSVAL(vwv +11, 0, this_data);
+		SSVAL(vwv +12, 0, param_offset + this_param);
+		SCVAL(vwv +13, 0, state->num_setup);
+		SCVAL(vwv +13, 1, 0);	/* reserved */
+		memcpy(vwv + 14, state->setup,
+		       sizeof(uint16_t) * state->num_setup);
+		break;
+	case SMBtranss:
+	case SMBtranss2:
+		SSVAL(vwv + 0, 0, state->num_param);
+		SSVAL(vwv + 1, 0, state->num_data);
+		SSVAL(vwv + 2, 0, this_param);
+		SSVAL(vwv + 3, 0, param_offset);
+		SSVAL(vwv + 4, 0, state->param_sent);
+		SSVAL(vwv + 5, 0, this_data);
+		SSVAL(vwv + 6, 0, param_offset + this_param);
+		SSVAL(vwv + 7, 0, state->data_sent);
+		if (cmd == SMBtranss2) {
+			SSVAL(vwv + 8, 0, state->fid);
+		}
+		break;
+	case SMBnttrans:
+		SCVAL(vwv,  0, state->max_setup);
+		SSVAL(vwv,  1, 0); /* reserved */
+		SIVAL(vwv,  3, state->num_param);
+		SIVAL(vwv,  7, state->num_data);
+		SIVAL(vwv, 11, state->rparam.max);
+		SIVAL(vwv, 15, state->rdata.max);
+		SIVAL(vwv, 19, this_param);
+		SIVAL(vwv, 23, param_offset);
+		SIVAL(vwv, 27, this_data);
+		SIVAL(vwv, 31, param_offset + this_param);
+		SCVAL(vwv, 35, state->num_setup);
+		SSVAL(vwv, 36, state->function);
+		memcpy(vwv + 19, state->setup,
+		       sizeof(uint16_t) * state->num_setup);
+		break;
+	case SMBnttranss:
+		SSVAL(vwv,  0, 0); /* reserved */
+		SCVAL(vwv,  2, 0); /* reserved */
+		SIVAL(vwv,  3, state->num_param);
+		SIVAL(vwv,  7, state->num_data);
+		SIVAL(vwv, 11, this_param);
+		SIVAL(vwv, 15, param_offset);
+		SIVAL(vwv, 19, state->param_sent);
+		SIVAL(vwv, 23, this_data);
+		SIVAL(vwv, 27, param_offset + this_param);
+		SIVAL(vwv, 31, state->data_sent);
+		SCVAL(vwv, 35, 0); /* reserved */
+		break;
+	}


-- 
Samba Shared Repository


More information about the samba-cvs mailing list