From da647ef9363edde57669e9d1c5b51d9a56d9b2a9 Mon Sep 17 00:00:00 2001 From: Pierre Pronchery Date: Fri, 28 May 2010 00:00:36 +0000 Subject: [PATCH] Actually parse the number upon incoming SMS messages in PDU mode --- src/gsm.c | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/src/gsm.c b/src/gsm.c index 1ba4956..807cdbb 100644 --- a/src/gsm.c +++ b/src/gsm.c @@ -1375,6 +1375,8 @@ static int _gsm_trigger_cmgl(GSM * gsm, char const * result) /* gsm_trigger_cmgr */ static char * _cmgr_pdu_parse(char const * pdu, time_t * timestamp, char number[32]); +static void _cmgr_pdu_parse_number(char const * number, size_t length, + char buf[32]); static time_t _cmgr_pdu_parse_timestamp(char const * timestamp); static int _gsm_trigger_cmgr(GSM * gsm, char const * result) @@ -1487,8 +1489,7 @@ static char * _cmgr_pdu_parse(char const * pdu, time_t * timestamp, addrl++; if((smscl * 2) + 2 + 4 + addrl + 2 > len) return NULL; - /* FIXME actually parse the number */ - snprintf(number, min(addrl + 1, 32), "%s", q + 2); + _cmgr_pdu_parse_number(q + 2, addrl + 1, number); q = pdu + (smscl * 2) + 2 + 4 + addrl + 2; if(sscanf(q, "%02X", &pid) != 1) /* PID */ return NULL; @@ -1538,6 +1539,23 @@ static char * _cmgr_pdu_parse(char const * pdu, time_t * timestamp, return (char *)p; } +static void _cmgr_pdu_parse_number(char const * number, size_t length, + char buf[32]) +{ + size_t i; + + for(i = 0; i < length - 1 && i < 32 - 1; i+=2) + { + if((number[i] != 'F' && (number[i] < '0' || number[i] > '9')) + || number[i + 1] < '0' || number[i + 1] > '9') + break; + buf[i] = number[i + 1]; + if((buf[i + 1] = number[i]) == 'F') + buf[i + 1] = '\0'; + } + buf[31] = '\0'; +} + static time_t _cmgr_pdu_parse_timestamp(char const * timestamp) { char const * p = timestamp;