static int add_interface(struct supplicant_task *task) { const char *driver = connman_option_get_string("wifi"); DBusMessage *message; DBusMessageIter array, dict; DBusPendingCall *call; _DBG_SUPPLICANT("task %p", task); message = dbus_message_new_method_call(SUPPLICANT_NAME, SUPPLICANT_PATH, SUPPLICANT_INTF, "addInterface"); if (message == NULL) return -ENOMEM; dbus_message_set_auto_start(message, FALSE); dbus_message_iter_init_append(message, &array); dbus_message_iter_append_basic(&array, DBUS_TYPE_STRING, &task->ifname); dbus_message_iter_open_container(&array, DBUS_TYPE_ARRAY, DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING DBUS_TYPE_STRING_AS_STRING DBUS_TYPE_VARIANT_AS_STRING DBUS_DICT_ENTRY_END_CHAR_AS_STRING, &dict); connman_dbus_dict_append_variant(&dict, "driver", DBUS_TYPE_STRING, &driver); dbus_message_iter_close_container(&array, &dict); if (dbus_connection_send_with_reply(connection, message, &call, TIMEOUT) == FALSE) { connman_error("Failed to add interface"); dbus_message_unref(message); return -EIO; } if (call == NULL) { connman_error("D-Bus connection not available"); dbus_message_unref(message); return -EIO; } dbus_pending_call_set_notify(call, add_interface_reply, task, NULL); dbus_message_unref(message); return -EINPROGRESS; }
static int wispr_portal_detect(struct connman_wispr_portal_context *wp_context) { enum connman_service_proxy_method proxy_method; enum connman_service_type service_type; char *interface = NULL; char **nameservers = NULL; int if_index; int err = 0; int i; DBG("wispr/portal context %p", wp_context); DBG("service %p", wp_context->service); service_type = connman_service_get_type(wp_context->service); switch (service_type) { case CONNMAN_SERVICE_TYPE_ETHERNET: case CONNMAN_SERVICE_TYPE_WIFI: case CONNMAN_SERVICE_TYPE_BLUETOOTH: case CONNMAN_SERVICE_TYPE_CELLULAR: case CONNMAN_SERVICE_TYPE_GADGET: break; case CONNMAN_SERVICE_TYPE_UNKNOWN: case CONNMAN_SERVICE_TYPE_SYSTEM: case CONNMAN_SERVICE_TYPE_GPS: case CONNMAN_SERVICE_TYPE_VPN: case CONNMAN_SERVICE_TYPE_P2P: return -EOPNOTSUPP; } interface = connman_service_get_interface(wp_context->service); if (!interface) return -EINVAL; DBG("interface %s", interface); if_index = connman_inet_ifindex(interface); if (if_index < 0) { DBG("Could not get ifindex"); err = -EINVAL; goto done; } nameservers = connman_service_get_nameservers(wp_context->service); if (!nameservers) { DBG("Could not get nameservers"); err = -EINVAL; goto done; } wp_context->web = g_web_new(if_index); if (!wp_context->web) { DBG("Could not set up GWeb"); err = -ENOMEM; goto done; } if (getenv("CONNMAN_WEB_DEBUG")) g_web_set_debug(wp_context->web, web_debug, "WEB"); if (wp_context->type == CONNMAN_IPCONFIG_TYPE_IPV4) { g_web_set_address_family(wp_context->web, AF_INET); wp_context->status_url = connman_option_get_string(CONF_STATUS_URL_IPV4); } else { g_web_set_address_family(wp_context->web, AF_INET6); wp_context->status_url = connman_option_get_string(CONF_STATUS_URL_IPV6); } for (i = 0; nameservers[i]; i++) g_web_add_nameserver(wp_context->web, nameservers[i]); proxy_method = connman_service_get_proxy_method(wp_context->service); DBG("Proxy method %d",proxy_method); if (proxy_method != CONNMAN_SERVICE_PROXY_METHOD_DIRECT) { wp_context->token = connman_proxy_lookup(interface, wp_context->status_url, wp_context->service, proxy_callback, wp_context); if (wp_context->token == 0) { err = -EINVAL; free_connman_wispr_portal_context(wp_context); } } else if (wp_context->timeout == 0) { wp_context->timeout = g_timeout_add_seconds(0, no_proxy_callback, wp_context); } done: g_strfreev(nameservers); g_free(interface); return err; }