1
0
mirror of https://github.com/samba-team/samba.git synced 2024-12-25 23:21:54 +03:00

r18471: Remove other Samba3 parser generator support as well - it's no

longer necessary as we can use libndr now.
(This used to be commit 22142a9f3d)
This commit is contained in:
Jelmer Vernooij 2006-09-13 13:49:17 +00:00 committed by Gerald (Jerry) Carter
parent e26ed8b3e2
commit 0eb9794e9f
5 changed files with 2 additions and 1379 deletions

View File

@ -1,223 +0,0 @@
###################################################
# Samba3 NDR header generator for IDL structures
# Copyright jelmer@samba.org 2005
# released under the GNU GPL
package Parse::Pidl::Samba3::Header;
use strict;
use Parse::Pidl::Typelist qw(hasType getType);
use Parse::Pidl::Util qw(has_property ParseExpr);
use Parse::Pidl::NDR qw(GetPrevLevel GetNextLevel ContainsDeferred);
use Parse::Pidl::Samba3::Types qw(DeclShort StringType);
use vars qw($VERSION);
$VERSION = '0.01';
my $res = "";
my $tabs = "";
sub indent() { $tabs.="\t"; }
sub deindent() { $tabs = substr($tabs, 1); }
sub pidl($) { $res .= $tabs.(shift)."\n"; }
sub fatal($$) { my ($e,$s) = @_; die("$e->{ORIGINAL}->{FILE}:$e->{ORIGINAL}->{LINE}: $s\n"); }
sub warning($$) { my ($e,$s) = @_; warn("$e->{ORIGINAL}->{FILE}:$e->{ORIGINAL}->{LINE}: $s\n"); }
sub ParseElement($)
{
my $e = shift;
foreach my $l (@{$e->{LEVELS}}) {
if ($l->{TYPE} eq "POINTER") {
next if ($l->{POINTER_TYPE} eq "ref" and $l->{LEVEL} eq "TOP");
pidl "\tuint32 ptr$l->{POINTER_INDEX}_$e->{NAME};";
} elsif ($l->{TYPE} eq "SWITCH") {
} elsif ($l->{TYPE} eq "DATA") {
my $n = DeclShort($e);
pidl "\t$n;" if ($n);
} elsif ($l->{TYPE} eq "ARRAY" and $l->{IS_ZERO_TERMINATED}) {
my ($t,$f) = StringType($e,$l);
pidl "\t" . uc($t) . " $e->{NAME};";
return;
} elsif ($l->{TYPE} eq "ARRAY") {
if ($l->{IS_CONFORMANT}) {
pidl "\tuint32 size_$e->{NAME};";
}
if ($l->{IS_VARYING}) {
pidl "\tuint32 length_$e->{NAME};";
pidl "\tuint32 offset_$e->{NAME};";
}
}
}
}
sub CreateStruct($$$$)
{
my ($if,$fn,$n,$t) = @_;
pidl "typedef struct $n {";
ParseElement($_) foreach (@$t);
if (not @$t) {
# Some compilers don't like empty structs
pidl "\tuint32 dummy;";
}
pidl "} " . uc($n) . ";";
pidl "";
}
sub ParseFunction($$)
{
my ($if,$fn) = @_;
my @in = ();
my @out = ();
foreach (@{$fn->{ELEMENTS}}) {
push (@in, $_) if (grep(/in/, @{$_->{DIRECTION}}));
push (@out, $_) if (grep(/out/, @{$_->{DIRECTION}}));
}
if (defined($fn->{RETURN_TYPE})) {
push (@out, {
NAME => "status",
TYPE => $fn->{RETURN_TYPE},
LEVELS => [
{
TYPE => "DATA",
DATA_TYPE => $fn->{RETURN_TYPE}
}
]
} );
}
# define Q + R structures for functions
CreateStruct($if, $fn, "$if->{NAME}_q_$fn->{NAME}", \@in);
CreateStruct($if, $fn, "$if->{NAME}_r_$fn->{NAME}", \@out);
}
sub ParseStruct($$$)
{
my ($if,$s,$n) = @_;
CreateStruct($if, $s, "$if->{NAME}_$n", $s->{ELEMENTS});
}
sub ParseUnion($$$)
{
my ($if,$u,$n) = @_;
my $extra = {
switch_value => $u->{SWITCH_TYPE}
};
if (not defined($extra->{switch_value})) {
$extra->{switch_value} = "uint32";
}
foreach my $e (@{$u->{ELEMENTS}}) {
foreach my $l (@{$e->{LEVELS}}) {
if ($l->{TYPE} eq "ARRAY") {
if ($l->{IS_CONFORMANT}) {
$extra->{"size"} = "uint32";
}
if ($l->{IS_VARYING}) {
$extra->{"length"} = $extra->{"offset"} = "uint32";
}
} elsif ($l->{TYPE} eq "POINTER") {
$extra->{"ptr$l->{POINTER_INDEX}"} = "uint32";
} elsif ($l->{TYPE} eq "SWITCH") {
$extra->{"level"} = "uint32";
}
}
}
pidl "typedef struct $if->{NAME}_$n\_ctr {";
indent;
pidl "$extra->{$_} $_;" foreach (keys %$extra);
pidl "union $if->{NAME}_$n {";
indent;
foreach (@{$u->{ELEMENTS}}) {
next if ($_->{TYPE} eq "EMPTY");
pidl "\t" . DeclShort($_) . ";";
}
deindent;
pidl "} u;";
deindent;
pidl "} ".uc("$if->{NAME}_$n\_ctr") .";";
pidl "";
}
sub ParseEnum($$$)
{
my ($if,$s,$n) = @_;
pidl "typedef enum {";
pidl "$_," foreach (@{$s->{ELEMENTS}});
pidl "} $n;";
}
sub ParseBitmap($$$)
{
my ($if,$s,$n) = @_;
pidl "#define $_" foreach (@{$s->{ELEMENTS}});
}
sub ParseInterface($)
{
my $if = shift;
my $def = "_RPC_" . uc($if->{NAME}) . "_H";
pidl "";
pidl "\#ifndef $def";
pidl "\#define $def";
pidl "";
foreach (@{$if->{FUNCTIONS}}) {
pidl "\#define " . uc($_->{NAME}) . " $_->{OPNUM}" ;
}
pidl "";
foreach (@{$if->{TYPES}}) {
ParseStruct($if, $_->{DATA}, $_->{NAME}) if ($_->{DATA}->{TYPE} eq "STRUCT");
ParseEnum($if, $_->{DATA}, $_->{NAME}) if ($_->{DATA}->{TYPE} eq "ENUM");
ParseBitmap($if, $_->{DATA}, $_->{NAME}) if ($_->{DATA}->{TYPE} eq "BITMAP");
ParseUnion($if, $_->{DATA}, $_->{NAME}) if ($_->{DATA}->{TYPE} eq "UNION");
}
ParseFunction($if, $_) foreach (@{$if->{FUNCTIONS}});
foreach (@{$if->{CONSTS}}) {
pidl "$_->{NAME} ($_->{VALUE})";
}
pidl "\#endif /* $def */";
}
sub Parse($$)
{
my($ndr,$filename) = @_;
$res = "";
$tabs = "";
pidl "/*";
pidl " * Unix SMB/CIFS implementation.";
pidl " * header auto-generated by pidl. DO NOT MODIFY!";
pidl " */";
pidl "";
# Loop over interfaces
foreach (@{$ndr}) {
ParseInterface($_) if ($_->{TYPE} eq "INTERFACE");
}
return $res;
}
1;

View File

@ -1,603 +0,0 @@
###################################################
# Samba3 NDR parser generator for IDL structures
# Copyright jelmer@samba.org 2005
# released under the GNU GPL
package Parse::Pidl::Samba3::Parser;
use strict;
use Parse::Pidl::Typelist qw(hasType getType mapType);
use Parse::Pidl::Util qw(has_property ParseExpr);
use Parse::Pidl::NDR qw(GetPrevLevel GetNextLevel ContainsDeferred);
use Parse::Pidl::Samba3::Types qw(DeclShort DeclLong InitType DissectType StringType);
use vars qw($VERSION);
$VERSION = '0.01';
use constant PRIMITIVES => 1;
use constant DEFERRED => 2;
my $res = "";
my $tabs = "";
sub indent() { $tabs.="\t"; }
sub deindent() { $tabs = substr($tabs, 1); }
sub pidl($) { $res .= $tabs.(shift)."\n"; }
sub fatal($$) { my ($e,$s) = @_; die("$e->{ORIGINAL}->{FILE}:$e->{ORIGINAL}->{LINE}: $s\n"); }
#TODO:
# - Add some security checks (array sizes, memory alloc == NULL, etc)
# - Don't add seperate _p and _d functions if there is no deferred data
# - [string] with non-varying arrays and "surrounding" strings
# - subcontext()
# - DATA_BLOB
sub Align($$)
{
my ($a,$b) = @_;
# Only align if previous element was smaller than current one
if ($$a < $b) {
pidl "if (!prs_align_custom(ps, $b))";
pidl "\treturn False;";
pidl "";
}
$$a = $b;
}
sub DeclareArrayVariables
{
my $es = shift;
my $what = shift;
my $output = 0;
foreach my $e (@$es) {
foreach my $l (@{$e->{LEVELS}}) {
if ($what) {
next if ($l->{IS_DEFERRED} and $what == PRIMITIVES);
next if (not $l->{IS_DEFERRED} and $what == DEFERRED);
}
if ($l->{TYPE} eq "ARRAY" and not $l->{IS_ZERO_TERMINATED}) {
pidl "uint32 i_$e->{NAME}_$l->{LEVEL_INDEX};";
$output = 1;
}
}
}
pidl "" if $output;
}
sub ParseElementLevelData($$$$$$$)
{
my ($e,$l,$nl,$env,$varname,$what,$align) = @_;
my $c = DissectType($e,$l,$varname,$what,$align);
return if not $c;
if (defined($e->{ALIGN})) {
Align($align, $e->{ALIGN});
} else {
# Default to 4
Align($align, 4);
}
pidl "if (!$c)";
pidl "\treturn False;";
}
sub ParseElementLevelArray($$$$$$$)
{
my ($e,$l,$nl,$env,$varname,$what,$align) = @_;
if ($l->{IS_ZERO_TERMINATED}) {
return if ($what == DEFERRED);
my ($t,$f) = StringType($e,$l);
Align($align, 4);
pidl "if (!smb_io_$t(\"$e->{NAME}\", &$varname, 1, ps, depth))";
pidl "\treturn False;";
$$align = 0;
return;
}
my $len = ParseExpr($l->{LENGTH_IS}, $env);
my $size = ParseExpr($l->{SIZE_IS}, $env);
if ($what == PRIMITIVES) {
# Fetch headers
if ($l->{IS_CONFORMANT} and not $l->{IS_SURROUNDING}) {
Align($align, 4);
pidl "if (!prs_uint32(\"size_$e->{NAME}\", ps, depth, &" . ParseExpr("size_$e->{NAME}", $env) . "))";
pidl "\treturn False;";
pidl "";
}
if ($l->{IS_VARYING}) {
Align($align, 4);
pidl "if (!prs_uint32(\"offset_$e->{NAME}\", ps, depth, &" . ParseExpr("offset_$e->{NAME}", $env) . "))";
pidl "\treturn False;";
pidl "";
pidl "if (!prs_uint32(\"length_$e->{NAME}\", ps, depth, &" . ParseExpr("length_$e->{NAME}", $env) . "))";
pidl "\treturn False;";
pidl "";
}
}
# Everything but fixed arrays have to be allocated
if (!$l->{IS_FIXED} and $what == PRIMITIVES) {
pidl "if (UNMARSHALLING(ps)) {";
indent;
pidl "$varname = (void *)PRS_ALLOC_MEM_VOID(ps,sizeof(*$varname)*$size);";
deindent;
pidl "}";
}
return if ($what == DEFERRED and not ContainsDeferred($e,$l));
my $i = "i_$e->{NAME}_$l->{LEVEL_INDEX}";
pidl "for ($i=0; $i<$len;$i++) {";
indent;
ParseElementLevel($e,$nl,$env,$varname."[$i]",$what,$align);
deindent;
pidl "}";
}
sub ParseElementLevelSwitch($$$$$$$)
{
my ($e,$l,$nl,$env,$varname,$what,$align) = @_;
ParseElementLevel($e,$nl,$env,$varname,$what,$align);
}
sub ParseElementLevelPtr($$$$$$$)
{
my ($e,$l,$nl,$env,$varname,$what,$align) = @_;
if ($what == PRIMITIVES) {
if (($l->{POINTER_TYPE} eq "ref") and ($l->{LEVEL} eq "EMBEDDED")) {
# Ref pointers always have to be non-NULL
pidl "if (MARSHALLING(ps) && !" . ParseExpr("ptr$l->{POINTER_INDEX}_$e->{NAME}", $env) . ")";
pidl "\treturn False;";
pidl "";
}
unless ($l->{POINTER_TYPE} eq "ref" and $l->{LEVEL} eq "TOP") {
Align($align, 4);
pidl "if (!prs_uint32(\"ptr$l->{POINTER_INDEX}_$e->{NAME}\", ps, depth, &" . ParseExpr("ptr$l->{POINTER_INDEX}_$e->{NAME}", $env) . "))";
pidl "\treturn False;";
pidl "";
}
}
if ($l->{POINTER_TYPE} eq "relative") {
fatal($e, "relative pointers not supported for Samba 3");
#FIXME
}
if ($what == DEFERRED) {
if ($l->{POINTER_TYPE} ne "ref") {
pidl "if (" . ParseExpr("ptr$l->{POINTER_INDEX}_$e->{NAME}", $env) . ") {";
indent;
}
ParseElementLevel($e,$nl,$env,$varname,PRIMITIVES,$align);
ParseElementLevel($e,$nl,$env,$varname,DEFERRED,$align);
if ($l->{POINTER_TYPE} ne "ref") {
deindent;
pidl "}";
}
$$align = 0;
}
}
sub ParseElementLevelSubcontext($$$$$$$)
{
my ($e,$l,$nl,$env,$varname,$what,$align) = @_;
fatal($e, "subcontext() not supported for Samba 3");
#FIXME
}
sub ParseElementLevel($$$$$$)
{
my ($e,$l,$env,$varname,$what,$align) = @_;
{
DATA => \&ParseElementLevelData,
SUBCONTEXT => \&ParseElementLevelSubcontext,
POINTER => \&ParseElementLevelPtr,
SWITCH => \&ParseElementLevelSwitch,
ARRAY => \&ParseElementLevelArray
}->{$l->{TYPE}}->($e,$l,GetNextLevel($e,$l),$env,$varname,$what,$align);
}
sub ParseElement($$$$)
{
my ($e,$env,$what,$align) = @_;
ParseElementLevel($e, $e->{LEVELS}[0], $env, ParseExpr($e->{NAME}, $env), $what, $align);
}
sub InitLevel($$$$)
{
sub InitLevel($$$$);
my ($e,$l,$varname,$env) = @_;
if ($l->{TYPE} eq "POINTER") {
if ($l->{POINTER_TYPE} eq "ref") {
pidl "if (!$varname)";
pidl "\treturn False;";
pidl "";
} else {
pidl "if ($varname) {";
indent;
}
unless ($l->{POINTER_TYPE} eq "ref" and $l->{LEVEL} eq "TOP") {
pidl ParseExpr("ptr$l->{POINTER_INDEX}_$e->{NAME}", $env) . " = 1;";
}
InitLevel($e, GetNextLevel($e,$l), "*$varname", $env);
if ($l->{POINTER_TYPE} ne "ref") {
deindent;
pidl "} else {";
pidl "\t" . ParseExpr("ptr$l->{POINTER_INDEX}_$e->{NAME}", $env) . " = 0;";
pidl "}";
}
} elsif ($l->{TYPE} eq "ARRAY" and $l->{IS_ZERO_TERMINATED}) {
my ($t,$f) = StringType($e,$l);
pidl "init_$t(&" . ParseExpr($e->{NAME}, $env) . ", ".substr($varname, 1) . ", $f);";
} elsif ($l->{TYPE} eq "ARRAY") {
pidl ParseExpr($e->{NAME}, $env) . " = $varname;";
} elsif ($l->{TYPE} eq "DATA") {
pidl InitType($e, $l, ParseExpr($e->{NAME}, $env), $varname);
} elsif ($l->{TYPE} eq "SWITCH") {
InitLevel($e, GetNextLevel($e,$l), $varname, $env);
pidl ParseExpr($e->{NAME}, $env) . ".switch_value = " . ParseExpr($l->{SWITCH_IS}, $env) . ";";
}
}
sub GenerateEnvElement($$)
{
my ($e,$env) = @_;
foreach my $l (@{$e->{LEVELS}}) {
if ($l->{TYPE} eq "DATA") {
$env->{$e->{NAME}} = "v->$e->{NAME}";
} elsif ($l->{TYPE} eq "POINTER") {
$env->{"ptr$l->{POINTER_INDEX}_$e->{NAME}"} = "v->ptr$l->{POINTER_INDEX}_$e->{NAME}";
} elsif ($l->{TYPE} eq "SWITCH") {
} elsif ($l->{TYPE} eq "ARRAY" and not $l->{IS_ZERO_TERMINATED}) {
$env->{"length_$e->{NAME}"} = "v->length_$e->{NAME}";
$env->{"size_$e->{NAME}"} = "v->size_$e->{NAME}";
$env->{"offset_$e->{NAME}"} = "v->offset_$e->{NAME}";
}
}
}
sub ParseStruct($$$)
{
my ($if,$s,$n) = @_;
my $fn = "$if->{NAME}_io_$n";
my $sn = uc("$if->{NAME}_$n");
my $ifn = "init_$if->{NAME}_$n";
my $args = "";
foreach (@{$s->{ELEMENTS}}) {
$args .= ", " . DeclLong($_);
}
my $env = { "this" => "v" };
GenerateEnvElement($_, $env) foreach (@{$s->{ELEMENTS}});
pidl "BOOL $ifn($sn *v$args)";
pidl "{";
indent;
pidl "DEBUG(5,(\"$ifn\\n\"));";
pidl "";
# Call init for all arguments
foreach (@{$s->{ELEMENTS}}) {
InitLevel($_, $_->{LEVELS}[0], $_->{NAME}, $env);
pidl "";
}
pidl "return True;";
deindent;
pidl "}";
pidl "";
my $pfn = "$fn\_p";
my $dfn = "$fn\_d";
pidl "BOOL $pfn(const char *desc, $sn *v, prs_struct *ps, int depth)";
pidl "{";
indent;
DeclareArrayVariables($s->{ELEMENTS}, PRIMITIVES);
pidl "if (v == NULL)";
pidl "\treturn False;";
pidl "";
pidl "prs_debug(ps, depth, desc, \"$pfn\");";
pidl "depth++;";
my $align = 8;
if ($s->{SURROUNDING_ELEMENT}) {
pidl "if (!prs_uint32(\"size_$s->{SURROUNDING_ELEMENT}->{NAME}\", ps, depth, &" . ParseExpr("size_$s->{SURROUNDING_ELEMENT}->{NAME}", $env) . "))";
pidl "\treturn False;";
pidl "";
$align = 4;
}
foreach (@{$s->{ELEMENTS}}) {
ParseElement($_, $env, PRIMITIVES, \$align);
pidl "";
}
pidl "return True;";
deindent;
pidl "}";
pidl "";
pidl "BOOL $dfn(const char *desc, $sn *v, prs_struct *ps, int depth)";
pidl "{";
indent;
DeclareArrayVariables($s->{ELEMENTS}, DEFERRED);
pidl "if (v == NULL)";
pidl "\treturn False;";
pidl "";
pidl "prs_debug(ps, depth, desc, \"$dfn\");";
pidl "depth++;";
$align = 0;
foreach (@{$s->{ELEMENTS}}) {
ParseElement($_, $env, DEFERRED, \$align);
pidl "";
}
pidl "return True;";
deindent;
pidl "}";
pidl "";
}
sub UnionGenerateEnvElement($)
{
my $e = shift;
my $env = {};
foreach my $l (@{$e->{LEVELS}}) {
if ($l->{TYPE} eq "DATA") {
$env->{$e->{NAME}} = "v->u.$e->{NAME}";
} elsif ($l->{TYPE} eq "POINTER") {
$env->{"ptr$l->{POINTER_INDEX}_$e->{NAME}"} = "v->ptr$l->{POINTER_INDEX}";
} elsif ($l->{TYPE} eq "SWITCH") {
} elsif ($l->{TYPE} eq "ARRAY" and not $l->{IS_ZERO_TERMINATED}) {
$env->{"length_$e->{NAME}"} = "v->length";
$env->{"size_$e->{NAME}"} = "v->size";
$env->{"offset_$e->{NAME}"} = "v->offset";
}
}
return $env;
}
sub ParseUnion($$$)
{
my ($if,$u,$n) = @_;
my $fn = "$if->{NAME}_io_$n";
my $sn = uc("$if->{NAME}_$n\_ctr");
my $pfn = "$fn\_p";
my $dfn = "$fn\_d";
pidl "BOOL $pfn(const char *desc, $sn* v, prs_struct *ps, int depth)";
pidl "{";
indent;
DeclareArrayVariables($u->{ELEMENTS});
if (defined ($u->{SWITCH_TYPE})) {
pidl "if (!prs_$u->{SWITCH_TYPE}(\"switch_value\", ps, depth, &v->switch_value))";
pidl "\treturn False;";
pidl "";
}
# Maybe check here that level and v->switch_value are equal?
pidl "switch (v->switch_value) {";
indent;
foreach (@{$u->{ELEMENTS}}) {
pidl "$_->{CASE}:";
indent;
if ($_->{TYPE} ne "EMPTY") {
pidl "depth++;";
my $env = UnionGenerateEnvElement($_);
my $align = 8;
ParseElement($_, $env, PRIMITIVES, \$align);
pidl "depth--;";
}
pidl "break;";
deindent;
pidl "";
}
unless ($u->{HAS_DEFAULT}) {
pidl "default:";
pidl "\treturn False;";
pidl "";
}
deindent;
pidl "}";
pidl "";
pidl "return True;";
deindent;
pidl "}";
pidl "";
pidl "BOOL $dfn(const char *desc, $sn* v, prs_struct *ps, int depth)";
pidl "{";
indent;
DeclareArrayVariables($u->{ELEMENTS});
if (defined($u->{SWITCH_TYPE})) {
pidl "switch (v->switch_value) {";
} else {
pidl "switch (level) {";
}
indent;
foreach (@{$u->{ELEMENTS}}) {
pidl "$_->{CASE}:";
indent;
if ($_->{TYPE} ne "EMPTY") {
pidl "depth++;";
my $env = UnionGenerateEnvElement($_);
my $align = 0;
ParseElement($_, $env, DEFERRED, \$align);
pidl "depth--;";
}
pidl "break;";
deindent;
pidl "";
}
deindent;
pidl "}";
pidl "";
pidl "return True;";
deindent;
pidl "}";
}
sub CreateFnDirection($$$$$)
{
my ($fn,$ifn,$s,$all,$es) = @_;
my $args = "";
foreach (@$all) { $args .= ", " . DeclLong($_); }
my $env = { };
GenerateEnvElement($_, $env) foreach (@$es);
pidl "BOOL $ifn($s *v$args)";
pidl "{";
indent;
pidl "DEBUG(5,(\"$ifn\\n\"));";
pidl "";
# Call init for all arguments
foreach (@$es) {
InitLevel($_, $_->{LEVELS}[0], $_->{NAME}, $env);
pidl "";
}
pidl "return True;";
deindent;
pidl "}";
pidl "";
pidl "BOOL $fn(const char *desc, $s *v, prs_struct *ps, int depth)";
pidl "{";
indent;
DeclareArrayVariables($es);
pidl "if (v == NULL)";
pidl "\treturn False;";
pidl "";
pidl "prs_debug(ps, depth, desc, \"$fn\");";
pidl "depth++;";
my $align = 8;
foreach (@$es) {
ParseElement($_, $env, PRIMITIVES, \$align);
ParseElement($_, $env, DEFERRED, \$align);
pidl "";
}
pidl "return True;";
deindent;
pidl "}";
pidl "";
}
sub ParseFunction($$)
{
my ($if,$fn) = @_;
my @in = ();
my @out = ();
my @all = @{$fn->{ELEMENTS}};
foreach (@{$fn->{ELEMENTS}}) {
push (@in, $_) if (grep(/in/, @{$_->{DIRECTION}}));
push (@out, $_) if (grep(/out/, @{$_->{DIRECTION}}));
}
if (defined($fn->{RETURN_TYPE})) {
my $status = {
NAME => "status",
TYPE => $fn->{RETURN_TYPE},
LEVELS => [
{
TYPE => "DATA",
DATA_TYPE => $fn->{RETURN_TYPE}
}
]
};
push (@out, $status);
push (@all, $status);
}
CreateFnDirection("$if->{NAME}_io_q_$fn->{NAME}",
"init_$if->{NAME}_q_$fn->{NAME}",
uc("$if->{NAME}_q_$fn->{NAME}"),
\@in, \@in);
CreateFnDirection("$if->{NAME}_io_r_$fn->{NAME}",
"init_$if->{NAME}_r_$fn->{NAME}",
uc("$if->{NAME}_r_$fn->{NAME}"),
\@all, \@out);
}
sub ParseInterface($)
{
my $if = shift;
# Structures first
pidl "/* $if->{NAME} structures */";
foreach (@{$if->{TYPES}}) {
ParseStruct($if, $_->{DATA}, $_->{NAME}) if ($_->{DATA}->{TYPE} eq "STRUCT");
ParseUnion($if, $_->{DATA}, $_->{NAME}) if ($_->{DATA}->{TYPE} eq "UNION");
}
pidl "/* $if->{NAME} functions */";
ParseFunction($if, $_) foreach (@{$if->{FUNCTIONS}});
}
sub Parse($$)
{
my($ndr,$filename) = @_;
$tabs = "";
$res = "";
pidl "/*";
pidl " * Unix SMB/CIFS implementation.";
pidl " * parser auto-generated by pidl. DO NOT MODIFY!";
pidl " */";
pidl "";
pidl "#include \"includes.h\"";
pidl "";
pidl "#undef DBGC_CLASS";
pidl "#define DBGC_CLASS DBGC_RPC_PARSE";
pidl "";
foreach (@$ndr) {
ParseInterface($_) if ($_->{TYPE} eq "INTERFACE");
}
return $res;
}
1;

View File

@ -1,82 +0,0 @@
###################################################
# Samba3 NDR client generator for IDL structures
# Copyright jelmer@samba.org 2005
# released under the GNU GPL
package Parse::Pidl::Samba3::Template;
use strict;
use Parse::Pidl::Typelist qw(hasType getType mapType);
use Parse::Pidl::Util qw(has_property ParseExpr);
use Parse::Pidl::NDR qw(GetPrevLevel GetNextLevel ContainsDeferred);
use vars qw($VERSION);
$VERSION = '0.01';
my $res;
sub pidl($) { my $x = shift; $res.="$x\n"; }
sub ParseInterface($)
{
my $if = shift;
foreach (@{$if->{FUNCTIONS}}) {
my $ret = $_->{RETURN_TYPE};
if (not $ret) { $ret = "void"; }
pidl "$ret _$_->{NAME}(pipes_struct *p, " . uc($if->{NAME}) . "_Q_" . uc($_->{NAME}) . " *q_u, " . uc($if->{NAME}) . "_R_" . uc($_->{NAME}) . " *r_u)";
pidl "{";
pidl "\t/* FIXME: Implement your code here */";
if (not defined($_->{RETURN_TYPE})) {
} elsif ($_->{RETURN_TYPE} eq "WERROR") {
pidl "\treturn WERR_NOT_SUPPORTED;";
} elsif ($_->{RETURN_TYPE} eq "NTSTATUS") {
pidl "\treturn NT_STATUS_NOT_IMPLEMENTED;";
} elsif ($_->{RETURN_TYPE} eq "uint32") {
pidl "\treturn 0;";
}
pidl "}";
pidl "";
}
}
sub Parse($$)
{
my($ndr,$filename) = @_;
$res = "";
pidl "/*
* Unix SMB/CIFS implementation.
**** template auto-generated by pidl. Modify to your needs ****
* RPC Pipe client / server routines
* Copyright (C) YOUR NAME YEAR.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include \"includes.h\"
#undef DBGC_CLASS
#define DBGC_CLASS DBGC_MSRPC
";
foreach (@$ndr) {
ParseInterface($_) if ($_->{TYPE} eq "INTERFACE");
}
return $res;
}
1;

View File

@ -1,403 +0,0 @@
###################################################
# Samba3 type-specific declarations / initialization / marshalling
# Copyright jelmer@samba.org 2005
# released under the GNU GPL
package Parse::Pidl::Samba3::Types;
require Exporter;
@ISA = qw(Exporter);
@EXPORT_OK = qw(DeclShort DeclLong InitType DissectType AddType StringType);
use strict;
use Parse::Pidl::Util qw(has_property ParseExpr property_matches);
use Parse::Pidl::NDR qw(GetPrevLevel GetNextLevel ContainsDeferred ContainsString);
use vars qw($VERSION);
$VERSION = '0.01';
# TODO: Find external types somehow?
sub warning($$) { my ($e,$s) = @_; print STDERR "$e->{ORIGINAL}->{FILE}:$e->{ORIGINAL}->{LINE}: $s\n"; }
sub init_scalar($$$$)
{
my ($e,$l,$n,$v) = @_;
return "$n = $v;";
}
sub dissect_scalar($$$$$)
{
my ($e,$l,$n,$w,$a) = @_;
my $t = lc($e->{TYPE});
return "prs_$t(\"$e->{NAME}\", ps, depth, &$n)";
}
sub decl_string($)
{
my $e = shift;
my $is_conformant = property_matches($e, "flag", ".*STR_SIZE4.*");
my $is_varying = property_matches($e, "flag", ".*STR_LEN4.*");
my $is_ascii = property_matches($e, "flag", ".*STR_ASCII.*");
return "STRING2" if ($is_conformant and $is_varying and $is_ascii);
return "UNISTR2" if ($is_conformant and $is_varying);
return "UNISTR3" if ($is_varying);
# We don't do UNISTR4, as we have lsa_String for that in Samba4's IDL
die("Don't know what string type to use");
}
sub contains_pointer($)
{
my $e = shift;
foreach my $l (@{$e->{LEVELS}}) {
return 1 if ($l->{TYPE} eq "POINTER");
}
return 0;
}
sub ext_decl_string($)
{
my $e = shift;
# One pointer is sufficient..
return "const char" if (contains_pointer($e));
return "const char *";
}
sub init_string($$$$)
{
my ($e,$l,$n,$v) = @_;
my $t = lc(decl_string($e));
my $flags;
if (property_matches($e, "flag", ".*STR_NULLTERM.*")) {
$flags = "UNI_STR_TERMINATE";
} elsif (property_matches($e, "flag", ".*STR_NOTERM.*")) {
$flags = "UNI_STR_NOTERM";
} else {
$flags = "UNI_FLAGS_NONE";
}
# One pointer is sufficient
if (substr($v, 0, 1) eq "*") { $v = substr($v, 1); }
return "init_$t(&$n, $v, $flags);";
}
sub dissect_string($$$$$)
{
my ($e,$l,$n,$w,$a) = @_;
my $t = lc(decl_string($e));
$$a = 1;
return "smb_io_$t(\"$e->{NAME}\", &$n, 1, ps, depth)";
}
sub StringType($$)
{
my ($e,$l) = @_;
my $nl = GetNextLevel($e,$l);
if ($l->{IS_VARYING} and $l->{IS_CONFORMANT} and $nl->{DATA_TYPE} eq "uint16") {
return ("unistr2", "UNI_FLAGS_NONE");
} elsif ($l->{IS_CONFORMANT} and $l->{IS_VARYING} and $nl->{DATA_TYPE} eq "uint8") {
return ("string2", 0);
} else {
fatal($e, "[string] non-varying string not supported for Samba3 yet");
}
}
my $known_types =
{
uint8 =>
{
DECL => "uint8",
INIT => \&init_scalar,
DISSECT_P => \&dissect_scalar,
},
uint16 =>
{
DECL => "uint16",
INIT => \&init_scalar,
DISSECT_P => \&dissect_scalar,
},
uint32 =>
{
DECL => "uint32",
INIT => \&init_scalar,
DISSECT_P => \&dissect_scalar,
},
uint64 =>
{
DECL => "uint64",
INIT => \&init_scalar,
DISSECT_P => \&dissect_scalar,
},
int32 =>
{
DECL => "int32",
INIT => \&init_scalar,
DISSECT_P => \&dissect_scalar,
},
string =>
{
DECL => \&decl_string,
EXT_DECL => \&ext_decl_string,
INIT => \&init_string,
DISSECT_P => \&dissect_string,
},
NTSTATUS =>
{
DECL => "NTSTATUS",
INIT => \&init_scalar,
DISSECT_P => \&dissect_scalar,
},
WERROR =>
{
DECL => "WERROR",
INIT => \&init_scalar,
DISSECT_P => \&dissect_scalar,
},
GUID =>
{
DECL => "struct uuid",
INIT => "",
DISSECT_P => sub {
my ($e,$l,$n) = @_;
return "smb_io_uuid(\"$e->{NAME}\", &$n, ps, depth)";
}
},
NTTIME =>
{
DECL => "NTTIME",
INIT => "",
DISSECT_P => sub {
my ($e,$l,$n,$w,$a) = @_;
return "smb_io_nttime(\"$e->{NAME}\", &n, ps, depth)";
}
},
dom_sid =>
{
DECL => "DOM_SID",
INIT => "",
DISSECT_P => sub {
my ($e,$l,$n,$w,$a) = @_;
return "smb_io_dom_sid(\"$e->{NAME}\", &n, ps, depth)";
}
},
policy_handle =>
{
DECL => "POLICY_HND",
INIT => "",
DISSECT_P => sub {
my ($e,$l,$n,$w,$a) = @_;
return "smb_io_pol_hnd(\"$e->{NAME}\", &n, ps, depth)";
}
},
security_descriptor =>
{
DECL => "SEC_DESC",
INIT => "",
DISSECT_P => sub {
my ($e,$l,$n,$w,$a) = @_;
return "sec_io_desc(\"$e->{NAME}\", &n, ps, depth)";
}
},
hyper =>
{
DECL => "uint64",
INIT => "",
DISSECT_P => sub {
my ($e,$l,$n,$w,$a) = @_;
return "prs_uint64(\"$e->{NAME}\", ps, depth, &$n)";
}
},
};
sub AddType($$)
{
my ($t,$d) = @_;
warn("Reregistering type $t") if (defined($known_types->{$t}));
$known_types->{$t} = $d;
}
# Return type without special stuff, as used in
# declarations for internal structs
sub DeclShort($)
{
my $e = shift;
my $t = $known_types->{$e->{TYPE}};
if (not $t) {
warning($e, "Can't declare unknown type `$e->{TYPE}'");
return undef;
}
my $p;
# DECL can be a function
if (ref($t->{DECL}) eq "CODE") {
$p = $t->{DECL}->($e);
} else {
$p = $t->{DECL};
}
my $prefixes = "";
my $suffixes = "";
foreach my $l (@{$e->{LEVELS}}) {
if ($l->{TYPE} eq "ARRAY" and not $l->{IS_FIXED}) {
$prefixes = "*$prefixes";
} elsif ($l->{TYPE} eq "ARRAY" and $l->{IS_FIXED}) {
$suffixes.="[$l->{SIZE_IS}]";
}
}
return "$p $prefixes$e->{NAME}$suffixes";
}
# Return type including special stuff (pointers, etc).
sub DeclLong($)
{
my $e = shift;
my $t = $known_types->{$e->{TYPE}};
if (not $t) {
warning($e, "Can't declare unknown type `$e->{TYPE}'");
return undef;
}
my $p;
if (defined($t->{EXT_DECL})) {
$p = $t->{EXT_DECL}
} else {
$p = $t->{DECL};
}
if (ref($p) eq "CODE") {
$p = $p->($e);
}
my $prefixes = "";
my $suffixes = "";
foreach my $l (@{$e->{LEVELS}}) {
if ($l->{TYPE} eq "ARRAY" and $l->{IS_ZERO_TERMINATED}) {
$p = "const char";
last;
} elsif ($l->{TYPE} eq "ARRAY" and not $l->{IS_FIXED}) {
$prefixes = "*$prefixes";
} elsif ($l->{TYPE} eq "ARRAY" and $l->{IS_FIXED}) {
$suffixes.="[$l->{SIZE_IS}]";
} elsif ($l->{TYPE} eq "POINTER") {
$prefixes = "*$prefixes";
}
}
return "$p $prefixes$e->{NAME}$suffixes";
}
sub InitType($$$$)
{
my ($e, $l, $varname, $value) = @_;
my $t = $known_types->{$l->{DATA_TYPE}};
if (not $t) {
warning($e, "Don't know how to initialize type $l->{DATA_TYPE}");
return undef;
}
# INIT can be a function
if (ref($t->{INIT}) eq "CODE") {
return $t->{INIT}->($e, $l, $varname, $value);
} else {
return $t->{INIT};
}
}
sub DissectType($$$$$)
{
my ($e,$l,$varname,$what,$align) = @_;
my $t = $known_types->{$l->{DATA_TYPE}};
if (not $t) {
warning($e, "Don't know how to dissect type $l->{DATA_TYPE}");
return undef;
}
my $dissect;
if ($what == 1) { #primitives
$dissect = $t->{DISSECT_P};
} elsif ($what == 2) {
$dissect = $t->{DISSECT_D};
}
return "" if not defined($dissect);
# DISSECT can be a function
if (ref($dissect) eq "CODE") {
return $dissect->($e,$l,$varname,$what,$align);
} else {
return $dissect;
}
}
sub LoadTypes($)
{
my $ndr = shift;
foreach my $if (@{$ndr}) {
next unless ($if->{TYPE} eq "INTERFACE");
foreach my $td (@{$if->{TYPES}}) {
my $decl = uc("$if->{NAME}_$td->{NAME}");
my $init = sub {
my ($e,$l,$n,$v) = @_;
return "$n = $v;";
};
my $dissect_d;
my $dissect_p;
if ($td->{DATA}->{TYPE} eq "UNION") {
$decl.="_CTR";
}
$dissect_p = sub {
my ($e,$l,$n,$w,$a) = @_;
return "$if->{NAME}_io_$td->{NAME}_p(\"$e->{NAME}\", &$n, ps, depth)";
};
$dissect_d = sub {
my ($e,$l,$n,$w,$a) = @_;
return "$if->{NAME}_io_$td->{NAME}_d(\"$e->{NAME}\", &$n, ps, depth)";
};
AddType($td->{NAME}, {
DECL => $decl,
INIT => $init,
DISSECT_D => $dissect_d,
DISSECT_P => $dissect_p
});
}
}
}
1;

View File

@ -17,7 +17,7 @@ pidl - An IDL compiler written in Perl
pidl --help pidl --help
pidl [--outputdir[=OUTNAME]] [--parse-idl-tree] [--dump-idl-tree] [--dump-ndr-tree] [--header[=OUTPUT]] [--ejs[=OUTPUT]] [--swig[=OUTPUT]] [--uint-enums] [--ndr-parser[=OUTPUT]] [--client] [--server] [--dcom-proxy] [--com-header] [--warn-compat] [--quiet] [--verbose] [--template] [--ws-parser[=OUTPUT]] [--diff] [--dump-idl] [--tdr-parser[=OUTPUT]] [--samba3-header[=OUTPUT]] [--samba3-parser=[OUTPUT]] [--samba3-server=[OUTPUT]] [--samba3-template[=OUTPUT]] [--samba3-client[=OUTPUT]] [--samba3-ndr-client[=OUTPUT]] [<idlfile>.idl]... pidl [--outputdir[=OUTNAME]] [--parse-idl-tree] [--dump-idl-tree] [--dump-ndr-tree] [--header[=OUTPUT]] [--ejs[=OUTPUT]] [--swig[=OUTPUT]] [--uint-enums] [--ndr-parser[=OUTPUT]] [--client] [--server] [--dcom-proxy] [--com-header] [--warn-compat] [--quiet] [--verbose] [--template] [--ws-parser[=OUTPUT]] [--diff] [--dump-idl] [--tdr-parser[=OUTPUT]] [--samba3-ndr-client[=OUTPUT]] [<idlfile>.idl]...
=head1 DESCRIPTION =head1 DESCRIPTION
@ -120,30 +120,6 @@ file the to disk. Useful for debugging pidl.
Tell pidl to dump the internal NDR information tree it generated Tell pidl to dump the internal NDR information tree it generated
from the IDL file to disk. Useful for debugging pidl. from the IDL file to disk. Useful for debugging pidl.
=item I<--samba3-header>
Generate Samba3-style RPC header file. Filename defaults to rpc_BASENAME.h.
=item I<--samba3-parser>
Generate parser file for Samba3, to be placed in rpc_parse/. Filename defaults
to parse_BASENAME.c.
=item I<--samba3-server>
Generate server file for Samba3, to be placed in rpc_server/. Filename defaults
to srv_BASENAME.c.
=item I<--samba3-template>
Generate template for server-side implementation in Samba3, to be placed in
rpc_server/. Filename defaults to srv_BASENAME_nt.c
=item I<--samba3-client>
Generate client calls for Samba 3, to be placed in rpc_client/. Filename
defaults to cli_BASENAME.c.
=item I<--samba3-ndr-client> =item I<--samba3-ndr-client>
Generate client calls for Samba3, to be placed in rpc_client/. Instead of Generate client calls for Samba3, to be placed in rpc_client/. Instead of
@ -376,7 +352,7 @@ usesgetlasterror, vararg, vi_progid, wire_marshal.
$ ./pidl --tdr-parser --header -- regf.idl $ ./pidl --tdr-parser --header -- regf.idl
# Generating a Samba3 parser, client and server # Generating a Samba3 parser, client and server
$ ./pidl --samba3-parser --samba3-server --samba3-client -- dfs.idl $ ./pidl --samba3-ndr-client -- dfs.idl
# Generating a Samba4 NDR parser, client and server # Generating a Samba4 NDR parser, client and server
$ ./pidl --ndr-parser --ndr-client --ndr-server -- samr.idl $ ./pidl --ndr-parser --ndr-client --ndr-server -- samr.idl
@ -469,7 +445,6 @@ my($opt_header);
my($opt_samba3_header); my($opt_samba3_header);
my($opt_samba3_parser); my($opt_samba3_parser);
my($opt_samba3_server); my($opt_samba3_server);
my($opt_samba3_template);
my($opt_samba3_ndr_client); my($opt_samba3_ndr_client);
my($opt_template) = 0; my($opt_template) = 0;
my($opt_client); my($opt_client);
@ -524,11 +499,6 @@ Samba 4 output:
--com-header[=OUTFILE] create header for COM [com_BASENAME.h] --com-header[=OUTFILE] create header for COM [com_BASENAME.h]
Samba 3 output: Samba 3 output:
--samba3-header[=OUTF] create Samba3-style header [rpc_BASENAME.h]
--samba3-parser[=OUTF] create parser for Samba3 [parse_BASENAME.c]
--samba3-template[=OUTF]create template implementation [srv_BASENAME_nt.c]
--samba3-server[=OUTF] create server side wrappers for Samba3 [srv_BASENAME.c]
--samba3-client[=OUTF] create client calls for Samba3 [cli_BASENAME.c]
--samba3-ndr-client[=OUTF] create client calls for Samba3 --samba3-ndr-client[=OUTF] create client calls for Samba3
using Samba4's NDR code [cli_BASENAME.c] using Samba4's NDR code [cli_BASENAME.c]
@ -547,10 +517,6 @@ my $result = GetOptions (
'parse-idl-tree' => \$opt_parse_idl_tree, 'parse-idl-tree' => \$opt_parse_idl_tree,
'dump-ndr-tree:s' => \$opt_dump_ndr_tree, 'dump-ndr-tree:s' => \$opt_dump_ndr_tree,
'uint-enums' => \$opt_uint_enums, 'uint-enums' => \$opt_uint_enums,
'samba3-header:s' => \$opt_samba3_header,
'samba3-parser:s' => \$opt_samba3_parser,
'samba3-server:s' => \$opt_samba3_server,
'samba3-template:s' => \$opt_samba3_template,
'samba3-ndr-client:s' => \$opt_samba3_ndr_client, 'samba3-ndr-client:s' => \$opt_samba3_ndr_client,
'header:s' => \$opt_header, 'header:s' => \$opt_header,
'server:s' => \$opt_server, 'server:s' => \$opt_server,
@ -653,7 +619,6 @@ sub process_file($)
defined($opt_ndr_parser) or defined($opt_ejs) or defined($opt_ndr_parser) or defined($opt_ejs) or
defined($opt_dump_ndr_tree) or defined($opt_samba3_header) or defined($opt_dump_ndr_tree) or defined($opt_samba3_header) or
defined($opt_samba3_parser) or defined($opt_samba3_server) or defined($opt_samba3_parser) or defined($opt_samba3_server) or
defined($opt_samba3_template) or
defined($opt_swig) or defined($opt_samba3_ndr_client)) { defined($opt_swig) or defined($opt_samba3_ndr_client)) {
require Parse::Pidl::NDR; require Parse::Pidl::NDR;
$ndr = Parse::Pidl::NDR::Parse($pidl); $ndr = Parse::Pidl::NDR::Parse($pidl);
@ -765,37 +730,6 @@ $dcom
print Parse::Pidl::Samba4::Template::Parse($pidl); print Parse::Pidl::Samba4::Template::Parse($pidl);
} }
if (defined($opt_samba3_header) or defined($opt_samba3_parser) or
defined($opt_samba3_server) or
defined($opt_samba3_ndr_client) or defined($opt_samba3_template)) {
require Parse::Pidl::Samba3::Types;
Parse::Pidl::Samba3::Types::LoadTypes($ndr);
}
if (defined($opt_samba3_header)) {
my $header = ($opt_samba3_header or "$outputdir/rpc_$basename.h");
require Parse::Pidl::Samba3::Header;
FileSave($header, Parse::Pidl::Samba3::Header::Parse($ndr, $basename));
}
if (defined($opt_samba3_parser)) {
my $header = ($opt_samba3_parser or "$outputdir/parse_$basename.c");
require Parse::Pidl::Samba3::Parser;
FileSave($header, Parse::Pidl::Samba3::Parser::Parse($ndr, $basename));
}
if (defined($opt_samba3_server)) {
my $header = ($opt_samba3_server or "$outputdir/srv_$basename.c");
require Parse::Pidl::Samba3::Server;
FileSave($header, Parse::Pidl::Samba3::Server::Parse($ndr, $basename));
}
if (defined($opt_samba3_template)) {
my $header = ($opt_samba3_template or "$outputdir/srv_$basename\_nt.c");
require Parse::Pidl::Samba3::Template;
FileSave($header, Parse::Pidl::Samba3::Template::Parse($ndr, $basename));
}
if (defined($opt_samba3_ndr_client)) { if (defined($opt_samba3_ndr_client)) {
my $client = ($opt_samba3_ndr_client or "$outputdir/cli_$basename.c"); my $client = ($opt_samba3_ndr_client or "$outputdir/cli_$basename.c");
my $header = $client; $header =~ s/\.c$/\.h/; my $header = $client; $header =~ s/\.c$/\.h/;