From 2797211645d452446cb7b329ee9d3d3a923f8520 Mon Sep 17 00:00:00 2001 From: laforge Date: Sat, 10 Mar 2007 02:22:04 +0000 Subject: * properly implement PIN/PUK handling throughout gsmd/libgsmd/util git-svn-id: http://svn.openmoko.org/trunk/src/target/gsm@1314 99fdad57-331a-0410-800a-d7fa5415bdb3 --- src/gsmd/usock.c | 46 +++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 41 insertions(+), 5 deletions(-) (limited to 'src/gsmd/usock.c') diff --git a/src/gsmd/usock.c b/src/gsmd/usock.c index 0337b5e..31292e8 100644 --- a/src/gsmd/usock.c +++ b/src/gsmd/usock.c @@ -38,6 +38,7 @@ #include #include #include +#include static void *__ucmd_ctx, *__gu_ctx; @@ -173,13 +174,37 @@ static int null_cmd_cb(struct gsmd_atcmd *cmd, void *ctx, char *resp) return 0; } +/* PIN command callback. Gets called for response to AT+CPIN cmcd */ +static int pin_cmd_cb(struct gsmd_atcmd *cmd, void *ctx, char *resp) +{ + gsmd_log(GSMD_DEBUG, "pin cmd cb\n"); + + /* We need to verify if there is some error */ + switch (cmd->ret) { + case 0: + break; + case GSM0707_CME_INCORRECT_PASSWORD: + /* prompt for pin again */ + break; + default: + /* something went wrong */ + break; + } + return 0; +} + static int usock_rcv_pin(struct gsmd_user *gu, struct gsmd_msg_hdr *gph, int len) { - u_int8_t *pin = (u_int8_t *)gph + sizeof(*gph); - int pin_len = len - sizeof(*gph); + 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 */ @@ -190,12 +215,23 @@ static int usock_rcv_pin(struct gsmd_user *gu, struct gsmd_msg_hdr *gph, return -EINVAL; } - cmd = atcmd_fill("AT+CPIN=\"", 9+1+1+strlen(pin), - &null_cmd_cb, gu, 0); + cmd = atcmd_fill("AT+CPIN=\"", 9+GSMD_PIN_MAXLEN+3+GSMD_PIN_MAXLEN+2, + &pin_cmd_cb, gu, 0); if (!cmd) return -ENOMEM; - strcat(cmd->buf, pin); + strcat(cmd->buf, gp->pin); + + switch (gp->type) { + case GSMD_PIN_SIM_PUK: + case GSMD_PIN_SIM_PUK2: + strcat(cmd->buf, "\",\""); + strcat(cmd->buf, gp->newpin); + break; + default: + break; + } + strcat(cmd->buf, "\""); return atcmd_submit(gu->gsmd, cmd); -- cgit v1.2.3