summaryrefslogtreecommitdiff
path: root/source3/libsmb
diff options
context:
space:
mode:
authorStefan Metzmacher <metze@samba.org>2012-09-28 20:00:21 +0200
committerStefan Metzmacher <metze@samba.org>2012-09-29 10:10:32 +0200
commit4e1306c46a0ab00c2e1a5d78a2f3a9bd9bb45cbe (patch)
tree5b1ad4fa4530e044e3c9ec53aecabd4f279740c8 /source3/libsmb
parentb186fdd185d2d5c7d9abd7f652aed58fec6de2ff (diff)
downloadsamba-4e1306c46a0ab00c2e1a5d78a2f3a9bd9bb45cbe.tar.gz
samba-4e1306c46a0ab00c2e1a5d78a2f3a9bd9bb45cbe.tar.bz2
samba-4e1306c46a0ab00c2e1a5d78a2f3a9bd9bb45cbe.zip
s3:libsmb: make cli_echo* protocol independent
metze
Diffstat (limited to 'source3/libsmb')
-rw-r--r--source3/libsmb/clientgen.c55
1 files changed, 23 insertions, 32 deletions
diff --git a/source3/libsmb/clientgen.c b/source3/libsmb/clientgen.c
index 31af1e7e24..6bc8d0ce70 100644
--- a/source3/libsmb/clientgen.c
+++ b/source3/libsmb/clientgen.c
@@ -454,9 +454,7 @@ time_t cli_state_server_time(struct cli_state *cli)
}
struct cli_echo_state {
- uint16_t vwv[1];
- DATA_BLOB data;
- int num_echos;
+ bool is_smb2;
};
static void cli_echo_done(struct tevent_req *subreq);
@@ -472,20 +470,25 @@ struct tevent_req *cli_echo_send(TALLOC_CTX *mem_ctx, struct event_context *ev,
if (req == NULL) {
return NULL;
}
- SSVAL(state->vwv, 0, num_echos);
- state->data = data;
- state->num_echos = num_echos;
- subreq = cli_smb_send(state, ev, cli, SMBecho, 0, 1, state->vwv,
- data.length, data.data);
- if (subreq == NULL) {
- goto fail;
+ if (smbXcli_conn_protocol(cli->conn) >= PROTOCOL_SMB2_02) {
+ state->is_smb2 = true;
+ subreq = smb2cli_echo_send(state, ev,
+ cli->conn,
+ cli->timeout);
+ } else {
+ subreq = smb1cli_echo_send(state, ev,
+ cli->conn,
+ cli->timeout,
+ num_echos,
+ data);
+ }
+ if (tevent_req_nomem(subreq, req)) {
+ return tevent_req_post(req, ev);
}
tevent_req_set_callback(subreq, cli_echo_done, req);
+
return req;
- fail:
- TALLOC_FREE(req);
- return NULL;
}
static void cli_echo_done(struct tevent_req *subreq)
@@ -495,31 +498,19 @@ static void cli_echo_done(struct tevent_req *subreq)
struct cli_echo_state *state = tevent_req_data(
req, struct cli_echo_state);
NTSTATUS status;
- uint32_t num_bytes;
- uint8_t *bytes;
- status = cli_smb_recv(subreq, state, NULL, 0, NULL, NULL,
- &num_bytes, &bytes);
+ if (state->is_smb2) {
+ status = smb2cli_echo_recv(subreq);
+ } else {
+ status = smb1cli_echo_recv(subreq);
+ }
+ TALLOC_FREE(subreq);
if (!NT_STATUS_IS_OK(status)) {
tevent_req_nterror(req, status);
return;
}
- if ((num_bytes != state->data.length)
- || (memcmp(bytes, state->data.data, num_bytes) != 0)) {
- tevent_req_nterror(req, NT_STATUS_INVALID_NETWORK_RESPONSE);
- return;
- }
- state->num_echos -=1;
- if (state->num_echos == 0) {
- tevent_req_done(req);
- return;
- }
-
- if (!smbXcli_req_set_pending(subreq)) {
- tevent_req_nterror(req, NT_STATUS_NO_MEMORY);
- return;
- }
+ tevent_req_done(req);
}
/**