pidl:NDR/Client: Set tevent_req cancel functions and forward to subreqs
authorSamuel Cabrero <scabrero@samba.org>
Tue, 21 Jul 2020 13:35:57 +0000 (15:35 +0200)
committerStefan Metzmacher <metze@samba.org>
Thu, 8 Feb 2024 15:39:20 +0000 (16:39 +0100)
Signed-off-by: Samuel Cabrero <scabrero@samba.org>
Reviewed-by: Stefan Metzmacher <metze@samba.org>
pidl/lib/Parse/Pidl/Samba4/NDR/Client.pm

index 84e2bebbb894a50e64fea45e2c523628bad1ca1e..c02ebc3f42a053c47526a5c991cbc448b2e99ca6 100644 (file)
@@ -48,10 +48,12 @@ sub ParseFunction_r_State($$$$)
        $self->pidl("struct dcerpc_$name\_r_state {");
        $self->indent;
        $self->pidl("TALLOC_CTX *out_mem_ctx;");
+       $self->pidl("struct tevent_req *subreq;");
        $self->deindent;
        $self->pidl("};");
        $self->pidl("");
        $self->pidl("static void dcerpc_$name\_r_done(struct tevent_req *subreq);");
+       $self->pidl("static bool dcerpc_$name\_r_cancel(struct tevent_req *subreq);");
        $self->pidl("");
 }
 
@@ -72,7 +74,6 @@ sub ParseFunction_r_Send($$$$)
 
        $self->pidl("struct tevent_req *req;");
        $self->pidl("struct dcerpc_$name\_r_state *state;");
-       $self->pidl("struct tevent_req *subreq;");
        $self->pidl("");
 
        $self->pidl("req = tevent_req_create(mem_ctx, &state,");
@@ -107,16 +108,16 @@ sub ParseFunction_r_Send($$$$)
        }
        $self->pidl("");
 
-       $self->pidl("subreq = dcerpc_binding_handle_call_send(state, ev, h,");
+       $self->pidl("state->subreq = dcerpc_binding_handle_call_send(state, ev, h,");
        $self->pidl("\t\tNULL, &ndr_table_$if->{NAME},");
        $self->pidl("\t\tNDR_$uname, $submem, r);");
-       $self->pidl("if (tevent_req_nomem(subreq, req)) {");
+       $self->pidl("if (tevent_req_nomem(state->subreq, req)) {");
        $self->indent;
        $self->pidl("return tevent_req_post(req, ev);");
        $self->deindent;
        $self->pidl("}");
-       $self->pidl("tevent_req_set_callback(subreq, dcerpc_$name\_r_done, req);");
-       $self->pidl("");
+       $self->pidl("tevent_req_set_callback(state->subreq, dcerpc_$name\_r_done, req);");
+       $self->pidl("tevent_req_set_cancel_fn(req, dcerpc_$name\_r_cancel);");
 
        $self->pidl("return req;");
        $self->deindent;
@@ -156,6 +157,29 @@ sub ParseFunction_r_Done($$$$)
        $self->pidl("");
 }
 
+sub ParseFunction_r_Cancel($$$$)
+{
+       my ($self, $if, $fn, $name) = @_;
+       my $uname = uc $name;
+
+       my $proto = "static bool dcerpc_$name\_r_cancel(struct tevent_req *req)";
+
+       $self->pidl("$proto");
+       $self->pidl("{");
+       $self->indent;
+
+       $self->pidl("struct dcerpc_$name\_r_state *state =");
+       $self->pidl("\ttevent_req_data(req,");
+       $self->pidl("\tstruct dcerpc_$name\_r_state);");
+       $self->pidl("");
+
+       $self->pidl("return tevent_req_cancel(state->subreq);");
+
+       $self->deindent;
+       $self->pidl("}");
+       $self->pidl("");
+}
+
 sub ParseFunction_r_Recv($$$$)
 {
        my ($self, $if, $fn, $name) = @_;
@@ -415,16 +439,19 @@ sub ParseFunction_State($$$$)
 
        my $state_str = "struct dcerpc_$name\_state";
        my $done_fn = "dcerpc_$name\_done";
+       my $cancel_fn = "dcerpc_$name\_cancel";
 
        $self->pidl("$state_str {");
        $self->indent;
        $self->pidl("struct $name orig;");
        $self->pidl("struct $name tmp;");
        $self->pidl("TALLOC_CTX *out_mem_ctx;");
+       $self->pidl("struct tevent_req *subreq;");
        $self->deindent;
        $self->pidl("};");
        $self->pidl("");
        $self->pidl("static void $done_fn(struct tevent_req *subreq);");
+       $self->pidl("static bool $cancel_fn(struct tevent_req *req);");
        $self->pidl("");
 }
 
@@ -437,6 +464,7 @@ sub ParseFunction_Send($$$$)
        my $done_fn = "dcerpc_$name\_done";
        my $out_mem_ctx = "dcerpc_$name\_out_memory";
        my $fn_str = "struct tevent_req *dcerpc_$name\_send";
+       my $cancel_fn = "dcerpc_$name\_cancel";
        my $pad = genpad($fn_str);
 
        $fn_args .= "TALLOC_CTX *mem_ctx";
@@ -454,7 +482,6 @@ sub ParseFunction_Send($$$$)
        $self->indent;
        $self->pidl("struct tevent_req *req;");
        $self->pidl("$state_str *state;");
-       $self->pidl("struct tevent_req *subreq;");
        $self->pidl("");
        $self->pidl("req = tevent_req_create(mem_ctx, &state,");
        $self->pidl("\t\t\t$state_str);");
@@ -508,13 +535,14 @@ sub ParseFunction_Send($$$$)
        $self->pidl("state->tmp = state->orig;");
        $self->pidl("");
 
-       $self->pidl("subreq = dcerpc_$name\_r_send(state, ev, h, &state->tmp);");
-       $self->pidl("if (tevent_req_nomem(subreq, req)) {");
+       $self->pidl("state->subreq = dcerpc_$name\_r_send(state, ev, h, &state->tmp);");
+       $self->pidl("if (tevent_req_nomem(state->subreq, req)) {");
        $self->indent;
        $self->pidl("return tevent_req_post(req, ev);");
        $self->deindent;
        $self->pidl("}");
-       $self->pidl("tevent_req_set_callback(subreq, $done_fn, req);");
+       $self->pidl("tevent_req_set_callback(state->subreq, $done_fn, req);");
+       $self->pidl("tevent_req_set_cancel_fn(req, $cancel_fn);");
        $self->pidl("return req;");
        $self->deindent;
        $self->pidl("}");
@@ -587,6 +615,27 @@ sub ParseFunction_Done($$$$)
        $self->pidl("");
 }
 
+sub ParseFunction_Cancel($$$$)
+{
+       my ($self, $if, $fn, $name) = @_;
+
+       my $state_str = "struct dcerpc_$name\_state";
+       my $cancel_fn = "dcerpc_$name\_cancel";
+
+       $self->pidl("static bool $cancel_fn(struct tevent_req *req)");
+       $self->pidl("{");
+       $self->indent;
+       $self->pidl("$state_str *state = tevent_req_data(");
+       $self->pidl("\treq, $state_str);");
+       $self->pidl("");
+
+       $self->pidl("return tevent_req_cancel(state->subreq);");
+
+       $self->deindent;
+       $self->pidl("}");
+       $self->pidl("");
+}
+
 sub ParseFunction_Recv($$$$)
 {
        my ($self, $if, $fn, $name) = @_;
@@ -752,6 +801,7 @@ sub ParseFunction($$$)
        $self->ParseFunction_r_State($if, $fn, $fn->{NAME});
        $self->ParseFunction_r_Send($if, $fn, $fn->{NAME});
        $self->ParseFunction_r_Done($if, $fn, $fn->{NAME});
+       $self->ParseFunction_r_Cancel($if, $fn, $fn->{NAME});
        $self->ParseFunction_r_Recv($if, $fn, $fn->{NAME});
        $self->ParseFunction_r_Sync($if, $fn, $fn->{NAME});
 
@@ -800,6 +850,7 @@ sub ParseFunction($$$)
        $self->ParseFunction_State($if, $fn, $fn->{NAME});
        $self->ParseFunction_Send($if, $fn, $fn->{NAME});
        $self->ParseFunction_Done($if, $fn, $fn->{NAME});
+       $self->ParseFunction_Cancel($if, $fn, $fn->{NAME});
        $self->ParseFunction_Recv($if, $fn, $fn->{NAME});
        $self->ParseFunction_Sync($if, $fn, $fn->{NAME});