1SD_BUS_MESSAGE_READ(3) sd_bus_message_read SD_BUS_MESSAGE_READ(3)
2
3
4
6 sd_bus_message_read, sd_bus_message_readv - Read a sequence of values
7 from a message
8
10 #include <systemd/sd-bus.h>
11
12 int sd_bus_message_read(sd_bus_message *m, char char *types, ...);
13
14 int sd_bus_message_readv(sd_bus_message *m, char char *types,
15 va_list ap);
16
18 sd_bus_message_read() reads a sequence of fields from the D-Bus message
19 object m and advances the read position in the message. The type string
20 types describes the types of items expected in the message and the
21 field arguments that follow. The type string may be NULL or empty, in
22 which case nothing is read.
23
24 The type string is composed of the elements described in
25 sd_bus_message_append(3), i.e. basic and container types. It must
26 contain zero or more single "complete types". The type string is
27 NUL-terminated.
28
29 For each type specified in the type string, one or more arguments need
30 to be specified after the types parameter, in the same order. The
31 arguments must be pointers to appropriate types (a pointer to int8_t
32 for a "y" in the type string, a pointer to int32_t for an "i", a
33 pointer to const char* for an "s", ...) which are set based on the
34 values in the message. As an exception, in case or array and variant
35 types, the first argument is an "input" argument that further specifies
36 how the message should be read. See the table below for a complete list
37 of allowed arguments and their types. Note that, if the basic type is a
38 pointer (e.g., const char * in the case of a string), the argument is a
39 pointer to a pointer, and also the pointer value that is written is
40 only borrowed and the contents must be copied if they are to be used
41 after the end of the messages lifetime.
42
43 Each argument may also be NULL, in which case the value is read and
44 ignored.
45
46 Table 1. Item type specifiers
47 ┌──────────┬──────────────────────────────┬────────────────┬───────────────┬───────────────┐
48 │Specifier │ Constant │ Description │ Type of the │ Types of the │
49 │ │ │ │ first │ subsequent │
50 │ │ │ │ argument │ arguments, if │
51 │ │ │ │ │ any │
52 ├──────────┼──────────────────────────────┼────────────────┼───────────────┼───────────────┤
53 │"y" │ SD_BUS_TYPE_BYTE │ unsigned │ uint8_t * │ │
54 │ │ │ integer │ │ │
55 ├──────────┼──────────────────────────────┼────────────────┼───────────────┼───────────────┤
56 │"b" │ SD_BUS_TYPE_BOOLEAN │ boolean │ int * │ │
57 ├──────────┼──────────────────────────────┼────────────────┼───────────────┼───────────────┤
58 │"n" │ SD_BUS_TYPE_INT16 │ signed │ int16_t * │ │
59 │ │ │ integer │ │ │
60 ├──────────┼──────────────────────────────┼────────────────┼───────────────┼───────────────┤
61 │"q" │ SD_BUS_TYPE_UINT16 │ unsigned │ uint16_t * │ │
62 │ │ │ integer │ │ │
63 ├──────────┼──────────────────────────────┼────────────────┼───────────────┼───────────────┤
64 │"i" │ SD_BUS_TYPE_INT32 │ signed │ int32_t * │ │
65 │ │ │ integer │ │ │
66 ├──────────┼──────────────────────────────┼────────────────┼───────────────┼───────────────┤
67 │"u" │ SD_BUS_TYPE_UINT32 │ unsigned │ uint32_t * │ │
68 │ │ │ integer │ │ │
69 ├──────────┼──────────────────────────────┼────────────────┼───────────────┼───────────────┤
70 │"x" │ SD_BUS_TYPE_INT64 │ signed │ int64_t * │ │
71 │ │ │ integer │ │ │
72 ├──────────┼──────────────────────────────┼────────────────┼───────────────┼───────────────┤
73 │"t" │ SD_BUS_TYPE_UINT64 │ unsigned │ uint64_t * │ │
74 │ │ │ integer │ │ │
75 ├──────────┼──────────────────────────────┼────────────────┼───────────────┼───────────────┤
76 │"d" │ SD_BUS_TYPE_DOUBLE │ floating-point │ double * │ │
77 ├──────────┼──────────────────────────────┼────────────────┼───────────────┼───────────────┤
78 │"s" │ SD_BUS_TYPE_STRING │ Unicode string │ const char ** │ │
79 ├──────────┼──────────────────────────────┼────────────────┼───────────────┼───────────────┤
80 │"o" │ SD_BUS_TYPE_OBJECT_PATH │ object path │ const char ** │ │
81 ├──────────┼──────────────────────────────┼────────────────┼───────────────┼───────────────┤
82 │"g" │ SD_BUS_TYPE_SIGNATURE │ signature │ const char ** │ │
83 ├──────────┼──────────────────────────────┼────────────────┼───────────────┼───────────────┤
84 │"h" │ SD_BUS_TYPE_UNIX_FD │ UNIX file │ int * │ │
85 │ │ │ descriptor │ │ │
86 ├──────────┼──────────────────────────────┼────────────────┼───────────────┼───────────────┤
87 │"a" │ SD_BUS_TYPE_ARRAY │ array │ int, which │ n sets of │
88 │ │ │ │ specifies the │ arguments │
89 │ │ │ │ expected │ appropriate │
90 │ │ │ │ length n of │ for the array │
91 │ │ │ │ the array │ element type │
92 ├──────────┼──────────────────────────────┼────────────────┼───────────────┼───────────────┤
93 │"v" │ SD_BUS_TYPE_VARIANT │ variant │ signature │ arguments │
94 │ │ │ │ string │ appropriate │
95 │ │ │ │ │ for the types │
96 │ │ │ │ │ specified by │
97 │ │ │ │ │ the signature │
98 ├──────────┼──────────────────────────────┼────────────────┼───────────────┴───────────────┤
99 │"(" │ SD_BUS_TYPE_STRUCT_BEGIN │ array start │ arguments appropriate for │
100 ├──────────┼──────────────────────────────┼────────────────┤ the structure elements │
101 │")" │ SD_BUS_TYPE_STRUCT_END │ array end │ │
102 ├──────────┼──────────────────────────────┼────────────────┼───────────────┬───────────────┤
103 │"{" │ SD_BUS_TYPE_DICT_ENTRY_BEGIN │ dictionary │ arguments │ arguments │
104 │ │ │ entry start │ appropriate │ appropriate │
105 ├──────────┼──────────────────────────────┼────────────────┤ for the first │ for the │
106 │"}" │ SD_BUS_TYPE_DICT_ENTRY_END │ dictionary │ type in the │ second type │
107 │ │ │ entry end │ pair │ in the pair │
108 └──────────┴──────────────────────────────┴────────────────┴───────────────┴───────────────┘
109
110 If objects of the specified types are not present at the current
111 position in the message, an error is returned.
112
113 The sd_bus_message_readv() is equivalent to the sd_bus_message_read(),
114 except that it is called with a "va_list" instead of a variable number
115 of arguments. This function does not call the va_end() macro. Because
116 it invokes the va_arg() macro, the value of ap is undefined after the
117 call.
118
120 On success, sd_bus_message_read() and sd_bus_message_readv() return 0
121 or a positive integer. On failure, they return a negative errno-style
122 error code.
123
124 Errors
125 Returned errors may indicate the following problems:
126
127 -EINVAL
128 Specified type string is invalid or the message parameter is NULL.
129
130 -ENXIO
131 The message does not contain the specified type at current
132 position.
133
134 -EBADMSG
135 The message cannot be parsed.
136
138 These APIs are implemented as a shared library, which can be compiled
139 and linked to with the libsystemd pkg-config(1) file.
140
142 Read a single basic type (a 64-bit integer):
143
144 sd_bus_message *m;
145 int64_t x;
146
147 sd_bus_message_read(m, "x", &x);
148
149 Read all types of integers:
150
151 uint8_t y;
152 int16_t n;
153 uint16_t q;
154 int32_t i;
155 uint32_t u;
156 int32_t x;
157 uint32_t t;
158 double d;
159
160 sd_bus_message_read(m, "ynqiuxtd", &y, &n, &q, &i, &u, &x, &t, &d);
161
162 Read a structure composed of a string and a D-Bus path:
163
164 const char *s, *p;
165
166 sd_bus_message_read(m, "(so)", &s, &p);
167
168 Read a variant, with the real type "gt" (signature, unsigned integer):
169
170 const char *s;
171 uint64_t *v;
172
173 sd_bus_message_read(m, "v", "gt", &s, &v);
174
175 Read a dictionary containing three pairs of type {integer=>string}:
176
177 int i, j, k;
178 const char *s, *t, *u;
179
180 sd_bus_message_read(m, "a{is}", 3, &i, &s, &j, &t, &k, &u);
181
182
184 systemd(1), sd-bus(3), sd_bus_message_read_basic(3),
185 sd_bus_message_skip(3), sd_bus_message_append(3)
186
187
188
189systemd 243 SD_BUS_MESSAGE_READ(3)