diff options
author | erin_yueh <erin_yueh@99fdad57-331a-0410-800a-d7fa5415bdb3> | 2007-12-12 12:48:10 +0000 |
---|---|---|
committer | erin_yueh <erin_yueh@99fdad57-331a-0410-800a-d7fa5415bdb3> | 2007-12-12 12:48:10 +0000 |
commit | 30c802206150291d388c14d9588faf32804d4b18 (patch) | |
tree | f8b707fb50991afd2d49ba849f04a1cbafd47c81 | |
parent | 3a4c4251d068f481ddef3c355d8e0936c5b3440b (diff) |
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
-rw-r--r-- | include/gsmd/event.h | 19 | ||||
-rw-r--r-- | include/gsmd/usock.h | 2 | ||||
-rw-r--r-- | include/libgsmd/misc.h | 3 | ||||
-rw-r--r-- | include/libgsmd/pin.h | 3 | ||||
-rw-r--r-- | src/gsmd/usock.c | 80 | ||||
-rw-r--r-- | src/libgsmd/libgsmd_phone.c | 4 | ||||
-rw-r--r-- | src/libgsmd/libgsmd_pin.c | 25 | ||||
-rw-r--r-- | src/util/shell.c | 22 |
8 files changed, 85 insertions, 73 deletions
diff --git a/include/gsmd/event.h b/include/gsmd/event.h index 38cefae..d10c26e 100644 --- a/include/gsmd/event.h +++ b/include/gsmd/event.h @@ -43,6 +43,25 @@ enum gsmd_pin_type { /* waiting for ... */ __NUM_GSMD_PIN }; +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", +}; + enum gsmd_call_type { GSMD_CALL_NONE = 0, GSMD_CALL_UNSPEC = 1, diff --git a/include/gsmd/usock.h b/include/gsmd/usock.h index 5116da9..5e07ced 100644 --- a/include/gsmd/usock.h +++ b/include/gsmd/usock.h @@ -89,13 +89,13 @@ enum gsmd_msg_phone_type { enum gsmd_msg_pin_type { GSMD_PIN_INPUT = 1, + GSMD_PIN_GET_STATUS = 2, }; enum gsmd_msg_phone { GSMD_PHONE_POWERUP = 1, GSMD_PHONE_POWERDOWN = 2, GSMD_PHONE_GET_IMSI = 3, - GSMD_PIN_GET_STATUS = 4, }; enum gsmd_msg_modem { diff --git a/include/libgsmd/misc.h b/include/libgsmd/misc.h index 8111360..554d958 100644 --- a/include/libgsmd/misc.h +++ b/include/libgsmd/misc.h @@ -79,6 +79,5 @@ extern int lgsm_get_subscriber_num(struct lgsm_handle *lh); /* Retrieve IMSI information */ extern int lgsm_get_imsi(struct lgsm_handle *lh); -/* Get PIN status information */ -extern int lgsm_pin_status(struct lgsm_handle *lh); + #endif diff --git a/include/libgsmd/pin.h b/include/libgsmd/pin.h index d125e40..8b02226 100644 --- a/include/libgsmd/pin.h +++ b/include/libgsmd/pin.h @@ -5,5 +5,6 @@ extern const char *lgsm_pin_name(enum gsmd_pin_type ptype); extern int lgsm_pin(struct lgsm_handle *lh, unsigned int type, const char *pin, const char *newpin); - +/* Get PIN status information */ +extern int lgsm_pin_status(struct lgsm_handle *lh); #endif 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 <gsmd/event.h> #include <libgsmd/libgsmd.h> -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; } |