mirror of
https://github.com/samba-team/samba.git
synced 2025-09-14 21:44:19 +03:00
s3:libsmb: add SMB2 support to cli_pull*
Signed-off-by: Stefan Metzmacher <metze@samba.org> Reviewed-by: Jeremy Allison <jra@samba.org>
This commit is contained in:
@@ -360,7 +360,11 @@ struct tevent_req *cli_pull_send(TALLOC_CTX *mem_ctx,
|
|||||||
return tevent_req_post(req, ev);
|
return tevent_req_post(req, ev);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (smbXcli_conn_protocol(state->cli->conn) >= PROTOCOL_SMB2_02) {
|
||||||
|
state->chunk_size = smb2cli_conn_max_read_size(cli->conn);
|
||||||
|
} else {
|
||||||
state->chunk_size = cli_read_max_bufsize(cli);
|
state->chunk_size = cli_read_max_bufsize(cli);
|
||||||
|
}
|
||||||
if (state->chunk_size > page_size) {
|
if (state->chunk_size > page_size) {
|
||||||
state->chunk_size &= ~(page_size - 1);
|
state->chunk_size &= ~(page_size - 1);
|
||||||
}
|
}
|
||||||
@@ -519,6 +523,29 @@ static void cli_pull_chunk_ship(struct cli_pull_chunk *chunk)
|
|||||||
ofs = chunk->ofs + chunk->tmp_size;
|
ofs = chunk->ofs + chunk->tmp_size;
|
||||||
size = chunk->total_size - chunk->tmp_size;
|
size = chunk->total_size - chunk->tmp_size;
|
||||||
|
|
||||||
|
if (smbXcli_conn_protocol(state->cli->conn) >= PROTOCOL_SMB2_02) {
|
||||||
|
uint32_t max_size;
|
||||||
|
|
||||||
|
ok = smb2cli_conn_req_possible(state->cli->conn, &max_size);
|
||||||
|
if (!ok) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* downgrade depending on the available credits
|
||||||
|
*/
|
||||||
|
size = MIN(max_size, size);
|
||||||
|
|
||||||
|
chunk->subreq = cli_smb2_read_send(chunk,
|
||||||
|
state->ev,
|
||||||
|
state->cli,
|
||||||
|
state->fnum,
|
||||||
|
ofs,
|
||||||
|
size);
|
||||||
|
if (tevent_req_nomem(chunk->subreq, req)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
ok = smb1cli_conn_req_possible(state->cli->conn);
|
ok = smb1cli_conn_req_possible(state->cli->conn);
|
||||||
if (!ok) {
|
if (!ok) {
|
||||||
return;
|
return;
|
||||||
@@ -533,6 +560,7 @@ static void cli_pull_chunk_ship(struct cli_pull_chunk *chunk)
|
|||||||
if (tevent_req_nomem(chunk->subreq, req)) {
|
if (tevent_req_nomem(chunk->subreq, req)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
tevent_req_set_callback(chunk->subreq,
|
tevent_req_set_callback(chunk->subreq,
|
||||||
cli_pull_chunk_done,
|
cli_pull_chunk_done,
|
||||||
chunk);
|
chunk);
|
||||||
@@ -557,7 +585,11 @@ static void cli_pull_chunk_done(struct tevent_req *subreq)
|
|||||||
|
|
||||||
chunk->subreq = NULL;
|
chunk->subreq = NULL;
|
||||||
|
|
||||||
|
if (smbXcli_conn_protocol(state->cli->conn) >= PROTOCOL_SMB2_02) {
|
||||||
|
status = cli_smb2_read_recv(subreq, &received, &buf);
|
||||||
|
} else {
|
||||||
status = cli_read_andx_recv(subreq, &received, &buf);
|
status = cli_read_andx_recv(subreq, &received, &buf);
|
||||||
|
}
|
||||||
if (NT_STATUS_EQUAL(status, NT_STATUS_END_OF_FILE)) {
|
if (NT_STATUS_EQUAL(status, NT_STATUS_END_OF_FILE)) {
|
||||||
received = 0;
|
received = 0;
|
||||||
status = NT_STATUS_OK;
|
status = NT_STATUS_OK;
|
||||||
|
Reference in New Issue
Block a user