summaryrefslogtreecommitdiff
path: root/source4
diff options
context:
space:
mode:
authorJelmer Vernooij <jelmer@samba.org>2005-06-01 00:00:50 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 13:17:21 -0500
commit03c2d642a620380d96a9e745ceb1cd19ffea2160 (patch)
tree351938707b57f8f3ed29a966d48d858f562d250d /source4
parent5ec5e7aa29ef4abf6b60a0de4947693d3e587f74 (diff)
downloadsamba-03c2d642a620380d96a9e745ceb1cd19ffea2160.tar.gz
samba-03c2d642a620380d96a9e745ceb1cd19ffea2160.tar.bz2
samba-03c2d642a620380d96a9e745ceb1cd19ffea2160.zip
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)
Diffstat (limited to 'source4')
-rw-r--r--source4/build/pidl/pidl.1.xml23
-rw-r--r--source4/build/pidl/validator.pm34
-rw-r--r--source4/librpc/idl/echo.idl17
-rw-r--r--source4/rpc_server/echo/rpc_echo.c2
-rw-r--r--source4/torture/rpc/echo.c4
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));