summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/gsmd/gsmd.h3
-rw-r--r--include/gsmd/usock.h14
-rw-r--r--src/gsmd/usock.c245
-rw-r--r--src/libgsmd/libgsmd_phonebook.c48
-rw-r--r--src/util/shell.c88
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;
personal git repositories of Harald Welte. Your mileage may vary