diff options
author | Jelmer Vernooij <jelmer@samba.org> | 2004-08-11 19:48:36 +0000 |
---|---|---|
committer | Gerald (Jerry) Carter <jerry@samba.org> | 2007-10-10 12:57:51 -0500 |
commit | 1d3b81e6c0c4c654c7395fe84b053cd77ef7d81a (patch) | |
tree | 3b193a8d482844dbdd05ae335882c800908bdd0f | |
parent | ca72bdfecbea2e332821bc292b4bb34f6c96ac2e (diff) | |
download | samba-1d3b81e6c0c4c654c7395fe84b053cd77ef7d81a.tar.gz samba-1d3b81e6c0c4c654c7395fe84b053cd77ef7d81a.tar.bz2 samba-1d3b81e6c0c4c654c7395fe84b053cd77ef7d81a.zip |
r1736: - Pidl updates:
- Support for "object oriented" interfaces in pidl
- Support for inherited interfaces in pidl
- Simplification of the support for properties on an interface
- Start on dcom rpc torture tests
(This used to be commit 45c3d0036b8510102816f9cdff9210098259cc5f)
-rw-r--r-- | source4/build/dcom/procedure | 14 | ||||
-rw-r--r-- | source4/build/pidl/Makefile | 2 | ||||
-rw-r--r-- | source4/build/pidl/dump.pm | 6 | ||||
-rw-r--r-- | source4/build/pidl/eparser.pm | 104 | ||||
-rw-r--r-- | source4/build/pidl/header.pm | 26 | ||||
-rw-r--r-- | source4/build/pidl/idl.pm | 1215 | ||||
-rw-r--r-- | source4/build/pidl/idl.yp | 89 | ||||
-rw-r--r-- | source4/build/pidl/parser.pm | 28 | ||||
-rwxr-xr-x | source4/build/pidl/pidl.pl | 2 | ||||
-rw-r--r-- | source4/build/pidl/util.pm | 14 | ||||
-rw-r--r-- | source4/librpc/idl/dcerpc.idl | 1 | ||||
-rw-r--r-- | source4/librpc/idl/dcom.idl | 55 | ||||
-rw-r--r-- | source4/librpc/idl/misc.idl | 1 | ||||
-rw-r--r-- | source4/librpc/idl/schannel.idl | 1 | ||||
-rw-r--r-- | source4/librpc/ndr/ndr_basic.c | 48 | ||||
-rw-r--r-- | source4/torture/config.mk | 1 | ||||
-rw-r--r-- | source4/torture/rpc/dcom.c | 47 |
17 files changed, 860 insertions, 794 deletions
diff --git a/source4/build/dcom/procedure b/source4/build/dcom/procedure index 3ee1738ba9..09fcc5946f 100644 --- a/source4/build/dcom/procedure +++ b/source4/build/dcom/procedure @@ -2,6 +2,13 @@ - ServerAlive2() - Bind to ISystemActivator +with dcom, there is a new attribute for interfaces, 'object'. these +object-oriented interfaces support inheritance. Everything that has the +attribute 'object' has ([in] ORPCTHIS *this, [out] ORPCTHAT *that) as first +arguments. + +OXID = Object Exporter ID + Everything based on IDispatch implements: /*****************/ @@ -9,7 +16,7 @@ Everything based on IDispatch implements: HRESULT QueryInterface( [in] ORPCTHIS *this, [out] ORPCTHAT *that, - [in] REFIID riid, + [in] IID *riid, [out] /* [iid_is] */ void **ppvObject); /*****************/ @@ -47,7 +54,7 @@ HRESULT GetTypeInfo ( HRESULT GetIDsOfNames( [in] ORPCTHIS *this, [out] ORPCTHAT *that, - [in] REFIID riid, + [in] IID *riid, [size_is][in] LPOLESTR *rgszNames, [in] UINT cNames, [in] LCID lcid, @@ -59,11 +66,10 @@ HRESULT Invoke( [in] ORPCTHIS *this, [out] ORPCTHAT *that, [in] DISPID dispIdMember, - [in] REFIID riid, + [in] IID *riid, [in] LCID lcid, [in] WORD wFlags, [out][in] DISPPARAMS *pDispParams, [out] VARIANT *pVarResult, [out] EXCEPINFO *pExcepInfo, [out] UINT *puArgErr); - diff --git a/source4/build/pidl/Makefile b/source4/build/pidl/Makefile index e2cc7be3eb..944f3db8af 100644 --- a/source4/build/pidl/Makefile +++ b/source4/build/pidl/Makefile @@ -1,3 +1,5 @@ +all: idl.pm + idl.pm: idl.yp yapp -s idl.yp diff --git a/source4/build/pidl/dump.pm b/source4/build/pidl/dump.pm index e74ffe6203..640bc3a120 100644 --- a/source4/build/pidl/dump.pm +++ b/source4/build/pidl/dump.pm @@ -183,7 +183,7 @@ sub DumpFunction($) ##################################################################### # dump a module header -sub DumpModuleHeader($) +sub DumpInterfaceProperties($) { my($header) = shift; my($data) = $header->{DATA}; @@ -208,6 +208,8 @@ sub DumpInterface($) my($data) = $interface->{DATA}; my($res); + $res .= DumpInterfaceProperties($interface->{PROPERTIES}); + $res .= "interface $interface->{NAME}\n{\n"; foreach my $d (@{$data}) { ($d->{TYPE} eq "TYPEDEF") && @@ -230,8 +232,6 @@ sub Dump($) $res = "/* Dumped by pidl */\n\n"; foreach my $x (@{$idl}) { - ($x->{TYPE} eq "MODULEHEADER") && - ($res .= DumpModuleHeader($x)); ($x->{TYPE} eq "INTERFACE") && ($res .= DumpInterface($x)); } diff --git a/source4/build/pidl/eparser.pm b/source4/build/pidl/eparser.pm index 0711790d23..acc8fddc80 100644 --- a/source4/build/pidl/eparser.pm +++ b/source4/build/pidl/eparser.pm @@ -14,9 +14,6 @@ my %needed; my %structs; my $module; -my $if_uuid; -my $if_version; -my $if_endpoints; sub pidl($) { @@ -933,17 +930,6 @@ sub BuildNeeded($) } } -##################################################################### -# parse the interface definitions -sub ModuleHeader($) -{ - my($h) = shift; - - $if_uuid = $h->{PROPERTIES}->{uuid}; - $if_version = $h->{PROPERTIES}->{version}; - $if_endpoints = $h->{PROPERTIES}->{endpoints}; -} - sub ParseHeader($$) { my($idl) = shift; @@ -989,9 +975,6 @@ sub Parse($$) open(OUT, ">$filename") || die "can't open $filename"; foreach my $x (@{$idl}) { - ($x->{TYPE} eq "MODULEHEADER") && - ModuleHeader($x); - if ($x->{TYPE} eq "INTERFACE") { $module = $x->{NAME}; BuildNeeded($x); @@ -1001,16 +984,14 @@ sub Parse($$) pidl "/* parser auto-generated by pidl */\n\n"; pidl "#ifdef HAVE_CONFIG_H\n"; pidl "#include \"config.h\"\n"; - pidl "#endif\n\n"; + pidl "#endif\n\n"; - pidl "#include \"packet-dcerpc.h\"\n"; - pidl "#include \"packet-dcerpc-nt.h\"\n\n"; - pidl "#include \"packet-dcerpc-eparser.h\"\n\n"; + pidl "#include \"packet-dcerpc.h\"\n"; + pidl "#include \"packet-dcerpc-nt.h\"\n\n"; + pidl "#include \"packet-dcerpc-eparser.h\"\n\n"; pidl "extern const value_string NT_errors[];\n\n"; - pidl "static int proto_dcerpc_$module = -1;\n\n"; - pidl "static gint ett_dcerpc_$module = -1;\n\n"; pidl "static int hf_opnum = -1;\n"; @@ -1033,6 +1014,7 @@ sub Parse($$) # Declarations for ett variables foreach my $y (keys(%needed)) { + pidl "static gint $y = -1;\n", if $y =~ /^ett_/; } @@ -1043,24 +1025,26 @@ sub Parse($$) } # Only perform module initialisation if we found a uuid - - if (defined($if_uuid)) { - - pidl "static e_uuid_t uuid_dcerpc_$module = {\n"; - pidl "\t0x" . substr($if_uuid, 0, 8); - pidl ", 0x" . substr($if_uuid, 9, 4); - pidl ", 0x" . substr($if_uuid, 14, 4) . ",\n"; - pidl "\t{ 0x" . substr($if_uuid, 19, 2); - pidl ", 0x" . substr($if_uuid, 21, 2); - pidl ", 0x" . substr($if_uuid, 24, 2); - pidl ", 0x" . substr($if_uuid, 26, 2); - pidl ", 0x" . substr($if_uuid, 28, 2); - pidl ", 0x" . substr($if_uuid, 30, 2); - pidl ", 0x" . substr($if_uuid, 32, 2); - pidl ", 0x" . substr($if_uuid, 34, 2) . " }\n"; - pidl "};\n\n"; - - pidl "static guint16 ver_dcerpc_$module = " . $if_version . ";\n\n"; + + for my $x (@{$idl}) { + pidl "static int proto_dcerpc_" . $x->{NAME} ." = -1;\n\n"; + if ((my $if_uuid = $x->{PROPERTIES}->{uuid})) { + pidl "static e_uuid_t uuid_dcerpc_" . $x->{NAME} ." = {\n"; + pidl "\t0x" . substr($if_uuid, 0, 8); + pidl ", 0x" . substr($if_uuid, 9, 4); + pidl ", 0x" . substr($if_uuid, 14, 4) . ",\n"; + pidl "\t{ 0x" . substr($if_uuid, 19, 2); + pidl ", 0x" . substr($if_uuid, 21, 2); + pidl ", 0x" . substr($if_uuid, 24, 2); + pidl ", 0x" . substr($if_uuid, 26, 2); + pidl ", 0x" . substr($if_uuid, 28, 2); + pidl ", 0x" . substr($if_uuid, 30, 2); + pidl ", 0x" . substr($if_uuid, 32, 2); + pidl ", 0x" . substr($if_uuid, 34, 2) . " }\n"; + pidl "};\n\n"; + + pidl "static guint16 ver_dcerpc_" . $x->{NAME} . " = " . $x->{PROPERTIES}->{version}. ";\n\n"; + } } pidl "void proto_register_dcerpc_$module(void)\n"; @@ -1092,31 +1076,33 @@ sub Parse($$) } pidl "\t};\n\n"; - if (defined($if_uuid)) { - - pidl "\tproto_dcerpc_$module = proto_register_protocol(\"$module\", \"$module\", \"$module\");\n\n"; + for my $x (@{$idl}) { + if (defined($x->{PROPERTIES}->{uuid})) { + $module = $x->{NAME}; - pidl "\tproto_register_field_array(proto_dcerpc_$module, hf, array_length (hf));\n"; - pidl "\tproto_register_subtree_array(ett, array_length(ett));\n"; + pidl "\tproto_dcerpc_$module = proto_register_protocol(\"$module\", \"$module\", \"$module\");\n\n"; - pidl "}\n\n"; + pidl "\tproto_register_field_array(proto_dcerpc_$module, hf, array_length (hf));\n"; + pidl "\tproto_register_subtree_array(ett, array_length(ett));\n"; - pidl "void proto_reg_handoff_dcerpc_$module(void)\n"; - pidl "{\n"; - pidl "\tdcerpc_init_uuid(proto_dcerpc_$module, ett_dcerpc_$module, \n"; - pidl "\t\t&uuid_dcerpc_$module, ver_dcerpc_$module, \n"; - pidl "\t\tdcerpc_" . $module . "_dissectors, hf_opnum);\n"; - pidl "}\n"; + pidl "}\n\n"; - } else { + pidl "void proto_reg_handoff_dcerpc_$module(void)\n"; + pidl "{\n"; + pidl "\tdcerpc_init_uuid(proto_dcerpc_$module, ett_dcerpc_$module, \n"; + pidl "\t\t&uuid_dcerpc_$module, ver_dcerpc_$module, \n"; + pidl "\t\tdcerpc_" . $module . "_dissectors, hf_opnum);\n"; + pidl "}\n"; - pidl "\tint proto_dcerpc;\n\n"; - pidl "\tproto_dcerpc = proto_get_id_by_filter_name(\"dcerpc\");\n"; - pidl "\tproto_register_field_array(proto_dcerpc, hf, array_length(hf));\n"; - pidl "\tproto_register_subtree_array(ett, array_length(ett));\n"; + } else { - pidl "}\n"; + pidl "\tint proto_dcerpc;\n\n"; + pidl "\tproto_dcerpc = proto_get_id_by_filter_name(\"dcerpc\");\n"; + pidl "\tproto_register_field_array(proto_dcerpc, hf, array_length(hf));\n"; + pidl "\tproto_register_subtree_array(ett, array_length(ett));\n"; + pidl "}\n"; + } } close(OUT); diff --git a/source4/build/pidl/header.pm b/source4/build/pidl/header.pm index 7618886bc2..589f9c6b54 100644 --- a/source4/build/pidl/header.pm +++ b/source4/build/pidl/header.pm @@ -9,8 +9,6 @@ use strict; my($res); my($tab_depth); -my $if_uuid; -my $if_version; sub tabs() { @@ -187,6 +185,7 @@ sub HeaderFunctionInOut($$) { my($fn) = shift; my($prop) = shift; + foreach my $e (@{$fn->{DATA}}) { if (util::has_property($e, $prop)) { HeaderElement($e); @@ -220,6 +219,7 @@ sub HeaderFunctionInOut_needed($$) sub HeaderFunction($) { my($fn) = shift; + $res .= "\nstruct $fn->{NAME} {\n"; $tab_depth++; my $needed = 0; @@ -272,12 +272,12 @@ sub HeaderInterface($) $res .= "#ifndef _HEADER_NDR_$interface->{NAME}\n"; $res .= "#define _HEADER_NDR_$interface->{NAME}\n\n"; - if (defined $if_uuid) { + if (defined $interface->{PROPERTIES}->{uuid}) { my $name = uc $interface->{NAME}; - $res .= "#define DCERPC_$name\_UUID \"$if_uuid\"\n"; + $res .= "#define DCERPC_$name\_UUID \"$interface->{PROPERTIES}->{uuid}\"\n"; - if(!defined $if_version) { $if_version = "0.0"; } - $res .= "#define DCERPC_$name\_VERSION $if_version\n"; + if(!defined $interface->{PROPERTIES}->{version}) { $interface->{PROPERTIES}->{version} = "0.0"; } + $res .= "#define DCERPC_$name\_VERSION $interface->{PROPERTIES}->{version}\n"; $res .= "#define DCERPC_$name\_NAME \"$interface->{NAME}\"\n\n"; $res .= "extern const struct dcerpc_interface_table dcerpc_table_$interface->{NAME};\n"; $res .= "NTSTATUS dcerpc_$interface->{NAME}_init(void);\n\n"; @@ -306,17 +306,6 @@ sub HeaderInterface($) } ##################################################################### -# parse the interface definitions -sub ModuleHeader($) -{ - my($h) = shift; - - $if_uuid = $h->{PROPERTIES}->{uuid}; - $if_version = $h->{PROPERTIES}->{version}; -} - - -##################################################################### # parse a parsed IDL into a C header sub Parse($) { @@ -325,9 +314,6 @@ sub Parse($) $res = "/* header auto-generated by pidl */\n\n"; foreach my $x (@{$idl}) { - ($x->{TYPE} eq "MODULEHEADER") && - ModuleHeader($x); - ($x->{TYPE} eq "INTERFACE") && HeaderInterface($x); } diff --git a/source4/build/pidl/idl.pm b/source4/build/pidl/idl.pm index e469c0fdc8..29e3cae9eb 100644 --- a/source4/build/pidl/idl.pm +++ b/source4/build/pidl/idl.pm @@ -500,88 +500,85 @@ sub new { yystates => [ {#State 0 - ACTIONS => { - "[" => 2 - }, + DEFAULT => -1, GOTOS => { - 'idl_interface' => 1, - 'idl' => 3, - 'module_header' => 4 + 'idl' => 1 } }, {#State 1 - DEFAULT => -1 - }, - {#State 2 ACTIONS => { - 'IDENTIFIER' => 5 + '' => 2 }, - DEFAULT => -5, + DEFAULT => -44, GOTOS => { - 'module_params' => 7, - 'identifier' => 6, - 'module_param' => 8 + 'interface' => 3, + 'property_list' => 4 } }, + {#State 2 + DEFAULT => 0 + }, {#State 3 + DEFAULT => -2 + }, + {#State 4 ACTIONS => { - '' => 9, - "[" => 2 - }, - GOTOS => { - 'idl_interface' => 10, - 'module_header' => 4 + "interface" => 6, + "[" => 5 } }, - {#State 4 + {#State 5 ACTIONS => { - "interface" => 12 + 'IDENTIFIER' => 7 }, GOTOS => { - 'interface' => 11 + 'identifier' => 8, + 'properties' => 10, + 'property' => 9 } }, - {#State 5 - DEFAULT => -69 - }, {#State 6 ACTIONS => { - "(" => 13 + 'IDENTIFIER' => 7 + }, + GOTOS => { + 'identifier' => 11 } }, {#State 7 - ACTIONS => { - "," => 14, - "]" => 15 - } + DEFAULT => -65 }, {#State 8 - DEFAULT => -6 + ACTIONS => { + "(" => 12 + }, + DEFAULT => -48 }, {#State 9 - DEFAULT => 0 + DEFAULT => -46 }, {#State 10 - DEFAULT => -2 + ACTIONS => { + "," => 13, + "]" => 14 + } }, {#State 11 - DEFAULT => -3 - }, - {#State 12 ACTIONS => { - 'IDENTIFIER' => 5 + ":" => 15 }, + DEFAULT => -4, GOTOS => { - 'identifier' => 16 + 'base_interface' => 16 } }, - {#State 13 + {#State 12 ACTIONS => { - 'IDENTIFIER' => 5, + 'IDENTIFIER' => 7, 'CONSTANT' => 23, 'TEXT' => 17 }, - DEFAULT => -56, + DEFAULT => -52, GOTOS => { 'identifier' => 18, 'listtext' => 21, @@ -590,97 +587,94 @@ sub new { 'constant' => 22 } }, - {#State 14 + {#State 13 ACTIONS => { - 'IDENTIFIER' => 5 + 'IDENTIFIER' => 7 }, GOTOS => { - 'identifier' => 6, - 'module_param' => 24 + 'identifier' => 8, + 'property' => 24 } }, + {#State 14 + DEFAULT => -45 + }, {#State 15 - DEFAULT => -4 + ACTIONS => { + 'IDENTIFIER' => 7 + }, + GOTOS => { + 'identifier' => 25 + } }, {#State 16 ACTIONS => { - "{" => 25 + "{" => 26 } }, {#State 17 - DEFAULT => -71 + DEFAULT => -67 }, {#State 18 - DEFAULT => -57 + DEFAULT => -53 }, {#State 19 - DEFAULT => -59 + DEFAULT => -55 }, {#State 20 ACTIONS => { - "-" => 26, - "+" => 27, - "&" => 28, - "/" => 29, - "|" => 30, - "(" => 31, - "*" => 32, - "." => 33, - ">" => 34 + "-" => 27, + "+" => 28, + "&" => 29, + "/" => 30, + "|" => 31, + "(" => 32, + "*" => 33, + "." => 34, + ">" => 35 }, - DEFAULT => -54 + DEFAULT => -50 }, {#State 21 ACTIONS => { - "," => 35, - ")" => 36 + "," => 36, + ")" => 37 } }, {#State 22 - DEFAULT => -58 + DEFAULT => -54 }, {#State 23 - DEFAULT => -70 + DEFAULT => -66 }, {#State 24 - DEFAULT => -7 + DEFAULT => -47 }, {#State 25 - ACTIONS => { - "typedef" => 37, - "const" => 43 - }, - DEFAULT => -48, - GOTOS => { - 'const' => 42, - 'function' => 38, - 'typedef' => 44, - 'definitions' => 39, - 'definition' => 41, - 'property_list' => 40 - } + DEFAULT => -5 }, {#State 26 ACTIONS => { - 'CONSTANT' => 23, - 'TEXT' => 17, - 'IDENTIFIER' => 5 + "typedef" => 38, + "const" => 44 }, - DEFAULT => -56, + DEFAULT => -44, GOTOS => { - 'identifier' => 18, - 'text' => 19, - 'anytext' => 45, - 'constant' => 22 + 'const' => 43, + 'function' => 39, + 'typedef' => 45, + 'definitions' => 40, + 'definition' => 42, + 'property_list' => 41 } }, {#State 27 ACTIONS => { 'CONSTANT' => 23, 'TEXT' => 17, - 'IDENTIFIER' => 5 + 'IDENTIFIER' => 7 }, - DEFAULT => -56, + DEFAULT => -52, GOTOS => { 'identifier' => 18, 'text' => 19, @@ -692,9 +686,9 @@ sub new { ACTIONS => { 'CONSTANT' => 23, 'TEXT' => 17, - 'IDENTIFIER' => 5 + 'IDENTIFIER' => 7 }, - DEFAULT => -56, + DEFAULT => -52, GOTOS => { 'identifier' => 18, 'text' => 19, @@ -706,9 +700,9 @@ sub new { ACTIONS => { 'CONSTANT' => 23, 'TEXT' => 17, - 'IDENTIFIER' => 5 + 'IDENTIFIER' => 7 }, - DEFAULT => -56, + DEFAULT => -52, GOTOS => { 'identifier' => 18, 'text' => 19, @@ -720,9 +714,9 @@ sub new { ACTIONS => { 'CONSTANT' => 23, 'TEXT' => 17, - 'IDENTIFIER' => 5 + 'IDENTIFIER' => 7 }, - DEFAULT => -56, + DEFAULT => -52, GOTOS => { 'identifier' => 18, 'text' => 19, @@ -732,11 +726,11 @@ sub new { }, {#State 31 ACTIONS => { - 'IDENTIFIER' => 5, 'CONSTANT' => 23, - 'TEXT' => 17 + 'TEXT' => 17, + 'IDENTIFIER' => 7 }, - DEFAULT => -56, + DEFAULT => -52, GOTOS => { 'identifier' => 18, 'text' => 19, @@ -746,11 +740,11 @@ sub new { }, {#State 32 ACTIONS => { + 'IDENTIFIER' => 7, 'CONSTANT' => 23, - 'TEXT' => 17, - 'IDENTIFIER' => 5 + 'TEXT' => 17 }, - DEFAULT => -56, + DEFAULT => -52, GOTOS => { 'identifier' => 18, 'text' => 19, @@ -762,9 +756,9 @@ sub new { ACTIONS => { 'CONSTANT' => 23, 'TEXT' => 17, - 'IDENTIFIER' => 5 + 'IDENTIFIER' => 7 }, - DEFAULT => -56, + DEFAULT => -52, GOTOS => { 'identifier' => 18, 'text' => 19, @@ -776,9 +770,9 @@ sub new { ACTIONS => { 'CONSTANT' => 23, 'TEXT' => 17, - 'IDENTIFIER' => 5 + 'IDENTIFIER' => 7 }, - DEFAULT => -56, + DEFAULT => -52, GOTOS => { 'identifier' => 18, 'text' => 19, @@ -788,11 +782,11 @@ sub new { }, {#State 35 ACTIONS => { - 'IDENTIFIER' => 5, 'CONSTANT' => 23, - 'TEXT' => 17 + 'TEXT' => 17, + 'IDENTIFIER' => 7 }, - DEFAULT => -56, + DEFAULT => -52, GOTOS => { 'identifier' => 18, 'text' => 19, @@ -801,678 +795,621 @@ sub new { } }, {#State 36 - DEFAULT => -8 - }, - {#State 37 ACTIONS => { - 'IDENTIFIER' => 5, - "enum" => 55, - 'void' => 56 + 'IDENTIFIER' => 7, + 'CONSTANT' => 23, + 'TEXT' => 17 }, - DEFAULT => -48, + DEFAULT => -52, GOTOS => { - 'identifier' => 58, - 'struct' => 59, - 'enum' => 60, - 'type' => 61, - 'union' => 62, - 'property_list' => 57 + 'identifier' => 18, + 'text' => 19, + 'anytext' => 55, + 'constant' => 22 } }, - {#State 38 - DEFAULT => -12 + {#State 37 + DEFAULT => -49 }, - {#State 39 + {#State 38 ACTIONS => { - "}" => 63, - "typedef" => 37, - "const" => 43 + 'IDENTIFIER' => 7, + "enum" => 56, + 'void' => 57 }, - DEFAULT => -48, + DEFAULT => -44, GOTOS => { - 'const' => 42, - 'function' => 38, - 'typedef' => 44, - 'definition' => 64, - 'property_list' => 40 + 'identifier' => 59, + 'struct' => 60, + 'enum' => 61, + 'type' => 62, + 'union' => 63, + 'property_list' => 58 } }, + {#State 39 + DEFAULT => -8 + }, {#State 40 ACTIONS => { - 'IDENTIFIER' => 5, - "enum" => 55, - "[" => 65, - 'void' => 56 + "}" => 64, + "typedef" => 38, + "const" => 44 }, - DEFAULT => -48, + DEFAULT => -44, GOTOS => { - 'identifier' => 58, - 'struct' => 59, - 'enum' => 60, - 'type' => 66, - 'union' => 62, - 'property_list' => 57 + 'const' => 43, + 'function' => 39, + 'typedef' => 45, + 'definition' => 65, + 'property_list' => 41 } }, {#State 41 - DEFAULT => -10 + ACTIONS => { + 'IDENTIFIER' => 7, + "enum" => 56, + "[" => 5, + 'void' => 57 + }, + DEFAULT => -44, + GOTOS => { + 'identifier' => 59, + 'struct' => 60, + 'enum' => 61, + 'type' => 66, + 'union' => 63, + 'property_list' => 58 + } }, {#State 42 - DEFAULT => -13 + DEFAULT => -6 }, {#State 43 + DEFAULT => -9 + }, + {#State 44 ACTIONS => { - 'IDENTIFIER' => 5 + 'IDENTIFIER' => 7 }, GOTOS => { 'identifier' => 67 } }, - {#State 44 - DEFAULT => -14 - }, {#State 45 - DEFAULT => -60 + DEFAULT => -10 }, {#State 46 - DEFAULT => -67 + DEFAULT => -56 }, {#State 47 - DEFAULT => -65 + DEFAULT => -63 }, {#State 48 - DEFAULT => -66 + DEFAULT => -61 }, {#State 49 - DEFAULT => -64 + DEFAULT => -62 }, {#State 50 + DEFAULT => -60 + }, + {#State 51 ACTIONS => { - "-" => 26, - "+" => 27, - "&" => 28, - "/" => 29, - "(" => 31, - "|" => 30, - "*" => 32, - "." => 33, + "-" => 27, + "+" => 28, + "&" => 29, + "/" => 30, + "(" => 32, + "|" => 31, + "*" => 33, + "." => 34, ")" => 68, - ">" => 34 + ">" => 35 } }, - {#State 51 - DEFAULT => -62 - }, {#State 52 - DEFAULT => -61 + DEFAULT => -58 }, {#State 53 - DEFAULT => -63 + DEFAULT => -57 }, {#State 54 + DEFAULT => -59 + }, + {#State 55 ACTIONS => { - "-" => 26, - "+" => 27, - "&" => 28, - "/" => 29, - "(" => 31, - "|" => 30, - "*" => 32, - "." => 33, - ">" => 34 + "-" => 27, + "+" => 28, + "&" => 29, + "/" => 30, + "(" => 32, + "|" => 31, + "*" => 33, + "." => 34, + ">" => 35 }, - DEFAULT => -55 + DEFAULT => -51 }, - {#State 55 + {#State 56 ACTIONS => { "{" => 69 } }, - {#State 56 - DEFAULT => -22 - }, {#State 57 + DEFAULT => -18 + }, + {#State 58 ACTIONS => { "union" => 70, - "[" => 65, + "[" => 5, "struct" => 71 } }, - {#State 58 - DEFAULT => -21 - }, {#State 59 - DEFAULT => -18 + DEFAULT => -17 }, {#State 60 - DEFAULT => -20 + DEFAULT => -14 }, {#State 61 + DEFAULT => -16 + }, + {#State 62 ACTIONS => { - 'IDENTIFIER' => 5 + 'IDENTIFIER' => 7 }, GOTOS => { 'identifier' => 72 } }, - {#State 62 - DEFAULT => -19 - }, {#State 63 - DEFAULT => -9 + DEFAULT => -15 }, {#State 64 - DEFAULT => -11 + DEFAULT => -3 }, {#State 65 - ACTIONS => { - 'IDENTIFIER' => 5 - }, - GOTOS => { - 'identifier' => 74, - 'property' => 75, - 'properties' => 73 - } + DEFAULT => -7 }, {#State 66 ACTIONS => { - 'IDENTIFIER' => 5 + 'IDENTIFIER' => 7 }, GOTOS => { - 'identifier' => 76 + 'identifier' => 73 } }, {#State 67 ACTIONS => { - 'IDENTIFIER' => 5 + 'IDENTIFIER' => 7 }, GOTOS => { - 'identifier' => 77 + 'identifier' => 74 } }, {#State 68 ACTIONS => { 'CONSTANT' => 23, 'TEXT' => 17, - 'IDENTIFIER' => 5 + 'IDENTIFIER' => 7 }, - DEFAULT => -56, + DEFAULT => -52, GOTOS => { 'identifier' => 18, 'text' => 19, - 'anytext' => 78, + 'anytext' => 75, 'constant' => 22 } }, {#State 69 ACTIONS => { - 'IDENTIFIER' => 5 + 'IDENTIFIER' => 7 }, GOTOS => { - 'identifier' => 79, - 'enum_element' => 80, - 'enum_elements' => 81 + 'identifier' => 76, + 'enum_element' => 77, + 'enum_elements' => 78 } }, {#State 70 ACTIONS => { - "{" => 82 + "{" => 79 } }, {#State 71 ACTIONS => { - "{" => 83 + "{" => 80 } }, {#State 72 ACTIONS => { - "[" => 85 + "[" => 82 }, - DEFAULT => -45, + DEFAULT => -41, GOTOS => { - 'array_len' => 84 + 'array_len' => 81 } }, {#State 73 ACTIONS => { - "," => 86, - "]" => 87 + "(" => 83 } }, {#State 74 ACTIONS => { - "(" => 88 - }, - DEFAULT => -52 + "=" => 84 + } }, {#State 75 - DEFAULT => -50 + DEFAULT => -64 }, {#State 76 ACTIONS => { - "(" => 89 - } + "=" => 85 + }, + DEFAULT => -22 }, {#State 77 - ACTIONS => { - "=" => 90 - } + DEFAULT => -20 }, {#State 78 - DEFAULT => -68 - }, - {#State 79 - ACTIONS => { - "=" => 91 - }, - DEFAULT => -26 - }, - {#State 80 - DEFAULT => -24 - }, - {#State 81 ACTIONS => { - "}" => 92, - "," => 93 + "}" => 86, + "," => 87 } }, - {#State 82 + {#State 79 ACTIONS => { - "[" => 96 + "[" => 90 }, GOTOS => { - 'union_elements' => 94, - 'union_element' => 95 + 'union_elements' => 88, + 'union_element' => 89 } }, - {#State 83 - DEFAULT => -39, + {#State 80 + DEFAULT => -35, GOTOS => { - 'element_list1' => 97 + 'element_list1' => 91 } }, - {#State 84 + {#State 81 ACTIONS => { - ";" => 98 + ";" => 92 } }, - {#State 85 + {#State 82 ACTIONS => { - 'IDENTIFIER' => 5, + 'IDENTIFIER' => 7, 'CONSTANT' => 23, 'TEXT' => 17, - "]" => 100 + "]" => 94 }, - DEFAULT => -56, + DEFAULT => -52, GOTOS => { 'identifier' => 18, 'text' => 19, - 'anytext' => 99, + 'anytext' => 93, 'constant' => 22 } }, - {#State 86 - ACTIONS => { - 'IDENTIFIER' => 5 - }, - GOTOS => { - 'identifier' => 74, - 'property' => 101 - } - }, - {#State 87 - DEFAULT => -49 - }, - {#State 88 - ACTIONS => { - 'IDENTIFIER' => 5, - 'CONSTANT' => 23, - 'TEXT' => 17 - }, - DEFAULT => -56, - GOTOS => { - 'identifier' => 18, - 'text' => 19, - 'anytext' => 102, - 'constant' => 22 - } - }, - {#State 89 + {#State 83 ACTIONS => { - "void" => 105, - "," => -41, - ")" => -41 + "void" => 97, + "," => -37, + ")" => -37 }, - DEFAULT => -48, + DEFAULT => -44, GOTOS => { - 'base_element' => 103, - 'element_list2' => 106, - 'property_list' => 104 + 'base_element' => 95, + 'element_list2' => 98, + 'property_list' => 96 } }, - {#State 90 + {#State 84 ACTIONS => { - 'IDENTIFIER' => 5, + 'IDENTIFIER' => 7, 'CONSTANT' => 23, 'TEXT' => 17 }, - DEFAULT => -56, + DEFAULT => -52, GOTOS => { 'identifier' => 18, 'text' => 19, - 'anytext' => 107, + 'anytext' => 99, 'constant' => 22 } }, - {#State 91 + {#State 85 ACTIONS => { - 'IDENTIFIER' => 5, + 'IDENTIFIER' => 7, 'CONSTANT' => 23, 'TEXT' => 17 }, - DEFAULT => -56, + DEFAULT => -52, GOTOS => { 'identifier' => 18, 'text' => 19, - 'anytext' => 108, + 'anytext' => 100, 'constant' => 22 } }, - {#State 92 - DEFAULT => -23 + {#State 86 + DEFAULT => -19 }, - {#State 93 + {#State 87 ACTIONS => { - 'IDENTIFIER' => 5 + 'IDENTIFIER' => 7 }, GOTOS => { - 'identifier' => 79, - 'enum_element' => 109 + 'identifier' => 76, + 'enum_element' => 101 } }, - {#State 94 + {#State 88 ACTIONS => { - "}" => 110, - "[" => 96 + "}" => 102, + "[" => 90 }, GOTOS => { - 'union_element' => 111 + 'union_element' => 103 } }, - {#State 95 - DEFAULT => -30 + {#State 89 + DEFAULT => -26 }, - {#State 96 + {#State 90 ACTIONS => { - "case" => 112, - "default" => 113 + "case" => 104, + "default" => 105 } }, - {#State 97 + {#State 91 ACTIONS => { - "}" => 114 + "}" => 106 }, - DEFAULT => -48, + DEFAULT => -44, GOTOS => { - 'base_element' => 115, - 'property_list' => 104 + 'base_element' => 107, + 'property_list' => 96 } }, - {#State 98 - DEFAULT => -17 + {#State 92 + DEFAULT => -13 }, - {#State 99 + {#State 93 ACTIONS => { - "-" => 26, - "+" => 27, - "&" => 28, - "/" => 29, - "(" => 31, - "|" => 30, - "*" => 32, - "." => 33, - "]" => 116, - ">" => 34 + "-" => 27, + "+" => 28, + "&" => 29, + "/" => 30, + "(" => 32, + "|" => 31, + "*" => 33, + "." => 34, + "]" => 108, + ">" => 35 } }, - {#State 100 - DEFAULT => -46 - }, - {#State 101 - DEFAULT => -51 - }, - {#State 102 - ACTIONS => { - "-" => 26, - "+" => 27, - "&" => 28, - "/" => 29, - "(" => 31, - "|" => 30, - "*" => 32, - "." => 33, - ")" => 117, - ">" => 34 - } + {#State 94 + DEFAULT => -42 }, - {#State 103 - DEFAULT => -43 + {#State 95 + DEFAULT => -39 }, - {#State 104 + {#State 96 ACTIONS => { - 'IDENTIFIER' => 5, - "enum" => 55, - "[" => 65, - 'void' => 56 + 'IDENTIFIER' => 7, + "enum" => 56, + "[" => 5, + 'void' => 57 }, - DEFAULT => -48, + DEFAULT => -44, GOTOS => { - 'identifier' => 58, - 'struct' => 59, - 'enum' => 60, - 'type' => 118, - 'union' => 62, - 'property_list' => 57 + 'identifier' => 59, + 'struct' => 60, + 'enum' => 61, + 'type' => 109, + 'union' => 63, + 'property_list' => 58 } }, - {#State 105 - DEFAULT => -42 + {#State 97 + DEFAULT => -38 }, - {#State 106 + {#State 98 ACTIONS => { - "," => 119, - ")" => 120 + "," => 110, + ")" => 111 } }, - {#State 107 + {#State 99 ACTIONS => { - "-" => 26, - "|" => 30, - "(" => 31, - "*" => 32, - ";" => 121, - "+" => 27, - "&" => 28, - "/" => 29, - "." => 33, - ">" => 34 + "-" => 27, + "|" => 31, + "(" => 32, + "*" => 33, + ";" => 112, + "+" => 28, + "&" => 29, + "/" => 30, + "." => 34, + ">" => 35 } }, - {#State 108 + {#State 100 ACTIONS => { - "-" => 26, - "+" => 27, - "&" => 28, - "/" => 29, - "(" => 31, - "|" => 30, - "*" => 32, - "." => 33, - ">" => 34 + "-" => 27, + "+" => 28, + "&" => 29, + "/" => 30, + "(" => 32, + "|" => 31, + "*" => 33, + "." => 34, + ">" => 35 }, - DEFAULT => -27 + DEFAULT => -23 }, - {#State 109 - DEFAULT => -25 + {#State 101 + DEFAULT => -21 }, - {#State 110 - DEFAULT => -29 + {#State 102 + DEFAULT => -25 }, - {#State 111 - DEFAULT => -31 + {#State 103 + DEFAULT => -27 }, - {#State 112 + {#State 104 ACTIONS => { - "(" => 122 + "(" => 113 } }, - {#State 113 + {#State 105 ACTIONS => { - "]" => 123 + "]" => 114 } }, - {#State 114 - DEFAULT => -28 + {#State 106 + DEFAULT => -24 }, - {#State 115 + {#State 107 ACTIONS => { - ";" => 124 + ";" => 115 } }, - {#State 116 - DEFAULT => -47 - }, - {#State 117 - DEFAULT => -53 + {#State 108 + DEFAULT => -43 }, - {#State 118 - DEFAULT => -37, + {#State 109 + DEFAULT => -33, GOTOS => { - 'pointers' => 125 + 'pointers' => 116 } }, - {#State 119 - DEFAULT => -48, + {#State 110 + DEFAULT => -44, GOTOS => { - 'base_element' => 126, - 'property_list' => 104 + 'base_element' => 117, + 'property_list' => 96 } }, - {#State 120 + {#State 111 ACTIONS => { - ";" => 127 + ";" => 118 } }, - {#State 121 - DEFAULT => -15 + {#State 112 + DEFAULT => -11 }, - {#State 122 + {#State 113 ACTIONS => { - 'IDENTIFIER' => 5, + 'IDENTIFIER' => 7, 'CONSTANT' => 23, 'TEXT' => 17 }, - DEFAULT => -56, + DEFAULT => -52, GOTOS => { 'identifier' => 18, 'text' => 19, - 'anytext' => 128, + 'anytext' => 119, 'constant' => 22 } }, - {#State 123 + {#State 114 ACTIONS => { - ";" => 129 + ";" => 120 }, - DEFAULT => -48, + DEFAULT => -44, GOTOS => { - 'base_element' => 130, - 'property_list' => 104 + 'base_element' => 121, + 'property_list' => 96 } }, - {#State 124 - DEFAULT => -40 + {#State 115 + DEFAULT => -36 }, - {#State 125 + {#State 116 ACTIONS => { - 'IDENTIFIER' => 5, - "*" => 132 + 'IDENTIFIER' => 7, + "*" => 123 }, GOTOS => { - 'identifier' => 131 + 'identifier' => 122 } }, - {#State 126 - DEFAULT => -44 + {#State 117 + DEFAULT => -40 }, - {#State 127 - DEFAULT => -16 + {#State 118 + DEFAULT => -12 }, - {#State 128 + {#State 119 ACTIONS => { - "-" => 26, - "+" => 27, - "&" => 28, - "/" => 29, - "(" => 31, - "|" => 30, - "*" => 32, - "." => 33, - ")" => 133, - ">" => 34 + "-" => 27, + "+" => 28, + "&" => 29, + "/" => 30, + "(" => 32, + "|" => 31, + "*" => 33, + "." => 34, + ")" => 124, + ">" => 35 } }, - {#State 129 - DEFAULT => -35 + {#State 120 + DEFAULT => -31 }, - {#State 130 + {#State 121 ACTIONS => { - ";" => 134 + ";" => 125 } }, - {#State 131 + {#State 122 ACTIONS => { - "[" => 85 + "[" => 82 }, - DEFAULT => -45, + DEFAULT => -41, GOTOS => { - 'array_len' => 135 + 'array_len' => 126 } }, - {#State 132 - DEFAULT => -38 + {#State 123 + DEFAULT => -34 }, - {#State 133 + {#State 124 ACTIONS => { - "]" => 136 + "]" => 127 } }, - {#State 134 - DEFAULT => -34 + {#State 125 + DEFAULT => -30 }, - {#State 135 - DEFAULT => -36 + {#State 126 + DEFAULT => -32 }, - {#State 136 + {#State 127 ACTIONS => { - ";" => 137 + ";" => 128 }, - DEFAULT => -48, + DEFAULT => -44, GOTOS => { - 'base_element' => 138, - 'property_list' => 104 + 'base_element' => 129, + 'property_list' => 96 } }, - {#State 137 - DEFAULT => -33 + {#State 128 + DEFAULT => -29 }, - {#State 138 + {#State 129 ACTIONS => { - ";" => 139 + ";" => 130 } }, - {#State 139 - DEFAULT => -32 + {#State 130 + DEFAULT => -28 } ], yyrules => @@ -1481,85 +1418,62 @@ sub new { '$start', 2, undef ], [#Rule 1 - 'idl', 1, undef + 'idl', 0, undef ], [#Rule 2 'idl', 2, sub -#line 18 "build/pidl/idl.yp" -{ util::FlattenArray([$_[1],$_[2]]) } +#line 19 "build/pidl/idl.yp" +{ + push(@{$_[1]}, $_[2]); $_[1] + } ], [#Rule 3 - 'idl_interface', 2, -sub -#line 21 "build/pidl/idl.yp" -{ [ $_[1], $_[2] ] } - ], - [#Rule 4 - 'module_header', 3, + 'interface', 7, sub #line 25 "build/pidl/idl.yp" -{{ - "TYPE" => "MODULEHEADER", - "PROPERTIES" => util::FlattenHash($_[2]) +{$_[3] => { + "TYPE" => "INTERFACE", + "PROPERTIES" => $_[1], + "NAME" => $_[3], + "BASE" => $_[4], + "DATA" => $_[6], }} ], - [#Rule 5 - 'module_params', 0, undef - ], - [#Rule 6 - 'module_params', 1, -sub -#line 33 "build/pidl/idl.yp" -{ [ $_[1] ] } - ], - [#Rule 7 - 'module_params', 3, -sub -#line 34 "build/pidl/idl.yp" -{ push(@{$_[1]}, $_[3]); $_[1] } - ], - [#Rule 8 - 'module_param', 4, -sub -#line 38 "build/pidl/idl.yp" -{ { "$_[1]" => "$_[3]" } } + [#Rule 4 + 'base_interface', 0, undef ], - [#Rule 9 - 'interface', 5, + [#Rule 5 + 'base_interface', 2, sub -#line 42 "build/pidl/idl.yp" -{{ - "TYPE" => "INTERFACE", - "NAME" => $_[2], - "DATA" => $_[4] - }} +#line 36 "build/pidl/idl.yp" +{ $_[2] } ], - [#Rule 10 + [#Rule 6 'definitions', 1, sub -#line 50 "build/pidl/idl.yp" +#line 40 "build/pidl/idl.yp" { [ $_[1] ] } ], - [#Rule 11 + [#Rule 7 'definitions', 2, sub -#line 51 "build/pidl/idl.yp" +#line 41 "build/pidl/idl.yp" { push(@{$_[1]}, $_[2]); $_[1] } ], - [#Rule 12 + [#Rule 8 'definition', 1, undef ], - [#Rule 13 + [#Rule 9 'definition', 1, undef ], - [#Rule 14 + [#Rule 10 'definition', 1, undef ], - [#Rule 15 + [#Rule 11 'const', 6, sub -#line 59 "build/pidl/idl.yp" +#line 49 "build/pidl/idl.yp" {{ "TYPE" => "CONST", "DTYPE" => $_[2], @@ -1567,10 +1481,10 @@ sub "VALUE" => $_[5] }} ], - [#Rule 16 + [#Rule 12 'function', 7, sub -#line 69 "build/pidl/idl.yp" +#line 59 "build/pidl/idl.yp" {{ "TYPE" => "FUNCTION", "NAME" => $_[3], @@ -1579,10 +1493,10 @@ sub "DATA" => $_[5] }} ], - [#Rule 17 + [#Rule 13 'typedef', 5, sub -#line 79 "build/pidl/idl.yp" +#line 69 "build/pidl/idl.yp" {{ "TYPE" => "TYPEDEF", "NAME" => $_[3], @@ -1590,128 +1504,128 @@ sub "ARRAY_LEN" => $_[4] }} ], - [#Rule 18 + [#Rule 14 'type', 1, undef ], - [#Rule 19 + [#Rule 15 'type', 1, undef ], - [#Rule 20 + [#Rule 16 'type', 1, undef ], - [#Rule 21 + [#Rule 17 'type', 1, undef ], - [#Rule 22 + [#Rule 18 'type', 1, sub -#line 88 "build/pidl/idl.yp" +#line 78 "build/pidl/idl.yp" { "void" } ], - [#Rule 23 + [#Rule 19 'enum', 4, sub -#line 93 "build/pidl/idl.yp" +#line 83 "build/pidl/idl.yp" {{ "TYPE" => "ENUM", "ELEMENTS" => $_[3] }} ], - [#Rule 24 + [#Rule 20 'enum_elements', 1, sub -#line 100 "build/pidl/idl.yp" +#line 90 "build/pidl/idl.yp" { [ $_[1] ] } ], - [#Rule 25 + [#Rule 21 'enum_elements', 3, sub -#line 101 "build/pidl/idl.yp" +#line 91 "build/pidl/idl.yp" { push(@{$_[1]}, $_[3]); $_[1] } ], - [#Rule 26 + [#Rule 22 'enum_element', 1, undef ], - [#Rule 27 + [#Rule 23 'enum_element', 3, sub -#line 105 "build/pidl/idl.yp" +#line 95 "build/pidl/idl.yp" { "$_[1]$_[2]$_[3]" } ], - [#Rule 28 + [#Rule 24 'struct', 5, sub -#line 109 "build/pidl/idl.yp" +#line 99 "build/pidl/idl.yp" {{ "TYPE" => "STRUCT", "PROPERTIES" => $_[1], "ELEMENTS" => $_[4] }} ], - [#Rule 29 + [#Rule 25 'union', 5, sub -#line 117 "build/pidl/idl.yp" +#line 107 "build/pidl/idl.yp" {{ "TYPE" => "UNION", "PROPERTIES" => $_[1], "DATA" => $_[4] }} ], - [#Rule 30 + [#Rule 26 'union_elements', 1, sub -#line 125 "build/pidl/idl.yp" +#line 115 "build/pidl/idl.yp" { [ $_[1] ] } ], - [#Rule 31 + [#Rule 27 'union_elements', 2, sub -#line 126 "build/pidl/idl.yp" +#line 116 "build/pidl/idl.yp" { push(@{$_[1]}, $_[2]); $_[1] } ], - [#Rule 32 + [#Rule 28 'union_element', 8, sub -#line 131 "build/pidl/idl.yp" +#line 121 "build/pidl/idl.yp" {{ "TYPE" => "UNION_ELEMENT", "CASE" => $_[4], "DATA" => $_[7] }} ], - [#Rule 33 + [#Rule 29 'union_element', 7, sub -#line 137 "build/pidl/idl.yp" +#line 127 "build/pidl/idl.yp" {{ "TYPE" => "EMPTY", "CASE" => $_[4], }} ], - [#Rule 34 + [#Rule 30 'union_element', 5, sub -#line 142 "build/pidl/idl.yp" +#line 132 "build/pidl/idl.yp" {{ "TYPE" => "UNION_ELEMENT", "CASE" => "default", "DATA" => $_[4] }} ], - [#Rule 35 + [#Rule 31 'union_element', 4, sub -#line 148 "build/pidl/idl.yp" +#line 138 "build/pidl/idl.yp" {{ "TYPE" => "EMPTY", "CASE" => "default", }} ], - [#Rule 36 + [#Rule 32 'base_element', 5, sub -#line 155 "build/pidl/idl.yp" +#line 145 "build/pidl/idl.yp" {{ "NAME" => $_[4], "TYPE" => $_[2], @@ -1720,181 +1634,181 @@ sub "ARRAY_LEN" => $_[5] }} ], - [#Rule 37 + [#Rule 33 'pointers', 0, sub -#line 167 "build/pidl/idl.yp" +#line 157 "build/pidl/idl.yp" { 0 } ], - [#Rule 38 + [#Rule 34 'pointers', 2, sub -#line 168 "build/pidl/idl.yp" +#line 158 "build/pidl/idl.yp" { $_[1]+1 } ], - [#Rule 39 + [#Rule 35 'element_list1', 0, undef ], - [#Rule 40 + [#Rule 36 'element_list1', 3, sub -#line 175 "build/pidl/idl.yp" +#line 165 "build/pidl/idl.yp" { push(@{$_[1]}, $_[2]); $_[1] } ], - [#Rule 41 + [#Rule 37 'element_list2', 0, undef ], - [#Rule 42 + [#Rule 38 'element_list2', 1, undef ], - [#Rule 43 + [#Rule 39 'element_list2', 1, sub -#line 181 "build/pidl/idl.yp" +#line 171 "build/pidl/idl.yp" { [ $_[1] ] } ], - [#Rule 44 + [#Rule 40 'element_list2', 3, sub -#line 182 "build/pidl/idl.yp" +#line 172 "build/pidl/idl.yp" { push(@{$_[1]}, $_[3]); $_[1] } ], - [#Rule 45 + [#Rule 41 'array_len', 0, undef ], - [#Rule 46 + [#Rule 42 'array_len', 2, sub -#line 187 "build/pidl/idl.yp" +#line 177 "build/pidl/idl.yp" { "*" } ], - [#Rule 47 + [#Rule 43 'array_len', 3, sub -#line 188 "build/pidl/idl.yp" +#line 178 "build/pidl/idl.yp" { "$_[2]" } ], - [#Rule 48 + [#Rule 44 'property_list', 0, undef ], - [#Rule 49 + [#Rule 45 'property_list', 4, sub -#line 194 "build/pidl/idl.yp" +#line 184 "build/pidl/idl.yp" { util::FlattenHash([$_[1],$_[3]]); } ], - [#Rule 50 + [#Rule 46 'properties', 1, sub -#line 197 "build/pidl/idl.yp" +#line 187 "build/pidl/idl.yp" { $_[1] } ], - [#Rule 51 + [#Rule 47 'properties', 3, sub -#line 198 "build/pidl/idl.yp" +#line 188 "build/pidl/idl.yp" { util::FlattenHash([$_[1], $_[3]]); } ], - [#Rule 52 + [#Rule 48 'property', 1, sub -#line 201 "build/pidl/idl.yp" +#line 191 "build/pidl/idl.yp" {{ "$_[1]" => "1" }} ], - [#Rule 53 + [#Rule 49 'property', 4, sub -#line 202 "build/pidl/idl.yp" +#line 192 "build/pidl/idl.yp" {{ "$_[1]" => "$_[3]" }} ], - [#Rule 54 + [#Rule 50 'listtext', 1, undef ], - [#Rule 55 + [#Rule 51 'listtext', 3, sub -#line 207 "build/pidl/idl.yp" +#line 197 "build/pidl/idl.yp" { "$_[1] $_[3]" } ], - [#Rule 56 + [#Rule 52 'anytext', 0, sub -#line 211 "build/pidl/idl.yp" +#line 201 "build/pidl/idl.yp" { "" } ], - [#Rule 57 + [#Rule 53 'anytext', 1, undef ], - [#Rule 58 + [#Rule 54 'anytext', 1, undef ], - [#Rule 59 + [#Rule 55 'anytext', 1, undef ], - [#Rule 60 + [#Rule 56 'anytext', 3, sub -#line 213 "build/pidl/idl.yp" +#line 203 "build/pidl/idl.yp" { "$_[1]$_[2]$_[3]" } ], - [#Rule 61 + [#Rule 57 'anytext', 3, sub -#line 214 "build/pidl/idl.yp" +#line 204 "build/pidl/idl.yp" { "$_[1]$_[2]$_[3]" } ], - [#Rule 62 + [#Rule 58 'anytext', 3, sub -#line 215 "build/pidl/idl.yp" +#line 205 "build/pidl/idl.yp" { "$_[1]$_[2]$_[3]" } ], - [#Rule 63 + [#Rule 59 'anytext', 3, sub -#line 216 "build/pidl/idl.yp" +#line 206 "build/pidl/idl.yp" { "$_[1]$_[2]$_[3]" } ], - [#Rule 64 + [#Rule 60 'anytext', 3, sub -#line 217 "build/pidl/idl.yp" +#line 207 "build/pidl/idl.yp" { "$_[1]$_[2]$_[3]" } ], - [#Rule 65 + [#Rule 61 'anytext', 3, sub -#line 218 "build/pidl/idl.yp" +#line 208 "build/pidl/idl.yp" { "$_[1]$_[2]$_[3]" } ], - [#Rule 66 + [#Rule 62 'anytext', 3, sub -#line 219 "build/pidl/idl.yp" +#line 209 "build/pidl/idl.yp" { "$_[1]$_[2]$_[3]" } ], - [#Rule 67 + [#Rule 63 'anytext', 3, sub -#line 220 "build/pidl/idl.yp" +#line 210 "build/pidl/idl.yp" { "$_[1]$_[2]$_[3]" } ], - [#Rule 68 + [#Rule 64 'anytext', 5, sub -#line 221 "build/pidl/idl.yp" +#line 211 "build/pidl/idl.yp" { "$_[1]$_[2]$_[3]$_[4]$_[5]" } ], - [#Rule 69 + [#Rule 65 'identifier', 1, undef ], - [#Rule 70 + [#Rule 66 'constant', 1, undef ], - [#Rule 71 + [#Rule 67 'text', 1, sub -#line 230 "build/pidl/idl.yp" +#line 220 "build/pidl/idl.yp" { "\"$_[1]\"" } ] ], @@ -1902,7 +1816,7 @@ sub bless($self,$class); } -#line 236 "build/pidl/idl.yp" +#line 226 "build/pidl/idl.yp" use util; @@ -1988,10 +1902,49 @@ sub parse_idl($$) my $data = `$cpp -xc $filename`; $/ = $saved_delim; - $self->YYData->{INPUT} = $data; - $self->YYData->{LINE} = 0; - $self->YYData->{LAST_TOKEN} = "NONE"; - return $self->YYParse( yylex => \&_Lexer, yyerror => \&_Error ); + $self->YYData->{INPUT} = $data; + $self->YYData->{LINE} = 0; + $self->YYData->{LAST_TOKEN} = "NONE"; + + my $idl = $self->YYParse( yylex => \&_Lexer, yyerror => \&_Error ); + + foreach my $x (@{$idl}) { + # Add [in] ORPCTHIS *this, [out] ORPCTHAT *that + # for 'object' interfaces + if (defined($x->{PROPERTIES}->{object})) { + foreach my $e (@{$x->{DATA}}) { + if($e->{TYPE} eq "FUNCTION") { + unshift(@{$e->{DATA}}, + { 'NAME' => 'ORPCthis', + 'POINTERS' => 1, + 'PROPERTIES' => { 'in' => '1' }, + 'TYPE' => 'ORPCTHIS' + }); + unshift(@{$e->{DATA}}, + { 'NAME' => 'ORPCthat', + 'POINTERS' => 1, + 'PROPERTIES' => { 'out' => '1' }, + 'TYPE' => 'ORPCTHAT' + }); + } + } + } + + # Do the inheritance + if (defined($x->{BASE}) and $x->{BASE} ne "") { + my $parent = util::get_interface($idl, $x->{BASE}); + + if(not defined($parent)) { + die("No such parent interface " . $x->{BASE}); + } + + @{$x->{INHERITED_DATA}} = (@{$parent->{INHERITED_DATA}}, @{$x->{DATA}}); + } else { + $x->{INHERITED_DATA} = $x->{DATA}; + } + } + + return $idl; } 1; diff --git a/source4/build/pidl/idl.yp b/source4/build/pidl/idl.yp index cb293de272..77ebbc74a7 100644 --- a/source4/build/pidl/idl.yp +++ b/source4/build/pidl/idl.yp @@ -14,36 +14,26 @@ ################ # grammer %% -idl: idl_interface - | idl idl_interface { util::FlattenArray([$_[1],$_[2]]) } -; - -idl_interface: module_header interface { [ $_[1], $_[2] ] } +idl: + #empty { {} } + | idl interface { + push(@{$_[1]}, $_[2]); $_[1] + } ; -module_header: '[' module_params ']' - {{ - "TYPE" => "MODULEHEADER", - "PROPERTIES" => util::FlattenHash($_[2]) +interface: property_list 'interface' identifier base_interface '{' definitions '}' + {$_[3] => { + "TYPE" => "INTERFACE", + "PROPERTIES" => $_[1], + "NAME" => $_[3], + "BASE" => $_[4], + "DATA" => $_[6], }} ; -module_params: - #empty - | module_param { [ $_[1] ] } - | module_params ',' module_param { push(@{$_[1]}, $_[3]); $_[1] } -; - -module_param: identifier '(' listtext ')' -{ { "$_[1]" => "$_[3]" } } -; - -interface: 'interface' identifier '{' definitions '}' - {{ - "TYPE" => "INTERFACE", - "NAME" => $_[2], - "DATA" => $_[4] - }} +base_interface: + #empty + | ':' identifier { $_[2] } ; definitions: @@ -199,7 +189,7 @@ properties: property { $_[1] } ; property: identifier {{ "$_[1]" => "1" }} - | identifier '(' anytext ')' {{ "$_[1]" => "$_[3]" }} + | identifier '(' listtext ')' {{ "$_[1]" => "$_[3]" }} ; listtext: @@ -318,8 +308,47 @@ sub parse_idl($$) my $data = `$cpp -xc $filename`; $/ = $saved_delim; - $self->YYData->{INPUT} = $data; - $self->YYData->{LINE} = 0; - $self->YYData->{LAST_TOKEN} = "NONE"; - return $self->YYParse( yylex => \&_Lexer, yyerror => \&_Error ); + $self->YYData->{INPUT} = $data; + $self->YYData->{LINE} = 0; + $self->YYData->{LAST_TOKEN} = "NONE"; + + my $idl = $self->YYParse( yylex => \&_Lexer, yyerror => \&_Error ); + + foreach my $x (@{$idl}) { + # Add [in] ORPCTHIS *this, [out] ORPCTHAT *that + # for 'object' interfaces + if (defined($x->{PROPERTIES}->{object})) { + foreach my $e (@{$x->{DATA}}) { + if($e->{TYPE} eq "FUNCTION") { + unshift(@{$e->{DATA}}, + { 'NAME' => 'ORPCthis', + 'POINTERS' => 1, + 'PROPERTIES' => { 'in' => '1' }, + 'TYPE' => 'ORPCTHIS' + }); + unshift(@{$e->{DATA}}, + { 'NAME' => 'ORPCthat', + 'POINTERS' => 1, + 'PROPERTIES' => { 'out' => '1' }, + 'TYPE' => 'ORPCTHAT' + }); + } + } + } + + # Do the inheritance + if (defined($x->{BASE}) and $x->{BASE} ne "") { + my $parent = util::get_interface($idl, $x->{BASE}); + + if(not defined($parent)) { + die("No such parent interface " . $x->{BASE}); + } + + @{$x->{INHERITED_DATA}} = (@{$parent->{INHERITED_DATA}}, @{$x->{DATA}}); + } else { + $x->{INHERITED_DATA} = $x->{DATA}; + } + } + + return $idl; } diff --git a/source4/build/pidl/parser.pm b/source4/build/pidl/parser.pm index bc9eaa627f..51d561d4b2 100644 --- a/source4/build/pidl/parser.pm +++ b/source4/build/pidl/parser.pm @@ -13,10 +13,6 @@ use client; my %needed; my %structs; -my $if_uuid; -my $if_version; -my $if_endpoints; - sub pidl($) { print OUT shift; @@ -622,7 +618,7 @@ sub ParseElementPrintBuffer($$) } if (util::array_size($e)) { - ParseArrayPrint($e, $var_prefix); + ParseArrayPrint($e, $var_prefix) } elsif (my $switch = util::has_property($e, "switch_is")) { ParseElementPrintSwitch($e, $var_prefix, $switch); } else { @@ -1340,7 +1336,7 @@ sub ParseFunctionPull($) sub FunctionTable($) { my($interface) = shift; - my($data) = $interface->{DATA}; + my($data) = $interface->{INHERITED_DATA}; my $count = 0; my $uname = uc $interface->{NAME}; @@ -1368,11 +1364,11 @@ sub FunctionTable($) my $endpoints; - if (! defined $if_endpoints) { - $if_endpoints = $interface->{NAME}; + if (! defined $interface->{PROPERTIES}->{endpoints}) { + $interface->{PROPERTIES}->{endpoints} = $interface->{NAME}; } - my @e = split / /, $if_endpoints; + my @e = split / /, $interface->{PROPERTIES}->{endpoints}; my $endpoint_count = $#e + 1; pidl "static const char * const $interface->{NAME}\_endpoint_strings[] = {\n\t"; @@ -1501,17 +1497,6 @@ sub BuildNeeded($) } ##################################################################### -# parse the interface definitions -sub ModuleHeader($) -{ - my($h) = shift; - - $if_uuid = $h->{PROPERTIES}->{uuid}; - $if_version = $h->{PROPERTIES}->{version}; - $if_endpoints = $h->{PROPERTIES}->{endpoints}; -} - -##################################################################### # parse a parsed IDL structure back into an IDL file sub Parse($$) { @@ -1523,9 +1508,6 @@ sub Parse($$) pidl "/* parser auto-generated by pidl */\n\n"; pidl "#include \"includes.h\"\n\n"; foreach my $x (@{$idl}) { - ($x->{TYPE} eq "MODULEHEADER") && - ModuleHeader($x); - if ($x->{TYPE} eq "INTERFACE") { BuildNeeded($x); ParseInterface($x); diff --git a/source4/build/pidl/pidl.pl b/source4/build/pidl/pidl.pl index cebd545297..616727edc6 100755 --- a/source4/build/pidl/pidl.pl +++ b/source4/build/pidl/pidl.pl @@ -115,7 +115,7 @@ sub process_file($) if ($opt_parse) { $pidl = IdlParse($idl_file); defined $pidl || die "Failed to parse $idl_file"; - IdlValidator::Validate($pidl); +# IdlValidator::Validate($pidl); if ($opt_keep && !util::SaveStructure($pidl_file, $pidl)) { die "Failed to save $pidl_file\n"; } diff --git a/source4/build/pidl/util.pm b/source4/build/pidl/util.pm index f822222b45..1341d77ccc 100644 --- a/source4/build/pidl/util.pm +++ b/source4/build/pidl/util.pm @@ -154,6 +154,20 @@ sub SaveStructure($$) } ##################################################################### +# find an interface in an array of interfaces +sub get_interface($$) +{ + my($if) = shift; + my($n) = shift; + + foreach(@{$if}) { + if($_->{NAME} eq $n) { return $_; } + } + + return 0; +} + +##################################################################### # see if a pidl property list contains a give property sub has_property($$) { diff --git a/source4/librpc/idl/dcerpc.idl b/source4/librpc/idl/dcerpc.idl index 71c1b26e2a..3618dfbb61 100644 --- a/source4/librpc/idl/dcerpc.idl +++ b/source4/librpc/idl/dcerpc.idl @@ -8,7 +8,6 @@ see http://www.opengroup.org/onlinepubs/9629399/chap12.htm for packet layouts */ -[] interface dcerpc { typedef [public] struct { diff --git a/source4/librpc/idl/dcom.idl b/source4/librpc/idl/dcom.idl index 9d5acb6ebd..dee52243a4 100644 --- a/source4/librpc/idl/dcom.idl +++ b/source4/librpc/idl/dcom.idl @@ -10,27 +10,22 @@ interface ObjectRpcBaseTypes { WERROR stub(); - typedef [public] struct { - uint32 upper; - uint32 lower; - } hyper; - ////////////////////////////////////////////////////////////// // Identifier Definitions //////////////////////////////////////////////////////////// // Machine Identifier -#define MID hyper +#define MID HYPER_T // Object Exporter Identifier -#define OXID hyper +#define OXID HYPER_T // Object Identifer -#define OID hyper +#define OID HYPER_T // Ping Set Identifier -#define SETID hyper +#define SETID HYPER_T // Interface Pointer Identifier #define IPID GUID @@ -186,7 +181,7 @@ interface ObjectRpcBaseTypes const uint32 SORF_NULL = 0x0; // convenient for initializing SORF const uint32 SORF_NOPING = 0x1000;// Pinging is not required // standard object reference - typedef struct + typedef [public] struct { uint32 flags; // STDOBJREF flags (see above) uint32 cPublicRefs; // count of references passed @@ -241,6 +236,26 @@ interface ObjectRpcBaseTypes } MInterfacePointer; } + +[ + object, + uuid(00000000-0000-0000-C000-000000000046) +] +interface IUnknown +{ + /*****************/ + /* Function 0x00 */ + HRESULT QueryInterface(); + + /*****************/ + /* Function 0x01 */ + uint32 AddRef(); + + /*****************/ + /* Function 0x02 */ + uint32 Release(); +} + ////////////////////////////////////////////////////////////////// // The remote version of Iunknown. This interface exists on every @@ -252,9 +267,10 @@ interface ObjectRpcBaseTypes // [ uuid(00000131-0000-0000-C000-000000000046), + object, version(0.0) ] -interface IRemUnknown // : IUnknown +interface IRemUnknown : IUnknown { typedef struct { @@ -262,7 +278,7 @@ interface IRemUnknown // : IUnknown STDOBJREF std; // data for returned interface } REMQIRESULT; - + HRESULT RemQueryInterface ( [in] IPID *ripid, // interface to QI on [in] uint32 cRefs, // count of AddRefs requested @@ -291,15 +307,18 @@ interface IRemUnknown // : IUnknown ); } + + // Derived from IRemUnknown, this interface supports Remote Query interface // for objects that supply additional data beyond the STDOBJREF in their // marshaled interface packets. [ +object, uuid(00000143-0000-0000-C000-000000000046), version(0.0) ] -interface IRemUnknown2 //: IRemUnknown +interface IRemUnknown2 : IRemUnknown { HRESULT RemQueryInterface2 ( [in] IPID *ripid, @@ -308,7 +327,6 @@ interface IRemUnknown2 //: IRemUnknown [out, size_is(cIids)] HRESULT *phr //FIXME [out, size_is(cIids)] MInterfacePointer **ppMIF ); - } [ uuid(99fcfec4-5260-101b-bbcb-00aa0021347a), @@ -339,7 +357,7 @@ interface IOXIDResolver // Returns S_TRUE if the SetId is known by the object exporter, // S_FALSE if not. [idempotent] WERROR SimplePing ( - [in] policy_handle hRpc, + [in,ref] policy_handle *hRpc, [in] SETID *pSetId // Must not be zero ); @@ -364,13 +382,13 @@ interface IOXIDResolver // can be used to validate the binding // from the client. [idempotent] WERROR ServerAlive ( - [in] policy_handle hRpc + [in,ref] policy_handle *hRpc ); // Method to get the protocol sequences, string bindings, // RemoteUnknown IPID and COM version for an object server // given its OXID. Supported by DCOM // version 5.2 and above. - [idempotent] error_status_t ResolveOxid2 ( + [idempotent] WERROR ResolveOxid2 ( [in] policy_handle hRpc, [in] OXID *pOxid, [in] uint16 cRequestedProtseqs, @@ -452,13 +470,10 @@ interface ISystemActivator /* Function 0x03 */ NTSTATUS isa_Unknown3(); - // Binding strings and the OBJREF_SIGNATURE in this call /*****************/ /* Function 0x04 */ NTSTATUS isa_Unknown4(); - - } [ diff --git a/source4/librpc/idl/misc.idl b/source4/librpc/idl/misc.idl index d7163839d5..7fed02f5b1 100644 --- a/source4/librpc/idl/misc.idl +++ b/source4/librpc/idl/misc.idl @@ -4,7 +4,6 @@ miscellaneous IDL structures */ -[] interface misc { /* a NULL sid */ diff --git a/source4/librpc/idl/schannel.idl b/source4/librpc/idl/schannel.idl index a208ee89a3..157634ef76 100644 --- a/source4/librpc/idl/schannel.idl +++ b/source4/librpc/idl/schannel.idl @@ -4,7 +4,6 @@ schannel structures */ -[] interface schannel { /* diff --git a/source4/librpc/ndr/ndr_basic.c b/source4/librpc/ndr/ndr_basic.c index 5d4ade096f..bf72e0ad8b 100644 --- a/source4/librpc/ndr/ndr_basic.c +++ b/source4/librpc/ndr/ndr_basic.c @@ -207,6 +207,21 @@ NTSTATUS ndr_pull_array_uint32(struct ndr_pull *ndr, int ndr_flags, uint32_t *da } /* + pull a const array of HYPER_T +*/ +NTSTATUS ndr_pull_array_HYPER_T(struct ndr_pull *ndr, int ndr_flags, HYPER_T *data, uint32_t n) +{ + uint32_t i; + if (!(ndr_flags & NDR_SCALARS)) { + return NT_STATUS_OK; + } + for (i=0;i<n;i++) { + NDR_CHECK(ndr_pull_HYPER_T(ndr, &data[i])); + } + return NT_STATUS_OK; +} + +/* push a uint8 */ NTSTATUS ndr_push_uint8(struct ndr_push *ndr, uint8_t v) @@ -347,6 +362,21 @@ NTSTATUS ndr_push_array_uint32(struct ndr_push *ndr, int ndr_flags, const uint32 } /* + push an array of HYPER_T +*/ +NTSTATUS ndr_push_array_HYPER_T(struct ndr_push *ndr, int ndr_flags, const HYPER_T *data, uint32_t n) +{ + int i; + if (!(ndr_flags & NDR_SCALARS)) { + return NT_STATUS_OK; + } + for (i=0;i<n;i++) { + NDR_CHECK(ndr_push_HYPER_T(ndr, data[i])); + } + return NT_STATUS_OK; +} + +/* save the current position */ void ndr_push_save(struct ndr_push *ndr, struct ndr_push_save *save) @@ -798,6 +828,24 @@ void ndr_print_bad_level(struct ndr_print *ndr, const char *name, uint16_t level ndr->print(ndr, "UNKNOWN LEVEL %u", level); } +void ndr_print_array_HYPER_T(struct ndr_print *ndr, const char *name, + const HYPER_T *data, uint32_t count) +{ + int i; + + ndr->print(ndr, "%s: ARRAY(%d)", name, count); + ndr->depth++; + for (i=0;i<count;i++) { + char *idx=NULL; + asprintf(&idx, "[%d]", i); + if (idx) { + ndr_print_HYPER_T(ndr, idx, data[i]); + free(idx); + } + } + ndr->depth--; +} + void ndr_print_array_uint32(struct ndr_print *ndr, const char *name, const uint32_t *data, uint32_t count) { diff --git a/source4/torture/config.mk b/source4/torture/config.mk index c520ef755b..157b06b3b8 100644 --- a/source4/torture/config.mk +++ b/source4/torture/config.mk @@ -49,6 +49,7 @@ REQUIRED_SUBSYSTEMS = \ ADD_OBJ_FILES = \ torture/rpc/lsa.o \ torture/rpc/echo.o \ + torture/rpc/dcom.o \ torture/rpc/dfs.o \ torture/rpc/drsuapi.o \ torture/rpc/spoolss.o \ diff --git a/source4/torture/rpc/dcom.c b/source4/torture/rpc/dcom.c new file mode 100644 index 0000000000..b42023eb2f --- /dev/null +++ b/source4/torture/rpc/dcom.c @@ -0,0 +1,47 @@ +/* + Unix SMB/CIFS implementation. + test suite for dcom rpc operations + + Copyright (C) Jelmer Vernooij 2004 + + 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" + +BOOL torture_rpc_dcom(int dummy) +{ + NTSTATUS status; + struct dcerpc_pipe *p; + TALLOC_CTX *mem_ctx; + BOOL ret = True; + + mem_ctx = talloc_init("torture_rpc_dcom"); + + status = torture_rpc_connection(&p, + DCERPC_IOXIDRESOLVER_NAME, + DCERPC_IOXIDRESOLVER_UUID, + DCERPC_IOXIDRESOLVER_VERSION); + if (!NT_STATUS_IS_OK(status)) { + return False; + } + + printf("\n"); + + talloc_destroy(mem_ctx); + + torture_rpc_close(p); + return ret; +} |