commit-grub
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[2189] * disk/ieee1275/ofdisk.c (compute_dev_path): New.


From: David S. Miller
Subject: [2189] * disk/ieee1275/ofdisk.c (compute_dev_path): New.
Date: Mon, 04 May 2009 23:13:53 +0000

Revision: 2189
          http://svn.sv.gnu.org/viewvc/?view=rev&root=grub&revision=2189
Author:   davem
Date:     2009-05-04 23:13:53 +0000 (Mon, 04 May 2009)
Log Message:
-----------
        * disk/ieee1275/ofdisk.c (compute_dev_path): New.
        (grub_ofdisk_open): Use it to un-escape "," characters.
        * kern/disk.c (find_part_sep): New.
        (grub_disk_open): Use it to find the first non-escaped ','
        character in the disk name.
        * util/ieee1275/devicemap.c (escape_of_path): New.
        (grub_util_emit_devicemap_entry): Use it.
        * util/sparc64/ieee1275/grub-install.in: Update script to
        strip partition specifiers properly by not triggering on
        '\' escaped ',' characters.

Modified Paths:
--------------
    trunk/grub2/ChangeLog
    trunk/grub2/disk/ieee1275/ofdisk.c
    trunk/grub2/kern/disk.c
    trunk/grub2/util/ieee1275/devicemap.c
    trunk/grub2/util/sparc64/ieee1275/grub-install.in
    trunk/grub2/util/sparc64/ieee1275/grub-setup.c

Modified: trunk/grub2/ChangeLog
===================================================================
--- trunk/grub2/ChangeLog       2009-05-04 23:05:12 UTC (rev 2188)
+++ trunk/grub2/ChangeLog       2009-05-04 23:13:53 UTC (rev 2189)
@@ -8,6 +8,17 @@
        * disk/ieee1275/ofdisk.c (grub_ofdisk_iterate): Bypass cdrom
        devices, and do not traverse down under controller nodes.
 
+       * disk/ieee1275/ofdisk.c (compute_dev_path): New.
+       (grub_ofdisk_open): Use it to un-escape "," characters.
+       * kern/disk.c (find_part_sep): New.
+       (grub_disk_open): Use it to find the first non-escaped ','
+       character in the disk name.
+       * util/ieee1275/devicemap.c (escape_of_path): New.
+       (grub_util_emit_devicemap_entry): Use it.
+       * util/sparc64/ieee1275/grub-install.in: Update script to
+       strip partition specifiers properly by not triggering on
+       '\' escaped ',' characters.
+
 2009-05-04  Robert Millan  <address@hidden>
 
        * include/grub/i386/linux.h (GRUB_LINUX_VID_MODE_VESA_START): Set

Modified: trunk/grub2/disk/ieee1275/ofdisk.c
===================================================================
--- trunk/grub2/disk/ieee1275/ofdisk.c  2009-05-04 23:05:12 UTC (rev 2188)
+++ trunk/grub2/disk/ieee1275/ofdisk.c  2009-05-04 23:13:53 UTC (rev 2189)
@@ -115,6 +115,38 @@
   return grub_devalias_iterate (dev_iterate);
 }
 
+static char *
+compute_dev_path (const char *name)
+{
+  char *devpath = grub_malloc (grub_strlen (name) + 2);
+  char *p, c;
+
+  if (!devpath)
+    return NULL;
+
+  /* Un-escape commas. */
+  p = devpath;
+  while ((c = *name++) != '\0')
+    {
+      if (c == '\\' && *name == ',')
+       {
+         *p++ = ',';
+         name++;
+       }
+      else
+       *p++ = c;
+    }
+
+  if (! grub_ieee1275_test_flag (GRUB_IEEE1275_FLAG_NO_PARTITION_0))
+    {
+      *p++ = ':';
+      *p++ = '0';
+    }
+  *p++ = '\0';
+
+  return devpath;
+}
+
 static grub_err_t
 grub_ofdisk_open (const char *name, grub_disk_t disk)
 {
@@ -126,14 +158,10 @@
   char prop[64];
   grub_ssize_t actual;
 
-  devpath = grub_strndup (name, grub_strlen (name) + 2);
+  devpath = compute_dev_path (name);
   if (! devpath)
     return grub_errno;
 
-  /* To access the complete disk add `:0'.  */
-  if (! grub_ieee1275_test_flag (GRUB_IEEE1275_FLAG_NO_PARTITION_0))
-    grub_strcat (devpath, ":0");
-
   op = ofdisk_hash_find (devpath);
   if (!op)
     op = ofdisk_hash_add (devpath);

Modified: trunk/grub2/kern/disk.c
===================================================================
--- trunk/grub2/kern/disk.c     2009-05-04 23:05:12 UTC (rev 2188)
+++ trunk/grub2/kern/disk.c     2009-05-04 23:13:53 UTC (rev 2189)
@@ -215,10 +215,28 @@
   return 0;
 }
 
+/* Return the location of the first ',', if any, which is not
+   escaped by a '\'.  */
+static const char *
+find_part_sep (const char *name)
+{
+  const char *p = name;
+  char c;
+
+  while ((c = *p++) != '\0')
+    {
+      if (c == '\\' && *p == ',')
+       p++;
+      else if (c == ',')
+       return p - 1;
+    }
+  return NULL;
+}
+
 grub_disk_t
 grub_disk_open (const char *name)
 {
-  char *p;
+  const char *p;
   grub_disk_t disk;
   grub_disk_dev_t dev;
   char *raw = (char *) name;
@@ -238,7 +256,7 @@
   if (! disk->name)
     goto fail;
   
-  p = grub_strchr (name, ',');
+  p = find_part_sep (name);
   if (p)
     {
       grub_size_t len = p - name;

Modified: trunk/grub2/util/ieee1275/devicemap.c
===================================================================
--- trunk/grub2/util/ieee1275/devicemap.c       2009-05-04 23:05:12 UTC (rev 
2188)
+++ trunk/grub2/util/ieee1275/devicemap.c       2009-05-04 23:13:53 UTC (rev 
2189)
@@ -1,13 +1,47 @@
 #include <stdio.h>
+#include <string.h>
 #include <grub/types.h>
 #include <grub/util/deviceiter.h>
 #include <grub/util/ofpath.h>
+#include <grub/util/misc.h>
 
+/* Since OF path names can have "," characters in them, and GRUB
+   internally uses "," to indicate partitions (unlike OF which uses
+   ":" for this purpose) we escape such commas.  */
+
+static char *
+escape_of_path (const char *orig_path)
+{
+  char *new_path, *d, c;
+  const char *p;
+
+  if (!strchr (orig_path, ','))
+    return (char *) orig_path;
+
+  new_path = xmalloc (strlen (orig_path) * 2);
+
+  p = orig_path;
+  d = new_path;
+  while ((c = *p++) != '\0')
+    {
+      if (c == ',')
+       *d++ = '\\';
+      *d++ = c;
+    }
+
+  free ((char *) orig_path);
+
+  return new_path;
+}
+
 void
 grub_util_emit_devicemap_entry (FILE *fp, char *name, int is_floppy UNUSED,
                                int *num_fd UNUSED, int *num_hd UNUSED)
 {
-  const char *ofpath = grub_util_devname_to_ofpath (name);
+  const char *orig_path = grub_util_devname_to_ofpath (name);
+  char *ofpath = escape_of_path (orig_path);
 
   fprintf(fp, "(%s)\t%s\n", ofpath, name);
+
+  free (ofpath);
 }

Modified: trunk/grub2/util/sparc64/ieee1275/grub-install.in
===================================================================
--- trunk/grub2/util/sparc64/ieee1275/grub-install.in   2009-05-04 23:05:12 UTC 
(rev 2188)
+++ trunk/grub2/util/sparc64/ieee1275/grub-install.in   2009-05-04 23:13:53 UTC 
(rev 2189)
@@ -237,8 +237,8 @@
     grub_drive="`$grub_probe --target=drive --device ${grub_device}`"
 
     # Strip partition number
-    install_drive="`echo ${install_drive} | sed -e s/,[0-9]*//g`"
-    grub_drive="`echo ${grub_drive} | sed -e s/,[0-9]*//g`"
+    install_drive="`echo ${install_drive} | sed -e s/\([^\]\),[0-9]*/\1/g`"
+    grub_drive="`echo ${grub_drive} | sed -e s/\([^\]\),[0-9]*/\1/g`"
     if [ "x${grub_drive}" != "x${install_drive}" ] ; then
         uuid="`$grub_probe --target=fs_uuid --device ${grub_device}`"
         if [ "x${uuid}" = "x" ] ; then

Modified: trunk/grub2/util/sparc64/ieee1275/grub-setup.c
===================================================================
--- trunk/grub2/util/sparc64/ieee1275/grub-setup.c      2009-05-04 23:05:12 UTC 
(rev 2188)
+++ trunk/grub2/util/sparc64/ieee1275/grub-setup.c      2009-05-04 23:13:53 UTC 
(rev 2189)
@@ -56,7 +56,7 @@
  * device.  It also needs to know the initial block number of
  * 'core' (which is 'diskboot' concatenated with 'kernel' and
  * all the modules, this is created by grub-mkimage).  This resulting
- * 'boot' image is 512 bytes in size and is placed in the first block
+ * 'boot' image is 512 bytes in size and is placed in the second block
  * of a partition.
  *
  * The initial 'diskboot' block acts as a loader for the actual GRUB
@@ -100,6 +100,28 @@
   fflush (stdout);
 }
 
+static char *compute_dest_ofpath (const char *dest)
+{
+  int len = strlen (dest);
+  char *res, *p, c;
+
+  res = xmalloc (len);
+  p = res;
+  while ((c = *dest++) != '\0')
+    {
+      if (c == '\\' && *dest == ',')
+       {
+         *p++ = ',';
+         dest++;
+       }
+      else
+       *p++ = c;
+    }
+  *p++ = '\0';
+
+  return res;
+}
+
 static void
 setup (const char *prefix, const char *dir,
        const char *boot_file, const char *core_file,
@@ -110,7 +132,7 @@
   size_t boot_size, core_size;
   grub_uint16_t core_sectors;
   grub_device_t root_dev, dest_dev;
-  char *boot_devpath;
+  char *boot_devpath, *dest_ofpath;
   grub_disk_addr_t *kernel_sector;
   struct boot_blocklist *first_block, *block;
   char *tmp_img;
@@ -170,6 +192,8 @@
       last_length = length;
     }
 
+  dest_ofpath = compute_dest_ofpath (dest);
+
   /* Read the boot image by the OS service.  */
   boot_path = grub_util_get_path (dir, boot_file);
   boot_size = grub_util_get_image_size (boot_path);
@@ -202,7 +226,8 @@
                                           + GRUB_DISK_SECTOR_SIZE
                                           - sizeof (*block));
 
-  grub_util_info ("root is '%s' and dest is '%s'", root, dest);
+  grub_util_info ("root is '%s', dest is '%s', and dest_ofpath is '%s'",
+                 root, dest, dest_ofpath);
 
   /* Open the root device and the destination device.  */
   grub_util_info ("Opening root");
@@ -330,7 +355,7 @@
 
   *kernel_sector = grub_cpu_to_be64 (first_sector);
 
-  strcpy(boot_devpath, dest);
+  strcpy(boot_devpath, dest_ofpath);
 
   grub_util_info ("boot device path %s, prefix is %s, dest is %s",
                  boot_devpath, prefix, dest);





reply via email to

[Prev in Thread] Current Thread [Next in Thread]