summaryrefslogtreecommitdiff
path: root/src/shared/bus-util.c
diff options
context:
space:
mode:
authorYu Watanabe <watanabe.yu+github@gmail.com>2018-03-19 23:46:29 +0900
committerYu Watanabe <watanabe.yu+github@gmail.com>2018-03-20 00:42:48 +0900
commitf37f8a61c0d5192bd9dc038d5996a41a6e940caf (patch)
tree63581f2103ae3e0faaa558209d126ff85875d365 /src/shared/bus-util.c
parent4f00a11c736b015f40f513b9349afb560791abdc (diff)
downloadsystemd-f37f8a61c0d5192bd9dc038d5996a41a6e940caf.tar.gz
bus-util: make bus_map_all_properties() not copy string
Diffstat (limited to 'src/shared/bus-util.c')
-rw-r--r--src/shared/bus-util.c26
1 files changed, 20 insertions, 6 deletions
diff --git a/src/shared/bus-util.c b/src/shared/bus-util.c
index 8699ed5ce2..2336338102 100644
--- a/src/shared/bus-util.c
+++ b/src/shared/bus-util.c
@@ -1020,7 +1020,7 @@ int bus_map_id128(sd_bus *bus, const char *member, sd_bus_message *m, sd_bus_err
return 0;
}
-static int map_basic(sd_bus *bus, const char *member, sd_bus_message *m, sd_bus_error *error, void *userdata) {
+static int map_basic(sd_bus *bus, const char *member, sd_bus_message *m, sd_bus_error *error, void *userdata, bool copy_string) {
char type;
int r;
@@ -1031,7 +1031,7 @@ static int map_basic(sd_bus *bus, const char *member, sd_bus_message *m, sd_bus_
switch (type) {
case SD_BUS_TYPE_STRING: {
- char **p = userdata;
+ const char **p = userdata;
const char *s;
r = sd_bus_message_read_basic(m, type, &s);
@@ -1041,7 +1041,11 @@ static int map_basic(sd_bus *bus, const char *member, sd_bus_message *m, sd_bus_
if (isempty(s))
s = NULL;
- return free_and_strdup(p, s);
+ if (copy_string)
+ return free_and_strdup((char **) userdata, s);
+
+ *p = s;
+ return 0;
}
case SD_BUS_TYPE_ARRAY: {
@@ -1111,6 +1115,7 @@ static int map_basic(sd_bus *bus, const char *member, sd_bus_message *m, sd_bus_
int bus_message_map_all_properties(
sd_bus_message *m,
const struct bus_properties_map *map,
+ bool copy_string,
sd_bus_error *error,
void *userdata) {
@@ -1153,7 +1158,7 @@ int bus_message_map_all_properties(
if (map[i].set)
r = prop->set(sd_bus_message_get_bus(m), member, m, error, v);
else
- r = map_basic(sd_bus_message_get_bus(m), member, m, error, v);
+ r = map_basic(sd_bus_message_get_bus(m), member, m, error, v, copy_string);
if (r < 0)
return r;
@@ -1179,6 +1184,7 @@ int bus_message_map_all_properties(
int bus_message_map_properties_changed(
sd_bus_message *m,
const struct bus_properties_map *map,
+ bool copy_string,
sd_bus_error *error,
void *userdata) {
@@ -1188,7 +1194,7 @@ int bus_message_map_properties_changed(
assert(m);
assert(map);
- r = bus_message_map_all_properties(m, map, error, userdata);
+ r = bus_message_map_all_properties(m, map, copy_string, error, userdata);
if (r < 0)
return r;
@@ -1219,6 +1225,7 @@ int bus_map_all_properties(
const char *path,
const struct bus_properties_map *map,
sd_bus_error *error,
+ sd_bus_message **reply,
void *userdata) {
_cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
@@ -1241,7 +1248,14 @@ int bus_map_all_properties(
if (r < 0)
return r;
- return bus_message_map_all_properties(m, map, error, userdata);
+ r = bus_message_map_all_properties(m, map, !reply, error, userdata);
+ if (r < 0)
+ return r;
+
+ if (reply)
+ *reply = sd_bus_message_ref(m);
+
+ return r;
}
int bus_connect_transport(BusTransport transport, const char *host, bool user, sd_bus **ret) {