Blame SOURCES/0313-grub-core-disk-ieee1275-ofdisk.c-Fix-CD-ROM-and-boot.patch

f96e0b
From 0e882e0c48a93f7e187fd403ffb32d3ad861ee77 Mon Sep 17 00:00:00 2001
f96e0b
From: Vladimir 'phcoder' Serbinenko <phcoder@gmail.com>
f96e0b
Date: Mon, 15 Apr 2013 00:38:39 +0200
f96e0b
Subject: [PATCH 313/482] 	* grub-core/disk/ieee1275/ofdisk.c: Fix CD-ROM
f96e0b
 and boot device 	detection.
f96e0b
f96e0b
---
f96e0b
 ChangeLog                        |  5 +++++
f96e0b
 grub-core/disk/ieee1275/ofdisk.c | 21 +++++++++++++++++++--
f96e0b
 2 files changed, 24 insertions(+), 2 deletions(-)
f96e0b
f96e0b
diff --git a/ChangeLog b/ChangeLog
f96e0b
index a4d9555..b372668 100644
f96e0b
--- a/ChangeLog
f96e0b
+++ b/ChangeLog
f96e0b
@@ -1,3 +1,8 @@
f96e0b
+2013-04-15  Vladimir Serbinenko  <phcoder@gmail.com>
f96e0b
+
f96e0b
+	* grub-core/disk/ieee1275/ofdisk.c: Fix CD-ROM and boot device
f96e0b
+	detection.
f96e0b
+
f96e0b
 2013-04-14  Vladimir Serbinenko  <phcoder@gmail.com>
f96e0b
 
f96e0b
 	* grub-core/lib/posix_wrap/sys/types.h: Make WORDS_BIGENDIAN definition
f96e0b
diff --git a/grub-core/disk/ieee1275/ofdisk.c b/grub-core/disk/ieee1275/ofdisk.c
f96e0b
index bebf777..ec92c4d 100644
f96e0b
--- a/grub-core/disk/ieee1275/ofdisk.c
f96e0b
+++ b/grub-core/disk/ieee1275/ofdisk.c
f96e0b
@@ -32,6 +32,7 @@ struct ofdisk_hash_ent
f96e0b
 {
f96e0b
   char *devpath;
f96e0b
   int is_boot;
f96e0b
+  int is_cdrom;
f96e0b
   /* Pointer to shortest available name on nodes representing canonical names,
f96e0b
      otherwise NULL.  */
f96e0b
   const char *shortest;
f96e0b
@@ -80,6 +81,18 @@ ofdisk_hash_add_real (char *devpath)
f96e0b
   return p;
f96e0b
 }
f96e0b
 
f96e0b
+static int
f96e0b
+check_string_cdrom (const char *str)
f96e0b
+{
f96e0b
+  const char *ptr = grub_strrchr (str, '/');
f96e0b
+
f96e0b
+  if (ptr)
f96e0b
+    ptr++;
f96e0b
+  else
f96e0b
+    ptr = str;
f96e0b
+  return (grub_strncmp (ptr, "cdrom", 5) == 0);
f96e0b
+}
f96e0b
+
f96e0b
 static struct ofdisk_hash_ent *
f96e0b
 ofdisk_hash_add (char *devpath, char *curcan)
f96e0b
 {
f96e0b
@@ -92,6 +105,8 @@ ofdisk_hash_add (char *devpath, char *curcan)
f96e0b
   if (!curcan)
f96e0b
     {
f96e0b
       p->shortest = devpath;
f96e0b
+      if (check_string_cdrom (devpath))
f96e0b
+	p->is_cdrom = 1;  
f96e0b
       return p;
f96e0b
     }
f96e0b
 
f96e0b
@@ -101,6 +116,9 @@ ofdisk_hash_add (char *devpath, char *curcan)
f96e0b
   else
f96e0b
     grub_free (curcan);
f96e0b
 
f96e0b
+  if (check_string_cdrom (devpath) || check_string_cdrom (curcan))
f96e0b
+    pcan->is_cdrom = 1;
f96e0b
+
f96e0b
   if (!pcan)
f96e0b
     grub_errno = GRUB_ERR_NONE;
f96e0b
   else
f96e0b
@@ -267,8 +285,7 @@ grub_ofdisk_iterate (grub_disk_dev_iterate_hook_t hook, void *hook_data,
f96e0b
 		}
f96e0b
 	    }
f96e0b
 
f96e0b
-	  if (grub_strncmp (ent->shortest, "cdrom", 5) == 0
f96e0b
-	      || ent->is_boot)
f96e0b
+	  if (!ent->is_boot && ent->is_cdrom)
f96e0b
 	    continue;
f96e0b
 
f96e0b
 	  {
f96e0b
-- 
f96e0b
1.8.2.1
f96e0b