r102 - trunk/src/target/gsm/src/gsmd

laforge at gta01.hmw-consulting.de laforge at gta01.hmw-consulting.de
Sun Oct 22 20:38:35 CEST 2006


Author: laforge
Date: 2006-10-22 18:38:35 +0000 (Sun, 22 Oct 2006)
New Revision: 102

Modified:
   trunk/src/target/gsm/src/gsmd/atcmd.c
   trunk/src/target/gsm/src/gsmd/gsmd.c
   trunk/src/target/gsm/src/gsmd/unsolicited.c
   trunk/src/target/gsm/src/gsmd/usock.c
Log:
- fix parsing of unsolicited codes 
- fix segfault due to missing zero-filled option in 'struct option' array


Modified: trunk/src/target/gsm/src/gsmd/atcmd.c
===================================================================
--- trunk/src/target/gsm/src/gsmd/atcmd.c	2006-10-22 17:50:13 UTC (rev 101)
+++ trunk/src/target/gsm/src/gsmd/atcmd.c	2006-10-22 18:38:35 UTC (rev 102)
@@ -97,8 +97,11 @@
 			ret = llparse_append(llp, byte);
 		break;
 	case LLPARSE_STATE_RESULT_CR:
-		if (byte == '\n')
+		if (byte == '\n') {
+			/* re-set cursor to start of buffer */
+			llp->cur = llp->buf;
 			llp->state = LLPARSE_STATE_IDLE;
+		}
 		break;
 	case LLPARSE_STATE_ERROR:
 		break;
@@ -117,9 +120,8 @@
 		/* if _after_ parsing the current byte we have finished,
 		 * let the caller know that there is something to handle */
 		if (llp->state == LLPARSE_STATE_RESULT_CR) {
+			/* FIXME: what to do with return value ? */
 			llp->cb(llp->buf, llp->cur - llp->buf, llp->ctx);
-			/* re-set cursor to start of buffer */
-			llp->cur = llp->buf;
 		}
 	}
 
@@ -149,7 +151,9 @@
 {
 	struct gsmd *g = ctx;
 	struct gsmd_atcmd *cmd;
-	int final = 0;
+	int rc, final = 0;
+
+	DEBUGP("buf=`%s'(%d)\n", buf, len);
 	
 	/* responses come in order, so first response has to be for first
 	 * command we sent, i.e. first entry in list */
@@ -164,11 +168,6 @@
 				buf);
 			return -EINVAL;
 		}
-		if (cmd->buf[2] != '+') {
-			gsmd_log(GSMD_ERROR, "extd reply to non-extd command?\n");
-			return -EINVAL;
-		}
-
 		if (!strncmp(buf+1, "CME ERROR", 9)) {
 			unsigned long err_nr;
 			err_nr = strtoul(colon+1, NULL, 10);
@@ -184,9 +183,18 @@
 			colon++;
 			if (colon > buf+len)
 				colon = NULL;
-			return unsolicited_parse(g, buf, len, colon);
+			rc = unsolicited_parse(g, buf, len, colon);
+			/* if unsolicited parser didn't handle this 'reply', then we 
+			 * need to continue and try harder and see what it is */
+			if (rc != -ENOENT)
+				return rc;
 		}
 
+		if (cmd->buf[2] != '+') {
+			gsmd_log(GSMD_ERROR, "extd reply to non-extd command?\n");
+			return -EINVAL;
+		}
+
 		/* if we survive till here, it's a valid extd response
 		 * to an extended command */
 
@@ -354,6 +362,7 @@
 	DEBUGP("c_iflag = 0x%08x, c_oflag = 0x%08x, c_cflag = 0x%08x, c_lflag = 0x%08x\n",
 		t.c_iflag, t.c_oflag, t.c_cflag, t.c_lflag);
 	t.c_iflag = t.c_oflag = 0;
+	cfmakeraw(&t);
 	rc = tcsetattr(fd, TCSANOW, &t);
 }
 

Modified: trunk/src/target/gsm/src/gsmd/gsmd.c
===================================================================
--- trunk/src/target/gsm/src/gsmd/gsmd.c	2006-10-22 17:50:13 UTC (rev 101)
+++ trunk/src/target/gsm/src/gsmd/gsmd.c	2006-10-22 18:38:35 UTC (rev 102)
@@ -30,7 +30,7 @@
 static int gsmd_test(struct gsmd *gsmd)
 {
 	struct gsmd_atcmd *cmd;
-	cmd = atcmd_fill("AT+CLCK=?", 255, &gsmd_test_atcb, NULL);
+	cmd = atcmd_fill("AT+CRC?", 255, &gsmd_test_atcb, NULL);
 	return atcmd_submit(gsmd, cmd);
 }
 
@@ -114,6 +114,7 @@
 	{ "device", 1, NULL, 'p' },
 	{ "speed", 1, NULL, 's' },
 	{ "logfile", 1, NULL, 'l' },
+	{ 0, 0, 0, 0 }
 };
 
 static void print_help(void)

Modified: trunk/src/target/gsm/src/gsmd/unsolicited.c
===================================================================
--- trunk/src/target/gsm/src/gsmd/unsolicited.c	2006-10-22 17:50:13 UTC (rev 101)
+++ trunk/src/target/gsm/src/gsmd/unsolicited.c	2006-10-22 18:38:35 UTC (rev 102)
@@ -322,7 +322,7 @@
 	}
 
 	/* FIXME: call vendor-specific unsolicited code parser */
-	return -EINVAL;
+	return -ENOENT;
 }
 
 static unsigned int errors_creating_events[] = {

Modified: trunk/src/target/gsm/src/gsmd/usock.c
===================================================================
--- trunk/src/target/gsm/src/gsmd/usock.c	2006-10-22 17:50:13 UTC (rev 101)
+++ trunk/src/target/gsm/src/gsmd/usock.c	2006-10-22 18:38:35 UTC (rev 102)
@@ -103,7 +103,7 @@
 	return 0;
 }
 
-static usock_msg_handler *pcmd_type_handlers[] = {
+static usock_msg_handler *pcmd_type_handlers[__NUM_GSMD_MSGS] = {
 	[GSMD_MSG_PASSTHROUGH]	= &usock_rcv_passthrough,
 	[GSMD_MSG_EVENT]	= &usock_rcv_event,
 	[GSMD_MSG_VOICECALL]	= &usock_rcv_voicecall,
@@ -118,7 +118,7 @@
 	if (gph->version != GSMD_PROTO_VERSION)
 		return -EINVAL;
 
-	if (gph->msg_type >= ARRAY_SIZE(pcmd_type_handlers))
+	if (gph->msg_type >= __NUM_GSMD_MSGS)
 		return -EINVAL;
 	
 	umh = pcmd_type_handlers[gph->msg_type];





More information about the commitlog mailing list