free(n);
}
-static int bus_find_parent_object_manager(sd_bus *bus, struct node **out, const char *path) {
+static int bus_find_parent_object_manager(sd_bus *bus, struct node **out, const char *path, bool* path_has_object_manager) {
struct node *n;
assert(bus);
assert(path);
+ assert(path_has_object_manager);
n = hashmap_get(bus->nodes, path);
+
+ if (n)
+ *path_has_object_manager = n->object_managers;
+
if (!n) {
_cleanup_free_ char *prefix = NULL;
size_t pl;
return 0;
}
-static int object_added_append_all(sd_bus *bus, sd_bus_message *m, const char *path) {
+static int object_added_append_all(sd_bus *bus, sd_bus_message *m, const char *path, bool path_has_object_manager) {
_cleanup_ordered_set_free_ OrderedSet *s = NULL;
_cleanup_free_ char *prefix = NULL;
size_t pl;
r = sd_bus_message_append(m, "{sa{sv}}", "org.freedesktop.DBus.Properties", 0);
if (r < 0)
return r;
- r = sd_bus_message_append(m, "{sa{sv}}", "org.freedesktop.DBus.ObjectManager", 0);
- if (r < 0)
- return r;
+ if (path_has_object_manager){
+ r = sd_bus_message_append(m, "{sa{sv}}", "org.freedesktop.DBus.ObjectManager", 0);
+ if (r < 0)
+ return r;
+ }
r = object_added_append_all_prefix(bus, m, s, path, path, false);
if (r < 0)
if (!BUS_IS_OPEN(bus->state))
return -ENOTCONN;
- r = bus_find_parent_object_manager(bus, &object_manager, path);
+ bool path_has_object_manager = false;
+ r = bus_find_parent_object_manager(bus, &object_manager, path, &path_has_object_manager);
if (r < 0)
return r;
if (r == 0)
if (r < 0)
return r;
- r = object_added_append_all(bus, m, path);
+ r = object_added_append_all(bus, m, path, path_has_object_manager);
if (r < 0)
return r;
return 0;
}
-static int object_removed_append_all(sd_bus *bus, sd_bus_message *m, const char *path) {
+static int object_removed_append_all(sd_bus *bus, sd_bus_message *m, const char *path, bool path_has_object_manager) {
_cleanup_ordered_set_free_ OrderedSet *s = NULL;
_cleanup_free_ char *prefix = NULL;
size_t pl;
r = sd_bus_message_append(m, "s", "org.freedesktop.DBus.Properties");
if (r < 0)
return r;
- r = sd_bus_message_append(m, "s", "org.freedesktop.DBus.ObjectManager");
- if (r < 0)
- return r;
+
+ if (path_has_object_manager){
+ r = sd_bus_message_append(m, "s", "org.freedesktop.DBus.ObjectManager");
+ if (r < 0)
+ return r;
+ }
r = object_removed_append_all_prefix(bus, m, s, path, path, false);
if (r < 0)
if (!BUS_IS_OPEN(bus->state))
return -ENOTCONN;
- r = bus_find_parent_object_manager(bus, &object_manager, path);
+ bool path_has_object_manager = false;
+ r = bus_find_parent_object_manager(bus, &object_manager, path, &path_has_object_manager);
if (r < 0)
return r;
if (r == 0)
if (r < 0)
return r;
- r = object_removed_append_all(bus, m, path);
+ r = object_removed_append_all(bus, m, path, path_has_object_manager);
if (r < 0)
return r;
if (strv_isempty(interfaces))
return 0;
- r = bus_find_parent_object_manager(bus, &object_manager, path);
+ bool path_has_object_manager = false;
+ r = bus_find_parent_object_manager(bus, &object_manager, path, &path_has_object_manager);
if (r < 0)
return r;
if (r == 0)
if (strv_isempty(interfaces))
return 0;
- r = bus_find_parent_object_manager(bus, &object_manager, path);
+ bool path_has_object_manager = false;
+ r = bus_find_parent_object_manager(bus, &object_manager, path, &path_has_object_manager);
if (r < 0)
return r;
if (r == 0)