From: Stefan Metzmacher Date: Fri, 12 Aug 2011 12:50:09 +0000 (+0200) Subject: s3:libsmb: abstract the incoming dispatch function via a function pointer X-Git-Url: http://git.samba.org/idra/samba.git/?p=idra%2Fsamba.git;a=commitdiff_plain;h=c485df9530fda65fb1a2142f53c60638d2ca1923;hp=58003b5a77910ec54fd84f71a26e582af0f83e98 s3:libsmb: abstract the incoming dispatch function via a function pointer This will allow handling of SMB2 in future. metze --- diff --git a/source3/include/client.h b/source3/include/client.h index f44e52f8f6d..79ce709069c 100644 --- a/source3/include/client.h +++ b/source3/include/client.h @@ -128,6 +128,17 @@ struct cli_state { struct tevent_req *read_smb_req; struct tevent_queue *outgoing; struct tevent_req **pending; + /* + * The incoming dispatch function should return: + * - NT_STATUS_RETRY, if more incoming PDUs are expected. + * - NT_STATUS_OK, if no more processing is desired, e.g. + * the dispatch function called + * tevent_req_done(). + * - All other return values disconnect the connection. + */ + NTSTATUS (*dispatch_incoming)(struct cli_state *cli, + TALLOC_CTX *frame, + uint8_t *inbuf); } conn; struct { diff --git a/source3/libsmb/async_smb.c b/source3/libsmb/async_smb.c index b3de5af50b0..b07eee9e10e 100644 --- a/source3/libsmb/async_smb.c +++ b/source3/libsmb/async_smb.c @@ -228,6 +228,9 @@ bool cli_smb_req_set_pending(struct tevent_req *req) } static void cli_smb_received(struct tevent_req *subreq); +static NTSTATUS cli_state_dispatch_smb1(struct cli_state *cli, + TALLOC_CTX *frame, + uint8_t *inbuf); static bool cli_state_receive_next(struct cli_state *cli) { @@ -246,6 +249,8 @@ static bool cli_state_receive_next(struct cli_state *cli) req = cli->conn.pending[0]; state = tevent_req_data(req, struct cli_smb_state); + cli->conn.dispatch_incoming = cli_state_dispatch_smb1; + /* * We're the first ones, add the read_smb request that waits for the * answer from the server @@ -579,10 +584,6 @@ static void cli_smb_sent(struct tevent_req *subreq) } } -static NTSTATUS cli_state_dispatch_smb1(struct cli_state *cli, - TALLOC_CTX *frame, - uint8_t *inbuf); - static void cli_smb_received(struct tevent_req *subreq) { struct cli_state *cli = tevent_req_callback_data( @@ -612,7 +613,7 @@ static void cli_smb_received(struct tevent_req *subreq) return; } - status = cli_state_dispatch_smb1(cli, frame, inbuf); + status = cli->conn.dispatch_incoming(cli, frame, inbuf); TALLOC_FREE(frame); if (NT_STATUS_IS_OK(status)) { /*