aboutsummaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorJörg Mayer <jmayer@loplof.de>2007-02-26 08:57:03 +0000
committerJörg Mayer <jmayer@loplof.de>2007-02-26 08:57:03 +0000
commitc7fd37e49c0d684b57e739b1c90f67c7978e30b6 (patch)
tree8aa6939b2f1a3672273d3b2345907e4b2a2ded4a /tools
parent2b75ac83af8e23f8b9d284c143537d7ab5b82487 (diff)
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
Diffstat (limited to 'tools')
-rw-r--r--tools/pidl/TODO4
-rw-r--r--tools/pidl/lib/Parse/Pidl/NDR.pm16
-rw-r--r--tools/pidl/lib/Parse/Pidl/Samba4/EJS.pm390
-rw-r--r--tools/pidl/lib/Parse/Pidl/Samba4/Header.pm15
-rw-r--r--tools/pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm74
-rw-r--r--tools/pidl/lib/Parse/Pidl/Wireshark/NDR.pm54
-rwxr-xr-xtools/pidl/tests/samba-ejs.pl42
-rwxr-xr-xtools/pidl/tests/samba-ndr.pl38
-rwxr-xr-xtools/pidl/tests/wireshark-ndr.pl53
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" }})});