$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("");
}
$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,");
}
$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;
$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) = @_;
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("");
}
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";
$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);");
$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("}");
$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) = @_;
$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});
$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});