static void gsm_end(GMarkupParseContext *context, const gchar *element_name, gpointer userdata, GError **error) { struct gsm_data *gsm; struct ofono_gprs_provision_data *ap; if (!g_str_equal(element_name, "apn")) return; gsm = userdata; ap = g_markup_parse_context_pop(context); if (ap == NULL) return; if (gsm->allow_duplicates == FALSE) { GSList *l; for (l = gsm->apns; l; l = l->next) { struct ofono_gprs_provision_data *pd = l->data; if (pd->type != ap->type) continue; mbpi_g_set_error(context, error, mbpi_error_quark(), MBPI_ERROR_DUPLICATE, "Duplicate context detected"); mbpi_ap_free(ap); return; } } gsm->apns = g_slist_append(gsm->apns, ap); }
static void apn_error(GMarkupParseContext *context, GError *error, gpointer userdata) { /* * Note that even if the error happened in a subparser, this will * be called. So we always perform cleanup of the allocated * provision data */ mbpi_ap_free(userdata); }
GSList *mbpi_lookup_apn(const char *mcc, const char *mnc, gboolean allow_duplicates, GError **error) { struct gsm_data gsm; GSList *l; memset(&gsm, 0, sizeof(gsm)); gsm.match_mcc = mcc; gsm.match_mnc = mnc; gsm.allow_duplicates = allow_duplicates; if (mbpi_parse(&toplevel_gsm_parser, &gsm, error) == FALSE) { for (l = gsm.apns; l; l = l->next) mbpi_ap_free(l->data); g_slist_free(gsm.apns); gsm.apns = NULL; } return gsm.apns; }
static void lookup_apn(const char *match_mcc, const char *match_mnc, gboolean allow_duplicates) { GSList *l; GSList *apns; GError *error = NULL; g_print("Searching for info for network: %s%s\n", match_mcc, match_mnc); apns = mbpi_lookup_apn(match_mcc, match_mnc, OFONO_GPRS_CONTEXT_TYPE_ANY, allow_duplicates, &error); if (apns == NULL) { if (error != NULL) { g_printerr("Lookup failed: %s\n", error->message); g_error_free(error); } return; } for (l = apns; l; l = l->next) { struct ofono_gprs_provision_data *ap = l->data; g_print("\n"); g_print("Name: %s\n", ap->name); g_print("APN: %s\n", ap->apn); g_print("Type: %s\n", mbpi_ap_type(ap->type)); g_print("Username: %s\n", ap->username); g_print("Password: %s\n", ap->password); mbpi_ap_free(ap); } g_slist_free(apns); }
static void provision_free_ap(gpointer data) { mbpi_ap_free(data); }
int provision_get_settings(const char *mcc, const char *mnc, const char *spn, struct ofono_gprs_provision_data **settings, int *count) { GSList *l; GSList *apns; GError *error = NULL; int ap_count; int i; ofono_info("Provisioning for MCC %s, MNC %s, SPN '%s'", mcc, mnc, spn); /* * Passing FALSE to mbpi_lookup_apn() would return * an empty list if duplicates are found. */ apns = mbpi_lookup_apn(mcc, mnc, TRUE, &error); if (error != NULL) { ofono_error("%s", error->message); g_error_free(error); } ofono_info("Found %d APs in MBPI", g_slist_length(apns)); apns = provision_normalize_apn_list(apns, spn); if (apns == NULL) return -ENOENT; ap_count = g_slist_length(apns); ofono_info("Provisioning %d APs", ap_count); *settings = g_try_new0(struct ofono_gprs_provision_data, ap_count); if (*settings == NULL) { ofono_error("Provisioning failed: %s", g_strerror(errno)); for (l = apns; l; l = l->next) mbpi_ap_free(l->data); g_slist_free(apns); return -ENOMEM; } *count = ap_count; for (l = apns, i = 0; l; l = l->next, i++) { struct ofono_gprs_provision_data *ap = l->data; ofono_info("Name: '%s'", ap->name); ofono_info("APN: '%s'", ap->apn); ofono_info("Type: %s", mbpi_ap_type(ap->type)); ofono_info("Username: '******'", ap->username); ofono_info("Password: '******'", ap->password); memcpy(*settings + i, ap, sizeof(struct ofono_gprs_provision_data)); g_free(ap); } g_slist_free(apns); return 0; }
static int provision_get_settings(const char *mcc, const char *mnc, const char *spn, struct ofono_gprs_provision_data **settings, int *count) { GSList *l; GSList *apns; GError *error = NULL; int ap_count; int i; DBG("Provisioning for MCC %s, MNC %s, SPN '%s'", mcc, mnc, spn); /* * TODO: review with upstream. Default behavior was to * disallow duplicate APN entries, which unfortunately exist * in the mobile-broadband-provider-info db. */ apns = mbpi_lookup_apn(mcc, mnc, TRUE, &error); if (apns == NULL) { if (error != NULL) { ofono_error("%s", error->message); g_error_free(error); } return -ENOENT; } ap_count = g_slist_length(apns); DBG("Found %d APs", ap_count); *settings = g_try_new0(struct ofono_gprs_provision_data, ap_count); if (*settings == NULL) { ofono_error("Provisioning failed: %s", g_strerror(errno)); for (l = apns; l; l = l->next) mbpi_ap_free(l->data); g_slist_free(apns); return -ENOMEM; } *count = ap_count; for (l = apns, i = 0; l; l = l->next, i++) { struct ofono_gprs_provision_data *ap = l->data; DBG("Name: '%s'", ap->name); DBG("APN: '%s'", ap->apn); DBG("Type: %s", mbpi_ap_type(ap->type)); DBG("Username: '******'", ap->username); DBG("Password: '******'", ap->password); memcpy(*settings + i, ap, sizeof(struct ofono_gprs_provision_data)); g_free(ap); } g_slist_free(apns); return 0; }