1 <?xml version='1.0'?> <!--*- Mode: nxml; nxml-child-indent: 2; indent-tabs-mode: nil -*-->
2 <!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
3 "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
6 SPDX-License-Identifier: LGPL-2.1+
8 This file is part of systemd.
10 Copyright 2014 Zbigniew Jędrzejewski-Szmek
13 <refentry id="sd_bus_message_append"
14 xmlns:xi="http://www.w3.org/2001/XInclude">
17 <title>sd_bus_message_append</title>
18 <productname>systemd</productname>
22 <contrib>A monkey with a typewriter</contrib>
23 <firstname>Zbigniew</firstname>
24 <surname>Jędrzejewski-Szmek</surname>
25 <email>zbyszek@in.waw.pl</email>
31 <refentrytitle>sd_bus_message_append</refentrytitle>
32 <manvolnum>3</manvolnum>
36 <refname>sd_bus_message_append</refname>
37 <refname>sd_bus_message_appendv</refname>
39 <refpurpose>Attach fields to a D-Bus message based on a type
45 <funcsynopsisinfo>#include <systemd/sd-bus.h></funcsynopsisinfo>
48 <funcdef>int sd_bus_message_append</funcdef>
49 <paramdef>sd_bus_message *<parameter>m</parameter></paramdef>
50 <paramdef>const char *<parameter>types</parameter></paramdef>
51 <paramdef>…</paramdef>
55 <funcdef>int sd_bus_message_appendv</funcdef>
56 <paramdef>sd_bus_message *<parameter>m</parameter></paramdef>
57 <paramdef>const char *<parameter>types</parameter></paramdef>
58 <paramdef>va_list <parameter>ap</parameter></paramdef>
65 <title>Description</title>
67 <para>The <function>sd_bus_message_append()</function> function
68 appends a sequence of fields to the D-Bus message object
69 <parameter>m</parameter>. The type string
70 <parameter>types</parameter> describes the types of the field
71 arguments that follow. For each type specified in the type string,
72 one or more arguments need to be specified, in the same order as
73 declared in the type string.</para>
75 <para>The type string is composed of the elements shown in the
76 table below. It contains zero or more single "complete types".
77 Each complete type may be one of the basic types or a fully
78 described container type. A container type may be a structure with
79 the contained types, a variant, an array with its element type, or
80 a dictionary entry with the contained types. The type string is
81 <constant>NUL</constant>-terminated.</para>
83 <para>In case of a basic type, one argument of the corresponding
84 type is expected.</para>
86 <para>A structure is denoted by a sequence of complete types
87 between <literal>(</literal> and <literal>)</literal>. This
88 sequence cannot be empty — it must contain at least one type.
89 Arguments corresponding to this nested sequence follow the same
90 rules as if they were not nested.</para>
92 <para>A variant is denoted by <literal>v</literal>. Corresponding
93 arguments must begin with a type string denoting a complete type,
94 and following that, arguments corresponding to the specified type.
97 <para>An array is denoted by <literal>a</literal> followed by a
98 complete type. Corresponding arguments must begin with the number of
99 entries in the array, followed by the entries themselves,
100 matching the element type of the array.</para>
102 <para>A dictionary is an array of dictionary entries, denoted by
103 <literal>a</literal> followed by a pair of complete types between
104 <literal>{</literal> and <literal>}</literal>. The first of those
105 types must be a basic type. Corresponding arguments must begin
106 with the number of dictionary entries, followed by a pair of
107 values for each entry matching the element type of
108 the dictionary entries.</para>
110 <para>The <function>sd_bus_message_appendv()</function> is equivalent to
111 the function <function>sd_bus_message_append()</function>,
112 except that it is called with a <literal>va_list</literal> instead of
113 a variable number of arguments. This function does not call the
114 <function>va_end()</function> macro. Because it invokes the
115 <function>va_arg()</function> macro, the value of ap
116 is undefined after the call.</para>
118 <para>For further details on the D-Bus type system, please consult
120 url="http://dbus.freedesktop.org/doc/dbus-specification.html#type-system">D-Bus
121 Specification</ulink>.</para>
124 <title>Item type specifiers</title>
127 <xi:include href="sd_bus_message_append_basic.xml" xpointer="xpointer(//table[@id='format-specifiers'])//colspec" />
128 <xi:include href="sd_bus_message_append_basic.xml" xpointer="xpointer(//table[@id='format-specifiers']//thead)" />
131 <xi:include href="sd_bus_message_append_basic.xml" xpointer="xpointer(//table[@id='format-specifiers']//tbody/*)" />
134 <entry><literal>a</literal></entry>
135 <entry><constant>SD_BUS_TYPE_ARRAY</constant></entry>
137 <entry>determined by array type and size</entry>
138 <entry>int, followed by array contents</entry>
142 <entry><literal>v</literal></entry>
143 <entry><constant>SD_BUS_TYPE_VARIANT</constant></entry>
144 <entry>variant</entry>
145 <entry>determined by the type argument</entry>
146 <entry>signature string, followed by variant contents</entry>
150 <entry><literal>(</literal></entry>
151 <entry><constant>SD_BUS_TYPE_STRUCT_BEGIN</constant></entry>
152 <entry>array start</entry>
153 <entry morerows="1">determined by the nested types</entry>
154 <entry morerows="1">structure contents</entry>
157 <entry><literal>)</literal></entry>
158 <entry><constant>SD_BUS_TYPE_STRUCT_END</constant></entry>
159 <entry>array end</entry>
163 <entry><literal>{</literal></entry>
164 <entry><constant>SD_BUS_TYPE_DICT_ENTRY_BEGIN</constant></entry>
165 <entry>dictionary entry start</entry>
166 <entry morerows="1">determined by the nested types</entry>
167 <entry morerows="1">dictionary contents</entry>
170 <entry><literal>}</literal></entry>
171 <entry><constant>SD_BUS_TYPE_DICT_ENTRY_END</constant></entry>
172 <entry>dictionary entry end</entry>
178 <para>For types "s" and "g" (unicode string or signature), the pointer may be
179 <constant>NULL</constant>, which is equivalent to an empty string. See
180 <citerefentry><refentrytitle>sd_bus_message_append_basic</refentrytitle><manvolnum>3</manvolnum></citerefentry>
181 for the precise interpretation of those and other types.</para>
186 <title>Types String Grammar</title>
188 <programlisting>types ::= complete_type*
189 complete_type ::= basic_type | variant | structure | array | dictionary
190 basic_type ::= "y" | "n" | "q" | "u" | "i" | "x" | "t" | "d" |
194 structure ::= "(" complete_type+ ")"
195 array ::= "a" complete_type
196 dictionary ::= "a" "{" basic_type complete_type "}"
201 <title>Examples</title>
203 <para>Append a single basic type (the string <literal>a string</literal>):
206 <programlisting>sd_bus_message *m;
208 sd_bus_message_append(m, "s", "a string");</programlisting>
210 <para>Append all types of integers:</para>
212 <programlisting>uint8_t y = 1;
220 sd_bus_message_append(m, "ynqiuxtd", y, n, q, i, u, x, t, d);</programlisting>
222 <para>Append a structure composed of a string and a D-Bus path:</para>
224 <programlisting>sd_bus_message_append(m, "(so)", "a string", "/a/path");
227 <para>Append an array of UNIX file descriptors:</para>
229 <programlisting>sd_bus_message_append(m, "ah", 3, STDIN_FILENO, STDOUT_FILENO, STDERR_FILENO);
232 <para>Append a variant, with the real type "g" (signature),
233 and value "sdbusisgood":</para>
235 <programlisting>sd_bus_message_append(m, "v", "g", "sdbusisgood");</programlisting>
237 <para>Append a dictionary containing the mapping {1=>"a", 2=>"b", 3=>""}:
240 <programlisting>sd_bus_message_append(m, "a{is}", 3, 1, "a", 2, "b", 3, NULL);
245 <title>Return Value</title>
247 <para>On success, these functions return 0 or a positive
248 integer. On failure, these functions return a negative
249 errno-style error code.</para>
252 <xi:include href="sd_bus_message_append_basic.xml" xpointer="errors" />
254 <xi:include href="libelogind-pkgconfig.xml" />
257 <title>See Also</title>
260 <citerefentry><refentrytitle>systemd</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
261 <citerefentry><refentrytitle>sd-bus</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
262 <citerefentry><refentrytitle>sd_bus_message_append_basic</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
263 <citerefentry><refentrytitle>sd_bus_message_append_array</refentrytitle><manvolnum>3</manvolnum></citerefentry>