const char *prefix,
const char *path,
bool require_fallback,
+ bool *found_object_manager,
sd_bus_error *error) {
const char *previous_interface = NULL;
assert(reply);
assert(prefix);
assert(path);
+ assert(found_object_manager);
assert(error);
n = hashmap_get(bus->nodes, prefix);
if (!n)
return 0;
+ if (!require_fallback && n->object_managers)
+ *found_object_manager = true;
+
LIST_FOREACH(vtables, i, n->vtables) {
void *u;
if (r < 0)
return r;
- r = sd_bus_message_append(reply, "{sa{sv}}", "org.freedesktop.DBus.ObjectManager", 0);
- if (r < 0)
- return r;
+ if (*found_object_manager) {
+ r = sd_bus_message_append(
+ reply, "{sa{sv}}", "org.freedesktop.DBus.ObjectManager", 0);
+ if (r < 0)
+ return r;
+ }
found_something = true;
}
_cleanup_free_ char *prefix = NULL;
size_t pl;
int r;
+ bool found_object_manager = false;
assert(bus);
assert(reply);
assert(error);
/* First, add all vtables registered for this path */
- r = object_manager_serialize_path(bus, reply, path, path, false, error);
+ r = object_manager_serialize_path(bus, reply, path, path, false, &found_object_manager, error);
if (r < 0)
return r;
if (bus->nodes_modified)
return -ENOMEM;
OBJECT_PATH_FOREACH_PREFIX(prefix, path) {
- r = object_manager_serialize_path(bus, reply, prefix, path, true, error);
+ r = object_manager_serialize_path(bus, reply, prefix, path, true, &found_object_manager, error);
if (r < 0)
return r;
if (bus->nodes_modified)