From: Hollis Blanchard <hollis@penguinppc.org>
To: grub-devel@gnu.org
Subject: Re: iterate return values
Date: Sun, 23 Jan 2005 12:23:36 -0600 [thread overview]
Message-ID: <20050123182336.GA31323@miracle> (raw)
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 <hollis@penguinppc.org>
* 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
\f
+
+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;
\f
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
next reply other threads:[~2005-01-23 18:58 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2005-01-23 18:23 Hollis Blanchard [this message]
2005-01-23 19:19 ` iterate return values Yoshinori K. Okuji
2005-01-23 19:53 ` Hollis Blanchard
2005-01-23 20:18 ` Marco Gerards
2005-01-23 20:26 ` Yoshinori K. Okuji
-- strict thread matches above, loose matches on Subject: below --
2005-02-04 6:11 Hollis Blanchard
2005-02-04 8:55 ` Yoshinori K. Okuji
2005-02-04 20:04 ` Marco Gerards
2005-02-04 20:43 ` Yoshinori K. Okuji
2005-02-04 21:21 ` Marco Gerards
2005-02-04 22:24 ` Yoshinori K. Okuji
2005-01-22 6:57 Hollis Blanchard
2005-01-22 11:26 ` Yoshinori K. Okuji
2005-01-22 13:01 ` Marco Gerards
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20050123182336.GA31323@miracle \
--to=hollis@penguinppc.org \
--cc=grub-devel@gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.