summaryrefslogtreecommitdiff
path: root/source4/pidl/pidl.1.xml
diff options
context:
space:
mode:
Diffstat (limited to 'source4/pidl/pidl.1.xml')
-rw-r--r--source4/pidl/pidl.1.xml571
1 files changed, 571 insertions, 0 deletions
diff --git a/source4/pidl/pidl.1.xml b/source4/pidl/pidl.1.xml
new file mode 100644
index 0000000000..cf7f560f0d
--- /dev/null
+++ b/source4/pidl/pidl.1.xml
@@ -0,0 +1,571 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!DOCTYPE refentry PUBLIC "-//Samba-Team//DTD DocBook V4.2-Based Variant V1.0//EN" "http://www.samba.org/samba/DTD/samba-doc">
+<refentry id="pidl.1">
+
+<refmeta>
+ <refentrytitle>pidl</refentrytitle>
+ <manvolnum>1</manvolnum>
+</refmeta>
+
+<refnamediv>
+ <refname>pidl</refname>
+ <refpurpose>IDL Compiler written in Perl</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+ <cmdsynopsis>
+ <command>pidl</command>
+ <arg choice="opt">--help</arg>
+ <arg choice="opt">--outputdir OUTNAME</arg>
+ <arg choice="opt">--parse</arg>
+ <arg choice="opt">--dump</arg>
+ <arg choice="opt">--ndr-header[=OUTPUT]</arg>
+ <arg choice="opt">--header[=OUTPUT]</arg>
+ <arg choice="opt">--ejs[=OUTPUT]</arg>
+ <arg choice="opt">--swig[=OUTPUT]</arg>
+ <arg choice="opt">--uint-enums</arg>
+ <arg choice="opt">--ndr-parser[=OUTPUT]</arg>
+ <arg choice="opt">--client</arg>
+ <arg choice="opt">--server</arg>
+ <arg choice="opt">--dcom-proxy</arg>
+ <arg choice="opt">--com-header</arg>
+ <arg choice="opt">--odl</arg>
+ <arg choice="opt">--warn-compat</arg>
+ <arg choice="opt">--quiet</arg>
+ <arg choice="opt">--verbose</arg>
+ <arg choice="opt">--template</arg>
+ <arg choice="opt">--eth-parser[=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>
+
+<refsect1>
+ <title>DESCRIPTION</title>
+
+ <para>pidl is an IDL compiler written in Perl that aims to be somewhat
+ compatible with the midl compiler. IDL stands for
+ "Interface Definition Language".</para>
+
+ <para>pidl can generate stubs for DCE/RPC server code, DCE/RPC
+ client code and ethereal dissectors for DCE/RPC traffic.</para>
+
+ <para>IDL compilers like <emphasis>pidl</emphasis> take a description
+ of an interface as their input and use it to generate C
+ (though support for other languages may be added later) code that
+ can use these interfaces, pretty print data sent
+ using these interfaces, or even generate ethereal
+ dissectors that can parse data sent over the
+ wire by these interfaces. </para>
+
+ <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 .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/unmarshalling and debugging purposes).
+ </para>
+
+</refsect1>
+
+<refsect1>
+ <title>OPTIONS</title>
+
+ <variablelist>
+ <varlistentry>
+ <term>--help</term>
+ <listitem><para>
+ Show list of available options.</para></listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>--outputdir OUTNAME</term>
+ <listitem><para>Write output files to the specified directory.
+ Defaults to the current directory.
+ </para></listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>--parse</term>
+ <listitem><para>
+ Tell pidl the files specified are (midl-style) IDL files.</para></listitem>
+ </varlistentry>
+
+
+ <varlistentry>
+ <term>--dump</term>
+ <listitem><para>
+ Convert .pidl files to (midl-style) IDL files. FIle will be named OUTNAME.idl.</para></listitem>
+ </varlistentry>
+
+
+ <varlistentry>
+ <term>--header</term>
+ <listitem><para>
+ Generate a C header file for the specified interface. Filename defaults to OUTNAME.h.</para></listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>--ndr-header</term>
+ <listitem><para>
+ Generate a C header file with the prototypes for the NDR parsers. Filename defaults to ndr_OUTNAME.h.</para></listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>--ndr-parser</term>
+ <listitem><para>
+ Generate a C file containing NDR parsers.
+ Filename defaults to ndr_OUTNAME.c.
+ </para></listitem>
+ </varlistentry>
+
+
+ <varlistentry>
+ <term>--server</term>
+ <listitem><para>
+ Generate boilerplate for the RPC server that implements
+ the interface. Filename defaults to ndr_OUTNAME_s.c</para></listitem>
+ </varlistentry>
+
+
+ <varlistentry>
+ <term>--template</term>
+ <listitem><para>
+ Generate stubs for a RPC server that implements
+ the interface. Output will be written to stdout.
+ </para></listitem>
+ </varlistentry>
+
+
+ <varlistentry>
+ <term>--eth-parser</term>
+ <listitem><para>
+ Generate an Ethereal dissector (in C) for the interface. Filename
+ defaults to packet-dcerpc-OUTNAME.c.
+ </para>
+
+ <para>Pidl will read additional data
+ from an ethereal conformance file if present. Such a file should
+ have the same location as the IDL file but with the extension
+ <quote>cnf</quote> rather then <quote>idl</quote>. See
+ below for details on the format of this file.
+ </para></listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>--diff</term>
+ <listitem><para>
+ Convert an IDL file to a pidl file and then back to a
+ IDL file and see if there are any differences with the
+ original IDL file. Useful for debugging pidl.</para></listitem>
+ </varlistentry>
+
+
+ <varlistentry>
+ <term>--keep</term>
+ <listitem><para>
+ Tell pidl to keep the pidl files (used as intermediate files
+ between the IDL files and the parser/server/etc code). Useful
+ for debugging pidl.</para></listitem>
+ </varlistentry>
+ </variablelist>
+</refsect1>
+
+<refsect1>
+ <title>IDL SYNTAX</title>
+
+ <para>IDL files are always preprocessed using the C preprocessor.</para>
+
+ <para>Pretty much everything in an interface (the interface itself,
+ functions, parameters) can have attributes (or properties
+ whatever name you give them). Attributes
+ always prepend the element they apply to and are surrounded
+ by square brackets ([]). Multiple attributes
+ are separated by comma's; arguments to attributes are
+ specified between parentheses. </para>
+
+ <para>See the section COMPATIBILITY for the list of attributes that
+ pidl supports.</para>
+
+ <para>C-style comments can be used.</para>
+
+<refsect2>
+ <title>CONFORMANT ARRAYS</title>
+
+ <para>
+A conformant array is one with that ends in [*] or []. The strange
+things about conformant arrays are:
+</para>
+
+<simplelist>
+ <member>they can only appear as the last element of a structure</member>
+ <member>the array size appears before the structure itself on the wire. </member>
+</simplelist>
+
+<para>
+ So, in this example:
+</para>
+
+<programlisting>
+ typedef struct {
+ long abc;
+ long count;
+ long foo;
+ [size_is(count)] long s[*];
+ } Struct1;
+</programlisting>
+
+<para>
+it appears like this:
+</para>
+
+<programlisting>
+[size_is] [abc] [count] [foo] [s...]
+</programlisting>
+
+<para>
+the first [size_is] field is the allocation size of the array, and
+occurs before the array elements and even before the structure
+alignment.
+</para>
+
+<para>
+Note that size_is() can refer to a constant, but that doesn't change
+the wire representation. It does not make the array a fixed array.
+</para>
+
+<para>
+midl.exe would write the above array as the following C header:
+</para>
+
+<programlisting>
+ typedef struct {
+ long abc;
+ long count;
+ long foo;
+ long s[1];
+ } Struct1;
+</programlisting>
+
+<para>
+pidl takes a different approach, and writes it like this:
+</para>
+
+<programlisting>
+ typedef struct {
+ long abc;
+ long count;
+ long foo;
+ long *s;
+ } Struct1;
+</programlisting>
+
+</refsect2>
+
+<refsect2>
+ <title>VARYING ARRAYS</title>
+
+<para>
+A varying array looks like this:
+</para>
+
+<programlisting>
+ typedef struct {
+ long abc;
+ long count;
+ long foo;
+ [size_is(count)] long *s;
+ } Struct1;
+</programlisting>
+
+<para>
+This will look like this on the wire:
+</para>
+
+<programlisting>
+[abc] [count] [foo] [PTR_s] [count] [s...]
+</programlisting>
+
+</refsect2>
+
+<refsect2>
+ <title>FIXED ARRAYS</title>
+
+<para>
+A fixed array looks like this:
+</para>
+
+<programlisting>
+ typedef struct {
+ long s[10];
+ } Struct1;
+</programlisting>
+
+<para>
+The NDR representation looks just like 10 separate long
+declarations. The array size is not encoded on the wire.
+</para>
+
+<para>
+pidl also supports "inline" arrays, which are not part of the IDL/NDR
+standard. These are declared like this:
+</para>
+
+<programlisting>
+ typedef struct {
+ uint32 foo;
+ uint32 count;
+ uint32 bar;
+ long s[count];
+ } Struct1;
+</programlisting>
+
+<para>
+This appears like this:
+</para>
+
+<programlisting>
+[foo] [count] [bar] [s...]
+</programlisting>
+
+<para>
+Fixed arrays are an extension added to support some of the strange
+embedded structures in security descriptors and spoolss.
+</para>
+
+</refsect2>
+
+<para>This section is by no means complete. See the OpenGroup and MSDN
+ documentation for additional information.</para>
+</refsect1>
+
+<refsect1>
+ <title>COMPATIBILITY WITH MIDL</title>
+
+ <refsect2>
+ <title>Asynchronous communication</title>
+
+ <!--FIXME-->
+ </refsect2>
+
+ <refsect2>
+ <title>Typelibs (.tlb files)</title>
+
+ <!-- FIXME -->
+ </refsect2>
+
+ <refsect2>
+ <title>Datagram support</title>
+
+ <para>ncadg is not supported yet.</para>
+ </refsect2>
+
+<refsect2>
+ <title>Supported properties (attributes is the MIDL term)</title>
+
+ <para>
+in, out, ref, length_is, switch_is, size_is, uuid, case, default, string, unique, ptr, pointer_default, v1_enum, object, helpstring, range, local, call_as, endpoint, switch_type, progid, coclass, iid_is.
+ </para>
+
+</refsect2>
+
+<refsect2>
+ <title>PIDL Specific properties</title>
+
+<variablelist>
+ <varlistentry><term>public</term>
+ <listitem><para>
+The [public] property on a structure or union is a pidl extension that
+forces the generated pull/push functions to be non-static. This allows
+you to declare types that can be used between modules. If you don't
+specify [public] then pull/push functions for other than top-level
+functions are declared static.
+ </para></listitem>
+ </varlistentry>
+
+ <varlistentry><term>noprint</term>
+ <listitem><para>
+The [noprint] property is a pidl extension that allows you to specify
+that pidl should not generate a ndr_print_*() function for that
+structure or union. This is used when you wish to define your own
+print function that prints a structure in a nicer manner. A good
+example is the use of [noprint] on dom_sid, which allows the
+pretty-printing of SIDs.
+ </para></listitem>
+ </varlistentry>
+
+ <varlistentry><term>value</term>
+ <listitem><para>
+The [value(expression)] property is a pidl extension that allows you
+to specify the value of a field when it is put on the wire. This
+allows fields that always have a well-known value to be automatically
+filled in, thus making the API more programmer friendly. The
+expression can be any C expression.
+ </para></listitem>
+ </varlistentry>
+
+ <varlistentry><term>relative</term>
+ <listitem><para>
+The [relative] property can be supplied on a pointer. When it is used
+it declares the pointer as a spoolss style "relative" pointer, which
+means it appears on the wire as an offset within the current
+encapsulating structure. This is not part of normal IDL/NDR, but it is
+a very useful extension as it avoids the manual encoding of many
+complex structures.
+ </para></listitem>
+ </varlistentry>
+
+ <varlistentry><term>subcontext(length)</term>
+ <listitem><para>
+ Specifies that a size of <replaceable>length</replaceable>
+ bytes should be read, followed by a blob of that size,
+ which will be parsed as NDR.
+ </para></listitem>
+ </varlistentry>
+
+ <varlistentry><term>flag</term>
+ <listitem><para>
+ Specify boolean options, mostly used for
+ low-level NDR options. Several options
+ can be specified using the | character.
+ Note that flags are inherited by substructures!
+ </para></listitem>
+ </varlistentry>
+
+ <varlistentry><term>nodiscriminant</term>
+ <listitem><para>
+The [nodiscriminant] property on a union means that the usual uint16
+discriminent field at the start of the union on the wire is
+omitted. This is not normally allowed in IDL/NDR, but is used for some
+spoolss structures.
+ </para></listitem>
+ </varlistentry>
+
+ <varlistentry><term>charset(name)</term>
+ <listitem><para>
+ Specify that the array or string uses the specified
+ charset. If this attribute is specified, pidl will
+ take care of converting the character data from this format
+ to the host format. Commonly used values are UCS2, DOS and UTF8.
+ </para></listitem>
+ </varlistentry>
+</variablelist>
+</refsect2>
+
+<refsect2>
+ <title>Unsupported MIDL properties</title>
+
+<para>aggregatable, appobject, async_uuid, bindable, control, cpp_quote, defaultbind, defaultcollelem, defaultvalue, defaultvtable, dispinterface, displaybind, dual, entry, first_is, helpcontext, helpfile, helpstringcontext, helpstringdll, hidden, idl_module, idl_quote, id, immediatebind, importlib, import, include, includelib, last_is, lcid, licensed, max_is, module, ms_union, no_injected_text, nonbrowsable, noncreatable, nonextensible, odl, oleautomation, optional, pragma, propget, propputref, propput, readonly, requestedit, restricted, retval, source, transmit_as, uidefault, usesgetlasterror, vararg, vi_progid, wire_marshal. </para>
+
+</refsect2>
+
+</refsect1>
+
+<refsect1>
+ <title>ETHEREAL CONFORMANCE FILES</title>
+
+<para>
+Pidl needs additional data for ethereal output. This data is read from
+so-called conformance files. This section describes the format of these
+files.</para>
+
+<para>
+Conformance files are simple text files with a single command on each line.
+Empty lines and lines starting with a '#' character are ignored.
+Arguments to commands are seperated by spaces.
+</para>
+
+<para>
+The following commands are currently supported:
+</para>
+
+<variablelist>
+
+<varlistentry>
+ <term>TYPE name dissector ft_type base_type mask valsstring alignment</term>
+ <listitem><para>FIXME</para></listitem>
+</varlistentry>
+
+<varlistentry>
+ <term>NOEMIT type</term>
+ <listitem><para>
+ Suppress emitting a dissect_type function for the specified type
+ </para></listitem>
+</varlistentry>
+
+<varlistentry>
+ <term>PARAM_VALUE type param</term>
+ <listitem><para>
+ FIXME
+ </para></listitem>
+</varlistentry>
+
+<varlistentry>
+ <term>HF_FIELD hf title filter ft_type base_type valsstring mask blurb</term>
+ <listitem><para>
+ FIXME
+ </para></listitem>
+</varlistentry>
+
+<varlistentry>
+ <term>HF_RENAME old_hf_name new_hf_name</term>
+ <listitem><para>FIXME</para></listitem>
+</varlistentry>
+
+<varlistentry>
+ <term>STRIP_PREFIX prefix</term>
+ <listitem><para> FIXME</para></listitem>
+</varlistentry>
+
+<varlistentry>
+ <term>PROTOCOL longname shortname filtername</term>
+ <listitem><para>FIXME</para></listitem>
+</varlistentry>
+
+<varlistentry>
+ <term>FIELD_DESCRIPTION field desc</term>
+ <listitem><para>FIXME</para></listitem>
+</varlistentry>
+
+<varlistentry>
+ <term>IMPORT dissector code...</term>
+ <listitem><para>FIXME</para></listitem>
+</varlistentry>
+
+</variablelist>
+
+</refsect1>
+
+<refsect1>
+ <title>VERSION</title>
+
+ <para>This man page is correct for version 4.0 of the Samba suite.</para>
+</refsect1>
+
+<refsect1>
+ <title>SEE ALSO</title>
+
+ <para><ulink url="http://msdn.microsoft.com/library/en-us/rpc/rpc/field_attributes.asp">Field Attributes [Remote Procedure Call]</ulink>, <ulink url="http://wiki.ethereal.com/DCE/RPC">Ethereal Wiki on DCE/RPC</ulink>.</para>
+
+</refsect1>
+
+<refsect1>
+ <title>AUTHOR</title>
+
+ &man.credits.samba;
+
+ <para>pidl was written by Andrew Tridgell, Stefan Metzmacher, Tim
+ Potter and Jelmer Vernooij. </para>
+
+ <para>This manpage was written by Jelmer Vernooij, partially based on the original pidl README by Andrew Tridgell. </para>
+
+</refsect1>
+
+</refentry>