grub_err_t grub_gpt_part_uuid (grub_device_t device, char **uuid) { struct grub_gpt_partentry entry; if (grub_gpt_device_partentry (device, &entry)) return grub_errno; *uuid = grub_gpt_guid_to_str (&entry.guid); if (!*uuid) return grub_errno; return GRUB_ERR_NONE; }
static grub_err_t grub_find_next (const char *disk_name, const grub_gpt_part_type_t *part_type, char **part_name, char **part_guid) { struct grub_gpt_partentry *part, *part_found = NULL; grub_device_t dev = NULL; grub_gpt_t gpt = NULL; grub_uint32_t i, part_index; dev = grub_device_open (disk_name); if (!dev) goto done; gpt = grub_gpt_read (dev->disk); if (!gpt) goto done; if (grub_gpt_repair (dev->disk, gpt)) goto done; for (i = 0; (part = grub_gpt_get_partentry (gpt, i)) != NULL; i++) { if (grub_memcmp (part_type, &part->type, sizeof (*part_type)) == 0) { unsigned int priority, tries_left, successful, old_priority = 0; priority = grub_gptprio_priority (part); tries_left = grub_gptprio_tries_left (part); successful = grub_gptprio_successful (part); if (part_found) old_priority = grub_gptprio_priority (part_found); if ((tries_left || successful) && priority > old_priority) { part_index = i; part_found = part; } } } if (!part_found) { grub_error (GRUB_ERR_UNKNOWN_DEVICE, N_("no such partition")); goto done; } if (grub_gptprio_tries_left (part_found)) { unsigned int tries_left = grub_gptprio_tries_left (part_found); grub_gptprio_set_tries_left (part_found, tries_left - 1); if (grub_gpt_update (gpt)) goto done; if (grub_gpt_write (dev->disk, gpt)) goto done; } *part_name = grub_xasprintf ("%s,gpt%u", disk_name, part_index + 1); if (!*part_name) goto done; *part_guid = grub_gpt_guid_to_str (&part_found->guid); if (!*part_guid) goto done; grub_errno = GRUB_ERR_NONE; done: grub_gpt_free (gpt); if (dev) grub_device_close (dev); return grub_errno; }