static void _xlate_extents(struct pe_disk *extents, uint32_t count) { unsigned i; for (i = 0; i < count; i++) { extents[i].lv_num = xlate16(extents[i].lv_num); extents[i].le_num = xlate16(extents[i].le_num); } }
static int _has_partition_table(struct device *dev) { int ret = 0; unsigned p; struct { uint8_t skip[PART_OFFSET]; struct partition part[4]; uint16_t magic; } __attribute__((packed)) buf; /* sizeof() == SECTOR_SIZE */ if (!dev_read(dev, UINT64_C(0), sizeof(buf), &buf)) return_0; /* FIXME Check for other types of partition table too */ /* Check for msdos partition table */ if (buf.magic == xlate16(PART_MAGIC)) { for (p = 0; p < 4; ++p) { /* Table is invalid if boot indicator not 0 or 0x80 */ if (buf.part[p].boot_ind & 0x7f) { ret = 0; break; } /* Must have at least one non-empty partition */ if (buf.part[p].nr_sects) ret = 1; } } return ret; }