summaryrefslogtreecommitdiffstats
path: root/gatchat/gatsyntax.c
diff options
context:
space:
mode:
authorDenis Kenzior <denkenz@gmail.com>2010-08-16 12:44:20 -0500
committerDenis Kenzior <denkenz@gmail.com>2010-08-16 12:44:50 -0500
commit5681e9df4989cf692512cddbf17378bb2d5adfce (patch)
tree360855ad541337de9ac5c67754aa9d64f692e452 /gatchat/gatsyntax.c
parent0e4aaf004258188561cf58737e772deb4b2e4216 (diff)
downloadofono-5681e9df4989cf692512cddbf17378bb2d5adfce.tar.bz2
gatchat: Handle embedded \r and \n in responses
Diffstat (limited to 'gatchat/gatsyntax.c')
-rw-r--r--gatchat/gatsyntax.c18
1 files changed, 17 insertions, 1 deletions
diff --git a/gatchat/gatsyntax.c b/gatchat/gatsyntax.c
index 6266e795..040a9a5c 100644
--- a/gatchat/gatsyntax.c
+++ b/gatchat/gatsyntax.c
@@ -32,6 +32,7 @@ enum GSMV1_STATE {
GSMV1_STATE_INITIAL_CR,
GSMV1_STATE_INITIAL_LF,
GSMV1_STATE_RESPONSE,
+ GSMV1_STATE_RESPONSE_STRING,
GSMV1_STATE_TERMINATOR_CR,
GSMV1_STATE_GUESS_MULTILINE_RESPONSE,
GSMV1_STATE_MULTILINE_RESPONSE,
@@ -48,6 +49,7 @@ enum GSMV1_STATE {
enum GSM_PERMISSIVE_STATE {
GSM_PERMISSIVE_STATE_IDLE = 0,
GSM_PERMISSIVE_STATE_RESPONSE,
+ GSM_PERMISSIVE_STATE_RESPONSE_STRING,
GSM_PERMISSIVE_STATE_GUESS_PDU,
GSM_PERMISSIVE_STATE_PDU,
GSM_PERMISSIVE_STATE_PROMPT,
@@ -105,6 +107,13 @@ static GAtSyntaxResult gsmv1_feed(GAtSyntax *syntax,
case GSMV1_STATE_RESPONSE:
if (byte == '\r')
syntax->state = GSMV1_STATE_TERMINATOR_CR;
+ else if (byte == '"')
+ syntax->state = GSMV1_STATE_RESPONSE_STRING;
+ break;
+
+ case GSMV1_STATE_RESPONSE_STRING:
+ if (byte == '"')
+ syntax->state = GSMV1_STATE_RESPONSE;
break;
case GSMV1_STATE_TERMINATOR_CR:
@@ -256,7 +265,14 @@ static GAtSyntaxResult gsm_permissive_feed(GAtSyntax *syntax,
i += 1;
res = G_AT_SYNTAX_RESULT_LINE;
goto out;
- }
+ } else if (byte == '"')
+ syntax->state =
+ GSM_PERMISSIVE_STATE_RESPONSE_STRING;
+ break;
+
+ case GSM_PERMISSIVE_STATE_RESPONSE_STRING:
+ if (byte == '"')
+ syntax->state = GSM_PERMISSIVE_STATE_RESPONSE;
break;
case GSM_PERMISSIVE_STATE_GUESS_PDU: