enum grub_dev_abstraction_types grub_util_get_dev_abstraction_os (const char *os_dev) { #ifndef HAVE_DEVICE_MAPPER if ((strncmp ("/dev/mapper/", os_dev, 12) == 0)) return GRUB_DEV_ABSTRACTION_LVM; #endif /* Check for RAID. */ if (!strncmp (os_dev, "/dev/md", 7) && ! grub_util_device_is_mapped (os_dev) && !grub_util_is_imsm (os_dev)) return GRUB_DEV_ABSTRACTION_RAID; return GRUB_DEV_ABSTRACTION_NONE; }
static int grub_hostdisk_linux_find_partition (char *dev, grub_disk_addr_t sector) { size_t len = strlen (dev); const char *format; char *p; int i; char real_dev[PATH_MAX]; struct linux_partition_cache *cache; int missing = 0; strcpy(real_dev, dev); if (have_devfs () && strcmp (real_dev + len - 5, "/disc") == 0) { p = real_dev + len - 4; format = "part%d"; } else if (strncmp (real_dev, "/dev/disk/by-id/", sizeof ("/dev/disk/by-id/") - 1) == 0) { p = real_dev + len; format = "-part%d"; } else if (real_dev[len - 1] >= '0' && real_dev[len - 1] <= '9') { p = real_dev + len; format = "p%d"; } else { p = real_dev + len; format = "%d"; } for (cache = linux_partition_cache_list; cache; cache = cache->next) { if (strcmp (cache->dev, dev) == 0 && cache->start == sector) { sprintf (p, format, cache->partno); strcpy (dev, real_dev); return 1; } } for (i = 1; i < 10000; i++) { grub_util_fd_t fd; grub_disk_addr_t start; sprintf (p, format, i); fd = open (real_dev, O_RDONLY); if (fd == -1) { if (missing++ < 10) continue; else return 0; } missing = 0; close (fd); if (!grub_util_device_is_mapped (real_dev) || !grub_util_get_dm_node_linear_info (real_dev, 0, 0, &start)) start = grub_util_find_partition_start_os (real_dev); /* We don't care about errors here. */ grub_errno = GRUB_ERR_NONE; if (start == sector) { struct linux_partition_cache *new_cache_item; new_cache_item = xmalloc (sizeof *new_cache_item); new_cache_item->dev = xstrdup (dev); new_cache_item->start = start; new_cache_item->partno = i; grub_list_push (GRUB_AS_LIST_P (&linux_partition_cache_list), GRUB_AS_LIST (new_cache_item)); strcpy (dev, real_dev); return 1; } } return 0; }