]>
git.ipfire.org Git - thirdparty/systemd.git/blob - src/shared/bus-map-properties.c
1 /* SPDX-License-Identifier: LGPL-2.1+ */
3 #include "bus-map-properties.h"
4 #include "alloc-util.h"
6 #include "bus-message.h"
8 int bus_map_id128(sd_bus
*bus
, const char *member
, sd_bus_message
*m
, sd_bus_error
*error
, void *userdata
) {
9 sd_id128_t
*p
= userdata
;
14 r
= sd_bus_message_read_array(m
, SD_BUS_TYPE_BYTE
, &v
, &n
);
21 memcpy((*p
).bytes
, v
, n
);
28 static int map_basic(sd_bus
*bus
, const char *member
, sd_bus_message
*m
, unsigned flags
, sd_bus_error
*error
, void *userdata
) {
32 r
= sd_bus_message_peek_type(m
, &type
, NULL
);
38 case SD_BUS_TYPE_STRING
:
39 case SD_BUS_TYPE_OBJECT_PATH
: {
40 const char **p
= userdata
;
43 r
= sd_bus_message_read_basic(m
, type
, &s
);
50 if (flags
& BUS_MAP_STRDUP
)
51 return free_and_strdup((char **) userdata
, s
);
57 case SD_BUS_TYPE_ARRAY
: {
58 _cleanup_strv_free_
char **l
= NULL
;
61 r
= bus_message_read_strv_extend(m
, &l
);
65 return strv_extend_strv(p
, l
, false);
68 case SD_BUS_TYPE_BOOLEAN
: {
71 r
= sd_bus_message_read_basic(m
, type
, &b
);
75 if (flags
& BUS_MAP_BOOLEAN_AS_BOOL
)
76 *(bool*) userdata
= b
;
83 case SD_BUS_TYPE_INT32
:
84 case SD_BUS_TYPE_UINT32
: {
85 uint32_t u
, *p
= userdata
;
87 r
= sd_bus_message_read_basic(m
, type
, &u
);
95 case SD_BUS_TYPE_INT64
:
96 case SD_BUS_TYPE_UINT64
: {
97 uint64_t t
, *p
= userdata
;
99 r
= sd_bus_message_read_basic(m
, type
, &t
);
107 case SD_BUS_TYPE_DOUBLE
: {
108 double d
, *p
= userdata
;
110 r
= sd_bus_message_read_basic(m
, type
, &d
);
121 int bus_message_map_all_properties(
123 const struct bus_properties_map
*map
,
133 r
= sd_bus_message_enter_container(m
, SD_BUS_TYPE_ARRAY
, "{sv}");
137 while ((r
= sd_bus_message_enter_container(m
, SD_BUS_TYPE_DICT_ENTRY
, "sv")) > 0) {
138 const struct bus_properties_map
*prop
;
140 const char *contents
;
144 r
= sd_bus_message_read_basic(m
, SD_BUS_TYPE_STRING
, &member
);
148 for (i
= 0, prop
= NULL
; map
[i
].member
; i
++)
149 if (streq(map
[i
].member
, member
)) {
155 r
= sd_bus_message_peek_type(m
, NULL
, &contents
);
159 r
= sd_bus_message_enter_container(m
, SD_BUS_TYPE_VARIANT
, contents
);
163 v
= (uint8_t *)userdata
+ prop
->offset
;
165 r
= prop
->set(sd_bus_message_get_bus(m
), member
, m
, error
, v
);
167 r
= map_basic(sd_bus_message_get_bus(m
), member
, m
, flags
, error
, v
);
171 r
= sd_bus_message_exit_container(m
);
175 r
= sd_bus_message_skip(m
, "v");
180 r
= sd_bus_message_exit_container(m
);
187 return sd_bus_message_exit_container(m
);
190 int bus_map_all_properties(
192 const char *destination
,
194 const struct bus_properties_map
*map
,
197 sd_bus_message
**reply
,
200 _cleanup_(sd_bus_message_unrefp
) sd_bus_message
*m
= NULL
;
207 assert(reply
|| (flags
& BUS_MAP_STRDUP
));
209 r
= sd_bus_call_method(
213 "org.freedesktop.DBus.Properties",
221 r
= bus_message_map_all_properties(m
, map
, flags
, error
, userdata
);
226 *reply
= sd_bus_message_ref(m
);