diff options
Diffstat (limited to 'source4/build/pidl')
-rw-r--r-- | source4/build/pidl/client.pm | 12 | ||||
-rw-r--r-- | source4/build/pidl/header.pm | 2 | ||||
-rw-r--r-- | source4/build/pidl/parser.pm | 19 | ||||
-rwxr-xr-x | source4/build/pidl/pidl.pl | 29 | ||||
-rw-r--r-- | source4/build/pidl/proxy.pm | 36 |
5 files changed, 68 insertions, 30 deletions
diff --git a/source4/build/pidl/client.pm b/source4/build/pidl/client.pm index 015ac05223..43808ce3fb 100644 --- a/source4/build/pidl/client.pm +++ b/source4/build/pidl/client.pm @@ -21,15 +21,11 @@ sub ParseFunction($$) $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); + if (p->flags & DCERPC_DEBUG_PRINT_IN) { + NDR_PRINT_IN_DEBUG($name, r); } - - return dcerpc_ndr_request_send(p, NULL, DCERPC_$uname, mem_ctx, - (ndr_push_flags_fn_t) ndr_push_$name, - (ndr_pull_flags_fn_t) ndr_pull_$name, - r, sizeof(*r)); + + return dcerpc_ndr_request_table_send(p, NULL, &dcerpc_table_$interface->{NAME}, DCERPC_$uname, mem_ctx, r); } NTSTATUS dcerpc_$name(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, struct $name *r) diff --git a/source4/build/pidl/header.pm b/source4/build/pidl/header.pm index 188fdd4f72..5dda18d1b5 100644 --- a/source4/build/pidl/header.pm +++ b/source4/build/pidl/header.pm @@ -195,7 +195,7 @@ sub HeaderTypedefProto($) } if (needed::is_needed("ndr_size_$d->{NAME}")) { - $res .= "size_t ndr_size_$d->{NAME}(int , struct $d->{NAME} *, int );\n"; + $res .= "size_t ndr_size_$d->{NAME}(int , const struct $d->{NAME} *, int );\n"; } } if ($d->{DATA}{TYPE} eq "UNION") { diff --git a/source4/build/pidl/parser.pm b/source4/build/pidl/parser.pm index 5be538b2cf..cec983724d 100644 --- a/source4/build/pidl/parser.pm +++ b/source4/build/pidl/parser.pm @@ -8,8 +8,6 @@ package IdlParser; use strict; -use client; -use proxy; use needed; # the list of needed functions @@ -853,7 +851,7 @@ sub ParseStructNdrSize($) my $static = fn_prefix($t); my $sizevar; - pidl $static . "size_t ndr_size_$t->{NAME}(int ret, struct $t->{NAME} *r, int flags)\n"; + pidl $static . "size_t ndr_size_$t->{NAME}(int ret, const struct $t->{NAME} *r, int flags)\n"; pidl "{\n"; if (util::has_property($t->{DATA}, "flag")) { @@ -1062,7 +1060,7 @@ sub ParseUnionNdrSize($) my $t = shift; my $static = fn_prefix($t); - pidl $static . "size_t ndr_size_$t->{NAME}(int ret, union $t->{NAME} *data, uint16 level, int flags)\n"; + pidl $static . "size_t ndr_size_$t->{NAME}(int ret, const union $t->{NAME} *data, uint16 level, int flags)\n"; pidl "{\n"; if (util::has_property($t->{DATA}, "flag")) { pidl "\tflags = flags | " . $t->{DATA}->{PROPERTIES}->{flag} . ";\n"; @@ -1599,13 +1597,6 @@ sub RegistrationFunction($$) pidl "\tif (NT_STATUS_IS_ERR(status)) {\n"; pidl "\t\treturn status;\n"; pidl "\t}\n\n"; - - if (util::has_property($interface, "object")) { - pidl "\tstatus = dcom_$interface->{NAME}_init();\n"; - pidl "\tif (NT_STATUS_IS_ERR(status)) {\n"; - pidl "\t\treturn status;\n"; - pidl "\t}\n\n"; - } } pidl "\treturn status;\n"; pidl "}\n\n"; @@ -1633,12 +1624,6 @@ sub Parse($$) if ($x->{TYPE} eq "INTERFACE") { needed::BuildNeeded($x); ParseInterface($x); - - if (util::has_property($x, "object")) { - pidl IdlProxy::ParseInterface($x); - } else { - pidl IdlClient::ParseInterface($x); - } } } diff --git a/source4/build/pidl/pidl.pl b/source4/build/pidl/pidl.pl index bb7f1f8ed6..8388bcfd4c 100755 --- a/source4/build/pidl/pidl.pl +++ b/source4/build/pidl/pidl.pl @@ -17,6 +17,8 @@ use idl; use dump; use header; use server; +use client; +use proxy; use stub; use parser; use eparser; @@ -31,6 +33,7 @@ my($opt_dump) = 0; my($opt_diff) = 0; my($opt_header) = 0; my($opt_template) = 0; +my($opt_client) = 0; my($opt_server) = 0; my($opt_parser) = 0; my($opt_eparser) = 0; @@ -68,6 +71,7 @@ sub ShowHelp() --dump dump a pidl file back to idl --header create a C header file --parser create a C parser + --client create a C client --server create server boilerplate --template print a template for a pipe --eparser create an ethereal parser @@ -88,6 +92,7 @@ GetOptions ( 'server' => \$opt_server, 'template' => \$opt_template, 'parser' => \$opt_parser, + 'client' => \$opt_client, 'eparser' => \$opt_eparser, 'diff' => \$opt_diff, 'keep' => \$opt_keep, @@ -138,6 +143,30 @@ sub process_file($) util::FileSave($header, IdlHeader::Parse($pidl)); } + if ($opt_client) { + my ($client) = util::ChangeExtension($output, "_c.c"); + my $res = ""; + my $h_filename = util::ChangeExtension($output, ".h"); + my $need_dcom_register = 0; + + $res .= "#include \"includes.h\"\n"; + $res .= "#include \"$h_filename\"\n\n"; + + foreach my $x (@{$pidl}) { + if (util::has_property($x, "object")) { + $res .= IdlProxy::ParseInterface($x); + $need_dcom_register = 1; + } else { + $res .= IdlClient::ParseInterface($x); + } + } + + if ($need_dcom_register) { + $res .= IdlProxy::RegistrationFunction($pidl, $basename); + } + util::FileSave($client, $res); + } + if ($opt_server) { my($server) = util::ChangeExtension($output, "_s.c"); my $res = ""; diff --git a/source4/build/pidl/proxy.pm b/source4/build/pidl/proxy.pm index f8991ce9fe..bf3990da47 100644 --- a/source4/build/pidl/proxy.pm +++ b/source4/build/pidl/proxy.pm @@ -105,10 +105,7 @@ static struct rpc_request *dcom_proxy_$interface->{NAME}_$name\_send(struct dcom NDR_PRINT_IN_DEBUG($name, r); } - return dcerpc_ndr_request_send(p, &d->ipid, DCERPC_$uname, mem_ctx, - (ndr_push_flags_fn_t) ndr_push_$name, - (ndr_pull_flags_fn_t) ndr_pull_$name, - r, sizeof(*r)); + return dcerpc_ndr_request_table_send(p, &d->ipid, &dcerpc_table_$interface->{NAME}, DCERPC_$uname, mem_ctx, r); } static NTSTATUS dcom_proxy_$interface->{NAME}_$name(struct dcom_interface_p *d, TALLOC_CTX *mem_ctx, struct $name *r) @@ -163,4 +160,35 @@ sub ParseInterface($) ParseRegFunc($interface); } +sub RegistrationFunction($$) +{ + my $idl = shift; + my $basename = shift; + + my $res = "NTSTATUS dcom_$basename\_init(void)\n"; + $res .= "{\n"; + $res .="\tNTSTATUS status = NT_STATUS_OK;\n"; + foreach my $interface (@{$idl}) { + next if $interface->{TYPE} ne "INTERFACE"; + next if not util::has_property($interface, "object"); + + my $data = $interface->{INHERITED_DATA}; + my $count = 0; + foreach my $d (@{$data}) { + if ($d->{TYPE} eq "FUNCTION") { $count++; } + } + + next if ($count == 0); + + $res .= "\tstatus = dcom_$interface->{NAME}_init();\n"; + $res .= "\tif (NT_STATUS_IS_ERR(status)) {\n"; + $res .= "\t\treturn status;\n"; + $res .= "\t}\n\n"; + } + $res .= "\treturn status;\n"; + $res .= "}\n\n"; + + return $res; +} + 1; |