bus-util: make bus_map_all_properties() not copy string

This commit is contained in:
Yu Watanabe
2018-03-20 00:42:48 +09:00
parent 4f00a11c73
commit f37f8a61c0
11 changed files with 132 additions and 201 deletions
+20 -6
View File
@@ -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) {
+3 -3
View File
@@ -51,9 +51,9 @@ struct bus_properties_map {
int bus_map_id128(sd_bus *bus, const char *member, sd_bus_message *m, sd_bus_error *error, void *userdata);
int bus_message_map_all_properties(sd_bus_message *m, const struct bus_properties_map *map, sd_bus_error *error, void *userdata);
int bus_message_map_properties_changed(sd_bus_message *m, const struct bus_properties_map *map, sd_bus_error *error, void *userdata);
int bus_map_all_properties(sd_bus *bus, const char *destination, const char *path, const struct bus_properties_map *map, sd_bus_error *error, void *userdata);
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);
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);
int bus_map_all_properties(sd_bus *bus, const char *destination, const char *path, const struct bus_properties_map *map, sd_bus_error *error, sd_bus_message **reply, void *userdata);
int bus_async_unregister_and_exit(sd_event *e, sd_bus *bus, const char *name);