diff --git a/conf/common.rmk b/conf/common.rmk index dbbf38f..0c4873d 100644 --- a/conf/common.rmk +++ b/conf/common.rmk @@ -13,6 +13,7 @@ grub_probe_SOURCES = util/grub-probe.c \ util/hostdisk.c util/misc.c util/getroot.c \ kern/device.c kern/disk.c kern/err.c kern/misc.c \ kern/parser.c kern/partition.c kern/file.c \ + kern/list.c \ \ fs/affs.c fs/cpio.c fs/fat.c fs/ext2.c fs/hfs.c \ fs/hfsplus.c fs/iso9660.c fs/udf.c fs/jfs.c fs/minix.c \ diff --git a/conf/i386-pc.rmk b/conf/i386-pc.rmk index c213bfd..cfdc50f 100644 --- a/conf/i386-pc.rmk +++ b/conf/i386-pc.rmk @@ -100,6 +100,7 @@ grub_setup_SOURCES = util/i386/pc/grub-setup.c util/hostdisk.c \ util/misc.c util/getroot.c kern/device.c kern/disk.c \ kern/err.c kern/misc.c kern/parser.c kern/partition.c \ kern/file.c kern/fs.c kern/env.c fs/fshelp.c \ + kern/list.c \ \ fs/affs.c fs/cpio.c fs/ext2.c fs/fat.c fs/hfs.c \ fs/hfsplus.c fs/iso9660.c fs/udf.c fs/jfs.c fs/minix.c \ diff --git a/include/grub/partition.h b/include/grub/partition.h index 6c0939b..6e50661 100644 --- a/include/grub/partition.h +++ b/include/grub/partition.h @@ -28,16 +28,19 @@ typedef struct grub_partition *grub_partition_t; /* Partition map type. */ struct grub_partition_map { + /* The next partition map type. */ + struct grub_partition_map *next; + /* The name of the partition map type. */ const char *name; + /* Priority of this partition map. */ + int prio; + /* Call HOOK with each partition, until HOOK returns non-zero. */ grub_err_t (*iterate) (struct grub_disk *disk, int (*hook) (struct grub_disk *disk, const grub_partition_t partition)); - - /* The next partition map type. */ - struct grub_partition_map *next; }; typedef struct grub_partition_map *grub_partition_map_t; diff --git a/kern/partition.c b/kern/partition.c index aa7161f..415765a 100644 --- a/kern/partition.c +++ b/kern/partition.c @@ -20,39 +20,35 @@ #include #include #include +#include static grub_partition_map_t grub_partition_map_list; +static int test (grub_partition_map_t new_item, grub_partition_map_t item) +{ + return new_item->prio > item->prio; +} + void grub_partition_map_register (grub_partition_map_t partmap) { - partmap->next = grub_partition_map_list; - grub_partition_map_list = partmap; + grub_list_insert (GRUB_AS_LIST_P (&grub_partition_map_list), + GRUB_AS_LIST (partmap), + (grub_list_test_t) test); } void grub_partition_map_unregister (grub_partition_map_t partmap) { - grub_partition_map_t *p, q; - - for (p = &grub_partition_map_list, q = *p; q; p = &(q->next), q = q->next) - if (q == partmap) - { - *p = q->next; - break; - } + grub_list_remove (GRUB_AS_LIST_P (&grub_partition_map_list), + GRUB_AS_LIST (partmap)); } int grub_partition_map_iterate (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)) - return 1; - - return 0; + return grub_list_iterate (GRUB_AS_LIST (grub_partition_map_list), + (grub_list_hook_t) hook); } static grub_partition_t diff --git a/partmap/acorn.c b/partmap/acorn.c index 0318beb..9d4bdce 100644 --- a/partmap/acorn.c +++ b/partmap/acorn.c @@ -131,6 +131,7 @@ acorn_partition_map_iterate (grub_disk_t disk, static struct grub_partition_map grub_acorn_partition_map = { .name = "Linux/ADFS partition map", + .prio = 10, .iterate = acorn_partition_map_iterate, }; diff --git a/partmap/amiga.c b/partmap/amiga.c index 4f5c9dd..2cee986 100644 --- a/partmap/amiga.c +++ b/partmap/amiga.c @@ -136,6 +136,7 @@ amiga_partition_map_iterate (grub_disk_t disk, /* Partition map type. */ static struct grub_partition_map grub_amiga_partition_map = { + .prio = 10, .name = "amiga_partition_map", .iterate = amiga_partition_map_iterate, }; diff --git a/partmap/apple.c b/partmap/apple.c index 09259a1..3a67b78 100644 --- a/partmap/apple.c +++ b/partmap/apple.c @@ -172,6 +172,7 @@ apple_partition_map_iterate (grub_disk_t disk, /* Partition map type. */ static struct grub_partition_map grub_apple_partition_map = { + .prio = 5, .name = "apple_partition_map", .iterate = apple_partition_map_iterate, }; diff --git a/partmap/bsdlabel.c b/partmap/bsdlabel.c index f376dce..d007105 100644 --- a/partmap/bsdlabel.c +++ b/partmap/bsdlabel.c @@ -73,6 +73,7 @@ bsdlabel_partition_map_iterate (grub_disk_t disk, static struct grub_partition_map grub_bsdlabel_partition_map = { .name = "bsdlabel_partition_map", + .prio = 5, .iterate = bsdlabel_partition_map_iterate, }; diff --git a/partmap/gpt.c b/partmap/gpt.c index e258297..d51c8b3 100644 --- a/partmap/gpt.c +++ b/partmap/gpt.c @@ -112,6 +112,7 @@ gpt_partition_map_iterate (grub_disk_t disk, /* Partition map type. */ static struct grub_partition_map grub_gpt_partition_map = { + .prio = 10, .name = "gpt_partition_map", .iterate = gpt_partition_map_iterate, }; diff --git a/partmap/pc.c b/partmap/pc.c index fd9dc09..d9d3e6a 100644 --- a/partmap/pc.c +++ b/partmap/pc.c @@ -120,6 +120,7 @@ pc_partition_map_iterate (grub_disk_t disk, static struct grub_partition_map grub_pc_partition_map = { .name = "pc_partition_map", + .prio = 1, .iterate = pc_partition_map_iterate, }; diff --git a/partmap/sun.c b/partmap/sun.c index 63ba6ae..2c6ee44 100644 --- a/partmap/sun.c +++ b/partmap/sun.c @@ -138,6 +138,7 @@ sun_partition_map_iterate (grub_disk_t disk, static struct grub_partition_map grub_sun_partition_map = { .name = "sun_partition_map", + .prio = 10, .iterate = sun_partition_map_iterate, };