]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
syslinux: Support {vesa,}menu.c32.
authorLunar <lunar@torproject.org>
Fri, 27 Mar 2015 14:15:13 +0000 (15:15 +0100)
committerVladimir Serbinenko <phcoder@gmail.com>
Fri, 27 Mar 2015 14:15:13 +0000 (15:15 +0100)
grub-core/lib/syslinux_parse.c

index 22389eb97970ab746bb185d8652de84c0e4727a7..153260b5410ee3b01cf123160c1d8d49519da72a 100644 (file)
@@ -839,6 +839,82 @@ simplify_filename (char *str)
   *optr = '\0';
 }
 
+static grub_err_t
+print_config (struct output_buffer *outbuf,
+             struct syslinux_menu *menu,
+              const char *filename, const char *basedir)
+{
+  struct syslinux_menu *menuptr;
+  grub_err_t err = GRUB_ERR_NONE;
+  char *new_cwd = NULL;
+  char *new_target_cwd = NULL;
+  char *newname = NULL;
+  int depth = 0;
+
+  new_cwd = get_read_filename (menu, basedir);
+  if (!new_cwd)
+    {
+      err = grub_errno;
+      goto out;
+    }
+  new_target_cwd = get_target_filename (menu, basedir);
+  if (!new_target_cwd)
+    {
+      err = grub_errno;
+      goto out;
+    }
+  newname = get_read_filename (menu, filename);
+  if (!newname)
+    {
+      err = grub_errno;
+      goto out;
+    }
+  simplify_filename (newname);
+
+  print_string ("#");
+  print_file (outbuf, menu, filename, NULL);
+  print_string (" ");
+  print (outbuf, newname, grub_strlen (newname));
+  print_string (":\n");
+
+  for (menuptr = menu; menuptr; menuptr = menuptr->parent, depth++)
+    if (grub_strcmp (menuptr->filename, newname) == 0
+        || depth > 20)
+      break;
+  if (menuptr)
+    {
+      print_string ("  syslinux_configfile -r ");
+      print_file (outbuf, menu, "/", NULL);
+      print_string (" -c ");
+      print_file (outbuf, menu, basedir, NULL);
+      print_string (" ");
+      print_file (outbuf, menu, filename, NULL);
+      print_string ("\n");
+    }
+  else
+    {
+      err = config_file (outbuf, menu->root_read_directory,
+                         menu->root_target_directory, new_cwd, new_target_cwd,
+                         newname, menu, menu->flavour);
+      if (err == GRUB_ERR_FILE_NOT_FOUND
+          || err == GRUB_ERR_BAD_FILENAME)
+        {
+          grub_errno = err = GRUB_ERR_NONE;
+          print_string ("# File ");
+          err = print (outbuf, newname, grub_strlen (newname));
+          if (err)
+            goto out;
+          print_string (" not found\n");
+        }
+    }
+
+ out:
+  grub_free (newname);
+  grub_free (new_cwd);
+  grub_free (new_target_cwd);
+  return err;
+}
+
 static grub_err_t
 write_entry (struct output_buffer *outbuf,
             struct syslinux_menu *menu,
@@ -1227,6 +1303,36 @@ write_entry (struct output_buffer *outbuf,
            break;
          }
 
+       if (grub_strcasecmp (basename, "menu.c32") == 0 ||
+           grub_strcasecmp (basename, "vesamenu.c32") == 0)
+         {
+           char *ptr;
+           char *end;
+
+           ptr = curentry->append;
+           if (!ptr)
+             return grub_errno;
+
+           while (*ptr)
+             {
+               end = ptr;
+               for (end = ptr; *end && !grub_isspace (*end); end++);
+               if (*end)
+                 *end++ = '\0';
+
+               /* "~" is supposed to be current file, so let's skip it */
+               if (grub_strcmp (ptr, "~") != 0)
+                 {
+                   err = print_config (outbuf, menu, ptr, "");
+                   if (err != GRUB_ERR_NONE)
+                     break;
+                  }
+               for (ptr = end; *ptr && grub_isspace (*ptr); ptr++);
+             }
+           err = GRUB_ERR_NONE;
+           break;
+         }
+
        /* FIXME: gdb, GFXBoot, Hdt, Ifcpu, Ifplop, Kbdmap,
           FIXME: Linux, Lua, Meminfo, rosh, Sanbboot  */
 
@@ -1239,70 +1345,13 @@ write_entry (struct output_buffer *outbuf,
       }
     case KERNEL_CONFIG:
       {
-       char *new_cwd, *new_target_cwd;
        const char *ap;
        ap = curentry->append;
        if (!ap)
          ap = curentry->argument;
        if (!ap)
          ap = "";
-       new_cwd = get_read_filename (menu, ap);
-       if (!new_cwd)
-         return grub_errno;
-       new_target_cwd = get_target_filename (menu, ap);
-       if (!new_target_cwd)
-         return grub_errno;
-
-       struct syslinux_menu *menuptr;
-       char *newname;
-       int depth = 0;
-       
-       newname = get_read_filename (menu, curentry->kernel_file);
-       if (!newname)
-         return grub_errno;
-       simplify_filename (newname);
-
-       print_string ("#");
-       print_file (outbuf, menu, curentry->kernel_file, NULL);
-       print_string (" ");
-       print (outbuf, newname, grub_strlen (newname));
-       print_string (":\n");
-
-       for (menuptr = menu; menuptr; menuptr = menuptr->parent, depth++)
-         if (grub_strcmp (menuptr->filename, newname) == 0
-             || depth > 20)
-           break;
-       if (menuptr)
-         {
-           print_string ("  syslinux_configfile -r ");
-           print_file (outbuf, menu, "/", NULL);
-           print_string (" -c ");
-           print_file (outbuf, menu, ap, NULL);
-           print_string (" ");
-           print_file (outbuf, menu, curentry->kernel_file, NULL);
-           print_string ("\n");
-         }
-       else
-         {
-           err = config_file (outbuf, menu->root_read_directory,
-                              menu->root_target_directory, new_cwd, new_target_cwd,
-                              newname, menu, menu->flavour);
-           if (err == GRUB_ERR_FILE_NOT_FOUND
-               || err == GRUB_ERR_BAD_FILENAME)
-             {
-               grub_errno = err = GRUB_ERR_NONE;
-               print_string ("# File ");
-               err = print (outbuf, newname, grub_strlen (newname));
-               if (err)
-                 return err;
-               print_string (" not found\n");
-             }
-           if (err)
-             return err;
-         }
-       grub_free (newname);
-       grub_free (new_cwd);
-       grub_free (new_target_cwd);
+       print_config (outbuf, menu, curentry->kernel_file, ap);
       }
       break;
     case KERNEL_NO_KERNEL: