diff options
| -rw-r--r-- | source3/include/async_smb.h | 2 | ||||
| -rw-r--r-- | source3/libsmb/async_smb.c | 31 | 
2 files changed, 33 insertions, 0 deletions
diff --git a/source3/include/async_smb.h b/source3/include/async_smb.h index ef53ee2163..7fc4ff7d27 100644 --- a/source3/include/async_smb.h +++ b/source3/include/async_smb.h @@ -122,6 +122,8 @@ struct async_req *cli_request_send(TALLOC_CTX *mem_ctx,  				   size_t bytes_alignment,  				   uint32_t num_bytes, const uint8_t *bytes); +uint16_t cli_wct_ofs(const struct cli_state *cli); +  bool cli_chain_cork(struct cli_state *cli, struct event_context *ev,  		    size_t size_hint);  void cli_chain_uncork(struct cli_state *cli); diff --git a/source3/libsmb/async_smb.c b/source3/libsmb/async_smb.c index fdcbb00206..52bfc75009 100644 --- a/source3/libsmb/async_smb.c +++ b/source3/libsmb/async_smb.c @@ -639,6 +639,37 @@ struct async_req *cli_request_send(TALLOC_CTX *mem_ctx,  }  /** + * Calculate the current ofs to wct for requests like write&x + * @param[in] req	The smb request we're currently building + * @retval how many bytes offset have we accumulated? + */ + +uint16_t cli_wct_ofs(const struct cli_state *cli) +{ +	size_t buf_size; + +	if (cli->chain_accumulator == NULL) { +		return smb_wct - 4; +	} + +	buf_size = talloc_get_size(cli->chain_accumulator->outbuf); + +	if (buf_size == smb_wct) { +		return smb_wct - 4; +	} + +	/* +	 * Add alignment for subsequent requests +	 */ + +	if ((buf_size % 4) != 0) { +		buf_size += (4 - (buf_size % 4)); +	} + +	return buf_size - 4; +} + +/**   * Figure out if there is an andx command behind the current one   * @param[in] buf	The smb buffer to look at   * @param[in] ofs	The offset to the wct field that is followed by the cmd  | 
