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