If booted from an image, the list of possible boot partitions is now ordered by

some heuristic: when you booted from a CD, CDs are preferred; else, volumes with
names like "Haiku" or "System" are preferred - if someone has better ideas, please
shout.
Note, this heuristic will only come into play if the boot loader was loaded from
an image (ie. floppy/CD/network), and you didn't choose any boot device.
Added evil methods to the Stack class that come in handy (you can now directly
access the array) for this.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@14410 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Axel Dörfler 2005-10-18 18:45:55 +00:00
parent a957e4c978
commit 3ea780cdf9
2 changed files with 73 additions and 2 deletions

View File

@ -1,4 +1,4 @@
/* Stack - a template stack class
/* Stack - a template stack class (plus some handy methods)
*
* Copyright 2001-2005, Axel Dörfler, axeld@pinc-software.de.
* This file may be used under the terms of the MIT License.
@ -59,6 +59,16 @@ template<class T> class Stack {
return true;
}
T *Array()
{
return fArray;
}
int32 CountItems() const
{
return fUsed;
}
private:
T *fArray;
int32 fUsed;

View File

@ -53,6 +53,62 @@ static struct {
dev_t gBootDevice = -1;
/** No image was chosen - prefer disks with names like "Haiku", or "System"
*/
static int
compare_image_boot(const void *_a, const void *_b)
{
KPartition *a = *(KPartition **)_a;
KPartition *b = *(KPartition **)_b;
if (a->ContentName() != NULL) {
if (b->ContentName() == NULL)
return 1;
} else if (b->ContentName() != NULL) {
return -1;
} else
return 0;
int compare = strcmp(a->ContentName(), b->ContentName());
if (!compare)
return 0;
if (!strcasecmp(a->ContentName(), "Haiku"))
return 1;
if (!strcasecmp(b->ContentName(), "Haiku"))
return -1;
if (!strncmp(a->ContentName(), "System", 6))
return 1;
if (!strncmp(b->ContentName(), "System", 6))
return -1;
return compare;
}
/** The system was booted from CD - prefer CDs over other entries. If there
* is no CD, fall back to the standard mechanism (as implemented by
* compare_image_boot().
*/
static int
compare_cd_boot(const void *_a, const void *_b)
{
KPartition *a = *(KPartition **)_a;
KPartition *b = *(KPartition **)_b;
bool aIsCD = a->Type() != NULL && !strcmp(a->Type(), kPartitionTypeDataSession);
bool bIsCD = b->Type() != NULL && !strcmp(b->Type(), kPartitionTypeDataSession);
int compare = (int)aIsCD - (int)bIsCD;
if (compare != 0)
return compare;
return compare_image_boot(_a, _b);
}
static status_t
get_boot_partitions(kernel_args *args, PartitionStack &partitions)
{
@ -116,7 +172,12 @@ get_boot_partitions(kernel_args *args, PartitionStack &partitions)
break;
}
// ToDo: sort partition list (ie. when booting from CD, CDs should come first in the list)
if (!args->boot_disk.user_selected) {
// sort partition list (ie. when booting from CD, CDs should come first in the list)
qsort(partitions.Array(), partitions.CountItems(), sizeof(KPartition *),
args->boot_disk.cd ? compare_cd_boot : compare_image_boot);
}
return B_OK;
}