From 03c2d642a620380d96a9e745ceb1cd19ffea2160 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Wed, 1 Jun 2005 00:00:50 +0000 Subject: r7159: Improve the messages from pidl's validator module. Change the IDL file for the echo interface to match the one we use for Windows. The only thing different between the two files currently is the names of the scalar types and the handling of strings. (This used to be commit b264c61061d222347919837600adf809fbadfb13) --- source4/build/pidl/pidl.1.xml | 23 ++++++++++------------- source4/build/pidl/validator.pm | 34 ++++++++++++++++++++++++++++++++-- source4/librpc/idl/echo.idl | 17 ++++++----------- source4/rpc_server/echo/rpc_echo.c | 2 +- source4/torture/rpc/echo.c | 4 ++-- 5 files changed, 51 insertions(+), 29 deletions(-) (limited to 'source4') 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 @@ --output OUTNAME --parse --dump - --header - --parser + --header[=OUTPUT] + --parser[=OUTPUT] --server --template - --eth-parser - --eth-header + --eth-parser[=OUTPUT] + --eth-header[=OUTPUT] --diff --keep idlfile + idlfile2 + ... @@ -49,16 +51,17 @@ dissectors that can parse data sent over the wire by these interfaces. - pidl takes IDL files in the same format that is used by midl, + 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. 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). + both marshalling/unmarshalling and debugging purposes). + @@ -377,12 +380,6 @@ embedded structures in security descriptors and spoolss. - - Pointers - - 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. - - Datagram support 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)); -- cgit