/* * * 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 #endif #include #include #include #include #define OFONO_API_SUBJECT_TO_CHANGE #include #include #include #include #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)