]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
Support escaped commas in hostdisk.
authorVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Tue, 8 Nov 2011 11:15:57 +0000 (12:15 +0100)
committerVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Tue, 8 Nov 2011 11:15:57 +0000 (12:15 +0100)
* grub-core/kern/emu/hostdisk.c (unescape_cmp): New function.
(find_grub_drive): Use unescape_cmp.
(make_device_name): Escape commas.

ChangeLog
grub-core/kern/emu/hostdisk.c

index 02af51ea87eead70529befd788c8613de6a70142..c7f8d3c7b0c6d54661a5f9c3d757a042046c7708 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2011-11-08  Vladimir Serbinenko  <phcoder@gmail.com>
+
+       Support escaped commas in hostdisk.
+
+       * grub-core/kern/emu/hostdisk.c (unescape_cmp): New function.
+       (find_grub_drive): Use unescape_cmp.
+       (make_device_name): Escape commas.
+
 2011-11-08  Vladimir Serbinenko  <phcoder@gmail.com>
 
        * util/grub.d/10_kfreebsd.in: Use ${grub_mkrelpath} not grub-mkrelpath.
index 23417a64d6a5f7858326cd6e6dce08b18eac8199..4d5c28631087cd835e4991ba08740fd3c1952813 100644 (file)
@@ -184,6 +184,27 @@ configure_device_driver (int fd)
 }
 #endif /* defined(__NetBSD__) */
 
+static int
+unescape_cmp (const char *a, const char *b_escaped)
+{
+  while (*a || *b_escaped)
+    {
+      if (*b_escaped == '\\' && b_escaped[1] != 0)
+       b_escaped++;
+      if (*a < *b_escaped)
+       return -1;
+      if (*a > *b_escaped)
+       return +1;
+      a++;
+      b_escaped++;
+    }
+  if (*a)
+    return +1;
+  if (*b_escaped)
+    return -1;
+  return 0;
+}
+
 static int
 find_grub_drive (const char *name)
 {
@@ -192,7 +213,7 @@ find_grub_drive (const char *name)
   if (name)
     {
       for (i = 0; i < ARRAY_SIZE (map); i++)
-       if (map[i].drive && ! strcmp (map[i].drive, name))
+       if (map[i].drive && unescape_cmp (map[i].drive, name) == 0)
          return i;
     }
 
@@ -1140,25 +1161,28 @@ grub_util_biosdisk_fini (void)
 static char *
 make_device_name (int drive, int dos_part, int bsd_part)
 {
-  char *ret;
-  char *dos_part_str = NULL;
-  char *bsd_part_str = NULL;
-
+  char *ret, *ptr, *end;
+  const char *iptr;
+
+  ret = xmalloc (strlen (map[drive].drive) * 2 
+                + sizeof (",XXXXXXXXXXXXXXXXXXXXXXXXXX"
+                          ",XXXXXXXXXXXXXXXXXXXXXXXXXX"));
+  end = (ret + strlen (map[drive].drive) * 2 
+        + sizeof (",XXXXXXXXXXXXXXXXXXXXXXXXXX"
+                  ",XXXXXXXXXXXXXXXXXXXXXXXXXX"));
+  ptr = ret;
+  for (iptr = map[drive].drive; *iptr; iptr++)
+    {
+      if (*iptr == ',')
+       *ptr++ = '\\';
+      *ptr++ = *iptr;
+    }
+  *ptr = 0;
   if (dos_part >= 0)
-    dos_part_str = xasprintf (",%d", dos_part + 1);
-
+    snprintf (ptr, end - ptr, ",%d", dos_part + 1);
+  ptr += strlen (ptr);
   if (bsd_part >= 0)
-    bsd_part_str = xasprintf (",%d", bsd_part + 1);
-
-  ret = xasprintf ("%s%s%s", map[drive].drive,
-                   dos_part_str ? : "",
-                   bsd_part_str ? : "");
-
-  if (dos_part_str)
-    free (dos_part_str);
-
-  if (bsd_part_str)
-    free (bsd_part_str);
+    snprintf (ptr, end - ptr, ",%d", bsd_part + 1); 
 
   return ret;
 }