From d88e15979081740b86f48a78c81df56f5122a2c4 Mon Sep 17 00:00:00 2001 From: tick Date: Sat, 1 Dec 2007 01:55:39 +0000 Subject: gsmd: Submitting a PIN for authentication needs to respond with status too.(Andrzej Zaborowski) git-svn-id: http://svn.openmoko.org/trunk/src/target/gsm@3545 99fdad57-331a-0410-800a-d7fa5415bdb3 --- src/gsmd/unsolicited.c | 108 +++++++++++++++++-------------------------------- 1 file changed, 38 insertions(+), 70 deletions(-) (limited to 'src/gsmd/unsolicited.c') diff --git a/src/gsmd/unsolicited.c b/src/gsmd/unsolicited.c index 4819571..b4bf260 100644 --- a/src/gsmd/unsolicited.c +++ b/src/gsmd/unsolicited.c @@ -487,12 +487,40 @@ static int is_in_array(unsigned int val, unsigned int *arr, unsigned int arr_len return 0; } +const int pintype_from_cme[GSM0707_CME_UNKNOWN] = { + [GSM0707_CME_PH_SIM_PIN_REQUIRED] = GSMD_PIN_PH_SIM_PIN, + [GSM0707_CME_PH_FSIM_PIN_REQUIRED] = GSMD_PIN_PH_FSIM_PIN, + [GSM0707_CME_PH_FSIM_PUK_REQUIRED] = GSMD_PIN_PH_FSIM_PUK, + [GSM0707_CME_SIM_PIN_REQUIRED] = GSMD_PIN_SIM_PIN, + [GSM0707_CME_SIM_PUK_REQUIRED] = GSMD_PIN_SIM_PUK, + [GSM0707_CME_SIM_PIN2_REQUIRED] = GSMD_PIN_SIM_PIN2, + [GSM0707_CME_SIM_PUK2_REQUIRED] = GSMD_PIN_SIM_PUK2, + [GSM0707_CME_NETPERS_PIN_REQUIRED] = GSMD_PIN_PH_NET_PIN, + [GSM0707_CME_NETPERS_PUK_REQUIRED] = GSMD_PIN_PH_NET_PUK, + [GSM0707_CME_NETSUBSET_PIN_REQUIRED] = GSMD_PIN_PH_NETSUB_PIN, + [GSM0707_CME_NETSUBSET_PUK_REQUIRED] = GSMD_PIN_PH_NETSUB_PUK, + [GSM0707_CME_PROVIDER_PIN_REQUIRED] = GSMD_PIN_PH_SP_PIN, + [GSM0707_CME_PROVIDER_PUK_REQUIRED] = GSMD_PIN_PH_SP_PUK, + [GSM0707_CME_CORPORATE_PIN_REQUIRED] = GSMD_PIN_PH_CORP_PIN, + [GSM0707_CME_CORPORATE_PUK_REQUIRED] = GSMD_PIN_PH_CORP_PUK, + /* FIXME: */ + [GSM0707_CME_SIM_FAILURE] = 0, + [GSM0707_CME_SIM_BUSY] = 0, + [GSM0707_CME_SIM_WRONG] = 0, + [GSM0707_CME_MEMORY_FULL] = 0, + [GSM0707_CME_MEMORY_FAILURE] = 0, + [GSM0707_CME_PHONE_FAILURE] = 0, + [GSM0707_CME_PHONE_NOCONNECT] = 0, + [GSM0707_CME_PHONE_ADAPT_RESERVED] = 0, + [GSM0707_CME_SIM_NOT_INSERTED] = 0, +}; + int generate_event_from_cme(struct gsmd *g, unsigned int cme_error) { struct gsmd_ucmd *gu; struct gsmd_evt_auxdata *eaux; - if (!is_in_array(cme_error, errors_creating_events, + if (!is_in_array(cme_error, errors_creating_events, ARRAY_SIZE(errors_creating_events))) { gu = usock_build_event(GSMD_MSG_EVENT, GSMD_EVT_IN_ERROR, sizeof(*eaux)); @@ -501,78 +529,18 @@ int generate_event_from_cme(struct gsmd *g, unsigned int cme_error) eaux = ((void *)gu) + sizeof(*gu); eaux->u.cme_err.number = cme_error; return usock_evt_send(g, gu, GSMD_EVT_IN_ERROR); - } - else { - gu = usock_build_event(GSMD_MSG_EVENT, GSMD_EVT_PIN, sizeof(*eaux)); + } else { + if (cme_error >= GSM0707_CME_UNKNOWN || + !pintype_from_cme[cme_error]) + return 0; + + gu = usock_build_event(GSMD_MSG_EVENT, GSMD_EVT_PIN, + sizeof(*eaux)); if (!gu) return -1; + eaux = ((void *)gu) + sizeof(*gu); - - switch (cme_error) { - case GSM0707_CME_PH_SIM_PIN_REQUIRED: - eaux->u.pin.type = GSMD_PIN_PH_SIM_PIN; - break; - case GSM0707_CME_PH_FSIM_PIN_REQUIRED: - eaux->u.pin.type = GSMD_PIN_PH_FSIM_PIN; - break; - case GSM0707_CME_PH_FSIM_PUK_REQUIRED: - eaux->u.pin.type = GSMD_PIN_PH_FSIM_PUK; - break; - case GSM0707_CME_SIM_PIN_REQUIRED: - eaux->u.pin.type = GSMD_PIN_SIM_PIN; - break; - case GSM0707_CME_SIM_PUK_REQUIRED: - eaux->u.pin.type = GSMD_PIN_SIM_PUK; - break; - case GSM0707_CME_SIM_PIN2_REQUIRED: - eaux->u.pin.type = GSMD_PIN_SIM_PIN2; - break; - case GSM0707_CME_SIM_PUK2_REQUIRED: - eaux->u.pin.type = GSMD_PIN_SIM_PUK2; - break; - case GSM0707_CME_NETPERS_PIN_REQUIRED: - eaux->u.pin.type = GSMD_PIN_PH_NET_PIN; - break; - case GSM0707_CME_NETPERS_PUK_REQUIRED: - eaux->u.pin.type = GSMD_PIN_PH_NET_PUK; - break; - case GSM0707_CME_NETSUBSET_PIN_REQUIRED: - eaux->u.pin.type = GSMD_PIN_PH_NETSUB_PIN; - break; - case GSM0707_CME_NETSUBSET_PUK_REQUIRED: - eaux->u.pin.type = GSMD_PIN_PH_NETSUB_PUK; - break; - case GSM0707_CME_PROVIDER_PIN_REQUIRED: - eaux->u.pin.type = GSMD_PIN_PH_SP_PIN; - break; - case GSM0707_CME_PROVIDER_PUK_REQUIRED: - eaux->u.pin.type = GSMD_PIN_PH_SP_PUK; - break; - case GSM0707_CME_CORPORATE_PIN_REQUIRED: - eaux->u.pin.type = GSMD_PIN_PH_CORP_PIN; - break; - case GSM0707_CME_CORPORATE_PUK_REQUIRED: - eaux->u.pin.type = GSMD_PIN_PH_CORP_PUK; - break; - - case GSM0707_CME_SIM_FAILURE: - case GSM0707_CME_SIM_BUSY: - case GSM0707_CME_SIM_WRONG: - case GSM0707_CME_MEMORY_FULL: - case GSM0707_CME_MEMORY_FAILURE: - case GSM0707_CME_PHONE_FAILURE: - case GSM0707_CME_PHONE_NOCONNECT: - case GSM0707_CME_PHONE_ADAPT_RESERVED: - case GSM0707_CME_SIM_NOT_INSERTED: - /* FIXME */ - talloc_free(gu); - return 0; - break; - default: - talloc_free(gu); - return 0; - break; - } + eaux->u.pin.type = pintype_from_cme[cme_error]; return usock_evt_send(g, gu, GSMD_EVT_PIN); } } -- cgit v1.2.3