From c74ea2093fc869693ac6209b859f000a3a22b28a Mon Sep 17 00:00:00 2001 From: Denis Kenzior Date: Tue, 7 Jul 2009 14:31:11 -0500 Subject: [PATCH] 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. --- gatchat/gatchat.c | 18 +++++++++++++++--- 1 file 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;