mirror of
https://github.com/samba-team/samba.git
synced 2024-12-23 17:34:34 +03:00
added a module for auto-generating the client calls. We can now go
from IDL file to working Samba4 RPC client library in a completely
automated fashion.
(This used to be commit 566476b3ff
)
This commit is contained in:
parent
adf6142953
commit
5eb907f1d4
76
source4/build/pidl/client.pm
Normal file
76
source4/build/pidl/client.pm
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
###################################################
|
||||||
|
# client calls generator
|
||||||
|
# Copyright tridge@samba.org 2003
|
||||||
|
# released under the GNU GPL
|
||||||
|
|
||||||
|
package IdlClient;
|
||||||
|
|
||||||
|
use Data::Dumper;
|
||||||
|
|
||||||
|
my($res);
|
||||||
|
|
||||||
|
#####################################################################
|
||||||
|
# parse a function
|
||||||
|
sub ParseFunction($)
|
||||||
|
{
|
||||||
|
my $fn = shift;
|
||||||
|
my $name = $fn->{NAME};
|
||||||
|
my $uname = uc $name;
|
||||||
|
|
||||||
|
if ($fn->{RETURN_TYPE} eq "void") {
|
||||||
|
$res .= "
|
||||||
|
NTSTATUS dcerpc_$name(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, struct $name *r)
|
||||||
|
{
|
||||||
|
return dcerpc_ndr_request(p, DCERPC_$uname, mem_ctx,
|
||||||
|
(ndr_push_fn_t) ndr_push_$name,
|
||||||
|
(ndr_pull_fn_t) ndr_pull_$name,
|
||||||
|
r);
|
||||||
|
}
|
||||||
|
";
|
||||||
|
} else {
|
||||||
|
$res .= "
|
||||||
|
NTSTATUS dcerpc_$name(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, struct $name *r)
|
||||||
|
{
|
||||||
|
NTSTATUS status;
|
||||||
|
status = dcerpc_ndr_request(p, DCERPC_$uname, mem_ctx,
|
||||||
|
(ndr_push_fn_t) ndr_push_$name,
|
||||||
|
(ndr_pull_fn_t) ndr_pull_$name,
|
||||||
|
r);
|
||||||
|
if (!NT_STATUS_IS_OK(status)) {
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
return r->out.result;
|
||||||
|
}
|
||||||
|
";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#####################################################################
|
||||||
|
# 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 auto-generated by pidl */\n\n";
|
||||||
|
$res .= "#include \"includes.h\"\n\n";
|
||||||
|
foreach my $x (@{$idl}) {
|
||||||
|
($x->{TYPE} eq "INTERFACE") &&
|
||||||
|
ParseInterface($x);
|
||||||
|
}
|
||||||
|
return $res;
|
||||||
|
}
|
||||||
|
|
||||||
|
1;
|
@ -1,7 +1,7 @@
|
|||||||
###################################################
|
###################################################
|
||||||
# Ethereal parser generator for IDL structures
|
# Samba4 parser generator for IDL structures
|
||||||
|
# Copyright tridge@samba.org 2000-2003
|
||||||
# Copyright tpot@samba.org 2001
|
# Copyright tpot@samba.org 2001
|
||||||
# Copyright tridge@samba.org 2000
|
|
||||||
# released under the GNU GPL
|
# released under the GNU GPL
|
||||||
|
|
||||||
package IdlParser;
|
package IdlParser;
|
||||||
|
@ -18,6 +18,7 @@ use dump;
|
|||||||
use header;
|
use header;
|
||||||
use parser;
|
use parser;
|
||||||
use eparser;
|
use eparser;
|
||||||
|
use client;
|
||||||
use util;
|
use util;
|
||||||
|
|
||||||
my($opt_help) = 0;
|
my($opt_help) = 0;
|
||||||
@ -27,6 +28,7 @@ my($opt_diff) = 0;
|
|||||||
my($opt_header) = 0;
|
my($opt_header) = 0;
|
||||||
my($opt_parser) = 0;
|
my($opt_parser) = 0;
|
||||||
my($opt_eparser) = 0;
|
my($opt_eparser) = 0;
|
||||||
|
my($opt_client);
|
||||||
my($opt_keep) = 0;
|
my($opt_keep) = 0;
|
||||||
my($opt_output);
|
my($opt_output);
|
||||||
|
|
||||||
@ -59,7 +61,7 @@ sub ShowHelp()
|
|||||||
{
|
{
|
||||||
print "
|
print "
|
||||||
perl IDL parser and code generator
|
perl IDL parser and code generator
|
||||||
Copyright tridge\@samba.org
|
Copyright (C) tridge\@samba.org
|
||||||
|
|
||||||
Usage: pidl.pl [options] <idlfile>
|
Usage: pidl.pl [options] <idlfile>
|
||||||
|
|
||||||
@ -71,6 +73,7 @@ sub ShowHelp()
|
|||||||
--header create a C header file
|
--header create a C header file
|
||||||
--parser create a C parser
|
--parser create a C parser
|
||||||
--eparser create an ethereal parser
|
--eparser create an ethereal parser
|
||||||
|
--client FILENAME create client calls in FILENAME
|
||||||
--diff run diff on the idl and dumped output
|
--diff run diff on the idl and dumped output
|
||||||
--keep keep the .pidl file
|
--keep keep the .pidl file
|
||||||
\n";
|
\n";
|
||||||
@ -86,6 +89,7 @@ GetOptions (
|
|||||||
'header' => \$opt_header,
|
'header' => \$opt_header,
|
||||||
'parser' => \$opt_parser,
|
'parser' => \$opt_parser,
|
||||||
'eparser' => \$opt_eparser,
|
'eparser' => \$opt_eparser,
|
||||||
|
'client=s' => \$opt_client,
|
||||||
'diff' => \$opt_diff,
|
'diff' => \$opt_diff,
|
||||||
'keep' => \$opt_keep
|
'keep' => \$opt_keep
|
||||||
);
|
);
|
||||||
@ -136,6 +140,13 @@ if ($opt_eparser) {
|
|||||||
util::FileSave($parser, IdlEParser::Parse($idl));
|
util::FileSave($parser, IdlEParser::Parse($idl));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ($opt_client) {
|
||||||
|
my($idl) = util::LoadStructure($pidl_file);
|
||||||
|
my($client) = util::ChangeExtension($opt_client, "c");
|
||||||
|
print "Generating $client client calls\n";
|
||||||
|
util::FileSave($client, IdlClient::Parse($idl));
|
||||||
|
}
|
||||||
|
|
||||||
if ($opt_diff) {
|
if ($opt_diff) {
|
||||||
my($idl) = util::LoadStructure($pidl_file);
|
my($idl) = util::LoadStructure($pidl_file);
|
||||||
my($tempfile) = util::ChangeExtension($opt_output, "tmp");
|
my($tempfile) = util::ChangeExtension($opt_output, "tmp");
|
||||||
|
Loading…
Reference in New Issue
Block a user