[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: iterate return values
From: |
Hollis Blanchard |
Subject: |
Re: iterate return values |
Date: |
Sun, 23 Jan 2005 12:23:36 -0600 |
User-agent: |
Mutt/1.5.6+20040907i |
This patch fixed it for me, tested on Apple and DOS partition maps.
(The #if 0 stuff is an example of what I'm thinking about for
grub_debug_printf, btw, I will remove it from this patch before checking
in.)
Is this OK?
-Hollis
2005-01-23 Hollis Blanchard <address@hidden>
* include/grub/partition.h (grub_partition_map): Remove trailing
whitespace. Add `present' function pointer.
(grub_partition_map_iterate): Add `disk' argument.
* kern/partition.c (grub_partition_map_iterate): Likewise. Update all
callers. Call `hook' only if `present' returns true.
* partmap/amiga.c (amiga_partition_map_present): New function.
(grub_amiga_partition_map): Initialize `present'.
* partmap/apple.c (apple_partition_map_present): New function.
(grub_apple_partition_map): Initialize `present'.
* partmap/pc.c (pc_partition_map_present): New function.
(grub_pc_partition_map): Initialize `present'.
Index: include/grub/partition.h
===================================================================
RCS file: /cvsroot/grub/grub2/include/grub/partition.h,v
retrieving revision 1.1
diff -u -p -r1.1 partition.h
--- include/grub/partition.h 4 Dec 2004 18:45:45 -0000 1.1
+++ include/grub/partition.h 23 Jan 2005 18:37:45 -0000
@@ -31,18 +31,21 @@ struct grub_partition_map
{
/* The name of the partition map type. */
const char *name;
-
+
+ /* Is this partition map type present on `disk'? */
+ grub_err_t (*present) (struct grub_disk *disk);
+
/* Call HOOK with each partition, until HOOK returns non-zero. */
grub_err_t (*iterate) (struct grub_disk *disk,
int (*hook) (const grub_partition_t partition));
-
+
/* Return the partition named STR on the disk DISK. */
grub_partition_t (*probe) (struct grub_disk *disk,
const char *str);
-
+
/* Return the name of the partition PARTITION. */
char *(*get_name) (const grub_partition_t partition);
-
+
/* The next partition map type. */
struct grub_partition_map *next;
};
@@ -76,7 +79,8 @@ grub_err_t EXPORT_FUNC(grub_partition_it
int (*hook) (const
grub_partition_t partition));
char *EXPORT_FUNC(grub_partition_get_name) (const grub_partition_t partition);
-void EXPORT_FUNC(grub_partition_map_iterate) (int (*hook) (const
grub_partition_map_t partmap));
+void EXPORT_FUNC(grub_partition_map_iterate) (struct grub_disk *disk,
+ int (*hook) (const
grub_partition_map_t partmap));
void EXPORT_FUNC(grub_partition_map_register) (grub_partition_map_t partmap);
Index: kern/partition.c
===================================================================
RCS file: /cvsroot/grub/grub2/kern/partition.c,v
retrieving revision 1.1
diff -u -p -r1.1 partition.c
--- kern/partition.c 4 Dec 2004 18:45:45 -0000 1.1
+++ kern/partition.c 23 Jan 2005 18:37:46 -0000
@@ -43,13 +43,27 @@ grub_partition_map_unregister (grub_part
}
void
-grub_partition_map_iterate (int (*hook) (const grub_partition_map_t partmap))
+grub_partition_map_iterate (struct grub_disk *disk,
+ int (*hook) (const grub_partition_map_t partmap))
{
grub_partition_map_t p;
for (p = grub_partition_map_list; p; p = p->next)
- if (hook (p))
+ {
+ int present;
+
+ grub_errno = 0;
+ present = p->present (disk);
+
+#if 0
+ grub_printf ("%s: %s returned %d\n", __FUNCTION__, p->name, present);
+ if (! present)
+ grub_print_error ();
+#endif
+
+ if (present && hook (p))
break;
+ }
}
grub_partition_t
@@ -68,7 +82,7 @@ grub_partition_probe (struct grub_disk *
}
/* Use the first partition map type found. */
- grub_partition_map_iterate (part_map_probe);
+ grub_partition_map_iterate (disk, part_map_probe);
return part;
}
@@ -84,7 +98,7 @@ grub_partition_iterate (struct grub_disk
return partmap->iterate (disk, hook);
}
- grub_partition_map_iterate (part_map_iterate);
+ grub_partition_map_iterate (disk, part_map_iterate);
return grub_errno;
}
Index: partmap/amiga.c
===================================================================
RCS file: /cvsroot/grub/grub2/partmap/amiga.c,v
retrieving revision 1.1
diff -u -p -r1.1 amiga.c
--- partmap/amiga.c 4 Dec 2004 18:45:45 -0000 1.1
+++ partmap/amiga.c 23 Jan 2005 18:37:46 -0000
@@ -72,6 +72,35 @@ static struct grub_partition_map grub_am
static grub_dl_t my_mod;
#endif
+
+static grub_err_t
+amiga_partition_map_present (grub_disk_t disk)
+{
+ struct grub_amiga_rdsk rdsk;
+ struct grub_disk raw;
+ int pos;
+
+ /* Enforce raw disk access. */
+ raw = *disk;
+ raw.partition = 0;
+
+ /* The RDSK block is one of the first 15 blocks. */
+ for (pos = 0; pos < 15; pos++)
+ {
+ /* Read the RDSK block which is a descriptor for the entire disk. */
+ if (grub_disk_read (&raw, pos, 0, sizeof (rdsk), (char *) &rdsk))
+ goto finish;
+
+ if (!grub_strcmp (rdsk.magic, "RDSK"))
+ break;
+ }
+
+ grub_error (GRUB_ERR_BAD_PART_TABLE, "no Amiga magic");
+
+finish:
+ return ! grub_errno;
+}
+
static grub_err_t
amiga_partition_map_iterate (grub_disk_t disk,
int (*hook) (const grub_partition_t partition))
@@ -198,6 +227,7 @@ amiga_partition_map_get_name (const grub
static struct grub_partition_map grub_amiga_partition_map =
{
.name = "amiga_partition_map",
+ .present = amiga_partition_map_present,
.iterate = amiga_partition_map_iterate,
.probe = amiga_partition_map_probe,
.get_name = amiga_partition_map_get_name
Index: partmap/apple.c
===================================================================
RCS file: /cvsroot/grub/grub2/partmap/apple.c,v
retrieving revision 1.1
diff -u -p -r1.1 apple.c
--- partmap/apple.c 4 Dec 2004 18:45:45 -0000 1.1
+++ partmap/apple.c 23 Jan 2005 18:37:46 -0000
@@ -94,6 +94,27 @@ static grub_dl_t my_mod;
static grub_err_t
+apple_partition_map_present (grub_disk_t disk)
+{
+ struct grub_apple_part apart;
+ struct grub_disk raw;
+
+ /* Enforce raw disk access. */
+ raw = *disk;
+ raw.partition = 0;
+
+ if (grub_disk_read (&raw, 1, 0, sizeof (struct grub_apple_part),
+ (char *) &apart))
+ goto finish;
+
+ if (apart.magic != GRUB_APPLE_PART_MAGIC)
+ grub_error (GRUB_ERR_BAD_PART_TABLE, "missing Apple magic");
+
+finish:
+ return ! grub_errno;
+}
+
+static grub_err_t
apple_partition_map_iterate (grub_disk_t disk,
int (*hook) (const grub_partition_t partition))
{
@@ -200,6 +221,7 @@ apple_partition_map_get_name (const grub
static struct grub_partition_map grub_apple_partition_map =
{
.name = "apple_partition_map",
+ .present = apple_partition_map_present,
.iterate = apple_partition_map_iterate,
.probe = apple_partition_map_probe,
.get_name = apple_partition_map_get_name
Index: partmap/pc.c
===================================================================
RCS file: /cvsroot/grub/grub2/partmap/pc.c,v
retrieving revision 1.1
diff -u -p -r1.1 pc.c
--- partmap/pc.c 4 Dec 2004 18:45:45 -0000 1.1
+++ partmap/pc.c 23 Jan 2005 18:37:46 -0000
@@ -92,6 +92,28 @@ grub_partition_parse (const char *str)
}
static grub_err_t
+pc_partition_map_present (grub_disk_t disk)
+{
+ struct grub_disk raw;
+ struct grub_pc_partition_mbr mbr;
+
+ /* Enforce raw disk access. */
+ raw = *disk;
+ raw.partition = 0;
+
+ /* Read the MBR. */
+ if (grub_disk_read (&raw, 0, 0, sizeof (mbr), (char *) &mbr))
+ goto finish;
+
+ /* Check if it is valid. */
+ if (mbr.signature != grub_cpu_to_le16 (GRUB_PC_PARTITION_SIGNATURE))
+ grub_error (GRUB_ERR_BAD_PART_TABLE, "missing DOS signature");
+
+finish:
+ return ! grub_errno;
+}
+
+static grub_err_t
pc_partition_map_iterate (grub_disk_t disk,
int (*hook) (const grub_partition_t partition))
{
@@ -283,6 +305,7 @@ pc_partition_map_get_name (const grub_pa
static struct grub_partition_map grub_pc_partition_map =
{
.name = "pc_partition_map",
+ .present = pc_partition_map_present,
.iterate = pc_partition_map_iterate,
.probe = pc_partition_map_probe,
.get_name = pc_partition_map_get_name