uint8_t wct, uint16_t *vwv,
int iov_count,
struct iovec *bytes_iov);
-bool cli_smb_req_send(struct tevent_req *req);
+NTSTATUS cli_smb_req_send(struct tevent_req *req);
size_t cli_smb_wct_ofs(struct tevent_req **reqs, int num_reqs);
bool cli_smb_chain_send(struct tevent_req **reqs, int num_reqs);
uint8_t *cli_smb_inbuf(struct tevent_req *req);
return result;
}
-static bool cli_signv(struct cli_state *cli, struct iovec *iov, int count,
- uint32_t *seqnum)
+static NTSTATUS cli_signv(struct cli_state *cli, struct iovec *iov, int count,
+ uint32_t *seqnum)
{
uint8_t *buf;
*/
if ((count <= 0) || (iov[0].iov_len < smb_wct)) {
- return false;
+ return NT_STATUS_INVALID_PARAMETER;
}
buf = iov_concat(talloc_tos(), iov, count);
if (buf == NULL) {
- return false;
+ return NT_STATUS_NO_MEMORY;
}
cli_calculate_sign_mac(cli, (char *)buf, seqnum);
memcpy(iov[0].iov_base, buf, iov[0].iov_len);
TALLOC_FREE(buf);
- return true;
+ return NT_STATUS_OK;
}
static void cli_smb_sent(struct tevent_req *subreq);
-static bool cli_smb_req_iov_send(struct tevent_req *req,
- struct cli_smb_state *state,
- struct iovec *iov, int iov_count)
+static NTSTATUS cli_smb_req_iov_send(struct tevent_req *req,
+ struct cli_smb_state *state,
+ struct iovec *iov, int iov_count)
{
struct tevent_req *subreq;
+ NTSTATUS status;
if (iov[0].iov_len < smb_wct) {
- return false;
+ return NT_STATUS_INVALID_PARAMETER;
}
if (state->mid != 0) {
smb_setlen((char *)iov[0].iov_base, iov_len(iov, iov_count) - 4);
- if (!cli_signv(state->cli, iov, iov_count, &state->seqnum)) {
- return false;
+ status = cli_signv(state->cli, iov, iov_count, &state->seqnum);
+
+ if (!NT_STATUS_IS_OK(status)) {
+ return status;
}
if (cli_encryption_on(state->cli)) {
- NTSTATUS status;
char *buf, *enc_buf;
buf = (char *)iov_concat(talloc_tos(), iov, iov_count);
if (buf == NULL) {
- return false;
+ return NT_STATUS_NO_MEMORY;
}
status = cli_encrypt_message(state->cli, (char *)buf,
&enc_buf);
if (!NT_STATUS_IS_OK(status)) {
DEBUG(0, ("Error in encrypting client message: %s\n",
nt_errstr(status)));
- return false;
+ return status;
}
buf = (char *)talloc_memdup(state, enc_buf,
smb_len(enc_buf)+4);
SAFE_FREE(enc_buf);
if (buf == NULL) {
- return false;
+ return NT_STATUS_NO_MEMORY;
}
iov[0].iov_base = (void *)buf;
iov[0].iov_len = talloc_get_size(buf);
state->cli->fd, iov, iov_count);
}
if (subreq == NULL) {
- return false;
+ return NT_STATUS_NO_MEMORY;
}
tevent_req_set_callback(subreq, cli_smb_sent, req);
- return true;
+ return NT_STATUS_OK;
}
-bool cli_smb_req_send(struct tevent_req *req)
+NTSTATUS cli_smb_req_send(struct tevent_req *req)
{
struct cli_smb_state *state = tevent_req_data(
req, struct cli_smb_state);
if (state->cli->fd == -1) {
- return false;
+ return NT_STATUS_CONNECTION_DISCONNECTED;
}
return cli_smb_req_iov_send(req, state, state->iov, state->iov_count);
{
struct tevent_req *req;
struct iovec iov;
+ NTSTATUS status;
iov.iov_base = CONST_DISCARD(void *, bytes);
iov.iov_len = num_bytes;
if (req == NULL) {
return NULL;
}
- if (!cli_smb_req_send(req)) {
- TALLOC_FREE(req);
+
+ status = cli_smb_req_send(req);
+ if (!NT_STATUS_IS_OK(status)) {
+ tevent_req_nterror(req, status);
+ return tevent_req_post(req, ev);
}
return req;
}
chain_padding = next_padding;
}
- if (!cli_smb_req_iov_send(reqs[0], last_state, iov, iovlen)) {
+ if (!NT_STATUS_IS_OK(cli_smb_req_iov_send(reqs[0], last_state, iov, iovlen))) {
goto fail;
}
return true;
struct cli_state *cli)
{
struct tevent_req *req, *subreq;
+ NTSTATUS status;
req = cli_session_setup_guest_create(mem_ctx, ev, cli, &subreq);
- if ((req == NULL) || !cli_smb_req_send(subreq)) {
- TALLOC_FREE(req);
+ if (req == NULL) {
return NULL;
}
+
+ status = cli_smb_req_send(subreq);
+ if (NT_STATUS_IS_OK(status)) {
+ tevent_req_nterror(req, status);
+ return tevent_req_post(req, ev);
+ }
return req;
}
const char *pass, int passlen)
{
struct tevent_req *req, *subreq;
+ NTSTATUS status;
req = cli_tcon_andx_create(mem_ctx, ev, cli, share, dev, pass, passlen,
&subreq);
- if ((req == NULL) || !cli_smb_req_send(subreq)) {
- TALLOC_FREE(req);
+ if (req == NULL) {
return NULL;
}
+ status = cli_smb_req_send(subreq);
+ if (!NT_STATUS_IS_OK(status)) {
+ tevent_req_nterror(req, status);
+ return tevent_req_post(req, ev);
+ }
return req;
}
int flags, int share_mode)
{
struct tevent_req *req, *subreq;
+ NTSTATUS status;
req = cli_open_create(mem_ctx, ev, cli, fname, flags, share_mode,
&subreq);
- if ((req == NULL) || !cli_smb_req_send(subreq)) {
- TALLOC_FREE(req);
+ if (req == NULL) {
return NULL;
}
+
+ status = cli_smb_req_send(subreq);
+ if (!NT_STATUS_IS_OK(status)) {
+ tevent_req_nterror(req, status);
+ return tevent_req_post(req, ev);
+ }
return req;
}
uint16_t fnum)
{
struct tevent_req *req, *subreq;
+ NTSTATUS status;
req = cli_close_create(mem_ctx, ev, cli, fnum, &subreq);
- if ((req == NULL) || !cli_smb_req_send(subreq)) {
- TALLOC_FREE(req);
+ if (req == NULL) {
return NULL;
}
+
+ status = cli_smb_req_send(subreq);
+ if (!NT_STATUS_IS_OK(status)) {
+ tevent_req_nterror(req, status);
+ return tevent_req_post(req, ev);
+ }
return req;
}
off_t offset, size_t size)
{
struct tevent_req *req, *subreq;
+ NTSTATUS status;
req = cli_read_andx_create(mem_ctx, ev, cli, fnum, offset, size,
&subreq);
- if ((req == NULL) || !cli_smb_req_send(subreq)) {
- TALLOC_FREE(req);
+ if (req == NULL) {
return NULL;
}
+
+ status = cli_smb_req_send(subreq);
+ if (!NT_STATUS_IS_OK(status)) {
+ tevent_req_nterror(req, status);
+ return tevent_req_post(req, ev);
+ }
return req;
}
off_t offset, size_t size)
{
struct tevent_req *req, *subreq;
+ NTSTATUS status;
req = cli_write_andx_create(mem_ctx, ev, cli, fnum, mode, buf, offset,
size, NULL, 0, &subreq);
- if ((req == NULL) || !cli_smb_req_send(subreq)) {
- TALLOC_FREE(req);
+ if (req == NULL) {
return NULL;
}
+
+ status = cli_smb_req_send(subreq);
+ if (!NT_STATUS_IS_OK(status)) {
+ tevent_req_nterror(req, status);
+ return tevent_req_post(req, ev);
+ }
return req;
}
struct cli_trans_state *state;
int iov_count;
uint8_t wct;
+ NTSTATUS status;
req = tevent_req_create(mem_ctx, &state, struct cli_trans_state);
if (req == NULL) {
return tevent_req_post(req, ev);
}
state->mid = cli_smb_req_mid(subreq);
- if (!cli_smb_req_send(subreq)) {
- tevent_req_nterror(req, NT_STATUS_NO_MEMORY);
+ status = cli_smb_req_send(subreq);
+ if (!NT_STATUS_IS_OK(status)) {
+ tevent_req_nterror(req, status);
return tevent_req_post(req, state->ev);
}
cli_state_seqnum_persistent(cli, state->mid);
}
cli_smb_req_set_mid(subreq, state->mid);
- if (!cli_smb_req_send(subreq)) {
- status = NT_STATUS_NO_MEMORY;
+ status = cli_smb_req_send(subreq);
+
+ if (!NT_STATUS_IS_OK(status)) {
goto fail;
}
tevent_req_set_callback(subreq, cli_trans_done, req);