summaryrefslogtreecommitdiff
path: root/source3
diff options
context:
space:
mode:
Diffstat (limited to 'source3')
-rw-r--r--source3/include/async_smb.h12
-rw-r--r--source3/libsmb/async_smb.c7
2 files changed, 18 insertions, 1 deletions
diff --git a/source3/include/async_smb.h b/source3/include/async_smb.h
index 1053de2942..6a09bb6001 100644
--- a/source3/include/async_smb.h
+++ b/source3/include/async_smb.h
@@ -91,6 +91,18 @@ struct cli_request {
uint8_t *rcvbuf;
} read;
} data;
+
+ /**
+ * For requests that don't follow the strict request/reply pattern
+ * such as the transaction request family and echo requests it is
+ * necessary to break the standard procedure in
+ * handle_incoming_pdu(). For a simple example look at
+ * cli_echo_recv_helper().
+ */
+ struct {
+ void (*fn)(struct async_req *req);
+ void *priv;
+ } recv_helper;
};
/*
diff --git a/source3/libsmb/async_smb.c b/source3/libsmb/async_smb.c
index 4d6c32edfa..b5fa9c44b1 100644
--- a/source3/libsmb/async_smb.c
+++ b/source3/libsmb/async_smb.c
@@ -409,6 +409,7 @@ bool cli_chain_cork(struct cli_state *cli, struct event_context *ev,
req->async = NULL;
req->enc_state = NULL;
+ req->recv_helper.fn = NULL;
SSVAL(req->outbuf, smb_tid, cli->cnum);
cli_setup_packet_buf(cli, req->outbuf);
@@ -822,7 +823,11 @@ static void handle_incoming_pdu(struct cli_state *cli)
* destructor cli_async_req_destructor().
*/
if (req->async[i] != NULL) {
- async_req_done(req->async[i]);
+ if (req->recv_helper.fn != NULL) {
+ req->recv_helper.fn(req->async[i]);
+ } else {
+ async_req_done(req->async[i]);
+ }
}
}
return;