bus-util: make bus_map_all_properties() not copy string
This commit is contained in:
+20
-6
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user