]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
* grub-core/term/arc/console.c: Assume that console is 80x24 vt100 if
authorVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Wed, 24 Apr 2013 16:39:00 +0000 (18:39 +0200)
committerVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Wed, 24 Apr 2013 16:39:00 +0000 (18:39 +0200)
it's serial.

ChangeLog
grub-core/term/arc/console.c
include/grub/arc/arc.h

index 2f55104e88f679e9669902b28811ea6f88dc8d00..6c27f76daae10268305c853f21b4708d5febfa74 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2013-04-24  Vladimir Serbinenko  <phcoder@gmail.com>
+
+       * grub-core/term/arc/console.c: Assume that console is 80x24 vt100 if
+       it's serial.
+
 2013-04-24  Vladimir Serbinenko  <phcoder@gmail.com>
 
        * util/grub-install.in: Fix target fo qemu_mips.
index 0ccaebe0a96f51f76848a9012ee742fe2230701c..13478ea36a9f246ae3dedb15204bc62786a2eb18 100644 (file)
@@ -50,10 +50,72 @@ put (struct grub_term_output *term __attribute__ ((unused)), const int c)
 
 static struct grub_terminfo_output_state grub_console_terminfo_output;
 
-static grub_err_t
-grub_console_init_output (struct grub_term_output *term)
+static int
+check_is_serial (void)
+{
+  static int is_serial = -1;
+
+  if (is_serial != -1)
+    return is_serial;
+
+  const char *consout = 0;
+
+  /* Check for serial. It works unless user manually overrides ConsoleOut
+     variable. If he does there is nothing we can do. Fortunately failure
+     isn't critical.
+  */
+  if (GRUB_ARC_SYSTEM_PARAMETER_BLOCK->firmware_vector_length
+      >= ((char *) (&GRUB_ARC_FIRMWARE_VECTOR->getenvironmentvariable + 1)
+         - (char *) GRUB_ARC_FIRMWARE_VECTOR)
+      && GRUB_ARC_FIRMWARE_VECTOR->getenvironmentvariable)
+    consout = GRUB_ARC_FIRMWARE_VECTOR->getenvironmentvariable ("ConsoleOut");
+  if (!consout)
+    return is_serial = 0;
+  if (consout[0] == '\0')
+    return is_serial = 0;
+
+  const char *ptr = consout + grub_strlen (consout) - 1;
+  int i;
+  /*
+    Recognize:
+    serial(N)
+    serial(N)other(M)
+   */
+  for (i = 0; i < 2; i++)
+    {
+      if (*ptr != ')')
+       return is_serial = 0;
+      ptr--;
+      for (; ptr >= consout && grub_isdigit (*ptr); ptr--);
+      if (ptr < consout)
+       return is_serial = 0;
+      if (*ptr != '(')
+       return is_serial = 0;
+      if (ptr >= consout + sizeof ("serial") - 1
+         && grub_memcmp (ptr - (sizeof ("serial") - 1),
+                         "serial", sizeof ("serial") - 1) == 0)
+       return is_serial = 1;
+      if (!(ptr >= consout + sizeof ("other") - 1
+           && grub_memcmp (ptr - (sizeof ("other") - 1),
+                           "other", sizeof ("other") - 1) == 0))
+       return is_serial = 0;
+      ptr -= sizeof ("other");
+    }
+  return 0;
+}
+    
+static void
+set_console_dimensions (void)
 {
   struct grub_arc_display_status *info = NULL;
+
+  if (check_is_serial ())
+    {
+      grub_console_terminfo_output.width = 80;
+      grub_console_terminfo_output.height = 24;
+      return;
+    }
+
   if (GRUB_ARC_SYSTEM_PARAMETER_BLOCK->firmware_vector_length
       >= ((char *) (&GRUB_ARC_FIRMWARE_VECTOR->getdisplaystatus + 1)
          - (char *) GRUB_ARC_FIRMWARE_VECTOR)
@@ -64,6 +126,12 @@ grub_console_init_output (struct grub_term_output *term)
       grub_console_terminfo_output.width = info->w + 1;
       grub_console_terminfo_output.height = info->h + 1;
     }
+}
+
+static grub_err_t
+grub_console_init_output (struct grub_term_output *term)
+{
+  set_console_dimensions ();
   grub_terminfo_output_init (term);
 
   return 0;
@@ -115,5 +183,8 @@ void
 grub_console_init_lately (void)
 {
   grub_terminfo_init ();
-  grub_terminfo_output_register (&grub_console_term_output, "arc");
+  if (check_is_serial ())
+    grub_terminfo_output_register (&grub_console_term_output, "vt100");
+  else
+    grub_terminfo_output_register (&grub_console_term_output, "arc");
 }
index 739926f432b304a9c39e348083c97f26d12538a6..8f865001e53dd5dc0e50ed4b9a3535dbe2116aa6 100644 (file)
@@ -210,7 +210,7 @@ struct grub_arc_firmware_vector
   grub_arc_err_t (*seek) (grub_arc_fileno_t fileno,
                          grub_arc_ularge_t *pos, grub_arc_enum_t mode);
   void *mount;
-  void *getenvironmentvariable;
+  const char * (*getenvironmentvariable) (const char *name);
   void *setenvironmentvariable;
 
   /* 0x80. */