From 30c802206150291d388c14d9588faf32804d4b18 Mon Sep 17 00:00:00 2001 From: erin_yueh Date: Wed, 12 Dec 2007 12:48:10 +0000 Subject: gsmd: 2nd try for retrieving PIN status (Erin Yueh) git-svn-id: http://svn.openmoko.org/trunk/src/target/gsm@3636 99fdad57-331a-0410-800a-d7fa5415bdb3 --- src/gsmd/usock.c | 80 ++++++++++++++++++++++++--------------------- src/libgsmd/libgsmd_phone.c | 4 --- src/libgsmd/libgsmd_pin.c | 25 ++++---------- src/util/shell.c | 22 ++++++++----- 4 files changed, 62 insertions(+), 69 deletions(-) (limited to 'src') diff --git a/src/gsmd/usock.c b/src/gsmd/usock.c index 76adc9b..5b9eb1c 100644 --- a/src/gsmd/usock.c +++ b/src/gsmd/usock.c @@ -303,47 +303,64 @@ static int pin_cmd_cb(struct gsmd_atcmd *cmd, void *ctx, char *resp) cmd->id, sizeof(ret), &ret); } +static int get_cpin_cb(struct gsmd_atcmd *cmd, void *ctx, char *resp) +{ + enum gsmd_pin_type type; + + if (!strncmp(resp, "+CPIN: ", 7)) { + unsigned int i; + resp += 7; + for (i = 0; i < __NUM_GSMD_PIN; i++) { + if(!strcmp(resp,pin_type_names[i])) + type = i; + } + } + + return gsmd_ucmd_submit(ctx, GSMD_MSG_PIN, GSMD_PIN_GET_STATUS, + cmd->id, sizeof(type), &type); +} + static int usock_rcv_pin(struct gsmd_user *gu, struct gsmd_msg_hdr *gph, int len) { struct gsmd_pin *gp = (struct gsmd_pin *) ((void *)gph + sizeof(*gph)); struct gsmd_atcmd *cmd; - if (gph->len < sizeof(*gp) || len < sizeof(*gp)+sizeof(*gph)) - return -EINVAL; - - gsmd_log(GSMD_DEBUG, "pin type=%u, pin='%s', newpin='%s'\n", - gp->type, gp->pin, gp->newpin); - switch (gph->msg_subtype) { case GSMD_PIN_INPUT: - /* FIXME */ - break; - default: - gsmd_log(GSMD_ERROR, "unknown pin type %u\n", - gph->msg_subtype); - return -EINVAL; - } + if (gph->len < sizeof(*gp) || len < sizeof(*gp)+sizeof(*gph)) + return -EINVAL; - cmd = atcmd_fill("AT+CPIN=\"", 9+GSMD_PIN_MAXLEN+3+GSMD_PIN_MAXLEN+2, + gsmd_log(GSMD_DEBUG, "pin type=%u, pin='%s', newpin='%s'\n", + gp->type, gp->pin, gp->newpin); + + cmd = atcmd_fill("AT+CPIN=\"", 9+GSMD_PIN_MAXLEN+3+GSMD_PIN_MAXLEN+2, &pin_cmd_cb, gu, 0, NULL); - if (!cmd) - return -ENOMEM; + if (!cmd) + return -ENOMEM; - strncat(cmd->buf, gp->pin, sizeof(gp->pin)); + strncat(cmd->buf, gp->pin, sizeof(gp->pin)); - switch (gp->type) { - case GSMD_PIN_SIM_PUK: - case GSMD_PIN_SIM_PUK2: - strcat(cmd->buf, "\",\""); - strncat(cmd->buf, gp->newpin, sizeof(gp->newpin)); + switch (gp->type) { + case GSMD_PIN_SIM_PUK: + case GSMD_PIN_SIM_PUK2: + strcat(cmd->buf, "\",\""); + strncat(cmd->buf, gp->newpin, sizeof(gp->newpin)); + break; + default: + break; + } + strcat(cmd->buf, "\""); break; - default: + case GSMD_PIN_GET_STATUS: + cmd = atcmd_fill("AT+CPIN?", 8 + 1, &get_cpin_cb, gu, 0, NULL); break; + default: + gsmd_log(GSMD_ERROR, "unknown pin type %u\n", + gph->msg_subtype); + return -EINVAL; } - strcat(cmd->buf, "\""); - return atcmd_submit(gu->gsmd, cmd); } @@ -383,14 +400,6 @@ static int get_imsi_cb(struct gsmd_atcmd *cmd, void *ctx, char *resp) cmd->id, strlen(resp) + 1, resp); } -static int get_cpin_cb(struct gsmd_atcmd *cmd, void *ctx, char *resp) -{ - DEBUGP("resp: %s\n", resp); - - return gsmd_ucmd_submit(ctx, GSMD_MSG_PHONE, GSMD_PIN_GET_STATUS, - cmd->id, strlen(resp) + 1, resp); -} - static int usock_rcv_phone(struct gsmd_user *gu, struct gsmd_msg_hdr *gph, int len) { @@ -410,10 +419,7 @@ static int usock_rcv_phone(struct gsmd_user *gu, struct gsmd_msg_hdr *gph, case GSMD_PHONE_GET_IMSI: cmd = atcmd_fill("AT+CIMI", 7 + 1, &get_imsi_cb, gu, 0, NULL); break; - - case GSMD_PIN_GET_STATUS: - cmd = atcmd_fill("AT+CPIN?", 8 + 1, &get_cpin_cb, gu, 0, NULL); - break; + default: return -EINVAL; } diff --git a/src/libgsmd/libgsmd_phone.c b/src/libgsmd/libgsmd_phone.c index 44082be..83e31e8 100644 --- a/src/libgsmd/libgsmd_phone.c +++ b/src/libgsmd/libgsmd_phone.c @@ -50,7 +50,3 @@ int lgsm_get_imsi(struct lgsm_handle *lh) return lgsm_send_simple(lh, GSMD_MSG_PHONE, GSMD_PHONE_GET_IMSI); } -int lgsm_pin_status(struct lgsm_handle *lh) -{ - return lgsm_send_simple(lh, GSMD_MSG_PHONE, GSMD_PIN_GET_STATUS); -} diff --git a/src/libgsmd/libgsmd_pin.c b/src/libgsmd/libgsmd_pin.c index 204f655..4918fec 100644 --- a/src/libgsmd/libgsmd_pin.c +++ b/src/libgsmd/libgsmd_pin.c @@ -28,25 +28,6 @@ #include #include -static const char *pin_type_names[__NUM_GSMD_PIN] = { - [GSMD_PIN_NONE] = "NONE", - [GSMD_PIN_SIM_PIN] = "SIM PIN", - [GSMD_PIN_SIM_PUK] = "SIM PUK", - [GSMD_PIN_PH_SIM_PIN] = "Phone-to-SIM PIN", - [GSMD_PIN_PH_FSIM_PIN] = "Phone-to-very-first SIM PIN", - [GSMD_PIN_PH_FSIM_PUK] = "Phone-to-very-first SIM PUK", - [GSMD_PIN_SIM_PIN2] = "SIM PIN2", - [GSMD_PIN_SIM_PUK2] = "SIM PUK2", - [GSMD_PIN_PH_NET_PIN] = "Network personalization PIN", - [GSMD_PIN_PH_NET_PUK] = "Network personalizaiton PUK", - [GSMD_PIN_PH_NETSUB_PIN]= "Network subset personalisation PIN", - [GSMD_PIN_PH_NETSUB_PUK]= "Network subset personalisation PUK", - [GSMD_PIN_PH_SP_PIN] = "Service provider personalisation PIN", - [GSMD_PIN_PH_SP_PUK] = "Service provider personalisation PUK", - [GSMD_PIN_PH_CORP_PIN] = "Corporate personalisation PIN", - [GSMD_PIN_PH_CORP_PUK] = "Corporate personalisation PUK", -}; - const char *lgsm_pin_name(enum gsmd_pin_type ptype) { if (ptype >= __NUM_GSMD_PIN) @@ -55,6 +36,11 @@ const char *lgsm_pin_name(enum gsmd_pin_type ptype) return pin_type_names[ptype]; } +int lgsm_pin_status(struct lgsm_handle *lh) +{ + return lgsm_send_simple(lh, GSMD_MSG_PIN, GSMD_PIN_GET_STATUS); +} + int lgsm_pin(struct lgsm_handle *lh, unsigned int type, const char *pin, const char *newpin) { @@ -98,3 +84,4 @@ int lgsm_pin(struct lgsm_handle *lh, unsigned int type, return rc; } + diff --git a/src/util/shell.c b/src/util/shell.c index 34f7e12..fec445e 100644 --- a/src/util/shell.c +++ b/src/util/shell.c @@ -356,10 +356,6 @@ static int phone_msghandler(struct lgsm_handle *lh, struct gsmd_msg_hdr *gmh) payload = (char *)gmh + sizeof(*gmh); printf("imsi <%s>\n", payload); break; - case GSMD_PIN_GET_STATUS: - payload = (char *)gmh + sizeof(*gmh); - printf("%s\n", payload); - break; case GSMD_PHONE_POWERUP: if (*intresult) printf("Modem power-up failed: %i\n", *intresult); @@ -382,11 +378,19 @@ static int phone_msghandler(struct lgsm_handle *lh, struct gsmd_msg_hdr *gmh) static int pin_msghandler(struct lgsm_handle *lh, struct gsmd_msg_hdr *gmh) { int result = *(int *) gmh->data; - - if (result) - printf("PIN error %i\n", result); - else - printf("PIN accepted!\n"); + switch (gmh->msg_subtype) { + case GSMD_PIN_GET_STATUS: + printf("PIN STATUS: %i\n", result); + break; + case GSMD_PIN_INPUT: + if (result) + printf("PIN error %i\n", result); + else + printf("PIN accepted!\n"); + break; + default: + return -EINVAL; + } pending_responses --; return 0; } -- cgit v1.2.3