summaryrefslogtreecommitdiff
path: root/source4/build/pidl
diff options
context:
space:
mode:
Diffstat (limited to 'source4/build/pidl')
-rw-r--r--source4/build/pidl/clientfns.pm127
-rwxr-xr-xsource4/build/pidl/pidl.pl8
2 files changed, 135 insertions, 0 deletions
diff --git a/source4/build/pidl/clientfns.pm b/source4/build/pidl/clientfns.pm
new file mode 100644
index 0000000000..9f5f0ea883
--- /dev/null
+++ b/source4/build/pidl/clientfns.pm
@@ -0,0 +1,127 @@
+###################################################
+# clientfs boilerplate generator
+# Copyright tpot@samba.org 2004
+# released under the GNU GPL
+
+package IdlClientFns;
+
+use strict;
+
+my($res);
+
+sub pidl($)
+{
+ $res .= shift;
+}
+
+use Data::Dumper;
+
+#####################################################################
+# produce boilerplate code for a interface
+sub Boilerplate_ClientFns($)
+{
+ my($interface) = shift;
+ my($data) = $interface->{DATA};
+ my $name = $interface->{NAME};
+
+ foreach my $d (@{$data}) {
+ if ($d->{TYPE} eq "FUNCTION") {
+
+ pidl "/*\n";
+ pidl Dumper($d);
+ pidl "\n*/\n\n";
+
+ pidl "$d->{RETURN_TYPE} $d->{NAME}(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx";
+
+ my $count = 0, my $i = 0;
+
+ foreach my $a (@{$d->{DATA}}) {
+ $count++;
+ }
+
+ pidl ", ", if $count > 0;
+
+ foreach my $a (@{$d->{DATA}}) {
+
+ pidl "/* [";
+ if ($a->{PROPERTIES}->{in}) {
+ pidl "in";
+ if ($a->{PROPERTIES}->{out} or
+ $a->{PROPERTIES}->{ref}) {
+ pidl ",";
+ }
+ }
+ if ($a->{PROPERTIES}->{out}) {
+ pidl "out";
+ if ($a->{PROPERTIES}->{ref}) {
+ pidl ",";
+ }
+ }
+ if ($a->{PROPERTIES}->{ref}) {
+ pidl "ref";
+ }
+ pidl "] */ ";
+
+ pidl "struct ", if $a->{TYPE} eq "policy_handle";
+
+ pidl "$a->{TYPE} ";
+ if ($a->{PROPERTIES}->{out}) {
+ pidl "*";
+ }
+
+ if (!$a->{PROPERTIES}->{ref}) {
+ pidl "*", if $a->{POINTERS};
+ }
+
+ pidl "$a->{NAME}";
+
+ $i++;
+
+ pidl ", ", if $i < $count;
+ }
+ pidl ")\n";
+ pidl "{\n";
+
+ pidl "\tstruct $d->{NAME} r;\n";
+ pidl "\tNTSTATUS status;\n";
+ pidl "\n";
+
+ foreach $a (@{$d->{DATA}}) {
+ if ($a->{PROPERTIES}->{in}) {
+ pidl "\tr.in.$a->{NAME} = $a->{NAME};\n";
+ }
+ if ($a->{PROPERTIES}->{out}) {
+ pidl "\tr.out.$a->{NAME} = $a->{NAME};\n";
+ }
+ }
+ pidl "\n";
+
+ pidl "\tstatus = dcerpc_$d->{NAME}(p, mem_ctx, &r);\n";
+ pidl "\n";
+
+ pidl "\treturn NT_STATUS_OK;\n";
+
+ pidl "}\n\n";
+ }
+ }
+}
+
+#####################################################################
+# parse a parsed IDL structure back into an IDL file
+sub Parse($)
+{
+ my($idl) = shift;
+ $res = "/* dcerpc client functions generated by pidl */\n\n";
+
+ $res .= "#include \"includes.h\"\n\n";
+
+ foreach my $x (@{$idl}) {
+ if ($x->{TYPE} eq "INTERFACE") {
+ Boilerplate_ClientFns($x);
+ }
+ }
+
+ return $res;
+}
+
+1;
diff --git a/source4/build/pidl/pidl.pl b/source4/build/pidl/pidl.pl
index 9b870d7263..c43d042b57 100755
--- a/source4/build/pidl/pidl.pl
+++ b/source4/build/pidl/pidl.pl
@@ -17,6 +17,7 @@ use idl;
use dump;
use header;
use server;
+use clientfns;
use parser;
use eparser;
use validator;
@@ -31,6 +32,7 @@ my($opt_header) = 0;
my($opt_template) = 0;
my($opt_server) = 0;
my($opt_parser) = 0;
+my($opt_clientfns) = 0;
my($opt_eparser) = 0;
my($opt_keep) = 0;
my($opt_output);
@@ -84,6 +86,7 @@ GetOptions (
'server' => \$opt_server,
'template' => \$opt_template,
'parser' => \$opt_parser,
+ 'clientfns' => \$opt_clientfns,
'eparser' => \$opt_eparser,
'diff' => \$opt_diff,
'keep' => \$opt_keep
@@ -142,6 +145,11 @@ sub process_file($)
IdlParser::Parse($pidl, $parser);
}
+ if ($opt_clientfns) {
+ my($clientfns) = util::ChangeExtension($output, "_c.c");
+ util::FileSave($clientfns, IdlClientFns::Parse($pidl));
+ }
+
if ($opt_eparser) {
my($parser) = util::ChangeExtension($output, ".c");
util::FileSave($parser, IdlEParser::Parse($pidl));