]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
Support net-/openbsd labels inside logical partitions
authorVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Mon, 20 Sep 2010 19:30:11 +0000 (21:30 +0200)
committerVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Mon, 20 Sep 2010 19:30:11 +0000 (21:30 +0200)
grub-core/partmap/bsdlabel.c
grub-core/partmap/msdos.c
include/grub/msdos_partition.h

index f25b9548e92b2c2bbabea3cf4ce5c236136e42c8..da5c6e3ab585f3179b793333d7318b78829e4496 100644 (file)
@@ -145,32 +145,49 @@ netopenbsdlabel_partition_map_iterate (grub_disk_t disk, grub_uint8_t type,
                                       int (*hook) (grub_disk_t disk,
                                                    const grub_partition_t partition))
 {
-  grub_err_t err;
+  int count = 0;
+
+  auto int check_msdos (grub_disk_t dsk,
+                       const grub_partition_t partition);
+
+  int check_msdos (grub_disk_t dsk,
+                  const grub_partition_t partition)
+  {
+    grub_err_t err;
+
+    if (partition->msdostype != type)
+      return 0;
+
+    err = iterate_real (dsk, partition->start
+                       + GRUB_PC_PARTITION_BSD_LABEL_SECTOR, 0, pmap, hook);
+    if (err == GRUB_ERR_NONE)
+      {
+       count++;
+       return 1;
+      }
+    if (err == GRUB_ERR_BAD_PART_TABLE)
+      {
+       grub_errno = GRUB_ERR_NONE;
+       return 0;
+      }
+    grub_print_error ();
+    return 0;
+  }
 
   if (disk->partition && grub_strcmp (disk->partition->partmap->name, "msdos")
       == 0)
     return grub_error (GRUB_ERR_BAD_PART_TABLE, "no embedding supported");
 
   {
-    struct grub_msdos_partition_mbr mbr;
-    unsigned i;
+    grub_err_t err;
+    err = grub_partition_msdos_iterate (disk, check_msdos);
 
-    err = grub_disk_read (disk, 0, 0, sizeof (mbr), &mbr);
     if (err)
       return err;
-
-    for (i = 0; i < ARRAY_SIZE (mbr.entries); i++)
-      if (mbr.entries[i].type == type)
-       {
-         err = iterate_real (disk, mbr.entries[i].start
-                             + GRUB_PC_PARTITION_BSD_LABEL_SECTOR, 0, pmap,
-                             hook);
-         if (err != GRUB_ERR_BAD_PART_TABLE)
-           return err;
-       }
+    if (!count)
+      return grub_error (GRUB_ERR_BAD_PART_TABLE, "no bsdlabel found");
   }
-
-  return grub_error (GRUB_ERR_BAD_PART_TABLE, "no bsdlabel found");
+  return GRUB_ERR_NONE;
 }
 
 static grub_err_t
index a378bb1cd3fb7933e4e1cc857a92f05bd6bbbf33..c1805fe56a43417cb3b419b08378966780e01269 100644 (file)
 static struct grub_partition_map grub_msdos_partition_map;
 \f
 
-static grub_err_t
-pc_partition_map_iterate (grub_disk_t disk,
-                         int (*hook) (grub_disk_t disk,
-                                      const grub_partition_t partition))
+grub_err_t
+grub_partition_msdos_iterate (grub_disk_t disk,
+                             int (*hook) (grub_disk_t disk,
+                                          const grub_partition_t partition))
 {
   struct grub_partition p;
   struct grub_msdos_partition_mbr mbr;
@@ -148,7 +148,7 @@ pc_partition_map_iterate (grub_disk_t disk,
 static struct grub_partition_map grub_msdos_partition_map =
   {
     .name = "msdos",
-    .iterate = pc_partition_map_iterate,
+    .iterate = grub_partition_msdos_iterate,
   };
 
 GRUB_MOD_INIT(part_msdos)
index 650d78493f1a22131bebc47cdf659af1246194a1..a6e3fda495004127b8f0762e12395cc4a5df2175 100644 (file)
@@ -22,6 +22,8 @@
 #include <grub/symbol.h>
 #include <grub/types.h>
 #include <grub/err.h>
+#include <grub/disk.h>
+#include <grub/partition.h>
 
 /* The signature.  */
 #define GRUB_PC_PARTITION_SIGNATURE            0xaa55
@@ -114,4 +116,9 @@ grub_msdos_partition_is_extended (int type)
          || type == GRUB_PC_PARTITION_TYPE_LINUX_EXTENDED);
 }
 
+grub_err_t
+grub_partition_msdos_iterate (grub_disk_t disk,
+                             int (*hook) (grub_disk_t disk,
+                                          const grub_partition_t partition));
+
 #endif /* ! GRUB_PC_PARTITION_HEADER */