diff options
author | Denis Kenzior <denkenz@gmail.com> | 2010-08-16 12:44:20 -0500 |
---|---|---|
committer | Denis Kenzior <denkenz@gmail.com> | 2010-08-16 12:44:50 -0500 |
commit | 5681e9df4989cf692512cddbf17378bb2d5adfce (patch) | |
tree | 360855ad541337de9ac5c67754aa9d64f692e452 /gatchat/gatsyntax.c | |
parent | 0e4aaf004258188561cf58737e772deb4b2e4216 (diff) | |
download | ofono-5681e9df4989cf692512cddbf17378bb2d5adfce.tar.bz2 |
gatchat: Handle embedded \r and \n in responses
Diffstat (limited to 'gatchat/gatsyntax.c')
-rw-r--r-- | gatchat/gatsyntax.c | 18 |
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: |