################################################### # 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;