Lines Matching +full:uuid +full:- +full:dev
1 /*-
40 #include <uuid.h>
113 uuid_letoh(uuid_t *uuid) in uuid_letoh() argument
116 uuid->time_low = le32toh(uuid->time_low); in uuid_letoh()
117 uuid->time_mid = le16toh(uuid->time_mid); in uuid_letoh()
118 uuid->time_hi_and_version = le16toh(uuid->time_hi_and_version); in uuid_letoh()
152 if (memcmp(hdr->hdr_sig, GPT_HDR_SIG, sizeof(hdr->hdr_sig)) != 0) { in gpt_checkhdr()
156 sz = le32toh(hdr->hdr_size); in gpt_checkhdr()
161 crc = le32toh(hdr->hdr_crc_self); in gpt_checkhdr()
162 hdr->hdr_crc_self = crc32(0, Z_NULL, 0); in gpt_checkhdr()
163 if (crc32(hdr->hdr_crc_self, (const Bytef *)hdr, sz) != crc) { in gpt_checkhdr()
167 hdr->hdr_crc_self = crc; in gpt_checkhdr()
168 hdr->hdr_revision = le32toh(hdr->hdr_revision); in gpt_checkhdr()
169 if (hdr->hdr_revision < GPT_HDR_REVISION) { in gpt_checkhdr()
170 DPRINTF("unsupported GPT revision %d", hdr->hdr_revision); in gpt_checkhdr()
173 hdr->hdr_lba_self = le64toh(hdr->hdr_lba_self); in gpt_checkhdr()
174 if (hdr->hdr_lba_self != lba_self) { in gpt_checkhdr()
178 hdr->hdr_lba_alt = le64toh(hdr->hdr_lba_alt); in gpt_checkhdr()
179 if (hdr->hdr_lba_alt == hdr->hdr_lba_self) { in gpt_checkhdr()
183 hdr->hdr_entries = le32toh(hdr->hdr_entries); in gpt_checkhdr()
184 hdr->hdr_entsz = le32toh(hdr->hdr_entsz); in gpt_checkhdr()
185 if (hdr->hdr_entries == 0 || in gpt_checkhdr()
186 hdr->hdr_entsz < sizeof(struct gpt_ent) || in gpt_checkhdr()
187 sectorsize % hdr->hdr_entsz != 0) { in gpt_checkhdr()
191 hdr->hdr_lba_start = le64toh(hdr->hdr_lba_start); in gpt_checkhdr()
192 hdr->hdr_lba_end = le64toh(hdr->hdr_lba_end); in gpt_checkhdr()
193 hdr->hdr_lba_table = le64toh(hdr->hdr_lba_table); in gpt_checkhdr()
194 hdr->hdr_crc_table = le32toh(hdr->hdr_crc_table); in gpt_checkhdr()
195 uuid_letoh(&hdr->hdr_uuid); in gpt_checkhdr()
206 cnt = size / hdr->hdr_entsz; in gpt_checktbl()
207 if (hdr->hdr_entries <= cnt) { in gpt_checktbl()
208 cnt = hdr->hdr_entries; in gpt_checktbl()
210 if (hdr->hdr_crc_table != in gpt_checktbl()
211 crc32(0, tbl, hdr->hdr_entries * hdr->hdr_entsz)) { in gpt_checktbl()
213 return (-1); in gpt_checktbl()
217 ent = (struct gpt_ent *)(tbl + i * hdr->hdr_entsz); in gpt_checktbl()
218 uuid_letoh(&ent->ent_type); in gpt_checktbl()
219 if (uuid_equal(&ent->ent_type, &gpt_uuid_unused, NULL)) in gpt_checktbl()
221 ent->ent_lba_start = le64toh(ent->ent_lba_start); in gpt_checktbl()
222 ent->ent_lba_end = le64toh(ent->ent_lba_end); in gpt_checktbl()
228 ptable_gptread(struct ptable *table, void *dev, diskread_t dread) in ptable_gptread() argument
238 buf = malloc(table->sectorsize); in ptable_gptread()
241 tbl = malloc(table->sectorsize * MAXTBLSZ); in ptable_gptread()
247 if (dread(dev, buf, 1, 1) != 0) { in ptable_gptread()
254 phdr = gpt_checkhdr((struct gpt_hdr *)buf, 1, table->sectors - 1, in ptable_gptread()
255 table->sectorsize); in ptable_gptread()
259 howmany(phdr->hdr_entries * phdr->hdr_entsz, in ptable_gptread()
260 table->sectorsize)); in ptable_gptread()
261 if (dread(dev, tbl, size, phdr->hdr_lba_table) == 0 && in ptable_gptread()
262 gpt_checktbl(phdr, tbl, size * table->sectorsize, in ptable_gptread()
263 table->sectors - 1) == 0) { in ptable_gptread()
268 offset = pri ? hdr.hdr_lba_alt: table->sectors - 1; in ptable_gptread()
270 if (dread(dev, buf, 1, offset) != 0) in ptable_gptread()
274 table->sectors - 1, table->sectorsize); in ptable_gptread()
283 uuid_equal(&hdr.hdr_uuid, &phdr->hdr_uuid, NULL) == 0 || in ptable_gptread()
284 hdr.hdr_revision != phdr->hdr_revision || in ptable_gptread()
285 hdr.hdr_size != phdr->hdr_size || in ptable_gptread()
286 hdr.hdr_lba_start != phdr->hdr_lba_start || in ptable_gptread()
287 hdr.hdr_lba_end != phdr->hdr_lba_end || in ptable_gptread()
288 hdr.hdr_entries != phdr->hdr_entries || in ptable_gptread()
289 hdr.hdr_entsz != phdr->hdr_entsz || in ptable_gptread()
290 hdr.hdr_crc_table != phdr->hdr_crc_table) { in ptable_gptread()
293 howmany(phdr->hdr_entries * phdr->hdr_entsz, in ptable_gptread()
294 table->sectorsize)); in ptable_gptread()
295 if (dread(dev, tbl, size, phdr->hdr_lba_table) == 0 && in ptable_gptread()
296 gpt_checktbl(phdr, tbl, size * table->sectorsize, in ptable_gptread()
297 table->sectors - 1) == 0) { in ptable_gptread()
305 table->type = PTABLE_NONE; in ptable_gptread()
310 MAXTBLSZ * table->sectorsize); in ptable_gptread()
314 * in the disk's GPT table header, set the table->sectors to the value in ptable_gptread()
321 table->sectors = hdr.hdr_lba_alt + 1; in ptable_gptread()
325 if (uuid_equal(&ent->ent_type, &gpt_uuid_unused, NULL)) in ptable_gptread()
329 if (ent->ent_lba_start < hdr.hdr_lba_start || in ptable_gptread()
330 ent->ent_lba_end > hdr.hdr_lba_end || in ptable_gptread()
331 ent->ent_lba_start > ent->ent_lba_end) in ptable_gptread()
337 entry->part.start = ent->ent_lba_start; in ptable_gptread()
338 entry->part.end = ent->ent_lba_end; in ptable_gptread()
339 entry->part.index = i + 1; in ptable_gptread()
340 entry->part.type = gpt_parttype(ent->ent_type); in ptable_gptread()
341 entry->flags = le64toh(ent->ent_attr); in ptable_gptread()
342 memcpy(&entry->type.gpt, &ent->ent_type, sizeof(uuid_t)); in ptable_gptread()
343 STAILQ_INSERT_TAIL(&table->entries, entry, entry); in ptable_gptread()
380 ptable_ebrread(struct ptable *table, void *dev, diskread_t dread) in ptable_ebrread() argument
388 STAILQ_FOREACH(e1, &table->entries, entry) { in ptable_ebrread()
389 if (e1->type.mbr == DOSPTYP_EXT || in ptable_ebrread()
390 e1->type.mbr == DOSPTYP_EXTLBA) in ptable_ebrread()
396 offset = e1->part.start; in ptable_ebrread()
397 buf = malloc(table->sectorsize); in ptable_ebrread()
403 if (offset >= table->sectors) in ptable_ebrread()
406 if (dread(dev, buf, 1, offset) != 0) in ptable_ebrread()
414 offset = e1->part.start + start; in ptable_ebrread()
421 entry->part.start = offset + start; in ptable_ebrread()
422 entry->part.end = entry->part.start + end - 1; in ptable_ebrread()
423 entry->part.index = index++; in ptable_ebrread()
424 entry->part.type = mbr_parttype(dp[0].dp_typ); in ptable_ebrread()
425 entry->flags = dp[0].dp_flag; in ptable_ebrread()
426 entry->type.mbr = dp[0].dp_typ; in ptable_ebrread()
427 STAILQ_INSERT_TAIL(&table->entries, entry, entry); in ptable_ebrread()
431 offset = e1->part.start + le32toh(dp[1].dp_start); in ptable_ebrread()
456 ptable_bsdread(struct ptable *table, void *dev, diskread_t dread) in ptable_bsdread() argument
465 if (table->sectorsize < sizeof(struct disklabel)) { in ptable_bsdread()
469 buf = malloc(table->sectorsize); in ptable_bsdread()
472 if (dread(dev, buf, 1, 1) != 0) { in ptable_bsdread()
479 if (le32toh(dl->d_magic) != DISKMAGIC && in ptable_bsdread()
480 le32toh(dl->d_magic2) != DISKMAGIC) in ptable_bsdread()
482 if (le32toh(dl->d_secsize) != table->sectorsize) { in ptable_bsdread()
486 dl->d_npartitions = le16toh(dl->d_npartitions); in ptable_bsdread()
487 if (dl->d_npartitions > 20 || dl->d_npartitions < 8) { in ptable_bsdread()
492 part = &dl->d_partitions[0]; in ptable_bsdread()
494 for (i = 0; i < dl->d_npartitions; i++, part++) { in ptable_bsdread()
497 if (part->p_size == 0) in ptable_bsdread()
502 entry->part.start = le32toh(part->p_offset) - raw_offset; in ptable_bsdread()
503 entry->part.end = entry->part.start + in ptable_bsdread()
504 le32toh(part->p_size) - 1; in ptable_bsdread()
505 entry->part.type = bsd_parttype(part->p_fstype); in ptable_bsdread()
506 entry->part.index = i; /* starts from zero */ in ptable_bsdread()
507 entry->type.bsd = part->p_fstype; in ptable_bsdread()
508 STAILQ_INSERT_TAIL(&table->entries, entry, entry); in ptable_bsdread()
511 table->type = PTABLE_BSD; in ptable_bsdread()
517 #define cdb2devb(bno) ((bno) * ISO_DEFAULT_BLOCK_SIZE / table->sectorsize)
520 ptable_iso9660read(struct ptable *table, void *dev, diskread_t dread) in ptable_iso9660read() argument
526 buf = malloc(table->sectorsize); in ptable_iso9660read()
530 if (dread(dev, buf, 1, cdb2devb(16)) != 0) { in ptable_iso9660read()
537 if (bcmp(vd->id, ISO_STANDARD_ID, sizeof vd->id) != 0) in ptable_iso9660read()
543 entry->part.start = 0; in ptable_iso9660read()
544 entry->part.end = table->sectors; in ptable_iso9660read()
545 entry->part.type = PART_ISO9660; in ptable_iso9660read()
546 entry->part.index = 0; in ptable_iso9660read()
547 STAILQ_INSERT_TAIL(&table->entries, entry, entry); in ptable_iso9660read()
549 table->type = PTABLE_ISO9660; in ptable_iso9660read()
557 ptable_open(void *dev, uint64_t sectors, uint16_t sectorsize, in ptable_open() argument
574 if (dread(dev, buf, 1, DOSBBSECTOR) != 0) { in ptable_open()
582 table->sectors = sectors; in ptable_open()
583 table->sectorsize = sectorsize; in ptable_open()
584 table->type = PTABLE_NONE; in ptable_open()
585 STAILQ_INIT(&table->entries); in ptable_open()
587 if (ptable_iso9660read(table, dev, dread) == NULL) { in ptable_open()
591 } else if (table->type == PTABLE_ISO9660) in ptable_open()
595 if (ptable_bsdread(table, dev, dread) == NULL) { /* Read error. */ in ptable_open()
598 } else if (table->type == PTABLE_BSD) in ptable_open()
608 table->type = PTABLE_GPT; in ptable_open()
609 table = ptable_gptread(table, dev, dread); in ptable_open()
632 table->type = PTABLE_GPT; in ptable_open()
638 if (table->type == PTABLE_GPT) { in ptable_open()
639 table = ptable_gptread(table, dev, dread); in ptable_open()
646 table->type = PTABLE_MBR; in ptable_open()
655 if (start + end - 1 >= sectors) in ptable_open()
664 entry->part.start = start; in ptable_open()
665 entry->part.end = start + end - 1; in ptable_open()
666 entry->part.index = i + 1; in ptable_open()
667 entry->part.type = mbr_parttype(dp[i].dp_typ); in ptable_open()
668 entry->flags = dp[i].dp_flag; in ptable_open()
669 entry->type.mbr = dp[i].dp_typ; in ptable_open()
670 STAILQ_INSERT_TAIL(&table->entries, entry, entry); in ptable_open()
674 table = ptable_ebrread(table, dev, dread); in ptable_open()
693 while (!STAILQ_EMPTY(&table->entries)) { in ptable_close()
694 entry = STAILQ_FIRST(&table->entries); in ptable_close()
695 STAILQ_REMOVE_HEAD(&table->entries, entry); in ptable_close()
705 return (table->type); in ptable_gettype()
711 uint64_t tmp = table->sectors * table->sectorsize; in ptable_getsize()
713 if (tmp < table->sectors) in ptable_getsize()
729 STAILQ_FOREACH(entry, &table->entries, entry) { in ptable_getpart()
730 if (entry->part.index != index) in ptable_getpart()
732 memcpy(part, &entry->part, sizeof(*part)); in ptable_getpart()
742 * 2: Non-active FreeBSD slice
744 * 4: non-active Linux slice
746 * 6: non-active FAT/FAT32 slice
767 STAILQ_FOREACH(entry, &table->entries, entry) { in ptable_getbestpart()
769 if (table->type == PTABLE_MBR) { in ptable_getbestpart()
770 switch (entry->type.mbr) { in ptable_getbestpart()
772 pref = entry->flags & 0x80 ? PREF_FBSD_ACT: in ptable_getbestpart()
776 pref = entry->flags & 0x80 ? PREF_LINUX_ACT: in ptable_getbestpart()
785 pref = entry->flags & 0x80 ? PREF_DOS_ACT: in ptable_getbestpart()
794 if (table->type == PTABLE_GPT) { in ptable_getbestpart()
795 if (entry->part.type == PART_DOS) in ptable_getbestpart()
797 else if (entry->part.type == PART_FREEBSD_UFS || in ptable_getbestpart()
798 entry->part.type == PART_FREEBSD_ZFS) in ptable_getbestpart()
810 memcpy(part, &best->part, sizeof(*part)); in ptable_getbestpart()
824 STAILQ_FOREACH(entry, &table->entries, entry) { in ptable_iterate()
826 if (table->type == PTABLE_MBR) in ptable_iterate()
827 sprintf(name, "s%d", entry->part.index); in ptable_iterate()
831 if (table->type == PTABLE_GPT) in ptable_iterate()
832 sprintf(name, "p%d", entry->part.index); in ptable_iterate()
835 if (table->type == PTABLE_BSD) in ptable_iterate()
837 entry->part.index); in ptable_iterate()
838 if ((ret = iter(arg, name, &entry->part)) != 0) in ptable_iterate()