mirror of
https://github.com/samba-team/samba.git
synced 2024-12-24 21:34:56 +03:00
r12465: Merge Parse::Pidl::Samba4::NDR::Header into Parse::Pidl::Samba4::NDR::Parser.
Small optimization to avoid including NDR headers multiple times
This commit is contained in:
parent
975d8816db
commit
6967b98849
@ -83,11 +83,11 @@ interface drsblobs {
|
||||
* w2k uses version 1
|
||||
* w2k3 uses version 1
|
||||
*/
|
||||
typedef [gensize] struct {
|
||||
typedef [public,gensize] struct {
|
||||
asclstr dns_name;
|
||||
} repsFromTo1OtherInfo;
|
||||
|
||||
typedef [gensize,flag(NDR_PAHEX)] struct {
|
||||
typedef [public,gensize,flag(NDR_PAHEX)] struct {
|
||||
/* this includes the 8 bytes of the repsFromToBlob header */
|
||||
[value(ndr_size_repsFromTo1(r, ndr->flags)+8)] uint32 blobsize;
|
||||
uint32 consecutive_sync_failures;
|
||||
|
@ -119,7 +119,7 @@ interface drsuapi
|
||||
|
||||
/*****************/
|
||||
/* Function 0x02 */
|
||||
typedef [gensize] struct {
|
||||
typedef [public,gensize] struct {
|
||||
[value(ndr_size_drsuapi_DsReplicaObjectIdentifier(r, ndr->flags)-4)] uint32 __ndr_size;
|
||||
[value(ndr_length_dom_sid(&r->sid))] uint32 __ndr_size_sid;
|
||||
GUID guid;
|
||||
@ -441,7 +441,7 @@ interface drsuapi
|
||||
} drsuapi_DsAttributeValueCtrUnicodeString;
|
||||
|
||||
/* DN String values */
|
||||
typedef [gensize] struct {
|
||||
typedef [public,gensize] struct {
|
||||
[value(ndr_size_drsuapi_DsReplicaObjectIdentifier3(r, ndr->flags))] uint32 __ndr_size;
|
||||
[value(ndr_length_dom_sid(&r->sid))] uint32 __ndr_size_sid;
|
||||
GUID guid;
|
||||
@ -582,7 +582,7 @@ interface drsuapi
|
||||
drsuapi_DsReplicaMetaDataCtr *meta_data_ctr;
|
||||
} drsuapi_DsReplicaObjectListItemEx;
|
||||
|
||||
typedef [gensize] struct {
|
||||
typedef [public,gensize] struct {
|
||||
GUID guid1;
|
||||
GUID guid2;
|
||||
drsuapi_DsReplicaObjectIdentifier *naming_context;
|
||||
|
@ -56,7 +56,7 @@
|
||||
uint32 unknown29;
|
||||
} spoolss_PrinterInfo0;
|
||||
|
||||
typedef [gensize] struct {
|
||||
typedef [public,gensize] struct {
|
||||
string32 devicename;
|
||||
uint16 specversion;
|
||||
uint16 driverversion;
|
||||
@ -752,7 +752,7 @@
|
||||
SPOOLSS_PRINTER_DATA_TYPE_STRING_ARRAY = 7
|
||||
} spoolss_PrinterDataType;
|
||||
|
||||
typedef [nodiscriminant,gensize] union {
|
||||
typedef [nodiscriminant,public,gensize] union {
|
||||
[case(SPOOLSS_PRINTER_DATA_TYPE_NULL)];
|
||||
[case(SPOOLSS_PRINTER_DATA_TYPE_STRING)] nstring string;
|
||||
[case(SPOOLSS_PRINTER_DATA_TYPE_BINARY),flag(NDR_REMAINING)] DATA_BLOB binary;
|
||||
|
@ -1,157 +0,0 @@
|
||||
###################################################
|
||||
# create C header files for an IDL structure
|
||||
# Copyright tridge@samba.org 2000
|
||||
# Copyright jelmer@samba.org 2005
|
||||
# released under the GNU GPL
|
||||
|
||||
package Parse::Pidl::Samba4::NDR::Header;
|
||||
|
||||
use strict;
|
||||
use Parse::Pidl::Typelist qw(mapType);
|
||||
use Parse::Pidl::Util qw(has_property is_constant);
|
||||
use Parse::Pidl::NDR qw(GetNextLevel GetPrevLevel);
|
||||
use Parse::Pidl::Samba4::NDR::Parser;
|
||||
|
||||
use vars qw($VERSION);
|
||||
$VERSION = '0.01';
|
||||
|
||||
my($res);
|
||||
|
||||
sub pidl ($) { $res .= shift; }
|
||||
|
||||
#####################################################################
|
||||
# prototype a typedef
|
||||
sub HeaderTypedefProto($)
|
||||
{
|
||||
my($d) = shift;
|
||||
|
||||
my $tf = Parse::Pidl::Samba4::NDR::Parser::get_typefamily($d->{DATA}{TYPE});
|
||||
|
||||
if (has_property($d, "gensize")) {
|
||||
my $size_args = $tf->{SIZE_FN_ARGS}->($d);
|
||||
pidl "size_t ndr_size_$d->{NAME}($size_args);\n";
|
||||
}
|
||||
|
||||
return unless has_property($d, "public");
|
||||
|
||||
unless (has_property($d, "nopush")) {
|
||||
pidl "NTSTATUS ndr_push_$d->{NAME}(struct ndr_push *ndr, int ndr_flags, " . $tf->{DECL}->($d, "push") . ");\n";
|
||||
}
|
||||
unless (has_property($d, "nopull")) {
|
||||
pidl "NTSTATUS ndr_pull_$d->{NAME}(struct ndr_pull *ndr, int ndr_flags, " . $tf->{DECL}->($d, "pull") . ");\n";
|
||||
}
|
||||
unless (has_property($d, "noprint")) {
|
||||
pidl "void ndr_print_$d->{NAME}(struct ndr_print *ndr, const char *name, " . $tf->{DECL}->($d, "print") . ");\n";
|
||||
}
|
||||
}
|
||||
|
||||
#####################################################################
|
||||
# output prototypes for a IDL function
|
||||
sub HeaderFnProto($$)
|
||||
{
|
||||
my ($interface,$fn) = @_;
|
||||
my $name = $fn->{NAME};
|
||||
|
||||
pidl "void ndr_print_$name(struct ndr_print *ndr, const char *name, int flags, const struct $name *r);\n";
|
||||
|
||||
unless (has_property($fn, "noopnum")) {
|
||||
pidl "NTSTATUS dcerpc_$name(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, struct $name *r);\n";
|
||||
pidl "struct rpc_request *dcerpc_$name\_send(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, struct $name *r);\n";
|
||||
}
|
||||
|
||||
return unless has_property($fn, "public");
|
||||
|
||||
pidl "NTSTATUS ndr_push_$name(struct ndr_push *ndr, int flags, const struct $name *r);\n";
|
||||
pidl "NTSTATUS ndr_pull_$name(struct ndr_pull *ndr, int flags, struct $name *r);\n";
|
||||
|
||||
pidl "\n";
|
||||
}
|
||||
|
||||
#####################################################################
|
||||
# parse the interface definitions
|
||||
sub HeaderInterface($)
|
||||
{
|
||||
my($interface) = shift;
|
||||
|
||||
if (defined $interface->{PROPERTIES}->{depends}) {
|
||||
my @d = split / /, $interface->{PROPERTIES}->{depends};
|
||||
foreach my $i (@d) {
|
||||
pidl "#include \"librpc/gen_ndr/ndr_$i\.h\"\n";
|
||||
}
|
||||
}
|
||||
|
||||
my $count = 0;
|
||||
|
||||
pidl "#ifndef _HEADER_NDR_$interface->{NAME}\n";
|
||||
pidl "#define _HEADER_NDR_$interface->{NAME}\n\n";
|
||||
|
||||
if (defined $interface->{PROPERTIES}->{uuid}) {
|
||||
my $name = uc $interface->{NAME};
|
||||
pidl "#define DCERPC_$name\_UUID " .
|
||||
Parse::Pidl::Util::make_str(lc($interface->{PROPERTIES}->{uuid})) . "\n";
|
||||
|
||||
if(!defined $interface->{PROPERTIES}->{version}) { $interface->{PROPERTIES}->{version} = "0.0"; }
|
||||
pidl "#define DCERPC_$name\_VERSION $interface->{PROPERTIES}->{version}\n";
|
||||
|
||||
pidl "#define DCERPC_$name\_NAME \"$interface->{NAME}\"\n";
|
||||
|
||||
if(!defined $interface->{PROPERTIES}->{helpstring}) { $interface->{PROPERTIES}->{helpstring} = "NULL"; }
|
||||
pidl "#define DCERPC_$name\_HELPSTRING $interface->{PROPERTIES}->{helpstring}\n";
|
||||
|
||||
pidl "\nextern const struct dcerpc_interface_table dcerpc_table_$interface->{NAME};\n";
|
||||
pidl "NTSTATUS dcerpc_server_$interface->{NAME}_init(void);\n\n";
|
||||
}
|
||||
|
||||
foreach my $d (@{$interface->{DATA}}) {
|
||||
next if $d->{TYPE} ne "FUNCTION";
|
||||
next if has_property($d, "noopnum");
|
||||
next if grep(/$d->{NAME}/,@{$interface->{INHERITED_FUNCTIONS}});
|
||||
my $u_name = uc $d->{NAME};
|
||||
pidl "#define DCERPC_$u_name (";
|
||||
|
||||
if (defined($interface->{BASE})) {
|
||||
pidl "DCERPC_" . uc $interface->{BASE} . "_CALL_COUNT + ";
|
||||
}
|
||||
|
||||
pidl sprintf("0x%02x", $count) . ")\n";
|
||||
$count++;
|
||||
}
|
||||
|
||||
pidl "\n#define DCERPC_" . uc $interface->{NAME} . "_CALL_COUNT (";
|
||||
|
||||
if (defined($interface->{BASE})) {
|
||||
pidl "DCERPC_" . uc $interface->{BASE} . "_CALL_COUNT + ";
|
||||
}
|
||||
|
||||
pidl "$count)\n\n";
|
||||
|
||||
foreach my $d (@{$interface->{DATA}}) {
|
||||
next if ($d->{TYPE} ne "TYPEDEF");
|
||||
HeaderTypedefProto($d);
|
||||
}
|
||||
|
||||
foreach my $d (@{$interface->{DATA}}) {
|
||||
next if ($d->{TYPE} ne "FUNCTION");
|
||||
HeaderFnProto($interface, $d);
|
||||
}
|
||||
|
||||
pidl "#endif /* _HEADER_NDR_$interface->{NAME} */\n";
|
||||
}
|
||||
|
||||
#####################################################################
|
||||
# parse a parsed IDL into a C header
|
||||
sub Parse($$)
|
||||
{
|
||||
my($idl,$basename) = @_;
|
||||
|
||||
$res = "";
|
||||
pidl "/* header auto-generated by pidl */\n";
|
||||
pidl "#include \"librpc/gen_ndr/$basename\.h\"\n\n";
|
||||
|
||||
foreach my $x (@{$idl}) {
|
||||
($x->{TYPE} eq "INTERFACE") && HeaderInterface($x);
|
||||
}
|
||||
return $res;
|
||||
}
|
||||
|
||||
1;
|
@ -101,7 +101,7 @@ sub get_value_of($)
|
||||
}
|
||||
}
|
||||
|
||||
my $res = "";
|
||||
my $res;
|
||||
my $deferred = "";
|
||||
my $tabs = "";
|
||||
|
||||
@ -117,6 +117,10 @@ sub pidl($)
|
||||
$res .="\n";
|
||||
}
|
||||
|
||||
my $res_hdr;
|
||||
|
||||
sub pidl_hdr ($) { my $d = shift; $res_hdr .= "$d\n"; }
|
||||
|
||||
####################################
|
||||
# defer() is like pidl(), but adds to
|
||||
# a deferred buffer which is then added to the
|
||||
@ -188,13 +192,17 @@ sub check_null_pointer_void($)
|
||||
}
|
||||
|
||||
#####################################################################
|
||||
# work out is a parse function should be declared static or not
|
||||
sub fn_prefix($)
|
||||
# declare a function public or static, depending on its attributes
|
||||
sub fn_declare($$)
|
||||
{
|
||||
my $fn = shift;
|
||||
my ($fn,$decl) = @_;
|
||||
|
||||
return "" if (has_property($fn, "public"));
|
||||
return "static ";
|
||||
if (has_property($fn, "public")) {
|
||||
pidl_hdr "$decl;";
|
||||
pidl "$decl";
|
||||
} else {
|
||||
pidl "static $decl";
|
||||
}
|
||||
}
|
||||
|
||||
###################################################################
|
||||
@ -1821,7 +1829,7 @@ sub ParseTypedefPush($)
|
||||
my($e) = shift;
|
||||
|
||||
my $args = $typefamily{$e->{DATA}->{TYPE}}->{DECL}->($e,"push");
|
||||
pidl fn_prefix($e) . "NTSTATUS ndr_push_$e->{NAME}(struct ndr_push *ndr, int ndr_flags, $args)";
|
||||
fn_declare($e, "NTSTATUS ndr_push_$e->{NAME}(struct ndr_push *ndr, int ndr_flags, $args)");
|
||||
|
||||
pidl "{";
|
||||
indent;
|
||||
@ -1840,7 +1848,7 @@ sub ParseTypedefPull($)
|
||||
|
||||
my $args = $typefamily{$e->{DATA}->{TYPE}}->{DECL}->($e,"pull");
|
||||
|
||||
pidl fn_prefix($e) . "NTSTATUS ndr_pull_$e->{NAME}(struct ndr_pull *ndr, int ndr_flags, $args)";
|
||||
fn_declare($e, "NTSTATUS ndr_pull_$e->{NAME}(struct ndr_pull *ndr, int ndr_flags, $args)");
|
||||
|
||||
pidl "{";
|
||||
indent;
|
||||
@ -1860,6 +1868,7 @@ sub ParseTypedefPrint($)
|
||||
my $args = $typefamily{$e->{DATA}->{TYPE}}->{DECL}->($e,"print");
|
||||
|
||||
pidl "void ndr_print_$e->{NAME}(struct ndr_print *ndr, const char *name, $args)";
|
||||
pidl_hdr "void ndr_print_$e->{NAME}(struct ndr_print *ndr, const char *name, $args);";
|
||||
pidl "{";
|
||||
indent;
|
||||
$typefamily{$e->{DATA}->{TYPE}}->{PRINT_FN_BODY}->($e->{DATA}, $e->{NAME});
|
||||
@ -1877,7 +1886,8 @@ sub ParseTypedefNdrSize($)
|
||||
my $tf = $typefamily{$t->{DATA}->{TYPE}};
|
||||
my $args = $tf->{SIZE_FN_ARGS}->($t);
|
||||
|
||||
pidl "size_t ndr_size_$t->{NAME}($args)";
|
||||
fn_declare($t, "size_t ndr_size_$t->{NAME}($args)");
|
||||
|
||||
pidl "{";
|
||||
indent;
|
||||
$typefamily{$t->{DATA}->{TYPE}}->{SIZE_FN_BODY}->($t);
|
||||
@ -1895,6 +1905,7 @@ sub ParseFunctionPrint($)
|
||||
return if has_property($fn, "noprint");
|
||||
|
||||
pidl "void ndr_print_$fn->{NAME}(struct ndr_print *ndr, const char *name, int flags, const struct $fn->{NAME} *r)";
|
||||
pidl_hdr "void ndr_print_$fn->{NAME}(struct ndr_print *ndr, const char *name, int flags, const struct $fn->{NAME} *r);";
|
||||
pidl "{";
|
||||
indent;
|
||||
|
||||
@ -1958,7 +1969,8 @@ sub ParseFunctionPush($)
|
||||
|
||||
return if has_property($fn, "nopush");
|
||||
|
||||
pidl fn_prefix($fn) . "NTSTATUS ndr_push_$fn->{NAME}(struct ndr_push *ndr, int flags, const struct $fn->{NAME} *r)";
|
||||
fn_declare($fn, "NTSTATUS ndr_push_$fn->{NAME}(struct ndr_push *ndr, int flags, const struct $fn->{NAME} *r)");
|
||||
|
||||
pidl "{";
|
||||
indent;
|
||||
|
||||
@ -2038,7 +2050,7 @@ sub ParseFunctionPull($)
|
||||
return if has_property($fn, "nopull");
|
||||
|
||||
# pull function args
|
||||
pidl fn_prefix($fn) . "NTSTATUS ndr_pull_$fn->{NAME}(struct ndr_pull *ndr, int flags, struct $fn->{NAME} *r)";
|
||||
fn_declare($fn, "NTSTATUS ndr_pull_$fn->{NAME}(struct ndr_pull *ndr, int flags, struct $fn->{NAME} *r)");
|
||||
pidl "{";
|
||||
indent;
|
||||
|
||||
@ -2149,6 +2161,7 @@ sub FunctionTable($)
|
||||
$count = $#{$interface->{FUNCTIONS}}+1;
|
||||
|
||||
return if ($count == 0);
|
||||
return unless defined ($interface->{PROPERTIES}->{uuid});
|
||||
|
||||
pidl "static const struct dcerpc_interface_call $interface->{NAME}\_calls[] = {";
|
||||
$count = 0;
|
||||
@ -2222,12 +2235,83 @@ sub FunctionTable($)
|
||||
pidl "";
|
||||
}
|
||||
|
||||
#####################################################################
|
||||
# generate prototypes and defines for the interface definitions
|
||||
# FIXME: these prototypes are for the DCE/RPC client functions, not the
|
||||
# NDR parser and so do not belong here, technically speaking
|
||||
sub HeaderInterface($)
|
||||
{
|
||||
my($interface) = shift;
|
||||
|
||||
my $count = 0;
|
||||
|
||||
pidl_hdr "#ifndef _HEADER_RPC_$interface->{NAME}";
|
||||
pidl_hdr "#define _HEADER_RPC_$interface->{NAME}";
|
||||
|
||||
pidl_hdr "";
|
||||
|
||||
if (defined $interface->{PROPERTIES}->{depends}) {
|
||||
my @d = split / /, $interface->{PROPERTIES}->{depends};
|
||||
foreach my $i (@d) {
|
||||
pidl_hdr "#include \"librpc/gen_ndr/ndr_$i\.h\"";
|
||||
}
|
||||
}
|
||||
|
||||
if (defined $interface->{PROPERTIES}->{uuid}) {
|
||||
my $name = uc $interface->{NAME};
|
||||
pidl_hdr "#define DCERPC_$name\_UUID " .
|
||||
Parse::Pidl::Util::make_str(lc($interface->{PROPERTIES}->{uuid}));
|
||||
|
||||
if(!defined $interface->{PROPERTIES}->{version}) { $interface->{PROPERTIES}->{version} = "0.0"; }
|
||||
pidl_hdr "#define DCERPC_$name\_VERSION $interface->{PROPERTIES}->{version}";
|
||||
|
||||
pidl_hdr "#define DCERPC_$name\_NAME \"$interface->{NAME}\"";
|
||||
|
||||
if(!defined $interface->{PROPERTIES}->{helpstring}) { $interface->{PROPERTIES}->{helpstring} = "NULL"; }
|
||||
pidl_hdr "#define DCERPC_$name\_HELPSTRING $interface->{PROPERTIES}->{helpstring}";
|
||||
|
||||
pidl_hdr "extern const struct dcerpc_interface_table dcerpc_table_$interface->{NAME};";
|
||||
pidl_hdr "NTSTATUS dcerpc_server_$interface->{NAME}_init(void);";
|
||||
}
|
||||
|
||||
foreach (@{$interface->{FUNCTIONS}}) {
|
||||
next if has_property($_, "noopnum");
|
||||
next if grep(/$_->{NAME}/,@{$interface->{INHERITED_FUNCTIONS}});
|
||||
my $u_name = uc $_->{NAME};
|
||||
|
||||
my $val = sprintf("0x%02x", $count);
|
||||
if (defined($interface->{BASE})) {
|
||||
$val .= " + DCERPC_" . uc $interface->{BASE} . "_CALL_COUNT";
|
||||
}
|
||||
|
||||
pidl_hdr "#define DCERPC_$u_name ($val)";
|
||||
|
||||
pidl_hdr "NTSTATUS dcerpc_$_->{NAME}(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, struct $_->{NAME} *r);";
|
||||
pidl_hdr "struct rpc_request *dcerpc_$_->{NAME}\_send(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, struct $_->{NAME} *r);";
|
||||
|
||||
pidl_hdr "";
|
||||
$count++;
|
||||
}
|
||||
|
||||
my $val = $count;
|
||||
|
||||
if (defined($interface->{BASE})) {
|
||||
$val .= " + DCERPC_" . uc $interface->{BASE} . "_CALL_COUNT";
|
||||
}
|
||||
|
||||
pidl_hdr "#define DCERPC_" . uc $interface->{NAME} . "_CALL_COUNT ($val)";
|
||||
|
||||
pidl_hdr "#endif /* _HEADER_RPC_$interface->{NAME} */";
|
||||
}
|
||||
|
||||
#####################################################################
|
||||
# parse the interface definitions
|
||||
sub ParseInterface($$)
|
||||
{
|
||||
my($interface,$needed) = @_;
|
||||
|
||||
HeaderInterface($interface);
|
||||
|
||||
# Typedefs
|
||||
foreach my $d (@{$interface->{TYPEDEFS}}) {
|
||||
($needed->{"push_$d->{NAME}"}) && ParseTypedefPush($d);
|
||||
@ -2257,10 +2341,8 @@ sub ParseInterface($$)
|
||||
|
||||
sub RegistrationFunction($$)
|
||||
{
|
||||
my ($idl,$filename) = @_;
|
||||
my ($idl,$basename) = @_;
|
||||
|
||||
$filename =~ /.*\/ndr_(.*).c/;
|
||||
my $basename = $1;
|
||||
pidl "NTSTATUS dcerpc_$basename\_init(void)";
|
||||
pidl "{";
|
||||
indent;
|
||||
@ -2271,6 +2353,7 @@ sub RegistrationFunction($$)
|
||||
my $count = ($#{$interface->{FUNCTIONS}}+1);
|
||||
|
||||
next if ($count == 0);
|
||||
next unless defined ($interface->{PROPERTIES}->{uuid});
|
||||
|
||||
pidl "status = dcerpc_ndr_$interface->{NAME}_init();";
|
||||
pidl "if (NT_STATUS_IS_ERR(status)) {";
|
||||
@ -2288,37 +2371,31 @@ sub RegistrationFunction($$)
|
||||
# parse a parsed IDL structure back into an IDL file
|
||||
sub Parse($$)
|
||||
{
|
||||
my($ndr,$filename) = @_;
|
||||
my($ndr,$basename) = @_;
|
||||
|
||||
$tabs = "";
|
||||
my $h_filename = $filename;
|
||||
$res = "";
|
||||
|
||||
if ($h_filename =~ /(.*)\.c/) {
|
||||
$h_filename = "$1.h";
|
||||
}
|
||||
$res_hdr = "";
|
||||
pidl_hdr "/* header auto-generated by pidl */";
|
||||
pidl_hdr "";
|
||||
|
||||
pidl "/* parser auto-generated by pidl */";
|
||||
pidl "";
|
||||
pidl "#include \"includes.h\"";
|
||||
pidl "#include \"librpc/gen_ndr/ndr_misc.h\"";
|
||||
pidl "#include \"librpc/gen_ndr/ndr_dcerpc.h\"";
|
||||
pidl "#include \"$h_filename\"";
|
||||
pidl "";
|
||||
|
||||
my %needed = ();
|
||||
|
||||
foreach my $x (@{$ndr}) {
|
||||
($x->{TYPE} eq "INTERFACE") && NeededInterface($x, \%needed);
|
||||
foreach (@{$ndr}) {
|
||||
($_->{TYPE} eq "INTERFACE") && NeededInterface($_, \%needed);
|
||||
}
|
||||
|
||||
foreach my $x (@{$ndr}) {
|
||||
($x->{TYPE} eq "INTERFACE") && ParseInterface($x, \%needed);
|
||||
foreach (@{$ndr}) {
|
||||
($_->{TYPE} eq "INTERFACE") && ParseInterface($_, \%needed);
|
||||
}
|
||||
|
||||
RegistrationFunction($ndr, $filename);
|
||||
RegistrationFunction($ndr, $basename);
|
||||
|
||||
return $res;
|
||||
return ($res_hdr, $res);
|
||||
}
|
||||
|
||||
sub NeededFunction($$)
|
||||
@ -2378,12 +2455,9 @@ sub NeededTypedef($$)
|
||||
sub NeededInterface($$)
|
||||
{
|
||||
my ($interface,$needed) = @_;
|
||||
foreach my $d (@{$interface->{FUNCTIONS}}) {
|
||||
NeededFunction($d, $needed);
|
||||
}
|
||||
foreach my $d (reverse @{$interface->{TYPEDEFS}}) {
|
||||
NeededTypedef($d, $needed);
|
||||
}
|
||||
NeededFunction($_, $needed) foreach (@{$interface->{FUNCTIONS}});
|
||||
NeededTypedef($_, $needed) foreach (reverse @{$interface->{TYPEDEFS}});
|
||||
}
|
||||
|
||||
1;
|
||||
|
||||
|
@ -17,7 +17,7 @@ pidl - An IDL compiler written in Perl
|
||||
|
||||
pidl --help
|
||||
|
||||
pidl [--outputdir[=OUTNAME]] [--parse-idl-tree] [--dump-idl-tree] [--dump-ndr-tree] [--ndr-header[=OUTPUT]] [--header[=OUTPUT]] [--ejs[=OUTPUT]] [--swig[=OUTPUT]] [--uint-enums] [--ndr-parser[=OUTPUT]] [--client] [--server] [--dcom-proxy] [--com-header] [--warn-compat] [--quiet] [--verbose] [--template] [--eth-parser[=OUTPUT]] [--diff] [--dump-idl] [--tdr-header=[OUTPUT]] [--tdr-parser[=OUTPUT]] [--samba3-header[=OUTPUT]] [--samba3-parser=[OUTPUT]] [--samba3-server=[OUTPUT]] [--samba3-template[=OUTPUT]] [--samba3-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] [--eth-parser[=OUTPUT]] [--diff] [--dump-idl] [--tdr-header=[OUTPUT]] [--tdr-parser[=OUTPUT]] [--samba3-header[=OUTPUT]] [--samba3-parser=[OUTPUT]] [--samba3-server=[OUTPUT]] [--samba3-template[=OUTPUT]] [--samba3-client[=OUTPUT]] [<idlfile>.idl]...
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
@ -71,13 +71,11 @@ Generate a new IDL file. File will be named OUTNAME.idl.
|
||||
|
||||
Generate a C header file for the specified interface. Filename defaults to OUTNAME.h.
|
||||
|
||||
=item I<--ndr-header>
|
||||
|
||||
Generate a C header file with the prototypes for the NDR parsers. Filename defaults to ndr_OUTNAME.h.
|
||||
|
||||
=item I<--ndr-parser>
|
||||
|
||||
Generate a C file containing NDR parsers. Filename defaults to ndr_OUTNAME.c.
|
||||
Generate a C file and C header containing NDR parsers. The filename for
|
||||
the parser defaults to ndr_OUTNAME.c. The header filename will be the
|
||||
parser filename with the extension changed from .c to .h.
|
||||
|
||||
=item I<--server>
|
||||
|
||||
@ -455,7 +453,6 @@ my($opt_dump_idl) = 0;
|
||||
my($opt_uint_enums) = 0;
|
||||
my($opt_diff) = 0;
|
||||
my($opt_header);
|
||||
my($opt_ndr_header);
|
||||
my($opt_samba3_header);
|
||||
my($opt_samba3_parser);
|
||||
my($opt_samba3_server);
|
||||
@ -504,7 +501,6 @@ Debugging:
|
||||
Samba 4 output:
|
||||
--header[=OUTFILE] create generic header file [BASENAME.h]
|
||||
--uint-enums don't use C enums, instead use uint* types
|
||||
--ndr-header[=OUTFILE] create a C NDR-specific header file [ndr_BASENAME.h]
|
||||
--ndr-parser[=OUTFILE] create a C NDR parser [ndr_BASENAME.c]
|
||||
--client[=OUTFILE] create a C NDR client [ndr_BASENAME_c.c]
|
||||
--tdr-header[=OUTFILE] create a C TDR header file [tdr_BASENAME.h]
|
||||
@ -538,7 +534,6 @@ my $result = GetOptions (
|
||||
'parse-idl-tree' => \$opt_parse_idl_tree,
|
||||
'dump-ndr-tree:s' => \$opt_dump_ndr_tree,
|
||||
'uint-enums' => \$opt_uint_enums,
|
||||
'ndr-header:s' => \$opt_ndr_header,
|
||||
'samba3-header:s' => \$opt_samba3_header,
|
||||
'samba3-parser:s' => \$opt_samba3_parser,
|
||||
'samba3-server:s' => \$opt_samba3_server,
|
||||
@ -646,7 +641,7 @@ sub process_file($)
|
||||
|
||||
$pidl = Parse::Pidl::ODL::ODL2IDL($pidl);
|
||||
|
||||
if (defined($opt_ndr_header) or defined($opt_eth_parser) or
|
||||
if (defined($opt_eth_parser) or
|
||||
defined($opt_client) or defined($opt_server) or
|
||||
defined($opt_ndr_parser) or defined($opt_ejs) or
|
||||
defined($opt_dump_ndr_tree) or defined($opt_samba3_header) or
|
||||
@ -668,17 +663,6 @@ sub process_file($)
|
||||
FileSave($header, Parse::Pidl::Samba4::Header::Parse($pidl));
|
||||
}
|
||||
|
||||
if (defined($opt_ndr_header)) {
|
||||
my $header = ($opt_ndr_header or "$outputdir/ndr_$basename.h");
|
||||
require Parse::Pidl::Samba4::NDR::Header;
|
||||
FileSave($header, Parse::Pidl::Samba4::NDR::Header::Parse($pidl, $basename));
|
||||
if (defined($opt_swig)) {
|
||||
require Parse::Pidl::Samba4::SWIG;
|
||||
my($filename) = ($opt_swig or "$outputdir/$basename.i");
|
||||
Parse::Pidl::Samba4::SWIG::RewriteHeader($pidl, $header, $filename);
|
||||
}
|
||||
}
|
||||
|
||||
my $h_filename = "$outputdir/ndr_$basename.h";
|
||||
if (defined($opt_client)) {
|
||||
require Parse::Pidl::Samba4::NDR::Client;
|
||||
@ -724,9 +708,28 @@ $dcom
|
||||
}
|
||||
|
||||
if (defined($opt_ndr_parser)) {
|
||||
my $parser = ($opt_ndr_parser or "$outputdir/ndr_$basename.c");
|
||||
my $parser_fname = ($opt_ndr_parser or "$outputdir/ndr_$basename.c");
|
||||
require Parse::Pidl::Samba4::NDR::Parser;
|
||||
FileSave($parser, Parse::Pidl::Samba4::NDR::Parser::Parse($ndr, $parser));
|
||||
my $header_fname = $parser_fname;
|
||||
$header_fname =~ s/\.c$/\.h/;
|
||||
my ($header,$parser) = Parse::Pidl::Samba4::NDR::Parser::Parse($ndr, $basename);
|
||||
|
||||
my $baseheader = $h_filename; $baseheader =~ s/\/ndr_/\//;
|
||||
$header = "#include \"$baseheader\"\n$header";
|
||||
|
||||
$parser = "#include \"includes.h\"\n"
|
||||
. "#include \"librpc/gen_ndr/ndr_misc.h\"\n"
|
||||
. "#include \"librpc/gen_ndr/ndr_dcerpc.h\"\n"
|
||||
. "#include \"$header_fname\"\n\n$parser";
|
||||
|
||||
FileSave($parser_fname, $parser);
|
||||
FileSave($header_fname, $header);
|
||||
|
||||
if (defined($opt_swig)) {
|
||||
require Parse::Pidl::Samba4::SWIG;
|
||||
my($filename) = ($opt_swig or "$outputdir/$basename.i");
|
||||
Parse::Pidl::Samba4::SWIG::RewriteHeader($pidl, $header_fname, $filename);
|
||||
}
|
||||
}
|
||||
|
||||
if (defined($opt_eth_parser)) {
|
||||
|
@ -4,45 +4,61 @@
|
||||
# Published under the GNU General Public License
|
||||
use strict;
|
||||
|
||||
use Test::Simple tests => 4;
|
||||
use Test::Simple tests => 6;
|
||||
use FindBin qw($RealBin);
|
||||
use lib "$RealBin/../lib";
|
||||
use Parse::Pidl::IDL;
|
||||
use Parse::Pidl::NDR;
|
||||
use Parse::Pidl::Samba4::NDR::Parser;
|
||||
use Parse::Pidl::Samba4::Header;
|
||||
|
||||
my $pidl = Parse::Pidl::IDL::parse_string(
|
||||
"interface test { void Test(); }; ", "<test>");
|
||||
ok (defined($pidl));
|
||||
my $pndr = Parse::Pidl::NDR::Parse($pidl);
|
||||
ok(defined($pndr));
|
||||
my ($header,$parser) = Parse::Pidl::Samba4::NDR::Parser($pndr);
|
||||
my $header = Parse::Pidl::Samba4::Header::Parse($pidl);
|
||||
ok(defined($header));
|
||||
my ($ndrheader,$parser) = Parse::Pidl::Samba4::NDR::Parser::Parse($pndr, "foo");
|
||||
ok(defined($parser));
|
||||
ok(defined($ndrheader));
|
||||
|
||||
my $outfile = "test";
|
||||
|
||||
#Parse::Pidl::Test::test_idl(
|
||||
# # Name
|
||||
# 'UInt8',
|
||||
#
|
||||
# # Settings
|
||||
# \%settings,
|
||||
#
|
||||
#
|
||||
# # C Test
|
||||
# '
|
||||
# uint8_t data[] = { 0x02 };
|
||||
# uint8_t result;
|
||||
# DATA_BLOB b;
|
||||
# struct ndr_pull *ndr;
|
||||
#
|
||||
# b.data = data;
|
||||
# b.length = 1;
|
||||
# ndr = ndr_pull_init_blob(&b, mem_ctx);
|
||||
#
|
||||
# if (NT_STATUS_IS_ERR(ndr_pull_uint8(ndr, NDR_SCALARS, &result)))
|
||||
# return 1;
|
||||
#
|
||||
# if (result != 0x02)
|
||||
# return 2;
|
||||
#');
|
||||
#my $cflags = $ENV{CFLAGS};
|
||||
my $cflags = "-Iinclude -I.";
|
||||
|
||||
open CC, "|cc -x c -o $outfile $cflags -";
|
||||
#open CC, ">foo";
|
||||
print CC "#include \"includes.h\"";
|
||||
print CC $header;
|
||||
print CC $ndrheader;
|
||||
print CC $parser;
|
||||
print CC
|
||||
'
|
||||
int main(int argc, const char **argv)
|
||||
{
|
||||
uint8_t data[] = { 0x02 };
|
||||
uint8_t result;
|
||||
DATA_BLOB b;
|
||||
struct ndr_pull *ndr;
|
||||
TALLOC_CTX *mem_ctx = talloc_init(NULL);
|
||||
|
||||
b.data = data;
|
||||
b.length = 1;
|
||||
ndr = ndr_pull_init_blob(&b, mem_ctx);
|
||||
|
||||
if (NT_STATUS_IS_ERR(ndr_pull_uint8(ndr, NDR_SCALARS, &result)))
|
||||
return 1;
|
||||
|
||||
if (result != 0x02)
|
||||
return 2;
|
||||
|
||||
talloc_free(mem_ctx);
|
||||
|
||||
return 0;
|
||||
}
|
||||
';
|
||||
close CC;
|
||||
|
||||
ok(-f $outfile);
|
||||
|
@ -6,7 +6,7 @@ PIDL_EXTRA_ARGS="$*"
|
||||
|
||||
[ -d librpc/gen_ndr ] || mkdir -p librpc/gen_ndr || exit 1
|
||||
|
||||
PIDL="$PERL ./pidl/pidl --outputdir librpc/gen_ndr --ndr-header --header --ndr-parser --server --client --dcom-proxy --com-header --swig --ejs $PIDL_EXTRA_ARGS"
|
||||
PIDL="$PERL ./pidl/pidl --outputdir librpc/gen_ndr --header --ndr-parser --server --client --dcom-proxy --com-header --swig --ejs $PIDL_EXTRA_ARGS"
|
||||
|
||||
if [ x$FULLBUILD = xFULL ]; then
|
||||
echo Rebuilding all idl files in librpc/idl
|
||||
|
Loading…
Reference in New Issue
Block a user