diff options
-rw-r--r-- | source4/build/pidl/pidl.1.xml | 23 | ||||
-rw-r--r-- | source4/build/pidl/validator.pm | 34 | ||||
-rw-r--r-- | source4/librpc/idl/echo.idl | 17 | ||||
-rw-r--r-- | source4/rpc_server/echo/rpc_echo.c | 2 | ||||
-rw-r--r-- | source4/torture/rpc/echo.c | 4 |
5 files changed, 51 insertions, 29 deletions
diff --git a/source4/build/pidl/pidl.1.xml b/source4/build/pidl/pidl.1.xml index 18ef97772b..e60889e895 100644 --- a/source4/build/pidl/pidl.1.xml +++ b/source4/build/pidl/pidl.1.xml @@ -19,15 +19,17 @@ <arg choice="opt">--output OUTNAME</arg> <arg choice="opt">--parse</arg> <arg choice="opt">--dump</arg> - <arg choice="opt">--header</arg> - <arg choice="opt">--parser</arg> + <arg choice="opt">--header[=OUTPUT]</arg> + <arg choice="opt">--parser[=OUTPUT]</arg> <arg choice="opt">--server</arg> <arg choice="opt">--template</arg> - <arg choice="opt">--eth-parser</arg> - <arg choice="opt">--eth-header</arg> + <arg choice="opt">--eth-parser[=OUTPUT]</arg> + <arg choice="opt">--eth-header[=OUTPUT]</arg> <arg choice="opt">--diff</arg> <arg choice="opt">--keep</arg> <arg choice="req">idlfile</arg> + <arg choice="opt">idlfile2</arg> + <arg choice="opt">...</arg> </cmdsynopsis> </refsynopsisdiv> @@ -49,16 +51,17 @@ dissectors that can parse data sent over the wire by these interfaces. </para> - <para>pidl takes IDL files in the same format that is used by midl, + <para>pidl takes IDL files in the same format as is used by midl, converts it to a .pidl file (which contains pidl's internal representation of the interface) and can then generate whatever output you need. .pidl files should be used for debugging purposes only. Write your - interface definitions in (midl) .idl format. + interface definitions in .idl format. </para> <para> The goal of pidl is to implement a IDL compiler that can be used while developing the RPC subsystem in Samba (for - both marshalling/un-marshalling and debugging purposes).</para> + both marshalling/unmarshalling and debugging purposes). + </para> </refsect1> @@ -378,12 +381,6 @@ embedded structures in security descriptors and spoolss. </refsect2> <refsect2> - <title>Pointers</title> - - <para>Pidl does not support "full" pointers in the DCE meaning of the word. However, its "unique" pointer is compatible with MIDL's full ("ptr") pointer support. </para> - </refsect2> - - <refsect2> <title>Datagram support</title> <para>ncadg is not supported yet.</para> diff --git a/source4/build/pidl/validator.pm b/source4/build/pidl/validator.pm index ec4ad4503b..8fedef5ce8 100644 --- a/source4/build/pidl/validator.pm +++ b/source4/build/pidl/validator.pm @@ -149,6 +149,25 @@ sub ValidProperties($$) } } +sub mapToScalar($) +{ + my $t = shift; + my $ti = typelist::getType($t); + + if (not defined ($ti)) { + return undef; + } elsif ($ti->{DATA}->{TYPE} eq "ENUM") { + return typelist::enum_type_fn($ti->{DATA}); + } elsif ($ti->{DATA}->{TYPE} eq "BITMAP") { + return typelist::enum_type_fn($ti->{DATA}); + } elsif ($ti->{DATA}->{TYPE} eq "SCALAR") { + return $t; + } + + return undef; +} + + ##################################################################### # parse a struct sub ValidElement($) @@ -174,8 +193,19 @@ sub ValidElement($) my $discriminator_type = util::has_property($type, "switch_type"); $discriminator_type = "uint32" unless defined ($discriminator_type); - if ($e2->{TYPE} ne $discriminator_type) { - print el_name($e) . ": Warning: switch_is() is of type $e2->{TYPE}, while discriminator type for union $type->{NAME} is $discriminator_type\n"; + my $t1 = mapToScalar($discriminator_type); + + if (not defined($t1)) { + fatal($e, el_name($e) . ": unable to map discriminator type '$discriminator_type' to scalar"); + } + + my $t2 = mapToScalar($e2->{TYPE}); + if (not defined($t2)) { + fatal($e, el_name($e) . ": unable to map variable used for switch_is() to scalar"); + } + + if ($t1 ne $t2) { + nonfatal($e, el_name($e) . ": switch_is() is of type $e2->{TYPE} ($t2), while discriminator type for union $type->{NAME} is $discriminator_type ($t1)"); } } } diff --git a/source4/librpc/idl/echo.idl b/source4/librpc/idl/echo.idl index b0defe59dd..d841a0974a 100644 --- a/source4/librpc/idl/echo.idl +++ b/source4/librpc/idl/echo.idl @@ -5,7 +5,6 @@ uuid("60a15ec5-4de8-11d7-a637-005056a20182"), endpoint("ncacn_np:[\\pipe\\rpcecho]", "ncacn_ip_tcp:", "ncalrpc:"), pointer_default(unique), - pointer_default_top(unique), version(1.0), helpstring("Simple echo pipe") ] @@ -13,7 +12,8 @@ interface rpcecho { /* Add one to an integer */ void echo_AddOne( - [in,out,ref] uint32 *v + [in] uint32 in_data, + [out] uint32 *out_data ); /* Echo an array of bytes back at the caller */ void echo_EchoData( @@ -24,15 +24,14 @@ interface rpcecho /* Sink data to the server */ void echo_SinkData( [in] uint32 len, - [in,ref,size_is(len)] uint8 *data + [in,size_is(len)] uint8 data[] ); /* Source data from server */ void echo_SourceData( [in] uint32 len, - [out,ref,size_is(len)] uint8 *data + [out,size_is(len)] uint8 data[] ); - /* test strings */ void echo_TestCall ( [in] unistr *s1, @@ -67,10 +66,6 @@ interface rpcecho echo_info1 info1; } echo_info6; - typedef union { - [case(1)] echo_info1 info1; - } echo_XXX; - typedef struct { uint8 v1; echo_info4 info4; @@ -110,7 +105,7 @@ interface rpcecho echo_Enum1_32 e2; } echo_Enum2; - typedef [switch_type(echo_Enum1)] union { + typedef [switch_type(uint16)] union { [case(ECHO_ENUM1)] echo_Enum1 e1; [case(ECHO_ENUM2)] echo_Enum2 e2; } echo_Enum3; @@ -130,5 +125,5 @@ interface rpcecho [in,out,ref] echo_Surrounding *data ); - uint16 echo_TestDoublePointer([in,ref] uint16 ***data); + uint16 echo_TestDoublePointer([in] uint16 ***data); } diff --git a/source4/rpc_server/echo/rpc_echo.c b/source4/rpc_server/echo/rpc_echo.c index daf16e12d7..057d89a866 100644 --- a/source4/rpc_server/echo/rpc_echo.c +++ b/source4/rpc_server/echo/rpc_echo.c @@ -30,7 +30,7 @@ static NTSTATUS echo_AddOne(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, struct echo_AddOne *r) { - *r->out.v = *r->in.v + 1; + *r->out.out_data = r->in.in_data + 1; return NT_STATUS_OK; } diff --git a/source4/torture/rpc/echo.c b/source4/torture/rpc/echo.c index 3ca2634a8d..14bfe573ce 100644 --- a/source4/torture/rpc/echo.c +++ b/source4/torture/rpc/echo.c @@ -39,8 +39,8 @@ static BOOL test_addone(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx) for (i=0;i<10;i++) { uint32_t n = i; struct echo_AddOne r; - r.in.v = &n; - r.out.v = &n; + r.in.in_data = n; + r.out.out_data = &n; status = dcerpc_echo_AddOne(p, mem_ctx, &r); if (!NT_STATUS_IS_OK(status)) { printf("AddOne(%d) failed - %s\n", i, nt_errstr(status)); |