Rev 11318: Merge upstream. in file:///home/jelmer/bzr.samba/4.0-perlselftest/

Jelmer Vernooij jelmer at samba.org
Wed Feb 21 23:00:40 GMT 2007


At file:///home/jelmer/bzr.samba/4.0-perlselftest/

------------------------------------------------------------
revno: 11318
revision-id: jelmer at samba.org-20070221230028-2w6bb3689dayshj6
parent: jelmer at samba.org-20070221225505-cwazqmwe1hkiducp
parent: svn-v2:21493 at 0c0555d6-39d7-0310-84fc-f1cc0bd64818-branches%2fSAMBA_4_0
committer: Jelmer Vernooij <jelmer at samba.org>
branch nick: 4.0-perlselftest
timestamp: Thu 2007-02-22 00:00:28 +0100
message:
  Merge upstream.
added:
  source/pidl/tests/samba-ejs.pl svn-v2:21490 at 0c0555d6-39d7-0310-84fc-f1cc0bd64818-branches%2fSAMBA_4_0-source%2fpidl%2ftests%2fsamba%2dejs.pl
modified:
  source/pidl/TODO               svn-v2:9459 at 0c0555d6-39d7-0310-84fc-f1cc0bd64818-branches%2fSAMBA_4_0-source%2fpidl%2fTODO
  source/pidl/lib/Parse/Pidl/Samba4/EJS.pm svn-v2:12463 at 0c0555d6-39d7-0310-84fc-f1cc0bd64818-branches%2fSAMBA_4_0-source%2fpidl%2flib%2fParse%2fPidl%2fSamba4%2fEJS.pm
  source/pidl/lib/Parse/Pidl/Samba4/Header.pm svn-v2:12463 at 0c0555d6-39d7-0310-84fc-f1cc0bd64818-branches%2fSAMBA_4_0-source%2fpidl%2flib%2fParse%2fPidl%2fSamba4%2fHeader.pm
  source/pidl/lib/Parse/Pidl/Wireshark/NDR.pm svn-v2:16824 at 0c0555d6-39d7-0310-84fc-f1cc0bd64818-branches%2fSAMBA_4_0-source%2fpidl%2flib%2fParse%2fPidl%2fWireshark%2fNDR.pm
  source/torture/rpc/drsuapi_cracknames.c svn-v2:10804 at 0c0555d6-39d7-0310-84fc-f1cc0bd64818-branches%2fSAMBA_4_0-source%2ftorture%2frpc%2fdrsuapi_cracknames.c
    ------------------------------------------------------------
    revno: 11286.1.5.1.27.1.8.1.236
    merged: svn-v2:21493 at 0c0555d6-39d7-0310-84fc-f1cc0bd64818-branches%2fSAMBA_4_0
    parent: svn-v2:21492 at 0c0555d6-39d7-0310-84fc-f1cc0bd64818-branches%2fSAMBA_4_0
    parent: jelmer at samba.org-20070221205428-1zdem89mxo23fywq
    committer: jelmer
    timestamp: Wed 2007-02-21 20:59:01 +0000
    message:
      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.
        ------------------------------------------------------------
        revno: 11286.1.5.1.27.1.8.1.235.1.1
        merged: jelmer at samba.org-20070221205428-1zdem89mxo23fywq
        parent: svn-v2:21492 at 0c0555d6-39d7-0310-84fc-f1cc0bd64818-branches%2fSAMBA_4_0
        committer: Jelmer Vernooij <jelmer at samba.org>
        branch nick: SAMBA_4_0
        timestamp: Wed 2007-02-21 21:54:28 +0100
        message:
          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.
    ------------------------------------------------------------
    revno: 11286.1.5.1.27.1.8.1.235
    merged: svn-v2:21492 at 0c0555d6-39d7-0310-84fc-f1cc0bd64818-branches%2fSAMBA_4_0
    parent: svn-v2:21491 at 0c0555d6-39d7-0310-84fc-f1cc0bd64818-branches%2fSAMBA_4_0
    parent: jelmer at samba.org-20070221141543-vl5ror4myglk0fer
    committer: jelmer
    timestamp: Wed 2007-02-21 14:35:25 +0000
    message:
      Finish work on nested type support in EJS.
        ------------------------------------------------------------
        revno: 11286.1.5.1.27.1.8.1.234.1.1
        merged: jelmer at samba.org-20070221141543-vl5ror4myglk0fer
        parent: svn-v2:21491 at 0c0555d6-39d7-0310-84fc-f1cc0bd64818-branches%2fSAMBA_4_0
        committer: Jelmer Vernooij <jelmer at samba.org>
        branch nick: SAMBA_4_0
        timestamp: Wed 2007-02-21 15:15:43 +0100
        message:
          Finish work on nested type support in EJS.
    ------------------------------------------------------------
    revno: 11286.1.5.1.27.1.8.1.234
    merged: svn-v2:21491 at 0c0555d6-39d7-0310-84fc-f1cc0bd64818-branches%2fSAMBA_4_0
    parent: svn-v2:21490 at 0c0555d6-39d7-0310-84fc-f1cc0bd64818-branches%2fSAMBA_4_0
    committer: abartlet
    timestamp: Wed 2007-02-21 13:03:24 +0000
    message:
      Verify that the DNS domain name is filled in on GUID searches in the
      RPC-CRACKNAMES test.
      
      Andrew Bartlett
    ------------------------------------------------------------
    revno: 11286.1.5.1.27.1.8.1.233
    merged: svn-v2:21490 at 0c0555d6-39d7-0310-84fc-f1cc0bd64818-branches%2fSAMBA_4_0
    parent: svn-v2:21489 at 0c0555d6-39d7-0310-84fc-f1cc0bd64818-branches%2fSAMBA_4_0
    parent: jelmer at samba.org-20070221123127-0131p4yw87krxoif
    committer: jelmer
    timestamp: Wed 2007-02-21 12:35:21 +0000
    message:
      Add some tests for the EJS code
      More work on supporting nested types in EJS.
    ------------------------------------------------------------
    revno: 11286.1.5.1.27.1.8.1.232.1.1
    merged: jelmer at samba.org-20070221123127-0131p4yw87krxoif
    parent: svn-v2:21489 at 0c0555d6-39d7-0310-84fc-f1cc0bd64818-branches%2fSAMBA_4_0
    committer: Jelmer Vernooij <jelmer at samba.org>
    branch nick: SAMBA_4_0
    timestamp: Wed 2007-02-21 13:31:27 +0100
    message:
      Add some tests for the EJS code
      More work on supporting nested types in EJS.
=== added file 'source/pidl/tests/samba-ejs.pl'
--- a/source/pidl/tests/samba-ejs.pl	1970-01-01 00:00:00 +0000
+++ b/source/pidl/tests/samba-ejs.pl	2007-02-21 12:35:21 +0000
@@ -0,0 +1,42 @@
+#!/usr/bin/perl
+# (C) 2007 Jelmer Vernooij <jelmer at 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, "");

=== modified file 'source/pidl/TODO'
--- a/source/pidl/TODO	2007-02-18 16:21:28 +0000
+++ b/source/pidl/TODO	2007-02-21 14:35:25 +0000
@@ -7,8 +7,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

=== modified file 'source/pidl/lib/Parse/Pidl/Samba4/EJS.pm'
--- a/source/pidl/lib/Parse/Pidl/Samba4/EJS.pm	2007-02-21 11:32:48 +0000
+++ b/source/pidl/lib/Parse/Pidl/Samba4/EJS.pm	2007-02-21 14:35:25 +0000
@@ -6,16 +6,23 @@
 
 package Parse::Pidl::Samba4::EJS;
 
+use Exporter;
+ at ISA = qw(Exporter);
+ at 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 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;
 
@@ -46,52 +53,6 @@
 	$tabs = substr($tabs, 0, -1);
 }
 
-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 @@
 	}
 }
 
-
 #####################################################################
 # work out is a parse function should be declared static or not
 sub fn_declare($$)
@@ -150,22 +110,25 @@
 
 	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);
         }
 
-	my $t;
-	if (ref($e->{TYPE}) eq "HASH") {
-		$t = "$e->{TYPE}->{TYPE}_$e->{TYPE}->{NAME}";
-	} else {
-		$t = $e->{TYPE};
+    	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));";
 	}
-
-	pidl "NDR_CHECK(ejs_pull_$t(ejs, v, $name, $var));";
 }
 
 ###########################
@@ -203,7 +166,6 @@
 	pidl "NDR_CHECK(ejs_pull_string(ejs, v, $name, $var));";
 }
 
-
 ###########################
 # pull an array element
 sub EjsPullArray($$$$$)
@@ -290,29 +252,20 @@
 # pull a struct
 sub EjsStructPull($$)
 {
-	my ($name, $d) = @_;
-	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, $d) = @_;
+	my ($d, $varname) = @_;
 	my $have_default = 0;
-	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;
@@ -323,7 +276,7 @@
 		pidl "$e->{CASE}:";
 		indent;
 		if ($e->{TYPE} ne "EMPTY") {
-			EjsPullElementTop($e, { $e->{NAME} => "r->$e->{NAME}"});
+			EjsPullElementTop($e, { $e->{NAME} => "$varname->$e->{NAME}"});
 		}
 		pidl "break;";
 		deindent;
@@ -336,9 +289,6 @@
 	}
 	deindent;
 	pidl "}";
-	pidl "return NT_STATUS_OK;";
-	deindent;
-	pidl "}";
 }
 
 ##############################################
@@ -363,51 +313,66 @@
 # pull a enum
 sub EjsEnumPull($$)
 {
-	my ($name, $d) = @_;
+	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, $d) = @_;
+	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}";
 	}
 }
 
@@ -444,28 +409,32 @@
 	pidl "}\n";
 }
 
-
 ###########################
 # push a scalar element
 sub EjsPushScalar($$$$$)
 {
 	my ($e, $l, $var, $name, $env) = @_;
-        # have to handle strings specially :(
+
+	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};
+		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));";
 	}
-
-	pidl "NDR_CHECK(ejs_push_$t(ejs, v, $name, $var));";
 }
 
 ###########################
@@ -511,7 +480,6 @@
 	EjsPushElement($e, GetNextLevel($e, $l), $var, $name, $env);
 }
 
-
 ###########################
 # push an array element
 sub EjsPushArray($$$$$)
@@ -579,29 +547,20 @@
 # push a struct
 sub EjsStructPush($$)
 {
-	my ($name, $d) = @_;
-	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, $d) = @_;
+	my ($d, $varname) = @_;
 	my $have_default = 0;
-	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;
@@ -612,7 +571,7 @@
 		pidl "$e->{CASE}:";
 		indent;
 		if ($e->{TYPE} ne "EMPTY") {
-			EjsPushElementTop($e, { $e->{NAME} => "r->$e->{NAME}"} );
+			EjsPushElementTop($e, { $e->{NAME} => "$varname->$e->{NAME}"} );
 		}
 		pidl "break;";
 		deindent;
@@ -625,35 +584,24 @@
 	}
 	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, $d) = @_;
+	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*$/) {
@@ -662,36 +610,55 @@
 			$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($)
@@ -719,7 +686,6 @@
 	pidl "}\n";
 }
 
-
 #################################
 # generate a ejs mapping function
 sub EjsFunction($$)
@@ -771,8 +737,8 @@
 	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}}) {
@@ -879,32 +845,25 @@
 	}
 }
 
-sub NeededTypedef($$)
+sub NeededType($$$)
 {
-	my ($t,$needed) = @_;
-
-	if (has_property($t, "public")) {
-		$needed->{"pull_$t->{NAME}"} = not has_property($t, "noejs");
-		$needed->{"push_$t->{NAME}"} = not has_property($t, "noejs");
-	}
-
-	return if (($t->{DATA}->{TYPE} ne "STRUCT") and 
-			   ($t->{DATA}->{TYPE} ne "UNION"));
-
-	foreach (@{$t->{DATA}->{ELEMENTS}}) {
+	sub NeededType($$$);
+	my ($t,$needed,$req) = @_;
+
+	NeededType($t->{DATA}, $needed, $req) if ($t->{TYPE} eq "TYPEDEF");
+
+	return if (($t->{TYPE} ne "STRUCT") and 
+			   ($t->{TYPE} ne "UNION"));
+
+	foreach (@{$t->{ELEMENTS}}) {
 		next if (has_property($_, "subcontext")); #FIXME: Support subcontexts
 		my $n;
-		if (ref($_->{TYPE}) eq "HASH") {
-			$n = "$_->{TYPE}->{TYPE}_$_->{TYPE}->{NAME}";
-		} else {
-			$n = $_->{TYPE};
-		}
-		unless (defined($needed->{"pull_$n"})) {
-			$needed->{"pull_$n"} = $needed->{"pull_$t->{NAME}"};
-		}
-		unless (defined($needed->{"push_$n"})) {
-			$needed->{"push_$n"} = $needed->{"push_$t->{NAME}"};
-		}
+		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");
 	}
 }
 
@@ -915,7 +874,16 @@
 	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;

=== modified file 'source/pidl/lib/Parse/Pidl/Samba4/Header.pm'
--- a/source/pidl/lib/Parse/Pidl/Samba4/Header.pm	2007-02-21 10:55:03 +0000
+++ b/source/pidl/lib/Parse/Pidl/Samba4/Header.pm	2007-02-21 14:35:25 +0000
@@ -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 @@
 		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}})
 		{

=== modified file 'source/pidl/lib/Parse/Pidl/Wireshark/NDR.pm'
--- a/source/pidl/lib/Parse/Pidl/Wireshark/NDR.pm	2007-02-18 16:46:59 +0000
+++ b/source/pidl/lib/Parse/Pidl/Wireshark/NDR.pm	2007-02-21 20:59:01 +0000
@@ -427,7 +427,7 @@
 	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 @@
 		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 @@
 
 	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}}";
@@ -849,7 +851,7 @@
 	register_type("long", "offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep, \@HF\@, NULL);","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);

=== modified file 'source/torture/rpc/drsuapi_cracknames.c'
--- a/source/torture/rpc/drsuapi_cracknames.c	2006-12-28 22:51:56 +0000
+++ b/source/torture/rpc/drsuapi_cracknames.c	2007-02-21 13:03:24 +0000
@@ -406,6 +406,38 @@
 
 	FQDN_1779_name = r.out.ctr.ctr1->array[0].result_name;
 
+	r.in.req.req1.format_offered	= DRSUAPI_DS_NAME_FORMAT_GUID;
+	r.in.req.req1.format_desired	= DRSUAPI_DS_NAME_FORMAT_FQDN_1779;
+	names[0].str = priv->domain_guid_str;
+
+	printf("testing DsCrackNames with name '%s' desired format:%d\n",
+	       names[0].str, r.in.req.req1.format_desired);
+
+	status = dcerpc_drsuapi_DsCrackNames(p, mem_ctx, &r);
+	if (!NT_STATUS_IS_OK(status)) {
+		const char *errstr = nt_errstr(status);
+		if (NT_STATUS_EQUAL(status, NT_STATUS_NET_WRITE_FAULT)) {
+			errstr = dcerpc_errstr(mem_ctx, p->last_fault_code);
+		}
+		printf("dcerpc_drsuapi_DsCrackNames failed - %s\n", errstr);
+		ret = False;
+	} else if (!W_ERROR_IS_OK(r.out.result)) {
+		printf("DsCrackNames failed - %s\n", win_errstr(r.out.result));
+		ret = False;
+	} else if (r.out.ctr.ctr1->array[0].status != DRSUAPI_DS_NAME_STATUS_OK) {
+		printf("DsCrackNames failed on name - %d\n", r.out.ctr.ctr1->array[0].status);
+		ret = False;
+	}
+
+	if (!ret) {
+		return ret;
+	}
+
+	if (strcmp(priv->domain_dns_name, r.out.ctr.ctr1->array[0].dns_domain_name) != 0) {
+		printf("DsCrackNames failed to return same DNS name - expected %s got %s\n", priv->domain_dns_name, r.out.ctr.ctr1->array[0].dns_domain_name);
+		return False;
+	}
+
 	FQDN_1779_dn = ldb_dn_new(mem_ctx, ldb, FQDN_1779_name);
 
 	canonical_name = ldb_dn_canonical_string(mem_ctx, FQDN_1779_dn);



More information about the samba-cvs mailing list