diff options
author | Yu Watanabe <watanabe.yu+github@gmail.com> | 2018-03-19 23:46:29 +0900 |
---|---|---|
committer | Yu Watanabe <watanabe.yu+github@gmail.com> | 2018-03-20 00:42:48 +0900 |
commit | f37f8a61c0d5192bd9dc038d5996a41a6e940caf (patch) | |
tree | 63581f2103ae3e0faaa558209d126ff85875d365 /src/shared/bus-util.c | |
parent | 4f00a11c736b015f40f513b9349afb560791abdc (diff) | |
download | systemd-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.c | 26 |
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) { |