2018-07-03 00:15:39 +03:00
<?xml version='1.0'?>
2014-03-07 08:24:20 +04:00
< !DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
2015-06-18 20:47:44 +03:00
"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
2014-03-07 08:24:20 +04:00
<!--
2017-11-18 19:22:32 +03:00
SPDX-License-Identifier: LGPL-2.1+
2014-03-07 08:24:20 +04:00
-->
2015-06-17 13:32:33 +03:00
<refentry id= "sd_bus_message_append"
2014-03-07 08:24:20 +04:00
xmlns:xi="http://www.w3.org/2001/XInclude">
<refentryinfo >
<title > sd_bus_message_append</title>
<productname > systemd</productname>
</refentryinfo>
<refmeta >
<refentrytitle > sd_bus_message_append</refentrytitle>
<manvolnum > 3</manvolnum>
</refmeta>
<refnamediv >
<refname > sd_bus_message_append</refname>
2017-04-25 10:32:24 +03:00
<refname > sd_bus_message_appendv</refname>
2014-03-07 08:24:20 +04:00
2015-07-07 21:35:45 +03:00
<refpurpose > Attach fields to a D-Bus message based on a type
string</refpurpose>
2014-03-07 08:24:20 +04:00
</refnamediv>
<refsynopsisdiv >
<funcsynopsis >
<funcsynopsisinfo > #include < systemd/sd-bus.h> </funcsynopsisinfo>
<funcprototype >
<funcdef > int sd_bus_message_append</funcdef>
<paramdef > sd_bus_message *<parameter > m</parameter> </paramdef>
<paramdef > const char *<parameter > types</parameter> </paramdef>
2016-12-12 01:01:07 +03:00
<paramdef > …</paramdef>
2014-03-07 08:24:20 +04:00
</funcprototype>
2017-04-25 10:32:24 +03:00
<funcprototype >
<funcdef > int sd_bus_message_appendv</funcdef>
<paramdef > sd_bus_message *<parameter > m</parameter> </paramdef>
<paramdef > const char *<parameter > types</parameter> </paramdef>
<paramdef > va_list <parameter > ap</parameter> </paramdef>
</funcprototype>
2014-03-07 08:24:20 +04:00
</funcsynopsis>
</refsynopsisdiv>
<refsect1 >
<title > Description</title>
2015-07-07 21:35:45 +03:00
<para > The <function > sd_bus_message_append()</function> function
appends a sequence of fields to the D-Bus message object
<parameter > m</parameter> . The type string
<parameter > types</parameter> describes the types of the field
2014-08-03 09:11:12 +04:00
arguments that follow. For each type specified in the type string,
2015-07-07 21:35:45 +03:00
one or more arguments need to be specified, in the same order as
declared in the type string.</para>
2014-03-07 08:24:20 +04:00
2015-07-07 21:35:45 +03:00
<para > The type string is composed of the elements shown in the
2014-03-07 08:24:20 +04:00
table below. It contains zero or more single "complete types".
Each complete type may be one of the basic types or a fully
2015-07-07 21:35:45 +03:00
described container type. A container type may be a structure with
the contained types, a variant, an array with its element type, or
a dictionary entry with the contained types. The type string is
2014-03-07 08:24:20 +04:00
<constant > NUL</constant> -terminated.</para>
<para > In case of a basic type, one argument of the corresponding
type is expected.</para>
<para > A structure is denoted by a sequence of complete types
between <literal > (</literal> and <literal > )</literal> . This
sequence cannot be empty — it must contain at least one type.
Arguments corresponding to this nested sequence follow the same
rules as if they were not nested.</para>
2015-05-11 14:49:29 +03:00
<para > A variant is denoted by <literal > v</literal> . Corresponding
2015-07-07 21:35:45 +03:00
arguments must begin with a type string denoting a complete type,
2014-03-07 08:24:20 +04:00
and following that, arguments corresponding to the specified type.
</para>
<para > An array is denoted by <literal > a</literal> followed by a
2015-07-07 21:35:45 +03:00
complete type. Corresponding arguments must begin with the number of
entries in the array, followed by the entries themselves,
matching the element type of the array.</para>
2014-03-07 08:24:20 +04:00
<para > A dictionary is an array of dictionary entries, denoted by
<literal > a</literal> followed by a pair of complete types between
<literal > {</literal> and <literal > }</literal> . The first of those
2015-07-07 21:35:45 +03:00
types must be a basic type. Corresponding arguments must begin
with the number of dictionary entries, followed by a pair of
values for each entry matching the element type of
the dictionary entries.</para>
2018-07-03 00:21:04 +03:00
<para > The <function > sd_bus_message_appendv()</function> is equivalent to the
<function > sd_bus_message_append()</function> , except that it is called with
a <literal > va_list</literal> instead of a variable number of arguments. This
function does not call the <function > va_end()</function> macro. Because it
invokes the <function > va_arg()</function> macro, the value of
<parameter > ap</parameter> is undefined after the call.</para>
2017-04-25 10:32:24 +03:00
2015-07-07 21:35:45 +03:00
<para > For further details on the D-Bus type system, please consult
the <ulink
url="http://dbus.freedesktop.org/doc/dbus-specification.html#type-system">D-Bus
Specification</ulink> .</para>
2014-03-07 08:24:20 +04:00
<table >
2015-07-07 21:35:45 +03:00
<title > Item type specifiers</title>
2014-03-07 08:24:20 +04:00
2015-07-07 21:35:45 +03:00
<tgroup cols= '5' >
2014-03-07 08:24:20 +04:00
<xi:include href= "sd_bus_message_append_basic.xml" xpointer= "xpointer(//table[@id='format-specifiers'])//colspec" />
<xi:include href= "sd_bus_message_append_basic.xml" xpointer= "xpointer(//table[@id='format-specifiers']//thead)" />
<tbody >
<xi:include href= "sd_bus_message_append_basic.xml" xpointer= "xpointer(//table[@id='format-specifiers']//tbody/*)" />
<row >
<entry > <literal > a</literal> </entry>
<entry > <constant > SD_BUS_TYPE_ARRAY</constant> </entry>
<entry > array</entry>
<entry > determined by array type and size</entry>
2015-07-07 21:35:45 +03:00
<entry > int, followed by array contents</entry>
2014-03-07 08:24:20 +04:00
</row>
<row >
<entry > <literal > v</literal> </entry>
<entry > <constant > SD_BUS_TYPE_VARIANT</constant> </entry>
<entry > variant</entry>
<entry > determined by the type argument</entry>
2015-07-07 21:35:45 +03:00
<entry > signature string, followed by variant contents</entry>
2014-03-07 08:24:20 +04:00
</row>
<row >
<entry > <literal > (</literal> </entry>
<entry > <constant > SD_BUS_TYPE_STRUCT_BEGIN</constant> </entry>
<entry > array start</entry>
<entry morerows= "1" > determined by the nested types</entry>
2015-07-07 21:35:45 +03:00
<entry morerows= "1" > structure contents</entry>
2014-03-07 08:24:20 +04:00
</row>
<row >
<entry > <literal > )</literal> </entry>
<entry > <constant > SD_BUS_TYPE_STRUCT_END</constant> </entry>
<entry > array end</entry>
</row>
<row >
<entry > <literal > {</literal> </entry>
<entry > <constant > SD_BUS_TYPE_DICT_ENTRY_BEGIN</constant> </entry>
<entry > dictionary entry start</entry>
<entry morerows= "1" > determined by the nested types</entry>
2015-07-07 21:35:45 +03:00
<entry morerows= "1" > dictionary contents</entry>
2014-03-07 08:24:20 +04:00
</row>
<row >
<entry > <literal > }</literal> </entry>
<entry > <constant > SD_BUS_TYPE_DICT_ENTRY_END</constant> </entry>
<entry > dictionary entry end</entry>
</row>
</tbody>
</tgroup>
</table>
2015-07-07 21:35:45 +03:00
2016-10-17 19:22:44 +03:00
<para > For types "s" and "g" (unicode string or signature), the pointer may be
<constant > NULL</constant> , which is equivalent to an empty string. See
<citerefentry > <refentrytitle > sd_bus_message_append_basic</refentrytitle> <manvolnum > 3</manvolnum> </citerefentry>
for the precise interpretation of those and other types.</para>
2014-03-07 08:24:20 +04:00
</refsect1>
<refsect1 >
2015-07-07 21:35:45 +03:00
<title > Types String Grammar</title>
2014-03-07 08:24:20 +04:00
<programlisting > types ::= complete_type*
complete_type ::= basic_type | variant | structure | array | dictionary
basic_type ::= "y" | "n" | "q" | "u" | "i" | "x" | "t" | "d" |
"b" | "h" |
"s" | "o" | "g"
variant ::= "v"
structure ::= "(" complete_type+ ")"
array ::= "a" complete_type
dictionary ::= "a" "{" basic_type complete_type "}"
</programlisting>
</refsect1>
<refsect1 >
<title > Examples</title>
<para > Append a single basic type (the string <literal > a string</literal> ):
</para>
<programlisting > sd_bus_message *m;
2016-12-12 01:01:07 +03:00
…
2014-03-07 08:24:20 +04:00
sd_bus_message_append(m, "s", "a string");</programlisting>
<para > Append all types of integers:</para>
<programlisting > uint8_t y = 1;
int16_t n = 2;
uint16_t q = 3;
int32_t i = 4;
uint32_t u = 5;
int32_t x = 6;
uint32_t t = 7;
double d = 8.0;
sd_bus_message_append(m, "ynqiuxtd", y, n, q, i, u, x, t, d);</programlisting>
2015-07-07 21:35:45 +03:00
<para > Append a structure composed of a string and a D-Bus path:</para>
2014-03-07 08:24:20 +04:00
<programlisting > sd_bus_message_append(m, "(so)", "a string", "/a/path");
</programlisting>
<para > Append an array of UNIX file descriptors:</para>
<programlisting > sd_bus_message_append(m, "ah", 3, STDIN_FILENO, STDOUT_FILENO, STDERR_FILENO);
</programlisting>
<para > Append a variant, with the real type "g" (signature),
and value "sdbusisgood":</para>
<programlisting > sd_bus_message_append(m, "v", "g", "sdbusisgood");</programlisting>
<para > Append a dictionary containing the mapping {1=>"a", 2=>"b", 3=>""}:
</para>
<programlisting > sd_bus_message_append(m, "a{is}", 3, 1, "a", 2, "b", 3, NULL);
</programlisting>
</refsect1>
<refsect1 >
<title > Return Value</title>
2017-04-25 10:32:24 +03:00
<para > On success, these functions return 0 or a positive
integer. On failure, these functions return a negative
2014-03-07 08:24:20 +04:00
errno-style error code.</para>
</refsect1>
<xi:include href= "sd_bus_message_append_basic.xml" xpointer= "errors" />
2018-06-06 12:59:04 +03:00
<xi:include href= "libsystemd-pkgconfig.xml" />
2014-03-07 08:24:20 +04:00
<refsect1 >
<title > See Also</title>
<para >
<citerefentry > <refentrytitle > systemd</refentrytitle> <manvolnum > 1</manvolnum> </citerefentry> ,
<citerefentry > <refentrytitle > sd-bus</refentrytitle> <manvolnum > 3</manvolnum> </citerefentry> ,
2015-07-07 21:35:45 +03:00
<citerefentry > <refentrytitle > sd_bus_message_append_basic</refentrytitle> <manvolnum > 3</manvolnum> </citerefentry> ,
<citerefentry > <refentrytitle > sd_bus_message_append_array</refentrytitle> <manvolnum > 3</manvolnum> </citerefentry>
2014-03-07 08:24:20 +04:00
</para>
</refsect1>
</refentry>