blob: b783515f1ddd53c6d86384c7aaf6e514f7fc70b0 [file] [log] [blame]
<!-- Common Interface Language (CIL) Reference Guide -->
<!-- call_macro_statements.xml -->
<sect1>
<title>Call / Macro Statements</title>
<sect2 id="call">
<title>call</title>
<para>Instantiate a <link linkend="macro">macro</link> within the current namespace. There may be zero or more parameters passed to the macro (with zero parameters this is similar to the <literal><link linkend="blockinherit">blockinherit</link></literal> (<literal><link linkend="call">call</link></literal>) / <literal><link linkend="blockabstract">blockabstract</link></literal> (<literal><link linkend="macro">macro</link></literal>) statements).</para>
<para>Each parameter passed contains an argument to be resolved by the <link linkend="macro">macro</link>, these can be named or anonymous but must conform to the parameter types defined in the <literal><link linkend="macro">macro</link></literal> statement.</para>
<para><emphasis role="bold">Statement definition:</emphasis></para>
<programlisting><![CDATA[(call macro_id [(param ...)])]]></programlisting>
<para><emphasis role="bold">Where:</emphasis></para>
<informaltable frame="all">
<tgroup cols="2">
<colspec colwidth="2 *"/>
<colspec colwidth="6 *"/>
<tbody>
<row>
<entry>
<para><literal><link linkend="call">call</link></literal></para>
</entry>
<entry>
<para>The <literal><link linkend="call">call</link></literal> keyword.</para>
</entry>
</row>
<row>
<entry>
<para><literal>macro_id</literal></para>
</entry>
<entry>
<para>The identifier of the <literal><link linkend="macro">macro</link></literal> to be instantiated.</para>
</entry>
</row>
<row>
<entry>
<para><literal>param</literal></para>
</entry>
<entry>
<para>Zero or more parameters that are passed to the macro.</para>
</entry>
</row>
</tbody></tgroup>
</informaltable>
<para><emphasis role="bold">Example:</emphasis></para>
<para>See the <literal><link linkend="macro">macro</link></literal> statement for an example.</para>
</sect2>
<sect2 id="macro">
<title>macro</title>
<para>Declare a macro in the current namespace with its associated parameters. The macro identifier is used by the <literal><link linkend="call">call</link></literal> statement to instantiate the macro and resolve any parameters. The call statement may be within the body of a macro.</para>
<para>Note that when resolving macros the callers namespace is not checked, only the following places:
<itemizedlist>
<listitem><simpara>Items defined inside the macro</simpara></listitem>
<listitem><simpara>Items passed into the macro as arguments</simpara></listitem>
<listitem><simpara>Items defined in the same namespace of the macro</simpara></listitem>
<listitem><simpara>Items defined in the global namespace</simpara></listitem>
</itemizedlist>
</para>
<para><emphasis role="bold">Statement definition:</emphasis></para>
<programlisting><![CDATA[
(macro macro_id ([(param_type param_id) ...])
cil_statements
...
)]]>
</programlisting>
<para><emphasis role="bold">Where:</emphasis></para>
<informaltable frame="all">
<tgroup cols="2">
<colspec colwidth="2 *"/>
<colspec colwidth="6 *"/>
<tbody>
<row>
<entry>
<para><literal><link linkend="macro">macro</link></literal></para>
</entry>
<entry>
<para>The <literal><link linkend="macro">macro</link></literal> keyword.</para>
</entry>
</row>
<row>
<entry>
<para><literal>macro_id</literal></para>
</entry>
<entry>
<para>The <literal><link linkend="macro">macro</link></literal> identifier.</para>
</entry>
</row>
<row>
<entry>
<para><literal>param_type</literal></para>
</entry>
<entry>
<para>Zero or more parameters that are passed to the macro. The <literal>param_type</literal> is a keyword used to determine the declaration type (e.g. <literal>type</literal>, <literal>class</literal>, <literal>categoryset</literal>).</para>
<para>The list of valid <literal>param_type</literal> entries are:
<simplelist type="inline">
<member><literal><link linkend="type">type</link></literal></member>
<member><literal><link linkend="typealias">typealias</link></literal></member>
<member><literal><link linkend="role">role</link></literal></member>
<member><literal><link linkend="user">user</link></literal></member>
<member><literal><link linkend="sensitivity">sensitivity</link></literal></member>
<member><literal><link linkend="sensitivityalias">sensitivityalias</link></literal></member>
<member><literal><link linkend="category">category</link></literal></member>
<member><literal><link linkend="categoryalias">categoryalias</link></literal></member>
<member><literal><link linkend="categoryset">categoryset</link></literal> (named or anonymous)</member>
<member><literal><link linkend="level">level</link></literal> (named or anonymous)</member>
<member><literal><link linkend="levelrange">levelrange</link></literal> (named or anonymous)</member>
<member><literal><link linkend="class">class</link></literal></member>
<member><literal><link linkend="classpermission">classpermission</link></literal> (named or anonymous)</member>
<member><literal><link linkend="ipaddr">ipaddr</link></literal> (named or anonymous)</member>
<member><literal><link linkend="boolean">block</link></literal></member>
<member><literal><link linkend="name">name</link></literal> (a string)</member>
<member><literal><link linkend="classmap">classmap</link></literal></member>
</simplelist></para>
</entry>
</row>
<row>
<entry>
<para><literal>param_id</literal></para>
</entry>
<entry>
<para>The parameter identifier used to reference the entry within the macro body (e.g. <literal>ARG1</literal>).</para>
</entry>
</row>
<row>
<entry>
<para><literal>cil_statement</literal></para>
</entry>
<entry>
<para>Zero or more valid CIL statements.</para>
</entry>
</row>
</tbody></tgroup>
</informaltable>
<para><emphasis role="bold">Examples:</emphasis></para>
<para>This example will instantiate the <literal>binder_call</literal> macro in the calling namespace (<literal>my_domain</literal>) and replace <literal>ARG1</literal> with <literal>appdomain</literal> and <literal>ARG2</literal> with <literal>binderservicedomain</literal>:</para>
<programlisting><![CDATA[
(block my_domain
(call binder_call (appdomain binderservicedomain))
)
(macro binder_call ((type ARG1) (type ARG2))
(allow ARG1 ARG2 (binder (call transfer)))
(allow ARG2 ARG1 (binder (transfer)))
(allow ARG1 ARG2 (fd (use)))
)]]>
</programlisting>
<para>This example does not pass any parameters to the macro but adds a <literal>type</literal> identifier to the current namespace:</para>
<programlisting><![CDATA[
(block unconfined
(call add_type)
....
(macro add_type ()
(type exec)
)
)]]>
</programlisting>
<para>This example passes an anonymous and named IP address to the macro:</para>
<programlisting><![CDATA[
(ipaddr netmask_1 255.255.255.0)
(context netlabel_1 (system.user object_r unconfined.object low_low)
(call build_nodecon ((192.168.1.64) netmask_1))
(macro build_nodecon ((ipaddr ARG1) (ipaddr ARG2))
(nodecon ARG1 ARG2 netlabel_1)
)]]>
</programlisting>
</sect2>
</sect1>