diff options
author | Jörg Mayer <jmayer@loplof.de> | 2007-02-26 08:57:03 +0000 |
---|---|---|
committer | Jörg Mayer <jmayer@loplof.de> | 2007-02-26 08:57:03 +0000 |
commit | c7fd37e49c0d684b57e739b1c90f67c7978e30b6 (patch) | |
tree | 8aa6939b2f1a3672273d3b2345907e4b2a2ded4a | |
parent | 2b75ac83af8e23f8b9d284c143537d7ab5b82487 (diff) | |
download | wireshark-c7fd37e49c0d684b57e739b1c90f67c7978e30b6.tar.gz wireshark-c7fd37e49c0d684b57e739b1c90f67c7978e30b6.tar.bz2 wireshark-c7fd37e49c0d684b57e739b1c90f67c7978e30b6.zip |
Update from samba tree revision 21471 to 21535
============================ Samba log start ============
------------------------------------------------------------------------
r21484 | jelmer | 2007-02-21 11:31:14 +0100 (Wed, 21 Feb 2007) | 1 line
Changed paths:
M /branches/SAMBA_4_0
M /branches/SAMBA_4_0/source/pidl/lib/Parse/Pidl/NDR.pm
M /branches/SAMBA_4_0/source/pidl/lib/Parse/Pidl/Samba4/EJS.pm
M /branches/SAMBA_4_0/source/pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm
M /branches/SAMBA_4_0/source/pidl/tests/samba-ndr.pl
Fix Needed* for nested datastructures.
------------------------------------------------------------------------
r21486 | jelmer | 2007-02-21 11:55:03 +0100 (Wed, 21 Feb 2007) | 1 line
Changed paths:
M /branches/SAMBA_4_0
M /branches/SAMBA_4_0/source/pidl/lib/Parse/Pidl/Samba4/Header.pm
Remove spurious semicolons.
------------------------------------------------------------------------
r21487 | jelmer | 2007-02-21 12:32:48 +0100 (Wed, 21 Feb 2007) | 1 line
Changed paths:
M /branches/SAMBA_4_0
M /branches/SAMBA_4_0/source/librpc/idl/echo.idl
M /branches/SAMBA_4_0/source/pidl/lib/Parse/Pidl/Samba4/EJS.pm
M /branches/SAMBA_4_0/source/pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm
Fix warning when using anonymous types, initial work on nested type support in ejs.
------------------------------------------------------------------------
r21490 | jelmer | 2007-02-21 13:35:21 +0100 (Wed, 21 Feb 2007) | 3 lines
Changed paths:
M /branches/SAMBA_4_0
M /branches/SAMBA_4_0/source/pidl/lib/Parse/Pidl/Samba4/EJS.pm
A /branches/SAMBA_4_0/source/pidl/tests/samba-ejs.pl
Add some tests for the EJS code
More work on supporting nested types in EJS.
------------------------------------------------------------------------
r21492 | jelmer | 2007-02-21 15:35:25 +0100 (Wed, 21 Feb 2007) | 2 lines
Changed paths:
M /branches/SAMBA_4_0
M /branches/SAMBA_4_0/source/pidl/TODO
M /branches/SAMBA_4_0/source/pidl/lib/Parse/Pidl/Samba4/EJS.pm
M /branches/SAMBA_4_0/source/pidl/lib/Parse/Pidl/Samba4/Header.pm
Finish work on nested type support in EJS.
------------------------------------------------------------------------
r21493 | jelmer | 2007-02-21 21:59:01 +0100 (Wed, 21 Feb 2007) | 15 lines
Changed paths:
M /branches/SAMBA_4_0
M /branches/SAMBA_4_0/source/pidl/lib/Parse/Pidl/Wireshark/NDR.pm
Patch from Ronnie Sahlberg. From his email:
This patch changes the function name and signature that pidl generate
a call for when dissecting a policy handle to a new, more
PIDL-friendly function.
It also stores the procedure name in a new pinfo-> field so that
helpers that want to know the procedure name can finbd out easily.
The new PIDL helper function for policy handles use this new field and will show
OpenHKU(<...>)
opened in frame X
closed in frame Y
for the policy handle.
------------------------------------------------------------------------
r21531 | jelmer | 2007-02-25 10:35:32 +0100 (Sun, 25 Feb 2007) | 1 line
Changed paths:
M /branches/SAMBA_4_0
M /branches/SAMBA_4_0/source/pidl/lib/Parse/Pidl/Wireshark/NDR.pm
Use pidl-specific utility functions. Patch from Ronnie Sahlberg
------------------------------------------------------------------------
r21532 | jelmer | 2007-02-25 10:55:57 +0100 (Sun, 25 Feb 2007) | 1 line
Changed paths:
M /branches/SAMBA_4_0
M /branches/SAMBA_4_0/source/pidl/TODO
M /branches/SAMBA_4_0/source/pidl/lib/Parse/Pidl/Wireshark/NDR.pm
M /branches/SAMBA_4_0/source/pidl/tests/wireshark-ndr.pl
Add tests for StripPrefixes utility function.
------------------------------------------------------------------------
r21534 | jelmer | 2007-02-26 02:03:19 +0100 (Mon, 26 Feb 2007) | 1 line
Changed paths:
M /branches/SAMBA_4_0
M /branches/SAMBA_4_0/source/pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm
M /branches/SAMBA_4_0/source/pidl/lib/Parse/Pidl/Wireshark/NDR.pm
M /branches/SAMBA_4_0/source/pidl/tests/wireshark-ndr.pl
Add some more tests for wireshark.
------------------------------------------------------------------------
------------------------------------------------------------------------
============================ Samba log end ==============
svn path=/trunk/; revision=20933
-rw-r--r-- | tools/pidl/TODO | 4 | ||||
-rw-r--r-- | tools/pidl/lib/Parse/Pidl/NDR.pm | 16 | ||||
-rw-r--r-- | tools/pidl/lib/Parse/Pidl/Samba4/EJS.pm | 390 | ||||
-rw-r--r-- | tools/pidl/lib/Parse/Pidl/Samba4/Header.pm | 15 | ||||
-rw-r--r-- | tools/pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm | 74 | ||||
-rw-r--r-- | tools/pidl/lib/Parse/Pidl/Wireshark/NDR.pm | 54 | ||||
-rwxr-xr-x | tools/pidl/tests/samba-ejs.pl | 42 | ||||
-rwxr-xr-x | tools/pidl/tests/samba-ndr.pl | 38 | ||||
-rwxr-xr-x | tools/pidl/tests/wireshark-ndr.pl | 53 |
9 files changed, 402 insertions, 284 deletions
diff --git a/tools/pidl/TODO b/tools/pidl/TODO index 2d4ca8a265..859b3d5317 100644 --- a/tools/pidl/TODO +++ b/tools/pidl/TODO @@ -1,3 +1,5 @@ +- allow [public] on typedefs only + - EJS output backend shouldn't use the NDR levels stuff but instead as the "C levels" and NDR levels don't necessarily match. @@ -7,8 +9,6 @@ - strip out pidl-specific properties - support nested elements - - allow non-typedef structs - - generate names for anonymous tagged types. Simple MD5Sum of contents? - support typedefs properly - improve represent_as(): allow it to be used for arrays and other complex types diff --git a/tools/pidl/lib/Parse/Pidl/NDR.pm b/tools/pidl/lib/Parse/Pidl/NDR.pm index a921e5cbe5..7322856cdd 100644 --- a/tools/pidl/lib/Parse/Pidl/NDR.pm +++ b/tools/pidl/lib/Parse/Pidl/NDR.pm @@ -588,6 +588,21 @@ sub CheckPointerTypes($$) } } +sub FindNestedTypes($$) +{ + sub FindNestedTypes($$); + my ($l, $t) = @_; + + return if not defined($t->{ELEMENTS}); + + foreach (@{$t->{ELEMENTS}}) { + if (ref($_->{TYPE}) eq "HASH") { + push (@$l, $_->{TYPE}) if (defined($_->{TYPE}->{NAME})); + FindNestedTypes($l, $_->{TYPE}); + } + } +} + sub ParseInterface($) { my $idl = shift; @@ -620,6 +635,7 @@ sub ParseInterface($) push (@consts, ParseConst($idl, $d)); } else { push (@types, ParseType($d, $idl->{PROPERTIES}->{pointer_default})); + FindNestedTypes(\@types, $d); } } diff --git a/tools/pidl/lib/Parse/Pidl/Samba4/EJS.pm b/tools/pidl/lib/Parse/Pidl/Samba4/EJS.pm index 59dc5f001d..9edd2a4a33 100644 --- a/tools/pidl/lib/Parse/Pidl/Samba4/EJS.pm +++ b/tools/pidl/lib/Parse/Pidl/Samba4/EJS.pm @@ -6,15 +6,23 @@ package Parse::Pidl::Samba4::EJS; +use Exporter; +@ISA = qw(Exporter); +@EXPORT_OK = qw(get_pointer_to get_value_of check_null_pointer $res + $res_hdr fn_declare); + use strict; use Parse::Pidl::Typelist; -use Parse::Pidl::Util qw(has_property); +use Parse::Pidl::Util qw(has_property ParseExpr); +use Parse::Pidl::NDR qw(GetPrevLevel GetNextLevel); +use Parse::Pidl::Samba4::NDR::Parser qw(GenerateStructEnv GenerateFunctionInEnv + GenerateFunctionOutEnv); use vars qw($VERSION); $VERSION = '0.01'; -my $res; -my $res_hdr; +our $res; +our $res_hdr; my %constants; @@ -45,53 +53,6 @@ sub deindent() $tabs = substr($tabs, 0, -1); } -# this should probably be in ndr.pm -sub GenerateStructEnv($) -{ - my $x = shift; - my %env; - - foreach my $e (@{$x->{ELEMENTS}}) { - if ($e->{NAME}) { - $env{$e->{NAME}} = "r->$e->{NAME}"; - } - } - - $env{"this"} = "r"; - - return \%env; -} - -sub GenerateFunctionInEnv($) -{ - my $fn = shift; - my %env; - - foreach my $e (@{$fn->{ELEMENTS}}) { - if (grep (/in/, @{$e->{DIRECTION}})) { - $env{$e->{NAME}} = "r->in.$e->{NAME}"; - } - } - - return \%env; -} - -sub GenerateFunctionOutEnv($) -{ - my $fn = shift; - my %env; - - foreach my $e (@{$fn->{ELEMENTS}}) { - if (grep (/out/, @{$e->{DIRECTION}})) { - $env{$e->{NAME}} = "r->out.$e->{NAME}"; - } elsif (grep (/in/, @{$e->{DIRECTION}})) { - $env{$e->{NAME}} = "r->in.$e->{NAME}"; - } - } - - return \%env; -} - sub get_pointer_to($) { my $var_name = shift; @@ -127,7 +88,6 @@ sub check_null_pointer($) } } - ##################################################################### # work out is a parse function should be declared static or not sub fn_declare($$) @@ -150,14 +110,25 @@ sub EjsPullScalar($$$$$) return if (has_property($e, "value")); - my $pl = Parse::Pidl::NDR::GetPrevLevel($e, $l); + if (ref($e->{TYPE}) eq "HASH" and not defined($e->{TYPE}->{NAME})) { + EjsTypePull($e->{TYPE}, $var); + } else { + my $pl = Parse::Pidl::NDR::GetPrevLevel($e, $l); $var = get_pointer_to($var); # have to handle strings specially :( - if (Parse::Pidl::Typelist::scalar_is_reference($e->{TYPE}) - and (defined($pl) and $pl->{TYPE} eq "POINTER")) { + if (Parse::Pidl::Typelist::scalar_is_reference($e->{TYPE}) + and (defined($pl) and $pl->{TYPE} eq "POINTER")) { $var = get_pointer_to($var); } - pidl "NDR_CHECK(ejs_pull_$e->{TYPE}(ejs, v, $name, $var));"; + + my $t; + if (ref($e->{TYPE}) eq "HASH") { + $t = "$e->{TYPE}->{TYPE}_$e->{TYPE}->{NAME}"; + } else { + $t = $e->{TYPE}; + } + pidl "NDR_CHECK(ejs_pull_$t(ejs, v, $name, $var));"; + } } ########################### @@ -177,7 +148,7 @@ sub EjsPullPointer($$$$$) indent; pidl "EJS_ALLOC(ejs, $var);"; $var = get_value_of($var); - EjsPullElement($e, Parse::Pidl::NDR::GetNextLevel($e, $l), $var, $name, $env); + EjsPullElement($e, GetNextLevel($e, $l), $var, $name, $env); deindent; pidl "}"; } @@ -187,7 +158,7 @@ sub EjsPullPointer($$$$$) sub EjsPullString($$$$$) { my ($e, $l, $var, $name, $env) = @_; - my $pl = Parse::Pidl::NDR::GetPrevLevel($e, $l); + my $pl = GetPrevLevel($e, $l); $var = get_pointer_to($var); if (defined($pl) and $pl->{TYPE} eq "POINTER") { $var = get_pointer_to($var); @@ -195,16 +166,15 @@ sub EjsPullString($$$$$) pidl "NDR_CHECK(ejs_pull_string(ejs, v, $name, $var));"; } - ########################### # pull an array element sub EjsPullArray($$$$$) { my ($e, $l, $var, $name, $env) = @_; - my $nl = Parse::Pidl::NDR::GetNextLevel($e, $l); - my $length = Parse::Pidl::Util::ParseExpr($l->{LENGTH_IS}, $env, $e); - my $size = Parse::Pidl::Util::ParseExpr($l->{SIZE_IS}, $env, $e); - my $pl = Parse::Pidl::NDR::GetPrevLevel($e, $l); + my $nl = GetNextLevel($e, $l); + my $length = ParseExpr($l->{LENGTH_IS}, $env, $e); + my $size = ParseExpr($l->{SIZE_IS}, $env, $e); + my $pl = GetPrevLevel($e, $l); if ($pl && $pl->{TYPE} eq "POINTER") { $var = get_pointer_to($var); } @@ -242,9 +212,9 @@ sub EjsPullArray($$$$$) sub EjsPullSwitch($$$$$) { my ($e, $l, $var, $name, $env) = @_; - my $switch_var = Parse::Pidl::Util::ParseExpr($l->{SWITCH_IS}, $env, $e); + my $switch_var = ParseExpr($l->{SWITCH_IS}, $env, $e); pidl "ejs_set_switch(ejs, $switch_var);"; - EjsPullElement($e, Parse::Pidl::NDR::GetNextLevel($e, $l), $var, $name, $env); + EjsPullElement($e, GetNextLevel($e, $l), $var, $name, $env); } ########################### @@ -271,10 +241,9 @@ sub EjsPullElement($$$$$) # pull a structure/union element at top level sub EjsPullElementTop($$) { - my $e = shift; - my $env = shift; + my ($e, $env) = @_; my $l = $e->{LEVELS}[0]; - my $var = Parse::Pidl::Util::ParseExpr($e->{NAME}, $env, $e); + my $var = ParseExpr($e->{NAME}, $env, $e); my $name = "\"$e->{NAME}\""; EjsPullElement($e, $l, $var, $name, $env); } @@ -283,32 +252,20 @@ sub EjsPullElementTop($$) # pull a struct sub EjsStructPull($$) { - my $name = shift; - my $d = shift; - my $env = GenerateStructEnv($d); - fn_declare($d, "NTSTATUS ejs_pull_$name(struct ejs_rpc *ejs, struct MprVar *v, const char *name, struct $name *r)"); - pidl "{"; - indent; + my ($d, $varname) = @_; + my $env = GenerateStructEnv($d, $varname); pidl "NDR_CHECK(ejs_pull_struct_start(ejs, &v, name));"; - foreach my $e (@{$d->{ELEMENTS}}) { + foreach my $e (@{$d->{ELEMENTS}}) { EjsPullElementTop($e, $env); } - pidl "return NT_STATUS_OK;"; - deindent; - pidl "}\n"; } ########################### # pull a union sub EjsUnionPull($$) { - my $name = shift; - my $d = shift; + my ($d, $varname) = @_; my $have_default = 0; - my $env = GenerateStructEnv($d); - fn_declare($d, "NTSTATUS ejs_pull_$name(struct ejs_rpc *ejs, struct MprVar *v, const char *name, union $name *r)"); - pidl "{"; - indent; pidl "NDR_CHECK(ejs_pull_struct_start(ejs, &v, name));"; pidl "switch (ejs->switch_var) {"; indent; @@ -319,7 +276,7 @@ sub EjsUnionPull($$) pidl "$e->{CASE}:"; indent; if ($e->{TYPE} ne "EMPTY") { - EjsPullElementTop($e, $env); + EjsPullElementTop($e, { $e->{NAME} => "$varname->$e->{NAME}"}); } pidl "break;"; deindent; @@ -332,9 +289,6 @@ sub EjsUnionPull($$) } deindent; pidl "}"; - pidl "return NT_STATUS_OK;"; - deindent; - pidl "}"; } ############################################## @@ -359,53 +313,66 @@ sub EjsEnumConstant($) # pull a enum sub EjsEnumPull($$) { - my $name = shift; - my $d = shift; + my ($d, $varname) = @_; EjsEnumConstant($d); - fn_declare($d, "NTSTATUS ejs_pull_$name(struct ejs_rpc *ejs, struct MprVar *v, const char *name, enum $name *r)"); - pidl "{"; - indent; pidl "unsigned e;"; pidl "NDR_CHECK(ejs_pull_enum(ejs, v, name, &e));"; - pidl "*r = e;"; - pidl "return NT_STATUS_OK;"; - deindent; - pidl "}\n"; + pidl "*$varname = e;"; } ########################### # pull a bitmap sub EjsBitmapPull($$) { - my $name = shift; - my $d = shift; + my ($d, $varname) = @_; my $type_fn = $d->{BASE_TYPE}; - my($type_decl) = Parse::Pidl::Typelist::mapTypeName($d->{BASE_TYPE}); - fn_declare($d, "NTSTATUS ejs_pull_$name(struct ejs_rpc *ejs, struct MprVar *v, const char *name, $type_decl *r)"); + pidl "NDR_CHECK(ejs_pull_$type_fn(ejs, v, name, $varname));"; +} + +sub EjsTypePullFunction($$) +{ + sub EjsTypePullFunction($$); + my ($d, $name) = @_; + return if (has_property($d, "noejs")); + + if ($d->{TYPE} eq "TYPEDEF") { + EjsTypePullFunction($d->{DATA}, $name); + return; + } + + if ($d->{TYPE} eq "STRUCT") { + fn_declare($d, "NTSTATUS ejs_pull_$name(struct ejs_rpc *ejs, struct MprVar *v, const char *name, struct $name *r)"); + } elsif ($d->{TYPE} eq "UNION") { + fn_declare($d, "NTSTATUS ejs_pull_$name(struct ejs_rpc *ejs, struct MprVar *v, const char *name, union $name *r)"); + } elsif ($d->{TYPE} eq "ENUM") { + fn_declare($d, "NTSTATUS ejs_pull_$name(struct ejs_rpc *ejs, struct MprVar *v, const char *name, enum $name *r)"); + } elsif ($d->{TYPE} eq "BITMAP") { + my($type_decl) = Parse::Pidl::Typelist::mapTypeName($d->{BASE_TYPE}); + fn_declare($d, "NTSTATUS ejs_pull_$name(struct ejs_rpc *ejs, struct MprVar *v, const char *name, $type_decl *r)"); + } pidl "{"; indent; - pidl "return ejs_pull_$type_fn(ejs, v, name, r);"; + + EjsTypePull($d, "r"); + + pidl "return NT_STATUS_OK;"; deindent; - pidl "}"; + pidl "}\n"; } - -########################### -# generate a structure pull -sub EjsTypedefPull($) +sub EjsTypePull($$) { - my $d = shift; - return if (has_property($d, "noejs")); - if ($d->{DATA}->{TYPE} eq 'STRUCT') { - EjsStructPull($d->{NAME}, $d->{DATA}); - } elsif ($d->{DATA}->{TYPE} eq 'UNION') { - EjsUnionPull($d->{NAME}, $d->{DATA}); - } elsif ($d->{DATA}->{TYPE} eq 'ENUM') { - EjsEnumPull($d->{NAME}, $d->{DATA}); - } elsif ($d->{DATA}->{TYPE} eq 'BITMAP') { - EjsBitmapPull($d->{NAME}, $d->{DATA}); + my ($d, $varname) = @_; + if ($d->{TYPE} eq 'STRUCT') { + EjsStructPull($d, $varname); + } elsif ($d->{TYPE} eq 'UNION') { + EjsUnionPull($d, $varname); + } elsif ($d->{TYPE} eq 'ENUM') { + EjsEnumPull($d, $varname); + } elsif ($d->{TYPE} eq 'BITMAP') { + EjsBitmapPull($d, $varname); } else { - warn "Unhandled pull typedef $d->{NAME} of type $d->{DATA}->{TYPE}"; + warn "Unhandled pull $varname of type $d->{TYPE}"; } } @@ -442,20 +409,32 @@ sub EjsPullFunction($) pidl "}\n"; } - ########################### # push a scalar element sub EjsPushScalar($$$$$) { my ($e, $l, $var, $name, $env) = @_; - # have to handle strings specially :( - my $pl = Parse::Pidl::NDR::GetPrevLevel($e, $l); - if ((not Parse::Pidl::Typelist::scalar_is_reference($e->{TYPE})) - or (defined($pl) and $pl->{TYPE} eq "POINTER")) { - $var = get_pointer_to($var); - } - pidl "NDR_CHECK(ejs_push_$e->{TYPE}(ejs, v, $name, $var));"; + if (ref($e->{TYPE}) eq "HASH" and not defined($e->{TYPE}->{NAME})) { + EjsTypePush($e->{TYPE}, get_pointer_to($var)); + } else { + # have to handle strings specially :( + my $pl = GetPrevLevel($e, $l); + + if ((not Parse::Pidl::Typelist::scalar_is_reference($e->{TYPE})) + or (defined($pl) and $pl->{TYPE} eq "POINTER")) { + $var = get_pointer_to($var); + } + + my $t; + if (ref($e->{TYPE}) eq "HASH") { + $t = "$e->{TYPE}->{TYPE}_$e->{TYPE}->{NAME}"; + } else { + $t = $e->{TYPE}; + } + + pidl "NDR_CHECK(ejs_push_$t(ejs, v, $name, $var));"; + } } ########################### @@ -463,7 +442,7 @@ sub EjsPushScalar($$$$$) sub EjsPushString($$$$$) { my ($e, $l, $var, $name, $env) = @_; - my $pl = Parse::Pidl::NDR::GetPrevLevel($e, $l); + my $pl = GetPrevLevel($e, $l); if (defined($pl) and $pl->{TYPE} eq "POINTER") { $var = get_pointer_to($var); } @@ -486,7 +465,7 @@ sub EjsPushPointer($$$$$) pidl "} else {"; indent; $var = get_value_of($var); - EjsPushElement($e, Parse::Pidl::NDR::GetNextLevel($e, $l), $var, $name, $env); + EjsPushElement($e, GetNextLevel($e, $l), $var, $name, $env); deindent; pidl "}"; } @@ -496,20 +475,19 @@ sub EjsPushPointer($$$$$) sub EjsPushSwitch($$$$$) { my ($e, $l, $var, $name, $env) = @_; - my $switch_var = Parse::Pidl::Util::ParseExpr($l->{SWITCH_IS}, $env, $e); + my $switch_var = ParseExpr($l->{SWITCH_IS}, $env, $e); pidl "ejs_set_switch(ejs, $switch_var);"; - EjsPushElement($e, Parse::Pidl::NDR::GetNextLevel($e, $l), $var, $name, $env); + EjsPushElement($e, GetNextLevel($e, $l), $var, $name, $env); } - ########################### # push an array element sub EjsPushArray($$$$$) { my ($e, $l, $var, $name, $env) = @_; - my $nl = Parse::Pidl::NDR::GetNextLevel($e, $l); - my $length = Parse::Pidl::Util::ParseExpr($l->{LENGTH_IS}, $env, $e); - my $pl = Parse::Pidl::NDR::GetPrevLevel($e, $l); + my $nl = GetNextLevel($e, $l); + my $length = ParseExpr($l->{LENGTH_IS}, $env, $e); + my $pl = GetPrevLevel($e, $l); if ($pl && $pl->{TYPE} eq "POINTER") { $var = get_pointer_to($var); } @@ -558,10 +536,9 @@ sub EjsPushElement($$$$$) # push a structure/union element at top level sub EjsPushElementTop($$) { - my $e = shift; - my $env = shift; + my ($e, $env) = @_; my $l = $e->{LEVELS}[0]; - my $var = Parse::Pidl::Util::ParseExpr($e->{NAME}, $env, $e); + my $var = ParseExpr($e->{NAME}, $env, $e); my $name = "\"$e->{NAME}\""; EjsPushElement($e, $l, $var, $name, $env); } @@ -570,32 +547,20 @@ sub EjsPushElementTop($$) # push a struct sub EjsStructPush($$) { - my $name = shift; - my $d = shift; - my $env = GenerateStructEnv($d); - fn_declare($d, "NTSTATUS ejs_push_$name(struct ejs_rpc *ejs, struct MprVar *v, const char *name, const struct $name *r)"); - pidl "{"; - indent; + my ($d, $varname) = @_; + my $env = GenerateStructEnv($d, $varname); pidl "NDR_CHECK(ejs_push_struct_start(ejs, &v, name));"; foreach my $e (@{$d->{ELEMENTS}}) { EjsPushElementTop($e, $env); } - pidl "return NT_STATUS_OK;"; - deindent; - pidl "}\n"; } ########################### # push a union sub EjsUnionPush($$) { - my $name = shift; - my $d = shift; + my ($d, $varname) = @_; my $have_default = 0; - my $env = GenerateStructEnv($d); - fn_declare($d, "NTSTATUS ejs_push_$name(struct ejs_rpc *ejs, struct MprVar *v, const char *name, const union $name *r)"); - pidl "{"; - indent; pidl "NDR_CHECK(ejs_push_struct_start(ejs, &v, name));"; pidl "switch (ejs->switch_var) {"; indent; @@ -606,7 +571,7 @@ sub EjsUnionPush($$) pidl "$e->{CASE}:"; indent; if ($e->{TYPE} ne "EMPTY") { - EjsPushElementTop($e, $env); + EjsPushElementTop($e, { $e->{NAME} => "$varname->$e->{NAME}"} ); } pidl "break;"; deindent; @@ -619,36 +584,24 @@ sub EjsUnionPush($$) } deindent; pidl "}"; - pidl "return NT_STATUS_OK;"; - deindent; - pidl "}"; } ########################### # push a enum sub EjsEnumPush($$) { - my $name = shift; - my $d = shift; + my ($d, $varname) = @_; EjsEnumConstant($d); - fn_declare($d, "NTSTATUS ejs_push_$name(struct ejs_rpc *ejs, struct MprVar *v, const char *name, const enum $name *r)"); - pidl "{"; - indent; - pidl "unsigned e = *r;"; + pidl "unsigned e = ".get_value_of($varname).";"; pidl "NDR_CHECK(ejs_push_enum(ejs, v, name, &e));"; - pidl "return NT_STATUS_OK;"; - deindent; - pidl "}\n"; } ########################### # push a bitmap sub EjsBitmapPush($$) { - my $name = shift; - my $d = shift; + my ($d, $varname) = @_; my $type_fn = $d->{BASE_TYPE}; - my($type_decl) = Parse::Pidl::Typelist::mapTypeName($d->{BASE_TYPE}); # put the bitmap elements in the constants array foreach my $e (@{$d->{ELEMENTS}}) { if ($e =~ /^(\w*)\s*(.*)\s*$/) { @@ -657,36 +610,55 @@ sub EjsBitmapPush($$) $constants{$bname} = $v; } } - fn_declare($d, "NTSTATUS ejs_push_$name(struct ejs_rpc *ejs, struct MprVar *v, const char *name, const $type_decl *r)"); + pidl "NDR_CHECK(ejs_push_$type_fn(ejs, v, name, $varname));"; +} + +sub EjsTypePushFunction($$) +{ + sub EjsTypePushFunction($$); + my ($d, $name) = @_; + return if (has_property($d, "noejs")); + + if ($d->{TYPE} eq "TYPEDEF") { + EjsTypePushFunction($d->{DATA}, $name); + return; + } + + if ($d->{TYPE} eq "STRUCT") { + fn_declare($d, "NTSTATUS ejs_push_$name(struct ejs_rpc *ejs, struct MprVar *v, const char *name, const struct $name *r)"); + } elsif ($d->{TYPE} eq "UNION") { + fn_declare($d, "NTSTATUS ejs_push_$name(struct ejs_rpc *ejs, struct MprVar *v, const char *name, const union $name *r)"); + } elsif ($d->{TYPE} eq "ENUM") { + fn_declare($d, "NTSTATUS ejs_push_$name(struct ejs_rpc *ejs, struct MprVar *v, const char *name, const enum $name *r)"); + } elsif ($d->{TYPE} eq "BITMAP") { + my($type_decl) = Parse::Pidl::Typelist::mapTypeName($d->{BASE_TYPE}); + fn_declare($d, "NTSTATUS ejs_push_$name(struct ejs_rpc *ejs, struct MprVar *v, const char *name, const $type_decl *r)"); + } pidl "{"; indent; - pidl "return ejs_push_$type_fn(ejs, v, name, r);"; + EjsTypePush($d, "r"); + pidl "return NT_STATUS_OK;"; deindent; - pidl "}"; + pidl "}\n"; } - -########################### -# generate a structure push -sub EjsTypedefPush($) +sub EjsTypePush($$) { - my $d = shift; - return if (has_property($d, "noejs")); + my ($d, $varname) = @_; - if ($d->{DATA}->{TYPE} eq 'STRUCT') { - EjsStructPush($d->{NAME}, $d->{DATA}); - } elsif ($d->{DATA}->{TYPE} eq 'UNION') { - EjsUnionPush($d->{NAME}, $d->{DATA}); - } elsif ($d->{DATA}->{TYPE} eq 'ENUM') { - EjsEnumPush($d->{NAME}, $d->{DATA}); - } elsif ($d->{DATA}->{TYPE} eq 'BITMAP') { - EjsBitmapPush($d->{NAME}, $d->{DATA}); + if ($d->{TYPE} eq 'STRUCT') { + EjsStructPush($d, $varname); + } elsif ($d->{TYPE} eq 'UNION') { + EjsUnionPush($d, $varname); + } elsif ($d->{TYPE} eq 'ENUM') { + EjsEnumPush($d, $varname); + } elsif ($d->{TYPE} eq 'BITMAP') { + EjsBitmapPush($d, $varname); } else { - warn "Unhandled push typedef $d->{NAME} of type $d->{DATA}->{TYPE}"; + warn "Unhandled push $varname of type $d->{TYPE}"; } } - ##################### # generate a function sub EjsPushFunction($) @@ -714,13 +686,11 @@ sub EjsPushFunction($) pidl "}\n"; } - ################################# # generate a ejs mapping function sub EjsFunction($$) { - my $d = shift; - my $iface = shift; + my ($d, $iface) = @_; my $name = $d->{NAME}; my $callnum = uc("DCERPC_$name"); my $table = "&dcerpc_table_$iface"; @@ -767,8 +737,8 @@ sub EjsInterface($$) pidl_hdr "\n"; foreach my $d (@{$interface->{TYPES}}) { - ($needed->{"push_$d->{NAME}"}) && EjsTypedefPush($d); - ($needed->{"pull_$d->{NAME}"}) && EjsTypedefPull($d); + ($needed->{"push_$d->{NAME}"}) && EjsTypePushFunction($d, $d->{NAME}); + ($needed->{"pull_$d->{NAME}"}) && EjsTypePullFunction($d, $d->{NAME}); } foreach my $d (@{$interface->{FUNCTIONS}}) { @@ -875,26 +845,25 @@ sub NeededFunction($$) } } -sub NeededTypedef($$) +sub NeededType($$$) { - my ($t,$needed) = @_; + sub NeededType($$$); + my ($t,$needed,$req) = @_; - if (has_property($t, "public")) { - $needed->{"pull_$t->{NAME}"} = not has_property($t, "noejs"); - $needed->{"push_$t->{NAME}"} = not has_property($t, "noejs"); - } + NeededType($t->{DATA}, $needed, $req) if ($t->{TYPE} eq "TYPEDEF"); - return if (($t->{DATA}->{TYPE} ne "STRUCT") and - ($t->{DATA}->{TYPE} ne "UNION")); + return if (($t->{TYPE} ne "STRUCT") and + ($t->{TYPE} ne "UNION")); - foreach (@{$t->{DATA}->{ELEMENTS}}) { + foreach (@{$t->{ELEMENTS}}) { next if (has_property($_, "subcontext")); #FIXME: Support subcontexts - unless (defined($needed->{"pull_$_->{TYPE}"})) { - $needed->{"pull_$_->{TYPE}"} = $needed->{"pull_$t->{NAME}"}; - } - unless (defined($needed->{"push_$_->{TYPE}"})) { - $needed->{"push_$_->{TYPE}"} = $needed->{"push_$t->{NAME}"}; + my $n; + if (ref($_->{TYPE}) eq "HASH" and defined($_->{TYPE}->{NAME})) { + $needed->{"$req\_$_->{TYPE}->{TYPE}_$_->{TYPE}->{NAME}"} = 1; + } elsif (ref($_->{TYPE}) ne "HASH") { + $needed->{$req."_".$_->{TYPE}} = 1; } + NeededType($_->{TYPE}, $needed, $req) if (ref($_->{TYPE}) eq "HASH"); } } @@ -905,7 +874,16 @@ sub NeededInterface($$) my ($interface,$needed) = @_; NeededFunction($_, $needed) foreach (@{$interface->{FUNCTIONS}}); - NeededTypedef($_, $needed) foreach (reverse @{$interface->{TYPES}}); + + foreach (reverse @{$interface->{TYPES}}) { + if (has_property($_, "public")) { + $needed->{"pull_$_->{NAME}"} = not has_property($_, "noejs"); + $needed->{"push_$_->{NAME}"} = not has_property($_, "noejs"); + } + + NeededType($_, $needed, "pull") if ($needed->{"pull_$_->{NAME}"}); + NeededType($_, $needed, "push") if ($needed->{"push_$_->{NAME}"}); + } } 1; diff --git a/tools/pidl/lib/Parse/Pidl/Samba4/Header.pm b/tools/pidl/lib/Parse/Pidl/Samba4/Header.pm index 7e52dbc2ee..11ecc17001 100644 --- a/tools/pidl/lib/Parse/Pidl/Samba4/Header.pm +++ b/tools/pidl/lib/Parse/Pidl/Samba4/Header.pm @@ -7,7 +7,7 @@ package Parse::Pidl::Samba4::Header; use strict; -use Parse::Pidl::Typelist qw(mapTypeName); +use Parse::Pidl::Typelist qw(mapTypeName scalar_is_reference); use Parse::Pidl::Util qw(has_property is_constant); use Parse::Pidl::Samba4 qw(is_intree); @@ -61,7 +61,7 @@ sub HeaderElement($) pidl " "; my $numstar = $element->{POINTERS}; if ($numstar >= 1) { - $numstar-- if Parse::Pidl::Typelist::scalar_is_reference($element->{TYPE}); + $numstar-- if (scalar_is_reference($element->{TYPE})); } foreach (@{$element->{ARRAY_LEN}}) { @@ -128,10 +128,10 @@ sub HeaderEnum($$) } pidl "\n"; $tab_depth--; - pidl "};\n"; + pidl "}\n"; pidl "#else\n"; my $count = 0; - pidl "enum $name { __donnot_use_enum_$name=0x7FFFFFFF};\n"; + pidl "enum $name { __donnot_use_enum_$name=0x7FFFFFFF}\n"; my $with_val = 0; my $without_val = 0; foreach my $e (@{$enum->{ELEMENTS}}) { @@ -154,7 +154,6 @@ sub HeaderEnum($$) pidl "#define $name ( $value )\n"; } pidl "#endif\n"; - pidl "\n"; } ##################################################################### @@ -357,7 +356,11 @@ sub HeaderInterface($) HeaderUnion($d, $d->{NAME}) if ($d->{TYPE} eq "UNION"); HeaderEnum($d, $d->{NAME}) if ($d->{TYPE} eq "ENUM"); HeaderBitmap($d, $d->{NAME}) if ($d->{TYPE} eq "BITMAP"); - pidl ";\n\n"; + pidl ";\n\n" if ($d->{TYPE} eq "BITMAP" or + $d->{TYPE} eq "STRUCT" or + $d->{TYPE} eq "TYPEDEF" or + $d->{TYPE} eq "UNION" or + $d->{TYPE} eq "ENUM"); } foreach my $d (@{$interface->{DATA}}) { diff --git a/tools/pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm b/tools/pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm index 4566279009..e1a19a7d3b 100644 --- a/tools/pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm +++ b/tools/pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm @@ -12,7 +12,7 @@ require Exporter; @EXPORT = qw(is_charset_array); @EXPORT_OK = qw(check_null_pointer GenerateFunctionInEnv GenerateFunctionOutEnv EnvSubstituteValue GenerateStructEnv NeededFunction - NeededElement NeededType $res); + NeededElement NeededType $res NeededInterface); use strict; use Parse::Pidl::Typelist qw(hasType getType mapTypeName); @@ -2479,7 +2479,6 @@ sub ParseTypePull($$$$) pidl "ndr_pull_restore_relative_base_offset(ndr, _save_relative_base_offset);" if defined(has_property($e, "relative_base")); } - sub ParseTypePullFunction($$) { my ($e, $varname) = @_; @@ -2651,17 +2650,35 @@ sub NeededElement($$$) return if ($e->{TYPE} eq "EMPTY"); + return if (ref($e->{TYPE}) eq "HASH" and + not defined($e->{TYPE}->{NAME})); + + my ($t, $rt); + if (ref($e->{TYPE}) eq "HASH") { + $t = $e->{TYPE}->{TYPE}."_".$e->{TYPE}->{NAME}; + } else { + $t = $e->{TYPE}; + } + + if (ref($e->{REPRESENTATION_TYPE}) eq "HASH") { + $rt = $e->{REPRESENTATION_TYPE}->{TYPE}."_".$e->{REPRESENTATION_TYPE}->{NAME}; + } else { + $rt = $e->{REPRESENTATION_TYPE}; + } + + die ("$e->{NAME} $t, $rt FOO") unless ($rt ne ""); + my @fn = (); if ($dir eq "print") { - push(@fn, "print_$e->{REPRESENTATION_TYPE}"); + push(@fn, "print_$rt"); } elsif ($dir eq "pull") { - push (@fn, "pull_$e->{TYPE}"); - push (@fn, "ndr_$e->{TYPE}_to_$e->{REPRESENTATION_TYPE}") - if ($e->{REPRESENTATION_TYPE} ne $e->{TYPE}); + push (@fn, "pull_$t"); + push (@fn, "ndr_$t\_to_$rt") + if ($rt ne $t); } elsif ($dir eq "push") { - push (@fn, "push_$e->{TYPE}"); - push (@fn, "ndr_$e->{REPRESENTATION_TYPE}_to_$e->{TYPE}") - if ($e->{REPRESENTATION_TYPE} ne $e->{TYPE}); + push (@fn, "push_$t"); + push (@fn, "ndr_$rt\_to_$t") + if ($rt ne $t); } else { die("invalid direction `$dir'"); } @@ -2685,28 +2702,21 @@ sub NeededFunction($$) } } -sub NeededType($$) +sub NeededType($$$) { - my ($t,$needed) = @_; - if (has_property($t, "public")) { - $needed->{"pull_$t->{NAME}"} = 1; - $needed->{"push_$t->{NAME}"} = 1; - $needed->{"print_$t->{NAME}"} = 1; - } + sub NeededType($$$); + my ($t,$needed,$req) = @_; - if ($t->{DATA}->{TYPE} eq "STRUCT" or $t->{DATA}->{TYPE} eq "UNION") { - if (has_property($t, "gensize")) { - $needed->{"ndr_size_$t->{NAME}"} = 1; - } + NeededType($t->{DATA}, $needed, $req) if ($t->{TYPE} eq "TYPEDEF"); - for my $e (@{$t->{DATA}->{ELEMENTS}}) { - $e->{PARENT} = $t->{DATA}; + if ($t->{TYPE} eq "STRUCT" or $t->{TYPE} eq "UNION") { + for my $e (@{$t->{ELEMENTS}}) { + $e->{PARENT} = $t; if (has_property($e, "compression")) { $needed->{"compression"} = 1; } - NeededElement($e, "pull", $needed) if ($needed->{"pull_$t->{NAME}"}); - NeededElement($e, "push", $needed) if ($needed->{"push_$t->{NAME}"}); - NeededElement($e, "print", $needed) if ($needed->{"print_$t->{NAME}"}); + NeededElement($e, $req, $needed); + NeededType($e->{TYPE}, $needed, $req) if (ref($e->{TYPE}) eq "HASH"); } } } @@ -2717,7 +2727,19 @@ sub NeededInterface($$) { my ($interface,$needed) = @_; NeededFunction($_, $needed) foreach (@{$interface->{FUNCTIONS}}); - NeededType($_, $needed) foreach (reverse @{$interface->{TYPES}}); + foreach (reverse @{$interface->{TYPES}}) { + if (has_property($_, "public")) { + $needed->{"pull\_$_->{NAME}"} = $needed->{"push\_$_->{NAME}"} = + $needed->{"print\_$_->{NAME}"} = 1; + } + + NeededType($_, $needed, "pull") if ($needed->{"pull_$_->{NAME}"}); + NeededType($_, $needed, "push") if ($needed->{"push_$_->{NAME}"}); + NeededType($_, $needed, "print") if ($needed->{"print_$_->{NAME}"}); + if (has_property($_, "gensize")) { + $needed->{"ndr_size_$_->{NAME}"} = 1; + } + } } 1; diff --git a/tools/pidl/lib/Parse/Pidl/Wireshark/NDR.pm b/tools/pidl/lib/Parse/Pidl/Wireshark/NDR.pm index 9ba6f2f3e0..db7d2cf241 100644 --- a/tools/pidl/lib/Parse/Pidl/Wireshark/NDR.pm +++ b/tools/pidl/lib/Parse/Pidl/Wireshark/NDR.pm @@ -18,7 +18,7 @@ package Parse::Pidl::Wireshark::NDR; use Exporter; @ISA = qw(Exporter); -@EXPORT_OK = qw(field2name @ett %res PrintIdl); +@EXPORT_OK = qw(field2name @ett %res PrintIdl StripPrefixes %hf_used RegisterInterfaceHandoff $conformance register_hf_field CheckUsed); use strict; use Parse::Pidl qw(error warning); @@ -34,11 +34,11 @@ $VERSION = '0.01'; our @ett; -my %hf_used = (); +our %hf_used = (); my %return_types = (); my %dissector_used = (); -my $conformance = undef; +our $conformance = undef; my %ptrtype_mappings = ( "unique" => "NDR_POINTER_UNIQUE", @@ -46,11 +46,11 @@ my %ptrtype_mappings = ( "ptr" => "NDR_POINTER_PTR" ); -sub StripPrefixes($) +sub StripPrefixes($$) { - my ($s) = @_; + my ($s, $prefixes) = @_; - foreach (@{$conformance->{strip_prefixes}}) { + foreach (@$prefixes) { $s =~ s/^$_\_//g; } @@ -135,9 +135,9 @@ sub Enum($$$) { my ($e,$name,$ifname) = @_; my $valsstring = "$ifname\_$name\_vals"; - my $dissectorname = "$ifname\_dissect\_enum\_".StripPrefixes($name); + my $dissectorname = "$ifname\_dissect\_enum\_".StripPrefixes($name, $conformance->{strip_prefixes}); - return if (defined($conformance->{noemit}->{StripPrefixes($name)})); + return if (defined($conformance->{noemit}->{StripPrefixes($name, $conformance->{strip_prefixes})})); foreach (@{$e->{ELEMENTS}}) { if (/([^=]*)=(.*)/) { @@ -176,7 +176,7 @@ sub Enum($$$) sub Bitmap($$$) { my ($e,$name,$ifname) = @_; - my $dissectorname = "$ifname\_dissect\_bitmap\_".StripPrefixes($name); + my $dissectorname = "$ifname\_dissect\_bitmap\_".StripPrefixes($name, $conformance->{strip_prefixes}); register_ett("ett_$ifname\_$name"); @@ -272,7 +272,7 @@ sub ElementLevel($$$$$$) } elsif ($l->{LEVEL} eq "EMBEDDED") { $type = "embedded"; } - pidl_code "offset = dissect_ndr_$type\_pointer(tvb, offset, pinfo, tree, drep, $myname\_, $ptrtype_mappings{$l->{POINTER_TYPE}}, \"Pointer to ".field2name(StripPrefixes($e->{NAME})) . " ($e->{TYPE})\",$hf);"; + pidl_code "offset = dissect_ndr_$type\_pointer(tvb, offset, pinfo, tree, drep, $myname\_, $ptrtype_mappings{$l->{POINTER_TYPE}}, \"Pointer to ".field2name(StripPrefixes($e->{NAME}, $conformance->{strip_prefixes})) . " ($e->{TYPE})\",$hf);"; } elsif ($l->{TYPE} eq "ARRAY") { if ($l->{IS_INLINE}) { error($e->{ORIGINAL}, "Inline arrays not supported"); @@ -353,7 +353,7 @@ sub Element($$$) { my ($e,$pn,$ifname) = @_; - my $dissectorname = "$ifname\_dissect\_element\_".StripPrefixes($pn)."\_".StripPrefixes($e->{NAME}); + my $dissectorname = "$ifname\_dissect\_element\_".StripPrefixes($pn, $conformance->{strip_prefixes})."\_".StripPrefixes($e->{NAME}, $conformance->{strip_prefixes}); my $call_code = "offset = $dissectorname(tvb, offset, pinfo, tree, drep);"; @@ -381,7 +381,7 @@ sub Element($$$) my $hf = register_hf_field("hf_$ifname\_$pn\_$e->{NAME}", field2name($e->{NAME}), "$ifname.$pn.$e->{NAME}", $type->{FT_TYPE}, $type->{BASE_TYPE}, $type->{VALSSTRING}, $type->{MASK}, ""); $hf_used{$hf} = 1; - my $eltname = StripPrefixes($pn) . ".$e->{NAME}"; + my $eltname = StripPrefixes($pn, $conformance->{strip_prefixes}) . ".$e->{NAME}"; if (defined($conformance->{noemit}->{$eltname})) { return $call_code; } @@ -427,7 +427,7 @@ sub Function($$$) PrintIdl DumpFunction($fn->{ORIGINAL}); pidl_fn_start "$ifname\_dissect\_$fn_name\_response"; pidl_code "static int"; - pidl_code "$ifname\_dissect\_${fn_name}_response(tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, guint8 *drep _U_)"; + pidl_code "$ifname\_dissect\_${fn_name}_response(tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo, proto_tree *tree _U_, guint8 *drep _U_)"; pidl_code "{"; indent; if ( not defined($fn->{RETURN_TYPE})) { @@ -446,6 +446,7 @@ sub Function($$$) error($fn, "unknown return type `$fn->{RETURN_TYPE}'"); } + pidl_code "pinfo->dcerpc_procedure_name=\"${fn_name}\";"; foreach (@{$fn->{ELEMENTS}}) { if (grep(/out/,@{$_->{DIRECTION}})) { pidl_code "$dissectornames{$_->{NAME}}"; @@ -491,9 +492,10 @@ sub Function($$$) pidl_fn_start "$ifname\_dissect\_$fn_name\_request"; pidl_code "static int"; - pidl_code "$ifname\_dissect\_${fn_name}_request(tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, guint8 *drep _U_)"; + pidl_code "$ifname\_dissect\_${fn_name}_request(tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo, proto_tree *tree _U_, guint8 *drep _U_)"; pidl_code "{"; indent; + pidl_code "pinfo->dcerpc_procedure_name=\"${fn_name}\";"; foreach (@{$fn->{ELEMENTS}}) { if (grep(/in/,@{$_->{DIRECTION}})) { pidl_code "$dissectornames{$_->{NAME}}"; @@ -511,9 +513,9 @@ sub Function($$$) sub Struct($$$) { my ($e,$name,$ifname) = @_; - my $dissectorname = "$ifname\_dissect\_struct\_".StripPrefixes($name); + my $dissectorname = "$ifname\_dissect\_struct\_".StripPrefixes($name, $conformance->{strip_prefixes}); - return if (defined($conformance->{noemit}->{StripPrefixes($name)})); + return if (defined($conformance->{noemit}->{StripPrefixes($name, $conformance->{strip_prefixes})})); register_ett("ett_$ifname\_$name"); @@ -561,9 +563,9 @@ sub Union($$$) { my ($e,$name,$ifname) = @_; - my $dissectorname = "$ifname\_dissect_".StripPrefixes($name); + my $dissectorname = "$ifname\_dissect_".StripPrefixes($name, $conformance->{strip_prefixes}); - return if (defined($conformance->{noemit}->{StripPrefixes($name)})); + return if (defined($conformance->{noemit}->{StripPrefixes($name, $conformance->{strip_prefixes})})); register_ett("ett_$ifname\_$name"); @@ -839,17 +841,17 @@ sub Initialize($) foreach my $bytes (qw(1 2 4 8)) { my $bits = $bytes * 8; - register_type("uint$bits", "offset = dissect_ndr_uint$bits(tvb, offset, pinfo, tree, drep, \@HF\@,NULL);", "FT_UINT$bits", "BASE_DEC", 0, "NULL", $bytes); - register_type("int$bits", "offset = dissect_ndr_uint$bits(tvb, offset, pinfo, tree, drep, \@HF\@, NULL);", "FT_INT$bits", "BASE_DEC", 0, "NULL", $bytes); + register_type("uint$bits", "offset = PIDL_dissect_uint$bits(tvb, offset, pinfo, tree, drep, \@HF\@, \@PARAM\@);", "FT_UINT$bits", "BASE_DEC", 0, "NULL", $bytes); + register_type("int$bits", "offset = PIDL_dissect_uint$bits(tvb, offset, pinfo, tree, drep, \@HF\@, \@PARAM\@);", "FT_INT$bits", "BASE_DEC", 0, "NULL", $bytes); } register_type("udlong", "offset = dissect_ndr_duint32(tvb, offset, pinfo, tree, drep, \@HF\@, NULL);", "FT_UINT64", "BASE_DEC", 0, "NULL", 4); - register_type("bool8", "offset = dissect_ndr_uint8(tvb, offset, pinfo, tree, drep, \@HF\@, NULL);","FT_INT8", "BASE_DEC", 0, "NULL", 1); - register_type("char", "offset = dissect_ndr_uint8(tvb, offset, pinfo, tree, drep, \@HF\@, NULL);","FT_INT8", "BASE_DEC", 0, "NULL", 1); - register_type("long", "offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep, \@HF\@, NULL);","FT_INT32", "BASE_DEC", 0, "NULL", 4); + register_type("bool8", "offset = PIDL_dissect_uint8(tvb, offset, pinfo, tree, drep, \@HF\@, \@PARAM\@);","FT_INT8", "BASE_DEC", 0, "NULL", 1); + register_type("char", "offset = PIDL_dissect_uint8(tvb, offset, pinfo, tree, drep, \@HF\@, \@PARAM\@);","FT_INT8", "BASE_DEC", 0, "NULL", 1); + register_type("long", "offset = PIDL_dissect_uint32(tvb, offset, pinfo, tree, drep, \@HF\@, \@PARAM\@);","FT_INT32", "BASE_DEC", 0, "NULL", 4); register_type("dlong", "offset = dissect_ndr_duint32(tvb, offset, pinfo, tree, drep, \@HF\@, NULL);","FT_INT64", "BASE_DEC", 0, "NULL", 8); register_type("GUID", "offset = dissect_ndr_uuid_t(tvb, offset, pinfo, tree, drep, \@HF\@, NULL);","FT_GUID", "BASE_NONE", 0, "NULL", 4); - register_type("policy_handle", "offset = dissect_nt_policy_hnd(tvb, offset, pinfo, tree, drep, \@HF\@, NULL, NULL, \@PARAM\@&0x01, \@PARAM\@&0x02);","FT_BYTES", "BASE_NONE", 0, "NULL", 4); + register_type("policy_handle", "offset = PIDL_dissect_policy_hnd(tvb, offset, pinfo, tree, drep, \@HF\@, \@PARAM\@);","FT_BYTES", "BASE_NONE", 0, "NULL", 4); register_type("NTTIME", "offset = dissect_ndr_nt_NTTIME(tvb, offset, pinfo, tree, drep, \@HF\@);","FT_ABSOLUTE_TIME", "BASE_NONE", 0, "NULL", 4); register_type("NTTIME_hyper", "offset = dissect_ndr_nt_NTTIME(tvb, offset, pinfo, tree, drep, \@HF\@);","FT_ABSOLUTE_TIME", "BASE_NONE", 0, "NULL", 4); register_type("time_t", "offset = dissect_ndr_time_t(tvb, offset, pinfo,tree, drep, \@HF\@, NULL);","FT_ABSOLUTE_TIME", "BASE_DEC", 0, "NULL", 4); @@ -862,9 +864,9 @@ sub Initialize($) offset = dissect_ndr_nt_SID_with_options(tvb, offset, pinfo, tree, drep, param); ","FT_STRING", "BASE_DEC", 0, "NULL", 4); register_type("WERROR", - "offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep, \@HF\@, NULL);","FT_UINT32", "BASE_DEC", 0, "VALS(WERR_errors)", 4); + "offset = PIDL_dissect_uint32(tvb, offset, pinfo, tree, drep, \@HF\@, \@PARAM\@);","FT_UINT32", "BASE_DEC", 0, "VALS(WERR_errors)", 4); register_type("NTSTATUS", - "offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep, \@HF\@, NULL);","FT_UINT32", "BASE_DEC", 0, "VALS(NT_errors)", 4); + "offset = PIDL_dissect_uint32(tvb, offset, pinfo, tree, drep, \@HF\@, \@PARAM\@);","FT_UINT32", "BASE_DEC", 0, "VALS(NT_errors)", 4); } diff --git a/tools/pidl/tests/samba-ejs.pl b/tools/pidl/tests/samba-ejs.pl new file mode 100755 index 0000000000..350cba571c --- /dev/null +++ b/tools/pidl/tests/samba-ejs.pl @@ -0,0 +1,42 @@ +#!/usr/bin/perl +# (C) 2007 Jelmer Vernooij <jelmer@samba.org> +# Published under the GNU General Public License +use strict; +use warnings; + +use Test::More tests => 13; +use FindBin qw($RealBin); +use lib "$RealBin"; +use Util; +use Parse::Pidl::Util qw(MyDumper); +use Parse::Pidl::Samba4::EJS qw(get_pointer_to get_value_of check_null_pointer + $res $res_hdr fn_declare); + +is("&foo", get_pointer_to("foo")); +is("&(&foo)", get_pointer_to(get_pointer_to("foo"))); +is("*foo", get_pointer_to("**foo")); +is("foo", get_pointer_to("*foo")); + +is("foo", get_value_of("&foo")); +is("*foo", get_value_of("foo")); +is("**foo", get_value_of("*foo")); + +$res = ""; +check_null_pointer("bla"); +is($res, ""); + +$res = ""; +check_null_pointer("*bla"); +is($res, "if (bla == NULL) return NT_STATUS_INVALID_PARAMETER_MIX;\n"); + +$res = ""; +$res_hdr = ""; +fn_declare({ PROPERTIES => { public => 1 } }, "myproto(int x)"); +is($res, "_PUBLIC_ myproto(int x)\n"); +is($res_hdr, "myproto(int x);\n"); + +$res = ""; +$res_hdr = ""; +fn_declare({ PROPERTIES => {} }, "mybla(int foo)"); +is($res, "static mybla(int foo)\n"); +is($res_hdr, ""); diff --git a/tools/pidl/tests/samba-ndr.pl b/tools/pidl/tests/samba-ndr.pl index 1167f77aee..d956402e64 100755 --- a/tools/pidl/tests/samba-ndr.pl +++ b/tools/pidl/tests/samba-ndr.pl @@ -11,7 +11,8 @@ use Util; use Parse::Pidl::Util qw(MyDumper); use Parse::Pidl::Samba4::NDR::Parser qw(check_null_pointer GenerateFunctionInEnv GenerateFunctionOutEnv GenerateStructEnv - EnvSubstituteValue NeededFunction NeededElement NeededType $res); + EnvSubstituteValue NeededFunction NeededElement NeededType $res + NeededInterface); my $output; sub print_fn($) { my $x = shift; $output.=$x; } @@ -209,46 +210,51 @@ is_deeply($needed, { pull_foo => 1, print_foo => 1, push_foo => 1, # public structs are always needed $needed = {}; -NeededType({ NAME => "bla", DATA => { TYPE => "STRUCT", ELEMENTS => [] } }, - $needed); +NeededType({ NAME => "bla", TYPE => "TYPEDEF", + DATA => { TYPE => "STRUCT", ELEMENTS => [] } }, + $needed, "pull"); is_deeply($needed, { }); $needed = {}; -NeededType({ PROPERTIES => { public => 1 }, NAME => "bla", - DATA => { TYPE => "STRUCT", ELEMENTS => [] } }, +NeededInterface({ TYPES => [ { PROPERTIES => { public => 1 }, NAME => "bla", + TYPE => "TYPEDEF", + DATA => { TYPE => "STRUCT", ELEMENTS => [] } } ] }, $needed); -is_deeply($needed, { pull_bla => 1, print_bla => 1, push_bla => 1 }); +is_deeply($needed, { pull_bla => 1, push_bla => 1, print_bla => 1 }); # make sure types for elements are set too $needed = {}; -NeededType({ PROPERTIES => { public => 1 }, NAME => "bla", +NeededInterface({ TYPES => [ { PROPERTIES => { public => 1 }, NAME => "bla", + TYPE => "TYPEDEF", DATA => { TYPE => "STRUCT", - ELEMENTS => [ { TYPE => "bar", REPRESENTATION_TYPE => "bar" } ] } }, + ELEMENTS => [ { TYPE => "bar", REPRESENTATION_TYPE => "bar" } ] } } ] }, $needed); -is_deeply($needed, { pull_bla => 1, print_bla => 1, push_bla => 1, - pull_bar => 1, print_bar => 1, push_bar => 1}); +is_deeply($needed, { pull_bla => 1, pull_bar => 1, push_bla => 1, push_bar => 1, + print_bla => 1, print_bar => 1}); $needed = {}; -NeededType({ PROPERTIES => { gensize => 1}, NAME => "bla", +NeededInterface({ TYPES => [ { PROPERTIES => { gensize => 1}, NAME => "bla", + TYPE => "TYPEDEF", DATA => { TYPE => "STRUCT", - ELEMENTS => [ { TYPE => "bar", REPRESENTATION_TYPE => "bar" } ] } }, + ELEMENTS => [ { TYPE => "bar", REPRESENTATION_TYPE => "bar" } ] } } ] }, $needed); is_deeply($needed, { ndr_size_bla => 1 }); # make sure types for elements are set too $needed = { pull_bla => 1 }; NeededType({ NAME => "bla", + TYPE => "TYPEDEF", DATA => { TYPE => "STRUCT", ELEMENTS => [ { TYPE => "bar", REPRESENTATION_TYPE => "bar" } ] } }, - $needed); + $needed, "pull"); is_deeply($needed, { pull_bla => 1, pull_bar => 1 }); $needed = {}; -NeededType({ PROPERTIES => { public => 1}, +NeededInterface({ TYPES => [ { PROPERTIES => { public => 1}, NAME => "bla", + TYPE => "TYPEDEF", DATA => { TYPE => "STRUCT", - ELEMENTS => [ { TYPE => "bar", REPRESENTATION_TYPE => "rep" } ] } }, - $needed); + ELEMENTS => [ { TYPE => "bar", REPRESENTATION_TYPE => "rep" } ] } } ] }, $needed); is_deeply($needed, { pull_bla => 1, push_bla => 1, print_bla => 1, print_rep => 1, pull_bar => 1, push_bar => 1, ndr_bar_to_rep => 1, ndr_rep_to_bar => 1}); diff --git a/tools/pidl/tests/wireshark-ndr.pl b/tools/pidl/tests/wireshark-ndr.pl index 574060f8ea..02eabb8942 100755 --- a/tools/pidl/tests/wireshark-ndr.pl +++ b/tools/pidl/tests/wireshark-ndr.pl @@ -5,12 +5,12 @@ use strict; use warnings; -use Test::More tests => 3; +use Test::More tests => 11; use FindBin qw($RealBin); use lib "$RealBin"; use Util; use Parse::Pidl::Util qw(MyDumper); -use Parse::Pidl::Wireshark::NDR qw(field2name %res PrintIdl); +use Parse::Pidl::Wireshark::NDR qw(field2name %res PrintIdl StripPrefixes %hf_used RegisterInterfaceHandoff $conformance register_hf_field CheckUsed); is("Access Mask", field2name("access_mask")); is("Accessmask", field2name("AccessMask")); @@ -21,3 +21,52 @@ is("/* IDL: foo */ /* IDL: bar */ ", $res{code}); + +is("bla_foo", StripPrefixes("bla_foo", [])); +is("foo", StripPrefixes("bla_foo", ["bla"])); +is("foo_bla", StripPrefixes("foo_bla", ["bla"])); + +%hf_used = (); +$res{code} = ""; +RegisterInterfaceHandoff({}); +is($res{code}, ""); +ok(not defined($hf_used{hf_bla_opnum})); + +%hf_used = (); +$res{code} = ""; +RegisterInterfaceHandoff({UUID => "uuid", NAME => "bla"}); +is($res{code}, 'void proto_reg_handoff_dcerpc_bla(void) +{ + dcerpc_init_uuid(proto_dcerpc_bla, ett_dcerpc_bla, + &uuid_dcerpc_bla, ver_dcerpc_bla, + bla_dissectors, hf_bla_opnum); +} +'); +is($hf_used{hf_bla_opnum}, 1); + +$conformance = {}; +register_hf_field("hf_bla_idx", "bla", "my.filter", "FT_UINT32", "BASE_HEX", "NULL", 0xF, undef); +is_deeply($conformance, { + header_fields => { + "hf_bla_idx" => { + INDEX => "hf_bla_idx", + NAME => "bla", + FILTER => "my.filter", + BASE_TYPE => "BASE_HEX", + FT_TYPE => "FT_UINT32", + VALSSTRING => "NULL", + BLURB => undef, + MASK => 0xF + } + }, + hf_renames => {}, + fielddescription => {} +}); + +%hf_used = ( hf_bla => 1 ); +test_warnings("", sub { + CheckUsed({ header_fields => { INDEX => "hf_bla" }})}); + +%hf_used = ( ); +test_warnings("nofile:0: hf field `hf_bla' not used\n", sub { + CheckUsed({ header_fields => { INDEX => "hf_bla" }})}); |