diff options
-rw-r--r-- | include/gsmd/gsmd.h | 3 | ||||
-rw-r--r-- | include/gsmd/usock.h | 14 | ||||
-rw-r--r-- | src/gsmd/usock.c | 245 | ||||
-rw-r--r-- | src/libgsmd/libgsmd_phonebook.c | 48 | ||||
-rw-r--r-- | src/util/shell.c | 88 |
5 files changed, 157 insertions, 241 deletions
diff --git a/include/gsmd/gsmd.h b/include/gsmd/gsmd.h index 5b2a9e6..de99238 100644 --- a/include/gsmd/gsmd.h +++ b/include/gsmd/gsmd.h @@ -98,9 +98,6 @@ struct gsmd_user { struct gsmd *gsmd; struct gsmd_fd gfd; /* the socket */ u_int32_t subscriptions; /* bitmaks of subscribed event groups */ - - struct llist_head pb_readrg_list; /* our READRG phonebook list */ - struct llist_head pb_find_list; /* our FIND phonebook list */ }; #define GSMD_DEBUG 1 /* debugging information */ diff --git a/include/gsmd/usock.h b/include/gsmd/usock.h index a4e5e41..4f1da7a 100644 --- a/include/gsmd/usock.h +++ b/include/gsmd/usock.h @@ -254,8 +254,6 @@ enum gsmd_msg_phonebook { GSMD_PHONEBOOK_GET_SUPPORT = 6, GSMD_PHONEBOOK_LIST_STORAGE = 7, GSMD_PHONEBOOK_SET_STORAGE = 8, - GSMD_PHONEBOOK_RETRIEVE_READRG = 9, - GSMD_PHONEBOOK_RETRIEVE_FIND = 10, }; /* Type-of-Address, Numbering-Plan-Identification field, GSM 03.40, 9.1.2.5 */ @@ -496,12 +494,17 @@ struct gsmd_phonebook_readrg { #define GSMD_PB_NUMB_MAXLEN 44 #define GSMD_PB_TEXT_MAXLEN 14 struct gsmd_phonebook { - u_int8_t index; + int8_t index; char numb[GSMD_PB_NUMB_MAXLEN+1]; u_int8_t type; char text[GSMD_PB_TEXT_MAXLEN+1]; } __attribute__ ((packed)); +struct gsmd_phonebooks { + struct gsmd_phonebook pb; + int8_t is_last; +} __attribute__ ((packed)); + /* Refer to GSM 07.07 subclause 8.13 */ /* FIXME: the tlength depends on SIM, use +CPBR=? to get */ struct gsmd_phonebook_find { @@ -610,11 +613,6 @@ struct gsmd_ucmd { char buf[]; } __attribute__ ((packed)); -struct gsmd_phonebooks { - struct llist_head list; - struct gsmd_phonebook pb; -} __attribute__ ((packed)); - extern struct gsmd_ucmd *ucmd_alloc(int extra_size); extern int usock_init(struct gsmd *g); extern void usock_cmd_enqueue(struct gsmd_ucmd *ucmd, struct gsmd_user *gu); diff --git a/src/gsmd/usock.c b/src/gsmd/usock.c index 5c5ec13..128a83f 100644 --- a/src/gsmd/usock.c +++ b/src/gsmd/usock.c @@ -39,6 +39,7 @@ #include <gsmd/atcmd.h> #include <gsmd/usock.h> #include <gsmd/talloc.h> +#include <gsmd/extrsp.h> #include <gsmd/ts0707.h> #include <gsmd/sms.h> @@ -664,77 +665,98 @@ static int usock_rcv_network(struct gsmd_user *gu, struct gsmd_msg_hdr *gph, static int phonebook_find_cb(struct gsmd_atcmd *cmd, void *ctx, char *resp) { struct gsmd_user *gu = ctx; - struct gsmd_phonebooks *gps; - char *fcomma, *lcomma, *ptr1, *ptr2 = NULL; - int num; + struct gsmd_phonebooks gps; + struct gsm_extrsp *er; DEBUGP("resp: %s\n", resp); - /* - * [+CPBF: <index1>,<number>,<type>,<text>[[...] - * <CR><LF>+CPBF: <index2>,<unmber>,<type>,<text>]] - */ - num = 0; - ptr1 = strtok(resp, "\n"); - - while (ptr1) { - gps = talloc(__pb_ctx, struct gsmd_phonebooks); - ptr2 = strchr(ptr1, ' '); - gps->pb.index = atoi(ptr2+1); - - fcomma = strchr(ptr1, '"'); - lcomma = strchr(fcomma+1, '"'); - strncpy(gps->pb.numb, fcomma + 1, (lcomma-fcomma-1)); - gps->pb.numb[(lcomma - fcomma) - 1] = '\0'; + er = extrsp_parse(cmd, resp); - gps->pb.type = atoi(lcomma + 2); - - ptr2 = strrchr(ptr1, ','); - fcomma = ptr2 + 1; - lcomma = strchr(fcomma + 1, '"'); - strncpy(gps->pb.text, fcomma + 1, (lcomma - fcomma - 1)); - gps->pb.text[(lcomma - fcomma) - 1] = '\0'; - - llist_add_tail(&gps->list, &gu->pb_find_list); + if ( !er ) + return -ENOMEM; - num++; + gps.is_last = (cmd->ret == 0 || cmd->ret == 4)? 1:0; - ptr1 = strtok(NULL, "\n"); + if ( !strncmp(resp, "OK", 2) ) { + /* The record is empty or could not read yet */ + gps.pb.index = 0; } + else if ( !strncmp(resp, "+CME", 4) ) { + DEBUGP("== +CME error\n"); + /* +CME ERROR: 21 */ + gps.pb.index = 0 - atoi(strpbrk(resp, "0123456789")); + } + else if ( er->num_tokens == 4 && + er->tokens[0].type == GSMD_ECMD_RTT_NUMERIC && + er->tokens[1].type == GSMD_ECMD_RTT_STRING && + er->tokens[2].type == GSMD_ECMD_RTT_NUMERIC && + er->tokens[3].type == GSMD_ECMD_RTT_STRING ) { + + /* + * [+CPBR: <index1>,<number>,<type>,<text>[[...] + * <CR><LF>+CPBR: <index2>,<unmber>,<type>,<text>]] + */ + + gps.pb.index = er->tokens[0].u.numeric; + strcpy(gps.pb.numb, er->tokens[1].u.string); + gps.pb.type = er->tokens[2].u.numeric; + strcpy(gps.pb.text, er->tokens[3].u.string); + } + else { + DEBUGP("Invalid Input : Parse error\n"); + return -EINVAL; + } + + talloc_free(er); - talloc_free(__pb_ctx); return gsmd_ucmd_submit(gu, GSMD_MSG_PHONEBOOK, GSMD_PHONEBOOK_FIND, - cmd->id, sizeof(num), &num); + cmd->id, sizeof(gps), &gps); } static int phonebook_read_cb(struct gsmd_atcmd *cmd, void *ctx, char *resp) { struct gsmd_user *gu = ctx; struct gsmd_phonebook gp; - char *fcomma, *lcomma; - char *ptr; + struct gsm_extrsp *er; DEBUGP("resp: %s\n", resp); + + er = extrsp_parse(cmd, resp); - /* check the record is empty or not */ - if (!strncmp(resp, "+CPBR", 5)) { - ptr = strchr(resp, ' '); - gp.index = atoi(ptr + 1); - - fcomma = strchr(resp, '"'); - lcomma = strchr(fcomma + 1, '"'); - strncpy(gp.numb, fcomma + 1, (lcomma - fcomma - 1)); - gp.numb[(lcomma-fcomma) - 1] = '\0'; - - gp.type = atoi(lcomma + 2); - - ptr = strrchr(resp, ','); - fcomma = ptr + 1; - lcomma = strchr(fcomma + 1, '"'); - strncpy(gp.text, fcomma + 1, (lcomma-fcomma - 1)); - gp.text[(lcomma - fcomma) - 1] = '\0'; - } else + if ( !er ) + return -ENOMEM; + + if ( !strncmp(resp, "OK", 2) ) { + /* The record is empty or could not read yet */ gp.index = 0; + } + else if ( !strncmp(resp, "+CME", 4) ) { + DEBUGP("== +CME error\n"); + /* +CME ERROR: 21 */ + gp.index = 0 - atoi(strpbrk(resp, "0123456789")); + } + else if ( er->num_tokens == 4 && + er->tokens[0].type == GSMD_ECMD_RTT_NUMERIC && + er->tokens[1].type == GSMD_ECMD_RTT_STRING && + er->tokens[2].type == GSMD_ECMD_RTT_NUMERIC && + er->tokens[3].type == GSMD_ECMD_RTT_STRING ) { + + /* + * [+CPBR: <index1>,<number>,<type>,<text>[[...] + * <CR><LF>+CPBR: <index2>,<unmber>,<type>,<text>]] + */ + + gp.index = er->tokens[0].u.numeric; + strcpy(gp.numb, er->tokens[1].u.string); + gp.type = er->tokens[2].u.numeric; + strcpy(gp.text, er->tokens[3].u.string); + } + else { + DEBUGP("Invalid Input : Parse error\n"); + return -EINVAL; + } + + talloc_free(er); return gsmd_ucmd_submit(gu, GSMD_MSG_PHONEBOOK, GSMD_PHONEBOOK_READ, cmd->id, sizeof(gp), &gp); @@ -743,47 +765,52 @@ static int phonebook_read_cb(struct gsmd_atcmd *cmd, void *ctx, char *resp) static int phonebook_readrg_cb(struct gsmd_atcmd *cmd, void *ctx, char *resp) { struct gsmd_user *gu = ctx; - struct gsmd_phonebooks *gps; - char *fcomma, *lcomma, *ptr1, *ptr2 = NULL; - int num; + struct gsmd_phonebooks gps; + struct gsm_extrsp *er; DEBUGP("resp: %s\n", resp); - /* - * [+CPBR: <index1>,<number>,<type>,<text>[[...] - * <CR><LF>+CPBR: <index2>,<unmber>,<type>,<text>]] - */ - num = 0; - ptr1 = strtok(resp, "\n"); - - while (ptr1) { - gps = talloc(__pb_ctx, struct gsmd_phonebooks); - ptr2 = strchr(ptr1, ' '); - gps->pb.index = atoi(ptr2+1); - - fcomma = strchr(ptr1, '"'); - lcomma = strchr(fcomma+1, '"'); - strncpy(gps->pb.numb, fcomma + 1, (lcomma-fcomma-1)); - gps->pb.numb[(lcomma - fcomma) - 1] = '\0'; + er = extrsp_parse(cmd, resp); - gps->pb.type = atoi(lcomma + 2); - - ptr2 = strrchr(ptr1, ','); - fcomma = ptr2 + 1; - lcomma = strchr(fcomma + 1, '"'); - strncpy(gps->pb.text, fcomma + 1, (lcomma - fcomma - 1)); - gps->pb.text[(lcomma - fcomma) - 1] = '\0'; - - llist_add_tail(&gps->list, &gu->pb_readrg_list); + if ( !er ) + return -ENOMEM; - num++; + gps.is_last = (cmd->ret == 0 || cmd->ret == 4)? 1:0; - ptr1 = strtok(NULL, "\n"); + if ( !strncmp(resp, "OK", 2) ) { + /* The record is empty or could not read yet */ + gps.pb.index = 0; } + else if ( !strncmp(resp, "+CME", 4) ) { + DEBUGP("== +CME error\n"); + /* +CME ERROR: 21 */ + gps.pb.index = 0 - atoi(strpbrk(resp, "0123456789")); + } + else if ( er->num_tokens == 4 && + er->tokens[0].type == GSMD_ECMD_RTT_NUMERIC && + er->tokens[1].type == GSMD_ECMD_RTT_STRING && + er->tokens[2].type == GSMD_ECMD_RTT_NUMERIC && + er->tokens[3].type == GSMD_ECMD_RTT_STRING ) { + + /* + * [+CPBR: <index1>,<number>,<type>,<text>[[...] + * <CR><LF>+CPBR: <index2>,<unmber>,<type>,<text>]] + */ + + gps.pb.index = er->tokens[0].u.numeric; + strcpy(gps.pb.numb, er->tokens[1].u.string); + gps.pb.type = er->tokens[2].u.numeric; + strcpy(gps.pb.text, er->tokens[3].u.string); + } + else { + DEBUGP("Invalid Input : Parse error\n"); + return -EINVAL; + } + + talloc_free(er); - talloc_free(__pb_ctx); return gsmd_ucmd_submit(gu, GSMD_MSG_PHONEBOOK, GSMD_PHONEBOOK_READRG, - cmd->id, sizeof(num), &num); + cmd->id, sizeof(gps), &gps); } static int phonebook_write_cb(struct gsmd_atcmd *cmd, void *ctx, char *resp) @@ -978,54 +1005,6 @@ static int usock_rcv_phonebook(struct gsmd_user *gu, cmd = atcmd_fill("AT+CPBR=?", 9+1, &phonebook_get_support_cb, gu, gph->id, NULL); break; - case GSMD_PHONEBOOK_RETRIEVE_READRG: - if (len < sizeof(*gph) + sizeof(int)) - return -EINVAL; - - num = (int *) ((void *)gph + sizeof(*gph)); - gp = talloc_size(__pb_ctx, sizeof(*gp) * (*num)); - if (!llist_empty(&gu->pb_readrg_list)) - llist_for_each_entry_safe(cur, cur2, - &gu->pb_readrg_list, list) { - gp->index = cur->pb.index; - strcpy(gp->numb, cur->pb.numb); - gp->type = cur->pb.type; - strcpy(gp->text, cur->pb.text); - gp++; - - llist_del(&cur->list); - free(cur); - } - - ret = gsmd_ucmd_submit(gu, GSMD_MSG_PHONEBOOK, - GSMD_PHONEBOOK_RETRIEVE_READRG, gph->id, - sizeof(*gp) * (*num), gp); - talloc_free(gp); - return ret; - case GSMD_PHONEBOOK_RETRIEVE_FIND: - if (len < sizeof(*gph) + sizeof(int)) - return -EINVAL; - - num = (int *) ((void *)gph + sizeof(*gph)); - gp = talloc_size(__pb_ctx, sizeof(*gp) * (*num)); - if (!llist_empty(&gu->pb_find_list)) - llist_for_each_entry_safe(cur, cur2, - &gu->pb_find_list, list) { - gp->index = cur->pb.index; - strcpy(gp->numb, cur->pb.numb); - gp->type = cur->pb.type; - strcpy(gp->text, cur->pb.text); - gp++; - - llist_del(&cur->list); - free(cur); - } - - ret = gsmd_ucmd_submit(gu, GSMD_MSG_PHONEBOOK, - GSMD_PHONEBOOK_RETRIEVE_FIND, gph->id, - sizeof(*gp) * (*num), gp); - talloc_free(gp); - return ret; default: return -EINVAL; } @@ -1154,8 +1133,6 @@ static int gsmd_usock_cb(int fd, unsigned int what, void *data) newuser->gsmd = g; newuser->subscriptions = 0xffffffff; INIT_LLIST_HEAD(&newuser->finished_ucmds); - INIT_LLIST_HEAD(&newuser->pb_readrg_list); - INIT_LLIST_HEAD(&newuser->pb_find_list); llist_add(&newuser->list, &g->users); gsmd_register_fd(&newuser->gfd); diff --git a/src/libgsmd/libgsmd_phonebook.c b/src/libgsmd/libgsmd_phonebook.c index f139c2a..798cd2f 100644 --- a/src/libgsmd/libgsmd_phonebook.c +++ b/src/libgsmd/libgsmd_phonebook.c @@ -199,51 +199,3 @@ int lgsm_pb_get_support(struct lgsm_handle *lh) { return lgsm_send_simple(lh, GSMD_MSG_PHONEBOOK, GSMD_PHONEBOOK_GET_SUPPORT); } - -int lgsm_pb_retrieve_readrg(struct lgsm_handle *lh, int num) -{ - struct gsmd_msg_hdr *gmh; - int rc; - - gmh = lgsm_gmh_fill(GSMD_MSG_PHONEBOOK, - GSMD_PHONEBOOK_RETRIEVE_READRG, sizeof(int)); - if (!gmh) - return -ENOMEM; - - *(int *)(gmh->data) = num; - - rc = lgsm_send(lh, gmh); - if (rc < gmh->len + sizeof(*gmh)) { - lgsm_gmh_free(gmh); - return -EIO; - } - - lgsm_gmh_free(gmh); - - return 0; -} - -int lgsm_pb_retrieve_find(struct lgsm_handle *lh, int num) -{ - struct gsmd_msg_hdr *gmh; - int rc; - - gmh = lgsm_gmh_fill(GSMD_MSG_PHONEBOOK, - GSMD_PHONEBOOK_RETRIEVE_FIND, sizeof(int)); - if (!gmh) - return -ENOMEM; - - *(int *)(gmh->data) = num; - - rc = lgsm_send(lh, gmh); - if (rc < gmh->len + sizeof(*gmh)) { - lgsm_gmh_free(gmh); - return -EIO; - } - - lgsm_gmh_free(gmh); - - return 0; -} - - diff --git a/src/util/shell.c b/src/util/shell.c index 373ce33..103e161 100644 --- a/src/util/shell.c +++ b/src/util/shell.c @@ -41,8 +41,6 @@ #endif #define STDIN_BUF_SIZE 1024 -static int nFIND = 0; -static int nREADRG = 0; int pending_responses = 0; @@ -57,39 +55,63 @@ static int pt_msghandler(struct lgsm_handle *lh, struct gsmd_msg_hdr *gmh) static int pb_msghandler(struct lgsm_handle *lh, struct gsmd_msg_hdr *gmh) { struct gsmd_phonebook *gp; - struct gsmd_phonebook_support *gps; + struct gsmd_phonebooks *gps; + struct gsmd_phonebook_support *gpsu; struct gsmd_phonebook_storage *gpst; char *payload; - char *fcomma, *lcomma, *ptr = NULL; - int *num; - char buf[128]; int i; switch (gmh->msg_subtype) { case GSMD_PHONEBOOK_FIND: - num = (int *) ((char *)gmh + sizeof(*gmh)); - printf("Records:%d\n", *num); + gps = (struct gsmd_phonebooks *) ((char *)gmh + sizeof(*gmh)); - nFIND = *num; + if (gps->pb.index > 0) + printf("%d, %s, %d, %s\n", + gps->pb.index, gps->pb.numb, + gps->pb.type, gps->pb.text); + else if (gps->pb.index < 0) + /* If index < 0, error happens */ + printf("+CME ERROR %d\n", (0-(gps->pb.index))); + else + /* The record doesn't exist or could not read yet */ + printf("Doesn't exist or couldn't read it yet\n"); + + if (gps->is_last) + pending_responses --; break; case GSMD_PHONEBOOK_READRG: - num = (int *) ((char *)gmh + sizeof(*gmh)); - printf("Records:%d\n", *num); + gps = (struct gsmd_phonebooks *) ((char *)gmh + sizeof(*gmh)); - nREADRG = *num; + if (gps->pb.index > 0) + printf("%d, %s, %d, %s\n", + gps->pb.index, gps->pb.numb, + gps->pb.type, gps->pb.text); + else if (gps->pb.index < 0) + /* If index < 0, error happens */ + printf("+CME ERROR %d\n", (0-(gps->pb.index))); + else + /* The record doesn't exist or could not read yet */ + printf("Doesn't exist or couldn't read it yet\n"); + + if (gps->is_last) + pending_responses --; break; case GSMD_PHONEBOOK_READ: gp = (struct gsmd_phonebook *) ((char *)gmh + sizeof(*gmh)); - if (gp->index) + if (gp->index > 0) printf("%d, %s, %d, %s\n", gp->index, gp->numb, gp->type, gp->text); + else if (gp->index < 0) + /* If index < 0, error happens */ + printf("+CME ERROR %d\n", (0-(gp->index))); else - printf("Empty\n"); + /* The record doesn't exist or could not read yet */ + printf("Doesn't exist or couldn't read it yet\n"); break; case GSMD_PHONEBOOK_GET_SUPPORT: - gps = (struct gsmd_phonebook_support *) ((char *)gmh + sizeof(*gmh)); - printf("(1-%d), %d, %d\n", gps->index, gps->nlength, gps->tlength); + gpsu = (struct gsmd_phonebook_support *) ((char *)gmh + sizeof(*gmh)); + printf("(1-%d), %d, %d\n", gpsu->index, gpsu->nlength, gpsu->tlength); pending_responses --; break; @@ -111,26 +133,6 @@ static int pb_msghandler(struct lgsm_handle *lh, struct gsmd_msg_hdr *gmh) payload = (char *)gmh + sizeof(*gmh); printf("%s\n", payload); break; - case GSMD_PHONEBOOK_RETRIEVE_READRG: - gp = (struct gsmd_phonebook *) ((char *)gmh + sizeof(*gmh)); - - for (i=0; i<nREADRG; i++) { - printf("%d,%s,%d,%s\n", gp->index, gp->numb, gp->type, gp->text); - gp++; - } - - nREADRG = 0; - break; - case GSMD_PHONEBOOK_RETRIEVE_FIND: - gp = (struct gsmd_phonebook *) ((char *)gmh + sizeof(*gmh)); - - for (i = 0; i < nFIND; i++) { - printf("%d,%s,%d,%s\n", gp->index, gp->numb, gp->type, gp->text); - gp++; - } - - nFIND = 0; - break; default: return -EINVAL; } @@ -425,8 +427,6 @@ static int shell_help(void) "\tps\tPB Support\n" "\tpm\tPB Memory\n" "\tpp\tPB Set Memory (pp=storage)\n" - "\tpRr\tRetrieve Readrg Records\n" - "\tpRf\tRetrieve Find Records\n" "\tsd\tSMS Delete (sd=index,delflg)\n" "\tsl\tSMS List (sl=stat)\n" "\tsr\tSMS Read (sr=index)\n" @@ -570,6 +570,7 @@ int shell_main(struct lgsm_handle *lgsmh, int sync) ptr = strchr(buf, ','); pb_readrg.index2 = atoi(ptr+1); lgsm_pb_read_entries(lgsmh, &pb_readrg); + pending_responses ++; } else if ( !strncmp(buf, "pr", 2)) { ptr = strchr(buf, '='); lgsm_pb_read_entry(lgsmh, atoi(ptr+1)); @@ -584,6 +585,7 @@ int shell_main(struct lgsm_handle *lgsmh, int sync) pb_find.findtext[strlen(ptr+1)] = '\0'; lgsm_pb_find_entry(lgsmh, &pb_find); + pending_responses ++; } else if ( !strncmp(buf, "pw", 2)) { printf("Write Phonebook Entry\n"); struct lgsm_phonebook pb; @@ -616,16 +618,6 @@ int shell_main(struct lgsm_handle *lgsmh, int sync) printf("Get Phonebook Support\n"); lgsm_pb_get_support(lgsmh); pending_responses ++; - } else if( !strncmp(buf, "pRr", 3) ) { - printf("Retrieve Readrg Records\n"); - - if ( nREADRG ) - lgsm_pb_retrieve_readrg(lgsmh, nREADRG); - } else if( !strncmp(buf, "pRf", 3) ) { - printf("Retrieve Find Records\n"); - - if ( nFIND ) - lgsm_pb_retrieve_find(lgsmh, nFIND); } else if ( !strncmp(buf, "sd", 2)) { printf("Delete SMS\n"); struct lgsm_sms_delete sms_del; |