18d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* 28d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpa_supplicant - D-Bus introspection 38d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Copyright (c) 2006, Dan Williams <dcbw@redhat.com> and Red Hat, Inc. 48d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Copyright (c) 2009, Witold Sowa <witold.sowa@gmail.com> 58d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Copyright (c) 2010, Jouni Malinen <j@w1.fi> 68d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * This software may be distributed under the terms of the BSD license. 804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * See README for more details. 98d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "utils/includes.h" 128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "utils/common.h" 148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "utils/list.h" 158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "utils/wpabuf.h" 168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "dbus_common_i.h" 178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "dbus_new_helpers.h" 188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstruct interfaces { 218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct dl_list list; 228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *dbus_interface; 238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpabuf *xml; 248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}; 258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic struct interfaces * add_interface(struct dl_list *list, 288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *dbus_interface) 298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct interfaces *iface; 318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dl_list_for_each(iface, list, struct interfaces, list) { 338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strcmp(iface->dbus_interface, dbus_interface) == 0) 348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return iface; /* already in the list */ 358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt iface = os_zalloc(sizeof(struct interfaces)); 388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!iface) 398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 40746bde5f922dfd627d25111da4313395bc4ed6afDmitry Shmidt iface->dbus_interface = os_strdup(dbus_interface); 418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt iface->xml = wpabuf_alloc(6000); 42746bde5f922dfd627d25111da4313395bc4ed6afDmitry Shmidt if (iface->dbus_interface == NULL || iface->xml == NULL) { 43746bde5f922dfd627d25111da4313395bc4ed6afDmitry Shmidt os_free(iface->dbus_interface); 44746bde5f922dfd627d25111da4313395bc4ed6afDmitry Shmidt wpabuf_free(iface->xml); 458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(iface); 468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpabuf_printf(iface->xml, "<interface name=\"%s\">", dbus_interface); 498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dl_list_add_tail(list, &iface->list); 508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return iface; 518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void add_arg(struct wpabuf *xml, const char *name, const char *type, 558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *direction) 568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpabuf_printf(xml, "<arg name=\"%s\"", name); 588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (type) 598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpabuf_printf(xml, " type=\"%s\"", type); 608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (direction) 618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpabuf_printf(xml, " direction=\"%s\"", direction); 628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpabuf_put_str(xml, "/>"); 638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void add_entry(struct wpabuf *xml, const char *type, const char *name, 678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const struct wpa_dbus_argument *args, int include_dir) 688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const struct wpa_dbus_argument *arg; 708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (args == NULL || args->name == NULL) { 728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpabuf_printf(xml, "<%s name=\"%s\"/>", type, name); 738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpabuf_printf(xml, "<%s name=\"%s\">", type, name); 768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (arg = args; arg && arg->name; arg++) { 778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt add_arg(xml, arg->name, arg->type, 788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt include_dir ? (arg->dir == ARG_IN ? "in" : "out") : 798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt NULL); 808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpabuf_printf(xml, "</%s>", type); 828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void add_property(struct wpabuf *xml, 868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const struct wpa_dbus_property_desc *dsc) 878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt wpabuf_printf(xml, "<property name=\"%s\" type=\"%s\" " 891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "access=\"%s%s\"/>", 908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dsc->dbus_property, dsc->type, 911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dsc->getter ? "read" : "", 921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dsc->setter ? "write" : ""); 938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void extract_interfaces_methods( 978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct dl_list *list, const struct wpa_dbus_method_desc *methods) 988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const struct wpa_dbus_method_desc *dsc; 1008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct interfaces *iface; 101fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt 1028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (dsc = methods; dsc && dsc->dbus_method; dsc++) { 1038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt iface = add_interface(list, dsc->dbus_interface); 1048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (iface) 1058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt add_entry(iface->xml, "method", dsc->dbus_method, 1068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dsc->args, 1); 1078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void extract_interfaces_signals( 1128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct dl_list *list, const struct wpa_dbus_signal_desc *signals) 1138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const struct wpa_dbus_signal_desc *dsc; 1158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct interfaces *iface; 116fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt 1178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (dsc = signals; dsc && dsc->dbus_signal; dsc++) { 1188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt iface = add_interface(list, dsc->dbus_interface); 1198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (iface) 1208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt add_entry(iface->xml, "signal", dsc->dbus_signal, 1218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dsc->args, 0); 1228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void extract_interfaces_properties( 1278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct dl_list *list, const struct wpa_dbus_property_desc *properties) 1288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const struct wpa_dbus_property_desc *dsc; 1308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct interfaces *iface; 131fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt 1328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (dsc = properties; dsc && dsc->dbus_property; dsc++) { 1338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt iface = add_interface(list, dsc->dbus_interface); 1348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (iface) 1358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt add_property(iface->xml, dsc); 1368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 1418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * extract_interfaces - Extract interfaces from methods, signals and props 1428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @list: Interface list to be filled 1438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @obj_dsc: Description of object from which interfaces will be extracted 1448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 1458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Iterates over all methods, signals, and properties registered with an 1468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * object and collects all declared DBus interfaces and create interfaces' 1478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * node in XML root node for each. Returned list elements contain interface 1488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * name and XML node of corresponding interface. 1498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 1508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void extract_interfaces(struct dl_list *list, 1518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_dbus_object_desc *obj_dsc) 1528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt extract_interfaces_methods(list, obj_dsc->methods); 1548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt extract_interfaces_signals(list, obj_dsc->signals); 1558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt extract_interfaces_properties(list, obj_dsc->properties); 1568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void add_interfaces(struct dl_list *list, struct wpabuf *xml) 1608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct interfaces *iface, *n; 162fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt 1638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dl_list_for_each_safe(iface, n, list, struct interfaces, list) { 1648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpabuf_len(iface->xml) + 20 < wpabuf_tailroom(xml)) { 1658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpabuf_put_buf(xml, iface->xml); 1668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpabuf_put_str(xml, "</interface>"); 167c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt } else { 168fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt wpa_printf(MSG_DEBUG, 169fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt "dbus: Not enough room for add_interfaces inspect data: tailroom %u, add %u", 170c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt (unsigned int) wpabuf_tailroom(xml), 171c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt (unsigned int) wpabuf_len(iface->xml)); 1728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dl_list_del(&iface->list); 1748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpabuf_free(iface->xml); 1758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(iface->dbus_interface); 1768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(iface); 1778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void add_child_nodes(struct wpabuf *xml, DBusConnection *con, 1828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *path) 1838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char **children; 1858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int i; 1868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* add child nodes to introspection tree */ 1888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_connection_list_registered(con, path, &children); 1898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (i = 0; children[i]; i++) 1908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpabuf_printf(xml, "<node name=\"%s\"/>", children[i]); 1918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_free_string_array(children); 1928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void add_introspectable_interface(struct wpabuf *xml) 1968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpabuf_printf(xml, "<interface name=\"%s\">" 1988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<method name=\"%s\">" 1998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<arg name=\"data\" type=\"s\" direction=\"out\"/>" 2008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "</method>" 2018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "</interface>", 2028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WPA_DBUS_INTROSPECTION_INTERFACE, 2038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WPA_DBUS_INTROSPECTION_METHOD); 2048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 2058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void add_properties_interface(struct wpabuf *xml) 2088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 2098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpabuf_printf(xml, "<interface name=\"%s\">", 2108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WPA_DBUS_PROPERTIES_INTERFACE); 2118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpabuf_printf(xml, "<method name=\"%s\">", WPA_DBUS_PROPERTIES_GET); 2138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt add_arg(xml, "interface", "s", "in"); 2148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt add_arg(xml, "propname", "s", "in"); 2158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt add_arg(xml, "value", "v", "out"); 2168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpabuf_put_str(xml, "</method>"); 2178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpabuf_printf(xml, "<method name=\"%s\">", WPA_DBUS_PROPERTIES_GETALL); 2198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt add_arg(xml, "interface", "s", "in"); 2208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt add_arg(xml, "props", "a{sv}", "out"); 2218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpabuf_put_str(xml, "</method>"); 2228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpabuf_printf(xml, "<method name=\"%s\">", WPA_DBUS_PROPERTIES_SET); 2248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt add_arg(xml, "interface", "s", "in"); 2258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt add_arg(xml, "propname", "s", "in"); 2268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt add_arg(xml, "value", "v", "in"); 2278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpabuf_put_str(xml, "</method>"); 2288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpabuf_put_str(xml, "</interface>"); 2308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 2318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void add_wpas_interfaces(struct wpabuf *xml, 2348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_dbus_object_desc *obj_dsc) 2358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 2368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct dl_list ifaces; 237fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt 2388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dl_list_init(&ifaces); 2398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt extract_interfaces(&ifaces, obj_dsc); 2408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt add_interfaces(&ifaces, xml); 2418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 2428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 2458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpa_dbus_introspect - Responds for Introspect calls on object 2468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Message with Introspect call 2478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @obj_dsc: Object description on which Introspect was called 2488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: Message with introspection result XML string as only argument 2498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 2508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Iterates over all methods, signals and properties registered with 2518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * object and generates introspection data for the object as XML string. 2528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 2538d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpa_dbus_introspect(DBusMessage *message, 2548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_dbus_object_desc *obj_dsc) 2558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 2568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply; 2588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpabuf *xml; 2598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 260c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt xml = wpabuf_alloc(10000); 2618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (xml == NULL) 2628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 2638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpabuf_put_str(xml, "<?xml version=\"1.0\"?>\n"); 2658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpabuf_put_str(xml, DBUS_INTROSPECT_1_0_XML_DOCTYPE_DECL_NODE); 2668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpabuf_put_str(xml, "<node>"); 2678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt add_introspectable_interface(xml); 2698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt add_properties_interface(xml); 2708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt add_wpas_interfaces(xml, obj_dsc); 2718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt add_child_nodes(xml, obj_dsc->connection, 2728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_get_path(message)); 2738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpabuf_put_str(xml, "</node>\n"); 2758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = dbus_message_new_method_return(message); 2778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (reply) { 2788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *intro_str = wpabuf_head(xml); 279fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt 2808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_append_args(reply, DBUS_TYPE_STRING, &intro_str, 2818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_INVALID); 2828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpabuf_free(xml); 2848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 2868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 287