From 89e6a5263e29759c4edd1a8e856443f59dff0c31 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Sun, 7 Feb 2010 13:24:41 +0100 Subject: [PATCH] s3: Add cli_smb() This is a sync wrapper around cli_smb_send/cli_smb_recv. This is a hack to speed up converting libsmb/ away from cli_send_smb/cli_receive_smb. Some routines in libsmb/ are only called in one place in smbtorture for example, where making it async right now is not worth it. With cli_smb_send/cli_smb_recv in place, pushing the asynchronosity out one level is "just" boilerplate code that is easy to do should it become necessary. --- source3/include/proto.h | 7 +++++++ source3/libsmb/clientgen.c | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+) diff --git a/source3/include/proto.h b/source3/include/proto.h index c10a885396c..b120cb1a92b 100644 --- a/source3/include/proto.h +++ b/source3/include/proto.h @@ -2327,6 +2327,13 @@ NTSTATUS cli_echo_recv(struct tevent_req *req); NTSTATUS cli_echo(struct cli_state *cli, uint16_t num_echos, DATA_BLOB data); bool cli_ucs2(struct cli_state *cli); bool is_andx_req(uint8_t cmd); +NTSTATUS cli_smb(TALLOC_CTX *mem_ctx, struct cli_state *cli, + uint8_t smb_command, uint8_t additional_flags, + uint8_t wct, uint16_t *vwv, + uint32_t num_bytes, const uint8_t *bytes, + struct tevent_req **result_parent, + uint8_t min_wct, uint8_t *pwct, uint16_t **pvwv, + uint32_t *pnum_bytes, uint8_t **pbytes); /* The following definitions come from libsmb/clierror.c */ diff --git a/source3/libsmb/clientgen.c b/source3/libsmb/clientgen.c index bdc06f1c74e..0afa9e6be77 100644 --- a/source3/libsmb/clientgen.c +++ b/source3/libsmb/clientgen.c @@ -961,3 +961,39 @@ bool is_andx_req(uint8_t cmd) return false; } + +NTSTATUS cli_smb(TALLOC_CTX *mem_ctx, struct cli_state *cli, + uint8_t smb_command, uint8_t additional_flags, + uint8_t wct, uint16_t *vwv, + uint32_t num_bytes, const uint8_t *bytes, + struct tevent_req **result_parent, + uint8_t min_wct, uint8_t *pwct, uint16_t **pvwv, + uint32_t *pnum_bytes, uint8_t **pbytes) +{ + struct tevent_context *ev; + struct tevent_req *req = NULL; + NTSTATUS status = NT_STATUS_NO_MEMORY; + + if (cli_has_async_calls(cli)) { + return NT_STATUS_INVALID_PARAMETER; + } + ev = tevent_context_init(mem_ctx); + if (ev == NULL) { + goto fail; + } + req = cli_smb_send(mem_ctx, ev, cli, smb_command, additional_flags, + wct, vwv, num_bytes, bytes); + if (req == NULL) { + goto fail; + } + if (!tevent_req_poll_ntstatus(req, ev, &status)) { + goto fail; + } + status = cli_smb_recv(req, min_wct, pwct, pvwv, pnum_bytes, pbytes); +fail: + TALLOC_FREE(ev); + if (NT_STATUS_IS_OK(status)) { + *result_parent = req; + } + return status; +} -- 2.11.4.GIT