static bool CALESetUpDBus(CALEContext * context) { assert(context != NULL); bool success = false; GError * error = NULL; /* Set up connection to the D-Bus system bus, where the BlueZ daemon is found. */ GDBusConnection * const connection = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error); if (connection == NULL) { OIC_LOG_V(ERROR, TAG, "Connection to D-Bus system bus failed: %s.", error->message); g_error_free(error); return success; } // Create a proxy to the BlueZ D-Bus ObjectManager. static char const object_manager_path[] = "/"; GDBusObjectManager * const object_manager = g_dbus_object_manager_client_new_sync( connection, G_DBUS_OBJECT_MANAGER_CLIENT_FLAGS_NONE, BLUEZ_NAME, object_manager_path, NULL, // get_proxy_type_func NULL, // get_proxy_type_user_data NULL, // get_proxy_type_destroy_notify NULL, // cancellable &error); if (object_manager == NULL) { OIC_LOG_V(ERROR, TAG, "Unable to create D-Bus ObjectManager client: %s", error->message); g_error_free(error); g_object_unref(connection); return success; } CALESubscribeToSignals(context, connection, object_manager); ca_mutex_lock(context->lock); context->connection = connection; context->object_manager = object_manager; ca_mutex_unlock(context->lock); success = CALESetUpBlueZObjects(context); return success; }
static int enable_func(void *data) { struct gt_gadget_enable_data *dt; dt = (struct gt_gadget_enable_data *)data; /* TODO add support for enabling well known UDC */ GVariant *gret; GError *error = NULL; GDBusObjectManager *manager; GList *objects; GList *l; const gchar *obj_path = NULL; _cleanup_g_free_ gchar *g_path = NULL; const gchar *msg = NULL; gboolean out_gadget_enabled = 0; gret = g_dbus_connection_call_sync(backend_ctx.gadgetd_conn, "org.usb.gadgetd", "/org/usb/Gadget", "org.usb.device.GadgetManager", "FindGadgetByName", g_variant_new("(s)", dt->gadget), NULL, G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error); if (error) { fprintf(stderr, "Failed to get gadget, %s\n", error->message); return -1; } g_variant_get(gret, "(o)", &g_path); g_variant_unref(gret); manager = g_dbus_object_manager_client_new_sync(backend_ctx.gadgetd_conn, G_DBUS_OBJECT_MANAGER_CLIENT_FLAGS_NONE, "org.usb.gadgetd", "/org/usb/Gadget", NULL, NULL, NULL, NULL, &error); if (error) { fprintf(stderr, "Failed to get dbus object manager, %s\n", error->message); return -1; } /* get first "free" udc and enable gadget */ objects = g_dbus_object_manager_get_objects(manager); for (l = objects; l != NULL; l = l->next) { GDBusObject *object = G_DBUS_OBJECT(l->data); obj_path = g_dbus_object_get_object_path(G_DBUS_OBJECT(object)); if (g_str_has_prefix(obj_path, "/org/usb/Gadget/UDC")) { obj_path = g_dbus_object_get_object_path(G_DBUS_OBJECT(object)); gret = g_dbus_connection_call_sync(backend_ctx.gadgetd_conn, "org.usb.gadgetd", obj_path, "org.usb.device.UDC", "EnableGadget", g_variant_new("(o)", g_path), NULL, G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error); if (error) { msg = error->message; goto out; } g_variant_get(gret, "(b)", &out_gadget_enabled); if (out_gadget_enabled) { g_variant_unref(gret); goto out; } } } if (l == NULL) { fprintf(stderr, "Failed to enable gadget, no UDC found\n"); return -1; } out: g_list_foreach(objects, (GFunc)g_object_unref, NULL); g_list_free(objects); g_object_unref(manager); if (msg != NULL) { fprintf(stderr, "Failed to enable gadget, %s\n", msg); return -1; } return 0; }