mirror of git://git.sysmocom.de/ofono
173 lines
4.2 KiB
C
173 lines
4.2 KiB
C
/*
|
|
*
|
|
* oFono - Open Source Telephony
|
|
*
|
|
* Copyright (C) 2017 Kerlink SA.
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License version 2 as
|
|
* published by the Free Software Foundation.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
*/
|
|
|
|
#ifdef HAVE_CONFIG_H
|
|
#include <config.h>
|
|
#endif
|
|
|
|
#include <errno.h>
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
|
|
#include <glib.h>
|
|
|
|
#define OFONO_API_SUBJECT_TO_CHANGE
|
|
#include <ofono/modem.h>
|
|
#include <ofono/gprs-provision.h>
|
|
#include <ofono/log.h>
|
|
#include <ofono/plugin.h>
|
|
|
|
#define CONFIG_FILE STORAGEDIR "/provisioning"
|
|
|
|
static int config_file_provision_get_settings(const char *mcc,
|
|
const char *mnc, const char *spn,
|
|
struct ofono_gprs_provision_data **settings,
|
|
int *count)
|
|
{
|
|
int result = 0;
|
|
GKeyFile *key_file = NULL;
|
|
char *setting_group = NULL;
|
|
char *value;
|
|
|
|
DBG("Finding settings for MCC %s, MNC %s, SPN '%s'", mcc, mnc, spn);
|
|
|
|
*count = 0;
|
|
*settings = NULL;
|
|
|
|
key_file = g_key_file_new();
|
|
|
|
if (!g_key_file_load_from_file(key_file, CONFIG_FILE, 0, NULL)) {
|
|
result = -ENOENT;
|
|
goto error;
|
|
}
|
|
|
|
setting_group = g_try_malloc(strlen("operator:") + strlen(mcc) +
|
|
strlen(mnc) + 2);
|
|
if (setting_group == NULL) {
|
|
result = -ENOMEM;
|
|
goto error;
|
|
}
|
|
|
|
sprintf(setting_group, "operator:%s,%s", mcc, mnc);
|
|
|
|
value = g_key_file_get_string(key_file, setting_group,
|
|
"internet.AccessPointName", NULL);
|
|
|
|
if (value == NULL)
|
|
goto error;
|
|
|
|
*settings = g_try_new0(struct ofono_gprs_provision_data, 1);
|
|
if (*settings == NULL) {
|
|
result = -ENOMEM;
|
|
goto error;
|
|
}
|
|
|
|
*count = 1;
|
|
|
|
(*settings)[0].type = OFONO_GPRS_CONTEXT_TYPE_INTERNET;
|
|
(*settings)[0].apn = value;
|
|
|
|
value = g_key_file_get_string(key_file, setting_group,
|
|
"internet.Username", NULL);
|
|
|
|
if (value != NULL)
|
|
(*settings)[0].username = value;
|
|
|
|
value = g_key_file_get_string(key_file, setting_group,
|
|
"internet.Password", NULL);
|
|
|
|
if (value != NULL)
|
|
(*settings)[0].password = value;
|
|
|
|
/* select default authentication method */
|
|
(*settings)[0].auth_method = OFONO_GPRS_AUTH_METHOD_NONE;
|
|
|
|
value = g_key_file_get_string(key_file, setting_group,
|
|
"internet.AuthenticationMethod", NULL);
|
|
|
|
if (value != NULL) {
|
|
if (g_strcmp0(value, "chap") == 0)
|
|
(*settings)[0].auth_method =
|
|
OFONO_GPRS_AUTH_METHOD_CHAP;
|
|
else if (g_strcmp0(value, "pap") == 0)
|
|
(*settings)[0].auth_method =
|
|
OFONO_GPRS_AUTH_METHOD_PAP;
|
|
else if (g_strcmp0(value, "none") != 0)
|
|
DBG("Unknown auth method: %s", value);
|
|
|
|
g_free(value);
|
|
}
|
|
|
|
(*settings)[0].proto = OFONO_GPRS_PROTO_IP;
|
|
value = g_key_file_get_string(key_file, setting_group,
|
|
"internet.Protocol", NULL);
|
|
|
|
if (value != NULL) {
|
|
DBG("CRO value:%s", value);
|
|
if (g_strcmp0(value, "ip") == 0) {
|
|
DBG("CRO value=ip");
|
|
(*settings)[0].proto = OFONO_GPRS_PROTO_IP;
|
|
} else if (g_strcmp0(value, "ipv6") == 0) {
|
|
DBG("CRO value=ipv6");
|
|
(*settings)[0].proto = OFONO_GPRS_PROTO_IPV6;
|
|
} else if (g_strcmp0(value, "dual") == 0)
|
|
(*settings)[0].proto = OFONO_GPRS_PROTO_IPV4V6;
|
|
else
|
|
DBG("Unknown protocol: %s", value);
|
|
|
|
g_free(value);
|
|
}
|
|
|
|
error:
|
|
if (key_file != NULL)
|
|
g_key_file_free(key_file);
|
|
|
|
if (setting_group != NULL)
|
|
g_free(setting_group);
|
|
|
|
if (result == 0 && *count > 0)
|
|
DBG("Found. APN:%s, proto:%d, auth_method:%d",
|
|
(*settings)[0].apn, (*settings)[0].proto,
|
|
(*settings)[0].auth_method);
|
|
else
|
|
DBG("Not found. Result:%d", result);
|
|
|
|
return result;
|
|
}
|
|
|
|
static struct ofono_gprs_provision_driver config_file_provision_driver = {
|
|
.name = "GPRS context provisioning",
|
|
.get_settings = config_file_provision_get_settings,
|
|
};
|
|
|
|
static int config_file_provision_init(void)
|
|
{
|
|
return ofono_gprs_provision_driver_register(
|
|
&config_file_provision_driver);
|
|
}
|
|
|
|
static void config_file_provision_exit(void)
|
|
{
|
|
ofono_gprs_provision_driver_unregister(
|
|
&config_file_provision_driver);
|
|
}
|
|
|
|
OFONO_PLUGIN_DEFINE(file_provision, "Gprs Provisioning Plugin",
|
|
VERSION, OFONO_PLUGIN_PRIORITY_HIGH,
|
|
config_file_provision_init,
|
|
config_file_provision_exit)
|