void hcid_dbus_unregister(void) { DBusConnection *conn = get_dbus_connection(); char **children; int i; uint16_t dev_id; if (!conn || !dbus_connection_get_is_connected(conn)) return; /* Unregister all paths in Adapter path hierarchy */ if (!dbus_connection_list_registered(conn, "/", &children)) return; for (i = 0; children[i]; i++) { char path[MAX_PATH_LENGTH]; struct btd_adapter *adapter; if (children[i][0] != 'h') continue; snprintf(path, sizeof(path), "/%s", children[i]); adapter = manager_find_adapter_by_path(path); if (!adapter) continue; dev_id = adapter_get_dev_id(adapter); manager_unregister_adapter(dev_id); } dbus_free_string_array(children); }
void DBus_InterpCleanup(Tcl_Interp *interp, DBusConnection *conn, char *path) { char **entries, **entry, *newpath, *pathentry; Tcl_DBusHandlerData *data; dbus_connection_get_object_path_data(conn, path, (void **)&data); if (data != NULL) { if (DBus_HandlerCleanup(interp, data)) { dbus_connection_unregister_object_path(conn, path); ckfree((char *)data); } } dbus_connection_list_registered(conn, path, &entries); if (*entries != NULL) { newpath = ckalloc(strlen(path) + 256); strcpy(newpath, path); pathentry = newpath + strlen(path) - 1; if (*pathentry++ != '/') *pathentry++ = '/'; for (entry = entries; *entry != NULL; entry++) { strncpy(pathentry, *entry, 255); /* Get a list of descendents from the child */ DBus_InterpCleanup(interp, conn, newpath); } ckfree(newpath); } /* Release the entries array */ dbus_free_string_array(entries); }
static void recursive_flush_changed_properties(DBusConnection *con, const char *path) { char **objects = NULL; char subobj_path[WPAS_DBUS_OBJECT_PATH_MAX]; int i; wpa_dbus_flush_object_changed_properties(con, path); if (!dbus_connection_list_registered(con, path, &objects)) goto out; for (i = 0; objects[i]; i++) { os_snprintf(subobj_path, WPAS_DBUS_OBJECT_PATH_MAX, "%s/%s", path, objects[i]); recursive_flush_changed_properties(con, subobj_path); } out: dbus_free_string_array(objects); }
static void generate_introspection_xml(DBusConnection *conn, struct generic_data *data, const char *path) { GSList *list; GString *gstr; char **children; int i; g_free(data->introspect); gstr = g_string_new(DBUS_INTROSPECT_1_0_XML_DOCTYPE_DECL_NODE); g_string_append_printf(gstr, "<node>\n"); for (list = data->interfaces; list; list = list->next) { struct interface_data *iface = list->data; g_string_append_printf(gstr, "\t<interface name=\"%s\">\n", iface->name); generate_interface_xml(gstr, iface); g_string_append_printf(gstr, "\t</interface>\n"); } if (!dbus_connection_list_registered(conn, path, &children)) goto done; for (i = 0; children[i]; i++) g_string_append_printf(gstr, "\t<node name=\"%s\"/>\n", children[i]); dbus_free_string_array(children); done: g_string_append_printf(gstr, "</node>\n"); data->introspect = g_string_free(gstr, FALSE); }
static Tcl_Obj *DBus_ListListeners(Tcl_Interp *interp, Tcl_DBusBus *dbus, const char *path, int flags) { Tcl_Obj *list, *sublist; char **entries, **entry, *newpath, *pathentry, *s; Tcl_DBusHandlerData *data; Tcl_DBusSignalData *signal; Tcl_DBusMethodData *method; Tcl_HashTable *interps; Tcl_HashEntry *memberPtr, *interpPtr; Tcl_HashSearch search; list = Tcl_NewObj(); /* Check if the specified path has a handler defined */ if (*path == '\0') data = dbus->fallback; else dbus_connection_get_object_path_data(dbus->conn, path, (void **)&data); if (data != NULL) { if ((flags & DBUS_METHODFLAG) == 0 && data->signal != NULL) { for (memberPtr = Tcl_FirstHashEntry(data->signal, &search); memberPtr != NULL; memberPtr = Tcl_NextHashEntry(&search)) { interps = Tcl_GetHashValue(memberPtr); interpPtr = Tcl_FindHashEntry(interps, (char *) interp); if (interpPtr != NULL) { signal = Tcl_GetHashValue(interpPtr); /* Report both the path and the script configured for the path */ Tcl_ListObjAppendElement(NULL, list, Tcl_NewStringObj(path, -1)); s = Tcl_GetHashKey(data->signal, memberPtr); Tcl_ListObjAppendElement(NULL, list, Tcl_NewStringObj(s, -1)); Tcl_ListObjAppendElement(NULL, list, signal->script); } } } else if ((flags & DBUS_METHODFLAG) != 0 && data->method != NULL) { for (memberPtr = Tcl_FirstHashEntry(data->method, &search); memberPtr != NULL; memberPtr = Tcl_NextHashEntry(&search)) { method = Tcl_GetHashValue(memberPtr); if (method->interp == interp) { s = Tcl_GetHashKey(data->method, memberPtr); /* Normally skip unknown handlers. But when listing */ /* unknown handlers, skip all named handlers. */ if (!(flags & DBUS_UNKNOWNFLAG) == (*s == '\0')) continue; /* Report both the path and the script configured for the path */ Tcl_ListObjAppendElement(NULL, list, Tcl_NewStringObj(path, -1)); /* There is no method name for unknown handlers */ if (!(flags & DBUS_UNKNOWNFLAG)) Tcl_ListObjAppendElement(NULL, list, Tcl_NewStringObj(s, -1)); Tcl_ListObjAppendElement(NULL, list, method->script); } } } } if (flags & DBUS_RECURSEFLAG) { /* Get a list of children of the current path */ dbus_connection_list_registered(dbus->conn, path, &entries); /* Allocate space for concatenating the path and a childs name */ newpath = ckalloc(strlen(path) + 256); /* Copy the path in the allocated space, making sure it ends with a / */ strcpy(newpath, path); pathentry = newpath + strlen(path) - 1; if (*pathentry++ != '/') *pathentry++ = '/'; /* Append each childs name to the path in turn */ for (entry = entries; *entry != NULL; entry++) { strncpy(pathentry, *entry, 255); /* Get a list of descendents from the child */ sublist = DBus_ListListeners(interp, dbus, newpath, flags); /* Append the sublist entries to the total list */ Tcl_ListObjAppendList(NULL, list, sublist); /* Release the temporary sublist */ Tcl_DecrRefCount(sublist); } /* Release the entries array */ dbus_free_string_array(entries); ckfree(newpath); } return list; }