ofono/plugins/file-provision.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)