]> git.ipfire.org Git - thirdparty/systemd.git/blob - man/sd_bus_message_append.xml
Merge pull request #8676 from keszybz/drop-license-boilerplate
[thirdparty/systemd.git] / man / sd_bus_message_append.xml
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">
4
5 <!--
6 SPDX-License-Identifier: LGPL-2.1+
7
8 This file is part of systemd.
9
10 Copyright 2014 Zbigniew Jędrzejewski-Szmek
11 -->
12
13 <refentry id="sd_bus_message_append"
14 xmlns:xi="http://www.w3.org/2001/XInclude">
15
16 <refentryinfo>
17 <title>sd_bus_message_append</title>
18 <productname>systemd</productname>
19
20 <authorgroup>
21 <author>
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>
26 </author>
27 </authorgroup>
28 </refentryinfo>
29
30 <refmeta>
31 <refentrytitle>sd_bus_message_append</refentrytitle>
32 <manvolnum>3</manvolnum>
33 </refmeta>
34
35 <refnamediv>
36 <refname>sd_bus_message_append</refname>
37 <refname>sd_bus_message_appendv</refname>
38
39 <refpurpose>Attach fields to a D-Bus message based on a type
40 string</refpurpose>
41 </refnamediv>
42
43 <refsynopsisdiv>
44 <funcsynopsis>
45 <funcsynopsisinfo>#include &lt;systemd/sd-bus.h&gt;</funcsynopsisinfo>
46
47 <funcprototype>
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>
52 </funcprototype>
53
54 <funcprototype>
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>
59 </funcprototype>
60
61 </funcsynopsis>
62 </refsynopsisdiv>
63
64 <refsect1>
65 <title>Description</title>
66
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>
74
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>
82
83 <para>In case of a basic type, one argument of the corresponding
84 type is expected.</para>
85
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>
91
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.
95 </para>
96
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>
101
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>
109
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>
117
118 <para>For further details on the D-Bus type system, please consult
119 the <ulink
120 url="http://dbus.freedesktop.org/doc/dbus-specification.html#type-system">D-Bus
121 Specification</ulink>.</para>
122
123 <table>
124 <title>Item type specifiers</title>
125
126 <tgroup cols='5'>
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)" />
129
130 <tbody>
131 <xi:include href="sd_bus_message_append_basic.xml" xpointer="xpointer(//table[@id='format-specifiers']//tbody/*)" />
132
133 <row>
134 <entry><literal>a</literal></entry>
135 <entry><constant>SD_BUS_TYPE_ARRAY</constant></entry>
136 <entry>array</entry>
137 <entry>determined by array type and size</entry>
138 <entry>int, followed by array contents</entry>
139 </row>
140
141 <row>
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>
147 </row>
148
149 <row>
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>
155 </row>
156 <row>
157 <entry><literal>)</literal></entry>
158 <entry><constant>SD_BUS_TYPE_STRUCT_END</constant></entry>
159 <entry>array end</entry>
160 </row>
161
162 <row>
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>
168 </row>
169 <row>
170 <entry><literal>}</literal></entry>
171 <entry><constant>SD_BUS_TYPE_DICT_ENTRY_END</constant></entry>
172 <entry>dictionary entry end</entry>
173 </row>
174 </tbody>
175 </tgroup>
176 </table>
177
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>
182
183 </refsect1>
184
185 <refsect1>
186 <title>Types String Grammar</title>
187
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" |
191 "b" | "h" |
192 "s" | "o" | "g"
193 variant ::= "v"
194 structure ::= "(" complete_type+ ")"
195 array ::= "a" complete_type
196 dictionary ::= "a" "{" basic_type complete_type "}"
197 </programlisting>
198 </refsect1>
199
200 <refsect1>
201 <title>Examples</title>
202
203 <para>Append a single basic type (the string <literal>a string</literal>):
204 </para>
205
206 <programlisting>sd_bus_message *m;
207
208 sd_bus_message_append(m, "s", "a string");</programlisting>
209
210 <para>Append all types of integers:</para>
211
212 <programlisting>uint8_t y = 1;
213 int16_t n = 2;
214 uint16_t q = 3;
215 int32_t i = 4;
216 uint32_t u = 5;
217 int32_t x = 6;
218 uint32_t t = 7;
219 double d = 8.0;
220 sd_bus_message_append(m, "ynqiuxtd", y, n, q, i, u, x, t, d);</programlisting>
221
222 <para>Append a structure composed of a string and a D-Bus path:</para>
223
224 <programlisting>sd_bus_message_append(m, "(so)", "a string", "/a/path");
225 </programlisting>
226
227 <para>Append an array of UNIX file descriptors:</para>
228
229 <programlisting>sd_bus_message_append(m, "ah", 3, STDIN_FILENO, STDOUT_FILENO, STDERR_FILENO);
230 </programlisting>
231
232 <para>Append a variant, with the real type "g" (signature),
233 and value "sdbusisgood":</para>
234
235 <programlisting>sd_bus_message_append(m, "v", "g", "sdbusisgood");</programlisting>
236
237 <para>Append a dictionary containing the mapping {1=>"a", 2=>"b", 3=>""}:
238 </para>
239
240 <programlisting>sd_bus_message_append(m, "a{is}", 3, 1, "a", 2, "b", 3, NULL);
241 </programlisting>
242 </refsect1>
243
244 <refsect1>
245 <title>Return Value</title>
246
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>
250 </refsect1>
251
252 <xi:include href="sd_bus_message_append_basic.xml" xpointer="errors" />
253
254 <refsect1>
255 <title>Notes</title>
256
257 <para><function>sd_bus_open_user()</function> and other functions
258 described here are available as a shared library, which can be
259 compiled and linked to with the
260 <constant>libsystemd-bus</constant> <citerefentry project='die-net'><refentrytitle>pkg-config</refentrytitle><manvolnum>1</manvolnum></citerefentry>
261 file.</para>
262 </refsect1>
263
264 <refsect1>
265 <title>See Also</title>
266
267 <para>
268 <citerefentry><refentrytitle>systemd</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
269 <citerefentry><refentrytitle>sd-bus</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
270 <citerefentry><refentrytitle>sd_bus_message_append_basic</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
271 <citerefentry><refentrytitle>sd_bus_message_append_array</refentrytitle><manvolnum>3</manvolnum></citerefentry>
272 </para>
273 </refsect1>
274
275 </refentry>