r7159: Improve the messages from pidl's validator module.
authorJelmer Vernooij <jelmer@samba.org>
Wed, 1 Jun 2005 00:00:50 +0000 (00:00 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 18:17:21 +0000 (13:17 -0500)
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.

source/build/pidl/pidl.1.xml
source/build/pidl/validator.pm
source/librpc/idl/echo.idl
source/rpc_server/echo/rpc_echo.c
source/torture/rpc/echo.c

index 18ef97772b1694be0f4dbcaa0876dfbabb105fd1..e60889e8957ae018f09791031dd4515801b4eae4 100644 (file)
                <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>
 
                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>
 
@@ -377,12 +380,6 @@ embedded structures in security descriptors and spoolss.
                <!--FIXME-->
        </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>
 
index ec4ad4503b89da5bb13eecff109ad596d793d094..8fedef5ce8b4c676976ec61712f1f41b1552318f 100644 (file)
@@ -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)");
                        }
                }
        }
index b0defe59dde8341ccdd151c44084fba5ad418111..d841a0974a0d38b4823755de7bd7f69f0a92a99e 100644 (file)
@@ -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);
 }
index daf16e12d7eb5727a339c68eb1ff3cf24ab3282f..057d89a866fcc1459ae98982a4dcbc9e8a2ebf5a 100644 (file)
@@ -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;
 }
 
index 3ca2634a8d7e42665f027e448fefd008519197cb..14bfe573ce536252aa54f785548e374c0aaaba98 100644 (file)
@@ -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));