summaryrefslogtreecommitdiffstats
path: root/gatchat
diff options
context:
space:
mode:
authorDenis Kenzior <denkenz@gmail.com>2009-07-07 14:31:11 -0500
committerDenis Kenzior <denkenz@gmail.com>2009-07-07 14:34:00 -0500
commitc74ea2093fc869693ac6209b859f000a3a22b28a (patch)
tree9efcddbf3abd58855cc8211d53789c1cfa06450f /gatchat
parentdb71137fd2444d6a83488a888d17ba4fab9ed84b (diff)
downloadofono-c74ea2093fc869693ac6209b859f000a3a22b28a.tar.bz2
Fix case where CMGS returns an error before pdu
Commands like CMGS might return an error before the entire command has been submitted. This results in gatchat stalling completely.
Diffstat (limited to 'gatchat')
-rw-r--r--gatchat/gatchat.c18
1 files changed, 15 insertions, 3 deletions
diff --git a/gatchat/gatchat.c b/gatchat/gatchat.c
index dc0d7c9c..32f0b592 100644
--- a/gatchat/gatchat.c
+++ b/gatchat/gatchat.c
@@ -466,9 +466,21 @@ static void have_line(GAtChat *p, gboolean strip_preceding)
cmd = g_queue_peek_head(p->command_queue);
- if (cmd && p->cmd_bytes_written == strlen(cmd->cmd) &&
- g_at_chat_handle_command_response(p, cmd, str))
- return;
+ if (cmd) {
+ char c = cmd->cmd[p->cmd_bytes_written - 1];
+
+ /* We check that we have submitted a terminator, in which case
+ * a command might have failed or completed successfully
+ *
+ * In the generic case, \r is at the end of the command, so we
+ * know the entire command has been submitted. In the case of
+ * commands like CMGS, every \r or Ctrl-Z might result in a
+ * final response from the modem, so we check this as well.
+ */
+ if ((c == '\r' || c == 26) &&
+ g_at_chat_handle_command_response(p, cmd, str))
+ return;
+ }
if (g_at_chat_match_notify(p, str) == TRUE)
return;