chiark / gitweb /
48a022d1150afe0b28be026a8653dbf08a100074
[elogind.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   This file is part of systemd.
7
8   Copyright 2014 Zbigniew Jędrzejewski-Szmek
9
10   systemd is free software; you can redistribute it and/or modify it
11   under the terms of the GNU Lesser General Public License as published by
12   the Free Software Foundation; either version 2.1 of the License, or
13   (at your option) any later version.
14
15   systemd is distributed in the hope that it will be useful, but
16   WITHOUT ANY WARRANTY; without even the implied warranty of
17   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18   Lesser General Public License for more details.
19
20   You should have received a copy of the GNU Lesser General Public License
21   along with systemd; If not, see <http://www.gnu.org/licenses/>.
22 -->
23
24 <refentry id="sd_bus_message_append"
25           xmlns:xi="http://www.w3.org/2001/XInclude">
26
27   <refentryinfo>
28     <title>sd_bus_message_append</title>
29     <productname>systemd</productname>
30
31     <authorgroup>
32       <author>
33         <contrib>A monkey with a typewriter</contrib>
34         <firstname>Zbigniew</firstname>
35         <surname>Jędrzejewski-Szmek</surname>
36         <email>zbyszek@in.waw.pl</email>
37       </author>
38     </authorgroup>
39   </refentryinfo>
40
41   <refmeta>
42     <refentrytitle>sd_bus_message_append</refentrytitle>
43     <manvolnum>3</manvolnum>
44   </refmeta>
45
46   <refnamediv>
47     <refname>sd_bus_message_append</refname>
48
49     <refpurpose>Attach fields to a D-Bus message based on a type
50     string</refpurpose>
51   </refnamediv>
52
53   <refsynopsisdiv>
54     <funcsynopsis>
55       <funcsynopsisinfo>#include &lt;systemd/sd-bus.h&gt;</funcsynopsisinfo>
56
57       <funcprototype>
58         <funcdef>int sd_bus_message_append</funcdef>
59         <paramdef>sd_bus_message *<parameter>m</parameter></paramdef>
60         <paramdef>const char *<parameter>types</parameter></paramdef>
61         <paramdef>…</paramdef>
62       </funcprototype>
63     </funcsynopsis>
64   </refsynopsisdiv>
65
66   <refsect1>
67     <title>Description</title>
68
69     <para>The <function>sd_bus_message_append()</function> function
70     appends a sequence of fields to the D-Bus message object
71     <parameter>m</parameter>. The type string
72     <parameter>types</parameter> describes the types of the field
73     arguments that follow. For each type specified in the type string,
74     one or more arguments need to be specified, in the same order as
75     declared in the type string.</para>
76
77     <para>The type string is composed of the elements shown in the
78     table below. It contains zero or more single "complete types".
79     Each complete type may be one of the basic types or a fully
80     described container type. A container type may be a structure with
81     the contained types, a variant, an array with its element type, or
82     a dictionary entry with the contained types. The type string is
83     <constant>NUL</constant>-terminated.</para>
84
85     <para>In case of a basic type, one argument of the corresponding
86     type is expected.</para>
87
88     <para>A structure is denoted by a sequence of complete types
89     between <literal>(</literal> and <literal>)</literal>. This
90     sequence cannot be empty — it must contain at least one type.
91     Arguments corresponding to this nested sequence follow the same
92     rules as if they were not nested.</para>
93
94     <para>A variant is denoted by <literal>v</literal>. Corresponding
95     arguments must begin with a type string denoting a complete type,
96     and following that, arguments corresponding to the specified type.
97     </para>
98
99     <para>An array is denoted by <literal>a</literal> followed by a
100     complete type. Corresponding arguments must begin with the number of
101     entries in the array, followed by the entries themselves,
102     matching the element type of the array.</para>
103
104     <para>A dictionary is an array of dictionary entries, denoted by
105     <literal>a</literal> followed by a pair of complete types between
106     <literal>{</literal> and <literal>}</literal>. The first of those
107     types must be a basic type. Corresponding arguments must begin
108     with the number of dictionary entries, followed by a pair of
109     values for each entry matching the element type of
110     the dictionary entries.</para>
111
112     <para>For further details on the D-Bus type system, please consult
113     the <ulink
114     url="http://dbus.freedesktop.org/doc/dbus-specification.html#type-system">D-Bus
115     Specification</ulink>.</para>
116
117     <table>
118       <title>Item type specifiers</title>
119
120       <tgroup cols='5'>
121         <xi:include href="sd_bus_message_append_basic.xml" xpointer="xpointer(//table[@id='format-specifiers'])//colspec" />
122         <xi:include href="sd_bus_message_append_basic.xml" xpointer="xpointer(//table[@id='format-specifiers']//thead)" />
123
124         <tbody>
125           <xi:include href="sd_bus_message_append_basic.xml" xpointer="xpointer(//table[@id='format-specifiers']//tbody/*)" />
126
127           <row>
128             <entry><literal>a</literal></entry>
129             <entry><constant>SD_BUS_TYPE_ARRAY</constant></entry>
130             <entry>array</entry>
131             <entry>determined by array type and size</entry>
132             <entry>int, followed by array contents</entry>
133           </row>
134
135           <row>
136             <entry><literal>v</literal></entry>
137             <entry><constant>SD_BUS_TYPE_VARIANT</constant></entry>
138             <entry>variant</entry>
139             <entry>determined by the type argument</entry>
140             <entry>signature string, followed by variant contents</entry>
141           </row>
142
143           <row>
144             <entry><literal>(</literal></entry>
145             <entry><constant>SD_BUS_TYPE_STRUCT_BEGIN</constant></entry>
146             <entry>array start</entry>
147             <entry morerows="1">determined by the nested types</entry>
148             <entry morerows="1">structure contents</entry>
149           </row>
150           <row>
151             <entry><literal>)</literal></entry>
152             <entry><constant>SD_BUS_TYPE_STRUCT_END</constant></entry>
153             <entry>array end</entry>
154           </row>
155
156           <row>
157             <entry><literal>{</literal></entry>
158             <entry><constant>SD_BUS_TYPE_DICT_ENTRY_BEGIN</constant></entry>
159             <entry>dictionary entry start</entry>
160             <entry morerows="1">determined by the nested types</entry>
161             <entry morerows="1">dictionary contents</entry>
162           </row>
163           <row>
164             <entry><literal>}</literal></entry>
165             <entry><constant>SD_BUS_TYPE_DICT_ENTRY_END</constant></entry>
166             <entry>dictionary entry end</entry>
167           </row>
168        </tbody>
169       </tgroup>
170     </table>
171
172     <para>For types "s" and "g" (unicode string or signature), the pointer may be
173     <constant>NULL</constant>, which is equivalent to an empty string. See
174     <citerefentry><refentrytitle>sd_bus_message_append_basic</refentrytitle><manvolnum>3</manvolnum></citerefentry>
175     for the precise interpretation of those and other types.</para>
176
177   </refsect1>
178
179   <refsect1>
180     <title>Types String Grammar</title>
181
182     <programlisting>types ::= complete_type*
183 complete_type ::= basic_type | variant | structure | array | dictionary
184 basic_type ::= "y" | "n" | "q" | "u" | "i" | "x" | "t" | "d" |
185                "b" | "h" |
186                "s" | "o" | "g"
187 variant ::= "v"
188 structure ::= "(" complete_type+ ")"
189 array ::= "a" complete_type
190 dictionary ::= "a" "{" basic_type complete_type "}"
191 </programlisting>
192   </refsect1>
193
194   <refsect1>
195     <title>Examples</title>
196
197     <para>Append a single basic type (the string <literal>a string</literal>):
198     </para>
199
200     <programlisting>sd_bus_message *m;
201
202 sd_bus_message_append(m, "s", "a string");</programlisting>
203
204     <para>Append all types of integers:</para>
205
206     <programlisting>uint8_t y = 1;
207 int16_t n = 2;
208 uint16_t q = 3;
209 int32_t i = 4;
210 uint32_t u = 5;
211 int32_t x = 6;
212 uint32_t t = 7;
213 double d = 8.0;
214 sd_bus_message_append(m, "ynqiuxtd", y, n, q, i, u, x, t, d);</programlisting>
215
216      <para>Append a structure composed of a string and a D-Bus path:</para>
217
218      <programlisting>sd_bus_message_append(m, "(so)", "a string", "/a/path");
219 </programlisting>
220
221      <para>Append an array of UNIX file descriptors:</para>
222
223      <programlisting>sd_bus_message_append(m, "ah", 3, STDIN_FILENO, STDOUT_FILENO, STDERR_FILENO);
224 </programlisting>
225
226      <para>Append a variant, with the real type "g" (signature),
227      and value "sdbusisgood":</para>
228
229      <programlisting>sd_bus_message_append(m, "v", "g", "sdbusisgood");</programlisting>
230
231      <para>Append a dictionary containing the mapping {1=>"a", 2=>"b", 3=>""}:
232      </para>
233
234      <programlisting>sd_bus_message_append(m, "a{is}", 3, 1, "a", 2, "b", 3, NULL);
235      </programlisting>
236   </refsect1>
237
238   <refsect1>
239     <title>Return Value</title>
240
241     <para>On success, this call returns 0 or a positive
242     integer. On failure, this call returns a negative
243     errno-style error code.</para>
244   </refsect1>
245
246   <xi:include href="sd_bus_message_append_basic.xml" xpointer="errors" />
247
248   <refsect1>
249     <title>Notes</title>
250
251     <para><function>sd_bus_open_user()</function> and other functions
252     described here are available as a shared library, which can be
253     compiled and linked to with the
254     <constant>libelogind-bus</constant> <citerefentry project='die-net'><refentrytitle>pkg-config</refentrytitle><manvolnum>1</manvolnum></citerefentry>
255     file.</para>
256   </refsect1>
257
258   <refsect1>
259     <title>See Also</title>
260
261     <para>
262       <citerefentry><refentrytitle>systemd</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
263       <citerefentry><refentrytitle>sd-bus</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
264       <citerefentry><refentrytitle>sd_bus_message_append_basic</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
265       <citerefentry><refentrytitle>sd_bus_message_append_array</refentrytitle><manvolnum>3</manvolnum></citerefentry>
266     </para>
267   </refsect1>
268
269 </refentry>