2008-01-12 Robert Millan <rmh@aybabtu.com>
* include/grub/util/getroot.h (grub_dev_abstraction_types): New enum. (grub_util_get_dev_abstraction): New function prototype. * util/getroot.c: Include `<grub/util/getroot.h>' (grub_util_get_grub_dev): Move detection of abstraction type to ... (grub_util_get_dev_abstraction): ... here (new function). * util/grub-probe.c: Convert PRINT_* to an enum. Add `PRINT_ABSTRACTION'. (probe): Probe for abstraction type when requested. (main): Understand `--target=abstraction'. * util/i386/efi/grub-install.in: Add abstraction module to core image when it is found to be necessary. * util/i386/pc/grub-install.in: Likewise. * util/powerpc/ieee1275/grub-install.in: Likewise. * util/update-grub_lib.in (font_path): Return system path without converting to GRUB path. * util/update-grub.in: Convert system path returned by font_path() to a GRUB path. Use `grub-probe -t abstraction' to determine what abstraction module is needed for loading fonts (if any). Export that as `GRUB_PRELOAD_MODULES'. * util/grub.d/00_header.in: Process `GRUB_PRELOAD_MODULES' (print insmod commands).
This commit is contained in:
parent
52bd3de956
commit
1eb8c80241
10 changed files with 135 additions and 43 deletions
|
@ -1,7 +1,7 @@
|
|||
/* getroot.c - Get root device */
|
||||
/*
|
||||
* GRUB -- GRand Unified Bootloader
|
||||
* Copyright (C) 1999,2000,2001,2002,2003,2006,2007 Free Software Foundation, Inc.
|
||||
* Copyright (C) 1999,2000,2001,2002,2003,2006,2007,2008 Free Software Foundation, Inc.
|
||||
*
|
||||
* GRUB is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
@ -24,6 +24,7 @@
|
|||
|
||||
#include <grub/util/misc.h>
|
||||
#include <grub/util/biosdisk.h>
|
||||
#include <grub/util/getroot.h>
|
||||
|
||||
static void
|
||||
strip_extra_slashes (char *dir)
|
||||
|
@ -239,27 +240,42 @@ grub_guess_root_device (const char *dir)
|
|||
return os_dev;
|
||||
}
|
||||
|
||||
char *
|
||||
grub_util_get_grub_dev (const char *os_dev)
|
||||
int
|
||||
grub_util_get_dev_abstraction (const char *os_dev)
|
||||
{
|
||||
/* Check for LVM. */
|
||||
if (!strncmp (os_dev, "/dev/mapper/", 12))
|
||||
{
|
||||
char *grub_dev = xmalloc (strlen (os_dev) - 12 + 1);
|
||||
|
||||
strcpy (grub_dev, os_dev+12);
|
||||
|
||||
return grub_dev;
|
||||
}
|
||||
return GRUB_DEV_ABSTRACTION_LVM;
|
||||
|
||||
/* Check for RAID. */
|
||||
if (!strncmp (os_dev, "/dev/md", 7))
|
||||
return GRUB_DEV_ABSTRACTION_RAID;
|
||||
|
||||
/* No abstraction found. */
|
||||
return GRUB_DEV_ABSTRACTION_NONE;
|
||||
}
|
||||
|
||||
char *
|
||||
grub_util_get_grub_dev (const char *os_dev)
|
||||
{
|
||||
char *grub_dev;
|
||||
|
||||
switch (grub_util_get_dev_abstraction (os_dev))
|
||||
{
|
||||
const char *p;
|
||||
char *grub_dev = xmalloc (20);
|
||||
case GRUB_DEV_ABSTRACTION_LVM:
|
||||
grub_dev = xmalloc (strlen (os_dev) - 12 + 1);
|
||||
|
||||
strcpy (grub_dev, os_dev + 12);
|
||||
|
||||
break;
|
||||
|
||||
case GRUB_DEV_ABSTRACTION_RAID:
|
||||
grub_dev = xmalloc (20);
|
||||
|
||||
if (os_dev[7] == '_' && os_dev[8] == 'd')
|
||||
{
|
||||
const char *p;
|
||||
|
||||
/* This a partitionable RAID device of the form /dev/md_dNNpMM. */
|
||||
int i;
|
||||
|
||||
|
@ -297,17 +313,17 @@ grub_util_get_grub_dev (const char *os_dev)
|
|||
}
|
||||
else if (os_dev[7] >= '0' && os_dev[7] <= '9')
|
||||
{
|
||||
p = os_dev + 5;
|
||||
memcpy (grub_dev, p, 7);
|
||||
memcpy (grub_dev, os_dev + 5, 7);
|
||||
grub_dev[7] = '\0';
|
||||
}
|
||||
else
|
||||
grub_util_error ("Unknown kind of RAID device `%s'", os_dev);
|
||||
|
||||
break;
|
||||
|
||||
return grub_dev;
|
||||
default: /* GRUB_DEV_ABSTRACTION_NONE */
|
||||
grub_dev = grub_util_biosdisk_get_grub_dev (os_dev);
|
||||
}
|
||||
|
||||
/* If it's not RAID or LVM, it should be a biosdisk. */
|
||||
return grub_util_biosdisk_get_grub_dev (os_dev);
|
||||
return grub_dev;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue