libsmb: Make cli_ntcreate cancellable
authorVolker Lendecke <vl@samba.org>
Fri, 20 Jun 2014 10:38:36 +0000 (10:38 +0000)
committerVolker Lendecke <vl@samba.org>
Sat, 21 Jun 2014 18:38:11 +0000 (20:38 +0200)
Signed-off-by: Volker Lendecke <vl@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
source3/libsmb/clifile.c

index 2ee6eda956f8d41cf070227b8244bb0011aa16c4..61cb8b598930152d9c5fdd8e92c7a5cf94ef6652 100644 (file)
@@ -1937,9 +1937,11 @@ struct cli_ntcreate_state {
                         struct smb_create_returns *cr);
        struct smb_create_returns cr;
        uint16_t fnum;
+       struct tevent_req *subreq;
 };
 
 static void cli_ntcreate_done(struct tevent_req *subreq);
+static bool cli_ntcreate_cancel(struct tevent_req *req);
 
 struct tevent_req *cli_ntcreate_send(TALLOC_CTX *mem_ctx,
                                     struct tevent_context *ev,
@@ -1983,6 +1985,10 @@ struct tevent_req *cli_ntcreate_send(TALLOC_CTX *mem_ctx,
                return tevent_req_post(req, ev);
        }
        tevent_req_set_callback(subreq, cli_ntcreate_done, req);
+
+       state->subreq = subreq;
+       tevent_req_set_cancel_fn(req, cli_ntcreate_cancel);
+
        return req;
 }
 
@@ -2002,6 +2008,13 @@ static void cli_ntcreate_done(struct tevent_req *subreq)
        tevent_req_done(req);
 }
 
+static bool cli_ntcreate_cancel(struct tevent_req *req)
+{
+       struct cli_ntcreate_state *state = tevent_req_data(
+               req, struct cli_ntcreate_state);
+       return tevent_req_cancel(state->subreq);
+}
+
 NTSTATUS cli_ntcreate_recv(struct tevent_req *req, uint16_t *fnum,
                           struct smb_create_returns *cr)
 {