grub-probe: Add PARTUUID detection support
Add PARTUUID detection support grub-probe for MBR and GPT partition schemes. Signed-off-by: Nicholas Vinson <nvinson234@gmail.com> Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
This commit is contained in:
parent
a16f4a822f
commit
0c0bcffc23
1 changed files with 48 additions and 0 deletions
|
@ -28,6 +28,7 @@
|
||||||
#include <grub/partition.h>
|
#include <grub/partition.h>
|
||||||
#include <grub/msdos_partition.h>
|
#include <grub/msdos_partition.h>
|
||||||
#include <grub/gpt_partition.h>
|
#include <grub/gpt_partition.h>
|
||||||
|
#include <grub/i386/pc/boot.h>
|
||||||
#include <grub/emu/hostdisk.h>
|
#include <grub/emu/hostdisk.h>
|
||||||
#include <grub/emu/getroot.h>
|
#include <grub/emu/getroot.h>
|
||||||
#include <grub/term.h>
|
#include <grub/term.h>
|
||||||
|
@ -62,6 +63,7 @@ enum {
|
||||||
PRINT_DRIVE,
|
PRINT_DRIVE,
|
||||||
PRINT_DEVICE,
|
PRINT_DEVICE,
|
||||||
PRINT_PARTMAP,
|
PRINT_PARTMAP,
|
||||||
|
PRINT_PARTUUID,
|
||||||
PRINT_ABSTRACTION,
|
PRINT_ABSTRACTION,
|
||||||
PRINT_CRYPTODISK_UUID,
|
PRINT_CRYPTODISK_UUID,
|
||||||
PRINT_HINT_STR,
|
PRINT_HINT_STR,
|
||||||
|
@ -85,6 +87,7 @@ static const char *targets[] =
|
||||||
[PRINT_DRIVE] = "drive",
|
[PRINT_DRIVE] = "drive",
|
||||||
[PRINT_DEVICE] = "device",
|
[PRINT_DEVICE] = "device",
|
||||||
[PRINT_PARTMAP] = "partmap",
|
[PRINT_PARTMAP] = "partmap",
|
||||||
|
[PRINT_PARTUUID] = "partuuid",
|
||||||
[PRINT_ABSTRACTION] = "abstraction",
|
[PRINT_ABSTRACTION] = "abstraction",
|
||||||
[PRINT_CRYPTODISK_UUID] = "cryptodisk_uuid",
|
[PRINT_CRYPTODISK_UUID] = "cryptodisk_uuid",
|
||||||
[PRINT_HINT_STR] = "hints_string",
|
[PRINT_HINT_STR] = "hints_string",
|
||||||
|
@ -181,6 +184,45 @@ probe_partmap (grub_disk_t disk, char delim)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
probe_partuuid (grub_disk_t disk, char delim)
|
||||||
|
{
|
||||||
|
grub_partition_t p = disk->partition;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Nested partitions not supported for now.
|
||||||
|
* Non-nested partitions must have disk->partition->parent == NULL
|
||||||
|
*/
|
||||||
|
if (p && p->parent == NULL)
|
||||||
|
{
|
||||||
|
disk->partition = p->parent;
|
||||||
|
|
||||||
|
if (strcmp(p->partmap->name, "msdos") == 0)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* The partition GUID for MSDOS is the partition number (starting
|
||||||
|
* with 1) prepended with the NT disk signature.
|
||||||
|
*/
|
||||||
|
grub_uint32_t nt_disk_sig;
|
||||||
|
|
||||||
|
if (grub_disk_read (disk, 0, GRUB_BOOT_MACHINE_WINDOWS_NT_MAGIC,
|
||||||
|
sizeof(nt_disk_sig), &nt_disk_sig) == 0)
|
||||||
|
grub_printf ("%08x-%02x",
|
||||||
|
grub_le_to_cpu32(nt_disk_sig), 1 + p->number);
|
||||||
|
}
|
||||||
|
else if (strcmp(p->partmap->name, "gpt") == 0)
|
||||||
|
{
|
||||||
|
struct grub_gpt_partentry gptdata;
|
||||||
|
|
||||||
|
if (grub_disk_read (disk, p->offset, p->index,
|
||||||
|
sizeof(gptdata), &gptdata) == 0)
|
||||||
|
print_gpt_guid(gptdata.guid);
|
||||||
|
}
|
||||||
|
|
||||||
|
disk->partition = p;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
probe_cryptodisk_uuid (grub_disk_t disk, char delim)
|
probe_cryptodisk_uuid (grub_disk_t disk, char delim)
|
||||||
{
|
{
|
||||||
|
@ -635,6 +677,12 @@ probe (const char *path, char **device_names, char delim)
|
||||||
/* Check if dev->disk itself is contained in a partmap. */
|
/* Check if dev->disk itself is contained in a partmap. */
|
||||||
probe_partmap (dev->disk, delim);
|
probe_partmap (dev->disk, delim);
|
||||||
|
|
||||||
|
else if (print == PRINT_PARTUUID)
|
||||||
|
{
|
||||||
|
probe_partuuid (dev->disk, delim);
|
||||||
|
putchar (delim);
|
||||||
|
}
|
||||||
|
|
||||||
else if (print == PRINT_MSDOS_PARTTYPE)
|
else if (print == PRINT_MSDOS_PARTTYPE)
|
||||||
{
|
{
|
||||||
if (dev->disk->partition
|
if (dev->disk->partition
|
||||||
|
|
Loading…
Reference in a new issue