diff options
author | Stefan Metzmacher <metze@samba.org> | 2011-08-12 14:50:09 +0200 |
---|---|---|
committer | Stefan Metzmacher <metze@samba.org> | 2011-08-12 18:06:04 +0200 |
commit | c485df9530fda65fb1a2142f53c60638d2ca1923 (patch) | |
tree | ec6cdf534838e86dbe3ab2a0904c9dc73f01c598 | |
parent | 58003b5a77910ec54fd84f71a26e582af0f83e98 (diff) | |
download | samba-c485df9530fda65fb1a2142f53c60638d2ca1923.tar.gz samba-c485df9530fda65fb1a2142f53c60638d2ca1923.tar.bz2 samba-c485df9530fda65fb1a2142f53c60638d2ca1923.zip |
s3:libsmb: abstract the incoming dispatch function via a function pointer
This will allow handling of SMB2 in future.
metze
-rw-r--r-- | source3/include/client.h | 11 | ||||
-rw-r--r-- | source3/libsmb/async_smb.c | 11 |
2 files changed, 17 insertions, 5 deletions
diff --git a/source3/include/client.h b/source3/include/client.h index f44e52f8f6..79ce709069 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 b3de5af50b..b07eee9e10 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)) { /* |