Esempio n. 1
0
File: gpt.c Progetto: crawford/grub
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;
}
Esempio n. 2
0
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;
}