mirror of
https://github.com/samba-team/samba.git
synced 2024-12-27 03:21:53 +03:00
e7f36ff1a5
generate a separate *_send() async function for every RPC call, and
there is a single dcerpc_ndr_request_recv() call that processes the
receive side of any rpc call. The caller can use
dcerpc_event_context() to get a pointer to the event context for the
pipe so that events can be waited for asynchronously.
The only part that remains synchronous is the initial bind
calls. These could also be made async if necessary, although I suspect
most applications won't need them to be.
(This used to be commit f5d004d8eb
)
88 lines
1.9 KiB
Perl
88 lines
1.9 KiB
Perl
###################################################
|
|
# client calls generator
|
|
# Copyright tridge@samba.org 2003
|
|
# released under the GNU GPL
|
|
|
|
package IdlClient;
|
|
|
|
use strict;
|
|
|
|
my($res);
|
|
|
|
#####################################################################
|
|
# parse a function
|
|
sub ParseFunction($)
|
|
{
|
|
my $fn = shift;
|
|
my $name = $fn->{NAME};
|
|
my $uname = uc $name;
|
|
|
|
$res .=
|
|
"
|
|
struct rpc_request *dcerpc_$name\_send(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, struct $name *r)
|
|
{
|
|
if (p->flags & DCERPC_DEBUG_PRINT_IN) {
|
|
NDR_PRINT_IN_DEBUG($name, r);
|
|
}
|
|
|
|
return dcerpc_ndr_request_send(p, DCERPC_$uname, mem_ctx,
|
|
(ndr_push_flags_fn_t) ndr_push_$name,
|
|
(ndr_pull_flags_fn_t) ndr_pull_$name,
|
|
r, sizeof(*r));
|
|
}
|
|
|
|
";
|
|
|
|
$res .=
|
|
"
|
|
NTSTATUS dcerpc_$name(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, struct $name *r)
|
|
{
|
|
struct rpc_request *req = dcerpc_$name\_send(p, mem_ctx, r);
|
|
NTSTATUS status;
|
|
if (req == NULL) return NT_STATUS_NO_MEMORY;
|
|
|
|
status = dcerpc_ndr_request_recv(req);
|
|
|
|
if (NT_STATUS_IS_OK(status) && (p->flags & DCERPC_DEBUG_PRINT_OUT)) {
|
|
NDR_PRINT_OUT_DEBUG($name, r);
|
|
}
|
|
";
|
|
if ($fn->{RETURN_TYPE} eq "NTSTATUS") {
|
|
$res .= "\tif (NT_STATUS_IS_OK(status)) status = r->out.result;\n";
|
|
}
|
|
$res .=
|
|
"
|
|
return status;
|
|
}
|
|
";
|
|
}
|
|
|
|
|
|
#####################################################################
|
|
# parse the interface definitions
|
|
sub ParseInterface($)
|
|
{
|
|
my($interface) = shift;
|
|
my($data) = $interface->{DATA};
|
|
foreach my $d (@{$data}) {
|
|
($d->{TYPE} eq "FUNCTION") &&
|
|
ParseFunction($d);
|
|
}
|
|
}
|
|
|
|
|
|
#####################################################################
|
|
# parse a parsed IDL structure back into an IDL file
|
|
sub Parse($)
|
|
{
|
|
my($idl) = shift;
|
|
$res = "/* dcerpc client calls generated by pidl */\n\n";
|
|
foreach my $x (@{$idl}) {
|
|
($x->{TYPE} eq "INTERFACE") &&
|
|
ParseInterface($x);
|
|
}
|
|
return $res;
|
|
}
|
|
|
|
1;
|