make escape code handling for serial terminal more robust
authorPatrick Georgi <patrick.georgi@coresystems.de>
Thu, 23 Oct 2008 12:22:24 +0000 (12:22 +0000)
committerPatrick Georgi <patrick.georgi@coresystems.de>
Thu, 23 Oct 2008 12:22:24 +0000 (12:22 +0000)
Signed-off-by: Patrick Georgi <patrick.georgi@coresystems.de>
Acked-by: Marc Jones <marc.jones@amd.com>
git-svn-id: svn://svn.coreboot.org/coreboot/trunk@3691 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1

payloads/libpayload/curses/keyboard.c

index 45bd4442fe3d540b73af1cda7b99bc473ab91231..ead4313a988d4c5619061f9bd4a5903f8fe1e993 100644 (file)
@@ -50,21 +50,24 @@ static int _halfdelay = 0;
    do the cooking in here, but we should probably eventually
    pass it to dedicated vt100 code */
 
-static int getkeyseq(char *buffer, int len)
+static int getkeyseq(char *buffer, int len, int max)
 {
        int i;
 
-       for(i = 0; i < 75; i++) {
-               if (serial_havechar())
-                       break;
-               mdelay(1);
-       }
+       while (1) {
+               for(i = 0; i < 75; i++) {
+                       if (serial_havechar())
+                               break;
+                       mdelay(1);
+               }
 
-       if (i == 75)
-               return len;
+               if (i == 75)
+                       return len;
 
-       buffer[len++] = serial_getchar();
-       return getkeyseq(buffer, len);
+               buffer[len++] = serial_getchar();
+               if (len == max)
+                       return len;
+       }
 }
 
 static struct {
@@ -99,7 +102,7 @@ static struct {
 static int handle_escape(void)
 {
        char buffer[5];
-       int len = getkeyseq(buffer, 0);
+       int len = getkeyseq(buffer, 0, sizeof(buffer));
        int i, t;
 
        if (len == 0)