From: Volker Lendecke Date: Fri, 16 Nov 2018 18:01:57 +0000 (+0100) Subject: libcli: Make smb2cli_notify_send cancellable X-Git-Tag: tdb-1.3.17~685 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=499d97b38c4477751d2dd38e9882bc7a5c7a8337;p=thirdparty%2Fsamba.git libcli: Make smb2cli_notify_send cancellable Signed-off-by: Volker Lendecke Reviewed-by: Jeremy Allison --- diff --git a/libcli/smb/smb2cli_notify.c b/libcli/smb/smb2cli_notify.c index 1a2a2793a32..9026a6b1c30 100644 --- a/libcli/smb/smb2cli_notify.c +++ b/libcli/smb/smb2cli_notify.c @@ -32,10 +32,12 @@ struct smb2cli_notify_state { uint32_t data_length; struct tevent_req *subreq; + struct tevent_req *timeout_subreq; }; static void smb2cli_notify_done(struct tevent_req *subreq); static void smb2cli_notify_timedout(struct tevent_req *subreq); +static bool smb2cli_notify_cancel(struct tevent_req *req); struct tevent_req *smb2cli_notify_send(TALLOC_CTX *mem_ctx, struct tevent_context *ev, @@ -49,7 +51,7 @@ struct tevent_req *smb2cli_notify_send(TALLOC_CTX *mem_ctx, uint32_t completion_filter, bool recursive) { - struct tevent_req *req, *subreq; + struct tevent_req *req; struct smb2cli_notify_state *state; uint8_t *fixed; uint16_t watch_tree; @@ -83,16 +85,33 @@ struct tevent_req *smb2cli_notify_send(TALLOC_CTX *mem_ctx, } tevent_req_set_callback(state->subreq, smb2cli_notify_done, req); - subreq = tevent_wakeup_send(state, ev, - timeval_current_ofs_msec(timeout_msec)); - if (tevent_req_nomem(subreq, req)) { - return tevent_req_post(req, ev); + if (timeout_msec != 0) { + state->timeout_subreq = tevent_wakeup_send( + state, ev, timeval_current_ofs_msec(timeout_msec)); + if (tevent_req_nomem(state->timeout_subreq, req)) { + return tevent_req_post(req, ev); + } + tevent_req_set_callback( + state->timeout_subreq, smb2cli_notify_timedout, req); } - tevent_req_set_callback(subreq, smb2cli_notify_timedout, req); + + tevent_req_set_cancel_fn(req, smb2cli_notify_cancel); return req; } +static bool smb2cli_notify_cancel(struct tevent_req *req) +{ + struct smb2cli_notify_state *state = tevent_req_data( + req, struct smb2cli_notify_state); + bool ok; + + TALLOC_FREE(state->timeout_subreq); + + ok = tevent_req_cancel(state->subreq); + return ok; +} + static void smb2cli_notify_timedout(struct tevent_req *subreq) { struct tevent_req *req = tevent_req_callback_data(