Пример #1
0
static void provider_resolv_host_addr(struct connman_provider *provider)
{
	if (provider->host == NULL)
		return;

	if (connman_inet_check_ipaddress(provider->host) > 0)
		return;

	if (provider->host_ip != NULL)
		return;

	/*
	 * If the hostname is not numeric, try to resolv it. We do not wait
	 * the result as it might take some time. We will get the result
	 * before VPN will feed routes to us because VPN client will need
	 * the IP address also before VPN connection can be established.
	 */
	provider->resolv = g_resolv_new(0);
	if (provider->resolv == NULL) {
		DBG("Cannot resolv %s", provider->host);
		return;
	}

	DBG("Trying to resolv %s", provider->host);

	connman_provider_ref(provider);

	g_resolv_lookup_hostname(provider->resolv, provider->host,
				resolv_result, provider);
}
Пример #2
0
static int vpn_connect(struct connman_provider *provider)
{
    struct vpn_data *data = connman_provider_get_data(provider);
    struct vpn_driver_data *vpn_driver_data;
    const char *name;
    int ret = 0;

    if (data != NULL)
        return -EISCONN;

    data = g_try_new0(struct vpn_data, 1);
    if (data == NULL)
        return -ENOMEM;

    data->provider = connman_provider_ref(provider);
    data->watch = 0;
    data->flags = 0;
    data->task = NULL;
    data->state = VPN_STATE_IDLE;

    connman_provider_set_data(provider, data);

    name = connman_provider_get_driver_name(provider);
    if (name == NULL)
        return -EINVAL;

    vpn_driver_data = g_hash_table_lookup(driver_hash, name);

    if (vpn_driver_data != NULL && vpn_driver_data->vpn_driver != NULL &&
            vpn_driver_data->vpn_driver->flags != VPN_FLAG_NO_TUN) {

        ret = vpn_create_tun(provider);
        if (ret < 0)
            goto exist_err;
    }

    data->task = connman_task_create(vpn_driver_data->program);

    if (data->task == NULL) {
        ret = -ENOMEM;
        stop_vpn(provider);
        goto exist_err;
    }

    if (connman_task_set_notify(data->task, "notify",
                                vpn_notify, provider)) {
        ret = -ENOMEM;
        stop_vpn(provider);
        connman_task_destroy(data->task);
        data->task = NULL;
        goto exist_err;
    }

    ret = vpn_driver_data->vpn_driver->connect(provider, data->task,
            data->if_name);
    if (ret < 0) {
        stop_vpn(provider);
        connman_task_destroy(data->task);
        data->task = NULL;
        goto exist_err;
    }

    DBG("%s started with dev %s",
        vpn_driver_data->provider_driver.name, data->if_name);

    data->state = VPN_STATE_CONNECT;

    return -EINPROGRESS;

exist_err:
    connman_provider_set_index(provider, -1);
    connman_provider_set_data(provider, NULL);
    connman_provider_unref(data->provider);
    g_free(data->if_name);
    g_free(data);

    return ret;
}