summaryrefslogtreecommitdiffstats
path: root/src/sbus/sssd_dbus_introspect.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/sbus/sssd_dbus_introspect.c')
-rw-r--r--src/sbus/sssd_dbus_introspect.c41
1 files changed, 37 insertions, 4 deletions
diff --git a/src/sbus/sssd_dbus_introspect.c b/src/sbus/sssd_dbus_introspect.c
index 34279c8d4..a66432dd9 100644
--- a/src/sbus/sssd_dbus_introspect.c
+++ b/src/sbus/sssd_dbus_introspect.c
@@ -34,7 +34,7 @@
"<!DOCTYPE node PUBLIC \"-//freedesktop//DTD D-BUS Object Introspection 1.0//EN\"\n" \
" \"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd\">\n"
-#define FMT_NODE "<node>\n"
+#define FMT_NODE "<node name=\"%s\">\n"
#define FMT_IFACE " <interface name=\"%s\">\n"
#define FMT_METHOD " <method name=\"%s\">\n"
#define FMT_METHOD_NOARG " <method name=\"%s\" />\n"
@@ -46,6 +46,7 @@
#define FMT_SIGNAL_CLOSE " </signal>\n"
#define FMT_PROPERTY " <property name=\"%s\" type=\"%s\" access=\"%s\" />\n"
#define FMT_IFACE_CLOSE " </interface>\n"
+#define FMT_CHILD_NODE " <node name=\"%s\" />\n"
#define FMT_NODE_CLOSE "</node>\n"
#define WRITE_OR_FAIL(file, ret, label, fmt, ...) do { \
@@ -294,8 +295,31 @@ done:
return ret;
}
+static int
+sbus_introspect_generate_nodes(FILE *file, const char **nodes)
+{
+ int ret;
+ int i;
+
+ if (nodes == NULL) {
+ return EOK;
+ }
+
+ for (i = 0; nodes[i] != NULL; i++) {
+ WRITE_OR_FAIL(file, ret, done, FMT_CHILD_NODE, nodes[i]);
+ }
+
+ ret = EOK;
+
+done:
+ return ret;
+}
+
static char *
-sbus_introspect_generate(TALLOC_CTX *mem_ctx, struct sbus_interface_list *list)
+sbus_introspect_generate(TALLOC_CTX *mem_ctx,
+ const char *node,
+ const char **nodes,
+ struct sbus_interface_list *list)
{
struct sbus_interface_list *item;
char *introspect = NULL;
@@ -310,7 +334,7 @@ sbus_introspect_generate(TALLOC_CTX *mem_ctx, struct sbus_interface_list *list)
}
WRITE_OR_FAIL(memstream, ret, done, FMT_DOCTYPE);
- WRITE_OR_FAIL(memstream, ret, done, FMT_NODE);
+ WRITE_OR_FAIL(memstream, ret, done, FMT_NODE, node);
DLIST_FOR_EACH(item, list) {
ret = sbus_introspect_generate_iface(memstream, item->interface);
@@ -319,6 +343,11 @@ sbus_introspect_generate(TALLOC_CTX *mem_ctx, struct sbus_interface_list *list)
}
}
+ ret = sbus_introspect_generate_nodes(memstream, nodes);
+ if (ret != EOK) {
+ goto done;
+ }
+
WRITE_OR_FAIL(memstream, ret, done, FMT_NODE_CLOSE);
fflush(memstream);
@@ -341,6 +370,7 @@ sbus_introspect(struct sbus_request *sbus_req, void *pvt)
DBusError *error;
struct sbus_interface_list *list;
struct sbus_connection *conn;
+ const char **nodes;
char *introspect;
errno_t ret;
@@ -354,7 +384,10 @@ sbus_introspect(struct sbus_request *sbus_req, void *pvt)
return sbus_request_fail_and_finish(sbus_req, error);
}
- introspect = sbus_introspect_generate(sbus_req, list);
+ nodes = sbus_nodes_hash_lookup(sbus_req, conn->nodes_fns, sbus_req->path);
+
+ introspect = sbus_introspect_generate(sbus_req, sbus_req->path,
+ nodes, list);
if (introspect == NULL) {
ret = ENOMEM;
goto done;