-/* $OpenBSD: part.c,v 1.146 2023/03/31 14:41:08 krw Exp $ */
+/* $OpenBSD: part.c,v 1.147 2023/03/31 19:12:32 krw Exp $ */
/*
* Copyright (c) 1997 Tobias Weingartner
struct mbr_type {
int mt_type;
- char *mt_name;
+ char *mt_desc;
};
/*
* https://www.win.tue.nl/~aeb/partitions/partition_types-1.html
*/
const struct mbr_type mbr_types[] = {
- { 0x00, "unused" }, /* unused */
- { 0x01, "DOS FAT-12" }, /* Primary DOS with 12 bit FAT */
- { 0x02, "XENIX /" }, /* XENIX / filesystem */
- { 0x03, "XENIX /usr" }, /* XENIX /usr filesystem */
- { 0x04, "DOS FAT-16" }, /* Primary DOS with 16 bit FAT */
- { 0x05, "Extended DOS" }, /* Extended DOS */
- { 0x06, "DOS > 32MB" }, /* Primary 'big' DOS (> 32MB) */
- { 0x07, "NTFS" }, /* NTFS */
- { 0x08, "AIX fs" }, /* AIX filesystem */
- { 0x09, "AIX/Coherent" }, /* AIX boot partition or Coherent */
- { 0x0A, "OS/2 Bootmgr" }, /* OS/2 Boot Manager or OPUS */
- { 0x0B, "Win95 FAT-32" }, /* Primary Win95 w/ 32-bit FAT */
- { 0x0C, "Win95 FAT32L" }, /* Primary Win95 w/ 32-bit FAT LBA-mapped */
- { 0x0E, "DOS FAT-16" }, /* Primary DOS w/ 16-bit FAT, CHS-mapped */
- { 0x0F, "Extended LBA" }, /* Extended DOS LBA-mapped */
- { 0x10, "OPUS" }, /* OPUS */
- { 0x11, "OS/2 hidden" }, /* OS/2 BM: hidden DOS 12-bit FAT */
- { 0x12, "Compaq Diag" }, /* Compaq Diagnostics */
- { 0x14, "OS/2 hidden" }, /* OS/2 BM: hidden DOS 16-bit FAT <32M or Novell DOS 7.0 bug */
- { 0x16, "OS/2 hidden" }, /* OS/2 BM: hidden DOS 16-bit FAT >=32M */
- { 0x17, "OS/2 hidden" }, /* OS/2 BM: hidden IFS */
- { 0x18, "AST swap" }, /* AST Windows swapfile */
- { 0x19, "Willowtech" }, /* Willowtech Photon coS */
- { 0x1C, "ThinkPad Rec" }, /* IBM ThinkPad recovery partition */
- { 0x20, "Willowsoft" }, /* Willowsoft OFS1 */
- { 0x24, "NEC DOS" }, /* NEC DOS */
- { 0x27, "Win Recovery" }, /* Windows hidden Recovery Partition */
- { 0x38, "Theos" }, /* Theos */
- { 0x39, "Plan 9" }, /* Plan 9 */
- { 0x40, "VENIX 286" }, /* VENIX 286 or LynxOS */
- { 0x41, "Lin/Minux DR" }, /* Linux/MINIX (sharing disk with DRDOS) or Personal RISC boot */
- { 0x42, "LinuxSwap DR" }, /* SFS or Linux swap (sharing disk with DRDOS) */
- { 0x43, "Linux DR" }, /* Linux native (sharing disk with DRDOS) */
- { 0x4D, "QNX 4.2 Pri" }, /* QNX 4.2 Primary */
- { 0x4E, "QNX 4.2 Sec" }, /* QNX 4.2 Secondary */
- { 0x4F, "QNX 4.2 Ter" }, /* QNX 4.2 Tertiary */
- { 0x50, "DM" }, /* DM (disk manager) */
- { 0x51, "DM" }, /* DM6 Aux1 (or Novell) */
- { 0x52, "CP/M or SysV" }, /* CP/M or Microport SysV/AT */
- { 0x53, "DM" }, /* DM6 Aux3 */
- { 0x54, "Ontrack" }, /* Ontrack */
- { 0x55, "EZ-Drive" }, /* EZ-Drive (disk manager) */
- { 0x56, "Golden Bow" }, /* Golden Bow (disk manager) */
- { 0x5C, "Priam" }, /* Priam Edisk (disk manager) */
- { 0x61, "SpeedStor" }, /* SpeedStor */
- { 0x63, "ISC, HURD, *" }, /* ISC, System V/386, GNU HURD or Mach */
- { 0x64, "NetWare 2.xx" }, /* Novell NetWare 2.xx */
- { 0x65, "NetWare 3.xx" }, /* Novell NetWare 3.xx */
- { 0x66, "NetWare 386" }, /* Novell 386 NetWare */
- { 0x67, "Novell" }, /* Novell */
- { 0x68, "Novell" }, /* Novell */
- { 0x69, "Novell" }, /* Novell */
- { 0x70, "DiskSecure" }, /* DiskSecure Multi-Boot */
- { 0x75, "PCIX" }, /* PCIX */
- { 0x80, "Minix (old)" }, /* Minix 1.1 ... 1.4a */
- { 0x81, "Minix (new)" }, /* Minix 1.4b ... 1.5.10 */
- { 0x82, "Linux swap" }, /* Linux swap */
- { 0x83, "Linux files*" }, /* Linux filesystem */
- { 0x84, "OS/2 hidden" }, /* OS/2 hidden C: drive */
- { 0x85, "Linux ext." }, /* Linux extended */
- { 0x86, "NT FAT VS" }, /* NT FAT volume set */
- { 0x87, "NTFS VS" }, /* NTFS volume set or HPFS mirrored */
- { 0x8E, "Linux LVM" }, /* Linux LVM */
- { 0x93, "Amoeba FS" }, /* Amoeba filesystem */
- { 0x94, "Amoeba BBT" }, /* Amoeba bad block table */
- { 0x99, "Mylex" }, /* Mylex EISA SCSI */
- { 0x9F, "BSDI" }, /* BSDI BSD/OS */
- { 0xA0, "NotebookSave" }, /* Phoenix NoteBIOS save-to-disk */
- { 0xA5, "FreeBSD" }, /* FreeBSD */
- { 0xA6, "OpenBSD" }, /* OpenBSD */
- { 0xA7, "NEXTSTEP" }, /* NEXTSTEP */
- { 0xA8, "MacOS X" }, /* MacOS X main partition */
- { 0xA9, "NetBSD" }, /* NetBSD */
- { 0xAB, "MacOS X boot" }, /* MacOS X boot partition */
- { 0xAF, "MacOS X HFS+" }, /* MacOS X HFS+ partition */
- { 0xB7, "BSDI filesy*" }, /* BSDI BSD/386 filesystem */
- { 0xB8, "BSDI swap" }, /* BSDI BSD/386 swap */
- { 0xBF, "Solaris" }, /* Solaris */
- { 0xC0, "CTOS" }, /* CTOS */
- { 0xC1, "DRDOSs FAT12" }, /* DRDOS/sec (FAT-12) */
- { 0xC4, "DRDOSs < 32M" }, /* DRDOS/sec (FAT-16, < 32M) */
- { 0xC6, "DRDOSs >=32M" }, /* DRDOS/sec (FAT-16, >= 32M) */
- { 0xC7, "HPFS Disbled" }, /* Syrinx (Cyrnix?) or HPFS disabled */
- { 0xDB, "CPM/C.DOS/C*" }, /* Concurrent CPM or C.DOS or CTOS */
- { 0xDE, "Dell Maint" }, /* Dell maintenance partition */
- { 0xE1, "SpeedStor" }, /* DOS access or SpeedStor 12-bit FAT extended partition */
- { 0xE3, "SpeedStor" }, /* DOS R/O or SpeedStor or Storage Dimensions */
- { 0xE4, "SpeedStor" }, /* SpeedStor 16-bit FAT extended partition < 1024 cyl. */
- { 0xEB, "BeOS/i386" }, /* BeOS for Intel */
- { 0xEE, "EFI GPT" }, /* EFI Protective Partition */
- { 0xEF, "EFI Sys" }, /* EFI System Partition */
- { 0xF1, "SpeedStor" }, /* SpeedStor or Storage Dimensions */
- { 0xF2, "DOS 3.3+ Sec" }, /* DOS 3.3+ Secondary */
- { 0xF4, "SpeedStor" }, /* SpeedStor >1024 cyl. or LANstep or IBM PS/2 IML */
- { 0xFF, "Xenix BBT" }, /* Xenix Bad Block Table */
+ { 0x00, NULL }, /* unused */
+ { 0x01, NULL }, /* Primary DOS with 12 bit FAT */
+ { 0x02, NULL }, /* XENIX / filesystem */
+ { 0x03, NULL }, /* XENIX /usr filesystem */
+ { 0x04, NULL }, /* Primary DOS with 16 bit FAT */
+ { 0x05, NULL }, /* Extended DOS */
+ { 0x06, NULL }, /* Primary 'big' DOS (> 32MB) */
+ { 0x07, NULL }, /* NTFS */
+ { 0x08, NULL }, /* AIX filesystem */
+ { 0x09, NULL }, /* AIX boot partition or Coherent */
+ { 0x0A, NULL }, /* OS/2 Boot Manager or OPUS */
+ { 0x0B, NULL }, /* Primary Win95 w/ 32-bit FAT */
+ { 0x0C, NULL }, /* Primary Win95 w/ 32-bit FAT LBA-mapped */
+ { 0x0E, NULL }, /* Primary DOS w/ 16-bit FAT, CHS-mapped */
+ { 0x0F, NULL }, /* Extended DOS LBA-mapped */
+ { 0x10, NULL }, /* OPUS */
+ { 0x11, NULL }, /* OS/2 BM: hidden DOS 12-bit FAT */
+ { 0x12, NULL }, /* Compaq Diagnostics */
+ { 0x14, NULL }, /* OS/2 BM: hidden DOS 16-bit FAT <32M or Novell DOS 7.0 bug */
+ { 0x16, NULL }, /* OS/2 BM: hidden DOS 16-bit FAT >=32M */
+ { 0x17, NULL }, /* OS/2 BM: hidden IFS */
+ { 0x18, NULL }, /* AST Windows swapfile */
+ { 0x19, NULL }, /* Willowtech Photon coS */
+ { 0x1C, NULL }, /* IBM ThinkPad recovery partition */
+ { 0x20, NULL }, /* Willowsoft OFS1 */
+ { 0x24, NULL }, /* NEC DOS */
+ { 0x27, NULL }, /* Windows hidden Recovery Partition */
+ { 0x38, NULL }, /* Theos */
+ { 0x39, NULL }, /* Plan 9 */
+ { 0x40, NULL }, /* VENIX 286 or LynxOS */
+ { 0x41, NULL }, /* Linux/MINIX (sharing disk with DRDOS) or Personal RISC boot */
+ { 0x42, NULL }, /* SFS or Linux swap (sharing disk with DRDOS) */
+ { 0x43, NULL }, /* Linux native (sharing disk with DRDOS) */
+ { 0x4D, NULL }, /* QNX 4.2 Primary */
+ { 0x4E, NULL }, /* QNX 4.2 Secondary */
+ { 0x4F, NULL }, /* QNX 4.2 Tertiary */
+ { 0x50, NULL }, /* DM (disk manager) */
+ { 0x51, NULL }, /* DM6 Aux1 (or Novell) */
+ { 0x52, NULL }, /* CP/M or Microport SysV/AT */
+ { 0x53, NULL }, /* DM6 Aux3 */
+ { 0x54, NULL }, /* Ontrack */
+ { 0x55, NULL }, /* EZ-Drive (disk manager) */
+ { 0x56, NULL }, /* Golden Bow (disk manager) */
+ { 0x5C, NULL }, /* Priam Edisk (disk manager) */
+ { 0x61, NULL }, /* SpeedStor */
+ { 0x63, NULL }, /* ISC, System V/386, GNU HURD or Mach */
+ { 0x64, NULL }, /* Novell NetWare 2.xx */
+ { 0x65, NULL }, /* Novell NetWare 3.xx */
+ { 0x66, NULL }, /* Novell 386 NetWare */
+ { 0x67, NULL }, /* Novell */
+ { 0x68, NULL }, /* Novell */
+ { 0x69, NULL }, /* Novell */
+ { 0x70, NULL }, /* DiskSecure Multi-Boot */
+ { 0x75, NULL }, /* PCIX */
+ { 0x80, NULL }, /* Minix 1.1 ... 1.4a */
+ { 0x81, NULL }, /* Minix 1.4b ... 1.5.10 */
+ { 0x82, NULL }, /* Linux swap */
+ { 0x83, NULL }, /* Linux filesystem */
+ { 0x84, NULL }, /* OS/2 hidden C: drive */
+ { 0x85, NULL }, /* Linux extended */
+ { 0x86, NULL }, /* NT FAT volume set */
+ { 0x87, NULL }, /* NTFS volume set or HPFS mirrored */
+ { 0x8E, NULL }, /* Linux LVM */
+ { 0x93, NULL }, /* Amoeba filesystem */
+ { 0x94, NULL }, /* Amoeba bad block table */
+ { 0x99, NULL }, /* Mylex EISA SCSI */
+ { 0x9F, NULL }, /* BSDI BSD/OS */
+ { 0xA0, NULL }, /* Phoenix NoteBIOS save-to-disk */
+ { 0xA5, NULL }, /* FreeBSD */
+ { 0xA6, NULL }, /* OpenBSD */
+ { 0xA7, NULL }, /* NEXTSTEP */
+ { 0xA8, NULL }, /* MacOS X main partition */
+ { 0xA9, NULL }, /* NetBSD */
+ { 0xAB, NULL }, /* MacOS X boot partition */
+ { 0xAF, NULL }, /* MacOS X HFS+ partition */
+ { 0xB7, NULL }, /* BSDI BSD/386 filesystem */
+ { 0xB8, NULL }, /* BSDI BSD/386 swap */
+ { 0xBF, NULL }, /* Solaris */
+ { 0xC0, NULL }, /* CTOS */
+ { 0xC1, NULL }, /* DRDOS/sec (FAT-12) */
+ { 0xC4, NULL }, /* DRDOS/sec (FAT-16, < 32M) */
+ { 0xC6, NULL }, /* DRDOS/sec (FAT-16, >= 32M) */
+ { 0xC7, NULL }, /* Syrinx (Cyrnix?) or HPFS disabled */
+ { 0xDB, NULL }, /* Concurrent CPM or C.DOS or CTOS */
+ { 0xDE, NULL }, /* Dell maintenance partition */
+ { 0xE1, NULL }, /* DOS access or SpeedStor 12-bit FAT extended partition */
+ { 0xE3, NULL }, /* DOS R/O or SpeedStor or Storage Dimensions */
+ { 0xE4, NULL }, /* SpeedStor 16-bit FAT extended partition < 1024 cyl. */
+ { 0xEB, NULL }, /* BeOS for Intel */
+ { 0xEE, NULL }, /* EFI Protective Partition */
+ { 0xEF, NULL }, /* EFI System Partition */
+ { 0xF1, NULL }, /* SpeedStor or Storage Dimensions */
+ { 0xF2, NULL }, /* DOS 3.3+ Secondary */
+ { 0xF4, NULL }, /* SpeedStor >1024 cyl. or LANstep or IBM PS/2 IML */
+ { 0xFF, NULL }, /* Xenix Bad Block Table */
};
struct gpt_type {
- int gt_menuid;
int gt_attr;
#define GTATTR_PROTECT (1 << 0)
#define GTATTR_PROTECT_EFISYS (1 << 1)
- char *gt_name;
+ char *gt_desc;
char *gt_guid;
};
char * const MICROSOFT_BASIC_DATA_GUID = "ebd0a0a2-b9e5-4433-87c0-68b6b72699c7";
const struct gpt_type gpt_types[] = {
- { 0x00, 0, "unused",
+ { 0,
+ NULL, /* Unused */
"00000000-0000-0000-0000-000000000000" },
- { 0x01, 0, "FAT12",
- MICROSOFT_BASIC_DATA_GUID },
- { 0x04, 0, "FAT16S",
- MICROSOFT_BASIC_DATA_GUID },
- { 0x06, 0, "FAT16B",
- MICROSOFT_BASIC_DATA_GUID },
- { 0x07, 0, "NTFS",
- MICROSOFT_BASIC_DATA_GUID },
- { 0x0B, 0, "FAT32",
- MICROSOFT_BASIC_DATA_GUID },
- { 0x0C, 0, "FAT32L",
- MICROSOFT_BASIC_DATA_GUID },
- { 0x0D, GTATTR_PROTECT, "BIOS Boot",
- "21686148-6449-6e6f-744e-656564454649" },
- { 0x0E, 0, "FAT16L",
- MICROSOFT_BASIC_DATA_GUID },
- { 0x11, 0, "OS/2 hidden",
- MICROSOFT_BASIC_DATA_GUID },
- { 0x14, 0, "OS/2 hidden",
- MICROSOFT_BASIC_DATA_GUID },
- { 0x16, 0, "OS/2 hidden",
- MICROSOFT_BASIC_DATA_GUID },
- { 0x17, 0, "OS/2 hidden",
- MICROSOFT_BASIC_DATA_GUID },
- { 0x1C, 0, "ThinkPad Rec",
- MICROSOFT_BASIC_DATA_GUID },
- { 0x27, 0, "Win Recovery",
- "de94bba4-06d1-4d40-a16a-bfd50179d6ac" },
- { 0x42, 0, "LinuxSwap DR",
- "af9b60a0-1431-4f62-bc68-3311714a69ad" },
- { 0x7f, 0, "ChromeKernel",
- "fe3a2a5d-4f32-41a7-b725-accc3285a309" },
- { 0x82, 0, "Linux swap",
+ { 0,
+ NULL, /* Legacy MBR */
+ "024dee41-33e7-11d3-9d69-0008c781f39f" },
+ { 0,
+ NULL, /* Linux swap */
"0657fd6d-a4ab-43c4-84e5-0933c84b4f4f" },
- { 0x83, 0, "Linux files*",
+ { 0,
+ NULL, /* Linux files* */
"0fc63daf-8483-4772-8e79-3d69d8477de4" },
- { 0x8E, 0, "Linux LVM",
- "e6d6d379-f507-44c2-a23c-238f2a3df928" },
- { 0xA5, 0, "FreeBSD",
- "516e7cb4-6ecf-11d6-8ff8-00022d09712b" },
- { 0xA6, 0, "OpenBSD",
- "824cc7a0-36a8-11e3-890a-952519ad3f61" },
- { 0xA8, 0, "MacOS X",
- "55465300-0000-11aa-aa11-00306543ecac" },
- { 0xA9, 0, "NetBSD",
- "49f48d5a-b10e-11dc-b99b-0019d1879648" },
- { 0xAB, 0, "MacOS X boot",
+ { GTATTR_PROTECT,
+ NULL, /* BIOS Boot */
+ "21686148-6449-6e6f-744e-656564454649" },
+ { GTATTR_PROTECT,
+ NULL, /* HiFive BBL */
+ "2e54b353-1271-4842-806f-e436d6af6985" },
+ { 0,
+ NULL, /* BeOS/i386 */
+ "42465331-3ba3-10f1-802a-4861696b7521" },
+ { 0,
+ NULL, /* MacOS X boot */
"426f6f74-0000-11aa-aa11-00306543ecac" },
- { 0xAF, 0, "MacOS X HFS+",
+ { 0,
+ NULL, /* MacOS X HFS+ */
"48465300-0000-11aa-aa11-00306543ecac" },
- { 0xB0, GTATTR_PROTECT | GTATTR_PROTECT_EFISYS, "APFS",
- "7c3457ef-0000-11aa-aa11-00306543ecac" },
- { 0xB1, GTATTR_PROTECT | GTATTR_PROTECT_EFISYS, "APFS ISC",
- "69646961-6700-11aa-aa11-00306543ecac" },
- { 0xB2, GTATTR_PROTECT | GTATTR_PROTECT_EFISYS, "APFS Recovery",
+ { 0,
+ NULL, /* NetBSD */
+ "49f48d5a-b10e-11dc-b99b-0019d1879648" },
+ { 0,
+ NULL, /* FreeBSD */
+ "516e7cb4-6ecf-11d6-8ff8-00022d09712b" },
+ { GTATTR_PROTECT | GTATTR_PROTECT_EFISYS,
+ NULL, /* APFS Recovery */
"52637672-7900-11aa-aa11-00306543ecac" },
- { 0xB3, GTATTR_PROTECT, "HiFive FSBL",
+ { 0,
+ NULL, /* MacOS X */
+ "55465300-0000-11aa-aa11-00306543ecac" },
+ { GTATTR_PROTECT,
+ NULL, /* HiFive FSBL */
"5b193300-fc78-40cd-8002-e86c45580b47" },
- { 0xB4, GTATTR_PROTECT, "HiFive BBL",
- "2e54b353-1271-4842-806f-e436d6af6985" },
- { 0xBF, 0, "Solaris",
+ { GTATTR_PROTECT | GTATTR_PROTECT_EFISYS,
+ NULL, /* APFS ISC */
+ "69646961-6700-11aa-aa11-00306543ecac" },
+ { 0,
+ NULL, /* Solaris */
"6a85cf4d-1dd2-11b2-99a6-080020736631" },
- { 0xEB, 0, "BeOS/i386",
- "42465331-3ba3-10f1-802a-4861696b7521" },
- { 0xEC, 0, "Legacy MBR",
- "024dee41-33e7-11d3-9d69-0008c781f39f" },
- { 0xEF, 0, "EFI Sys",
+ { GTATTR_PROTECT | GTATTR_PROTECT_EFISYS,
+ NULL, /* APFS */
+ "7c3457ef-0000-11aa-aa11-00306543ecac" },
+ { 0,
+ NULL, /* OpenBSD */
+ "824cc7a0-36a8-11e3-890a-952519ad3f61" },
+ { 0,
+ NULL, /* LinuxSwap DR */
+ "af9b60a0-1431-4f62-bc68-3311714a69ad" },
+ { 0,
+ NULL, /* EFI Sys */
EFI_SYSTEM_PARTITION_GUID },
+ { 0,
+ NULL, /* Win Recovery*/
+ "de94bba4-06d1-4d40-a16a-bfd50179d6ac" },
+ { 0,
+ NULL, /* Linux VM */
+ "e6d6d379-f507-44c2-a23c-238f2a3df928" },
+ { 0,
+ NULL, /* Microsoft basic data */
+ MICROSOFT_BASIC_DATA_GUID },
+ { 0,
+ NULL, /* ChromeKernel */
+ "fe3a2a5d-4f32-41a7-b725-accc3285a309" },
+};
+
+struct menu_item {
+ int mi_menuid; /* Unique hex octet */
+ int mi_mbrid; /* -1 == not on MBR menu */
+ char *mi_name; /* Truncated at 14 chars */
+ char *mi_guid; /* NULL == not on GPT menu */
+};
+
+const struct menu_item menu_items[] = {
+ { 0x00, 0x00, "Unused", "00000000-0000-0000-0000-000000000000" },
+ { 0x01, 0x01, "DOS FAT-12", MICROSOFT_BASIC_DATA_GUID },
+ { 0x02, 0x02, "XENIX /", NULL },
+ { 0x03, 0x03, "XENIX /usr", NULL },
+ { 0x04, 0x04, "DOS FAT-16", MICROSOFT_BASIC_DATA_GUID },
+ { 0x05, 0x05, "Extended DOS", NULL },
+ { 0x06, 0x06, "DOS > 32MB", MICROSOFT_BASIC_DATA_GUID },
+ { 0x07, 0x07, "NTFS", MICROSOFT_BASIC_DATA_GUID },
+ { 0x08, 0x08, "AIX fs", NULL },
+ { 0x09, 0x09, "AIX/Coherent", NULL },
+ { 0x0A, 0x0A, "OS/2 Bootmgr", NULL },
+ { 0x0B, 0x0B, "Win95 FAT-32", MICROSOFT_BASIC_DATA_GUID },
+ { 0x0C, 0x0C, "Win95 FAT32L", MICROSOFT_BASIC_DATA_GUID },
+ { 0x0D, -1, "BIOS boot", "21686148-6449-6e6f-744e-656564454649" },
+ { 0x0E, 0x0E, "DOS FAT-16", MICROSOFT_BASIC_DATA_GUID },
+ { 0x0F, 0x0F, "Extended LBA", NULL },
+ { 0x10, 0x10, "OPUS", NULL },
+ { 0x11, 0x11, "OS/2 hidden", MICROSOFT_BASIC_DATA_GUID },
+ { 0x12, 0x12, "Compaq Diag", NULL },
+ { 0x14, 0x14, "OS/2 hidden", MICROSOFT_BASIC_DATA_GUID },
+ { 0x16, 0x16, "OS/2 hidden", MICROSOFT_BASIC_DATA_GUID },
+ { 0x17, 0x17, "OS/2 hidden", MICROSOFT_BASIC_DATA_GUID },
+ { 0x18, 0x18, "AST swap", NULL },
+ { 0x19, 0x19, "Willowtech", NULL },
+ { 0x1C, 0x1C, "ThinkPad Rec", MICROSOFT_BASIC_DATA_GUID },
+ { 0x20, 0x20, "Willowsoft", NULL },
+ { 0x24, 0x24, "NEC DOS", NULL },
+ { 0x27, 0x27, "Win Recovery", "de94bba4-06d1-4d40-a16a-bfd50179d6ac" },
+ { 0x38, 0x38, "Theos", NULL },
+ { 0x39, 0x39, "Plan 9", NULL },
+ { 0x40, 0x40, "VENIX 286", NULL },
+ { 0x41, 0x41, "Lin/Minux DR", NULL },
+ { 0x42, 0x42, "LinuxSwap DR", "af9b60a0-1431-4f62-bc68-3311714a69ad" },
+ { 0x43, 0x43, "Linux DR", NULL },
+ { 0x4D, 0x4D, "QNX 4.2 Pri", NULL },
+ { 0x4E, 0x4E, "QNX 4.2 Sec", NULL },
+ { 0x4F, 0x4F, "QNX 4.2 Ter", NULL },
+ { 0x50, 0x50, "DM", NULL },
+ { 0x51, 0x51, "DM", NULL },
+ { 0x52, 0x52, "CP/M or SysV", NULL },
+ { 0x53, 0x53, "DM", NULL },
+ { 0x54, 0x54, "Ontrack", NULL },
+ { 0x55, 0x55, "EZ-Drive", NULL },
+ { 0x56, 0x56, "Golden Bow", NULL },
+ { 0x5C, 0x5C, "Priam" , NULL },
+ { 0x61, 0x61, "SpeedStor", NULL },
+ { 0x63, 0x63, "ISC, HURD, *", NULL },
+ { 0x64, 0x64, "NetWare 2.xx", NULL },
+ { 0x65, 0x65, "NetWare 3.xx", NULL },
+ { 0x66, 0x66, "NetWare 386", NULL },
+ { 0x67, 0x67, "Novell", NULL },
+ { 0x68, 0x68, "Novell", NULL },
+ { 0x69, 0x69, "Novell", NULL },
+ { 0x70, 0x70, "DiskSecure", NULL },
+ { 0x75, 0x75, "PCIX", NULL },
+ { 0x7F, -1, "Chrome Kernel","fe3a2a5d-4f32-41a7-b725-accc3285a309" },
+ { 0x80, 0x80, "Minix (old)", NULL },
+ { 0x81, 0x81, "Minix (new)", NULL },
+ { 0x82, 0x82, "Linux swap", "0657fd6d-a4ab-43c4-84e5-0933c84b4f4f" },
+ { 0x83, 0x83, "Linux files*", "0fc63daf-8483-4772-8e79-3d69d8477de4" },
+ { 0x84, 0x84, "OS/2 hidden", NULL },
+ { 0x85, 0x85, "Linux ext.", NULL },
+ { 0x86, 0x86, "NT FAT VS", NULL },
+ { 0x87, 0x87, "NTFS VS", NULL },
+ { 0x8E, 0x8E, "Linux LVM", "e6d6d379-f507-44c2-a23c-238f2a3df928" },
+ { 0x93, 0x93, "Amoeba FS", NULL },
+ { 0x94, 0x94, "Amoeba BBT", NULL },
+ { 0x99, 0x99, "Mylex" , NULL },
+ { 0x9F, 0x9F, "BSDI", NULL },
+ { 0xA0, 0xA0, "NotebookSave", NULL },
+ { 0xA5, 0xA5, "FreeBSD", "516e7cb4-6ecf-11d6-8ff8-00022d09712b" },
+ { 0xA6, 0xA6, "OpenBSD", "824cc7a0-36a8-11e3-890a-952519ad3f61" },
+ { 0xA7, 0xA7, "NeXTSTEP", NULL },
+ { 0xA8, 0xA8, "MacOS X", "55465300-0000-11aa-aa11-00306543ecac" },
+ { 0xA9, 0xA9, "NetBSD", "49f48d5a-b10e-11dc-b99b-0019d1879648" },
+ { 0xAB, 0xAB, "MacOS X boot", "426f6f74-0000-11aa-aa11-00306543ecac" },
+ { 0xAF, 0xAF, "MacOS X HFS+", "48465300-0000-11aa-aa11-00306543ecac" },
+ { 0xB0, -1, "APFS", "7c3457ef-0000-11aa-aa11-00306543ecac" },
+ { 0xB1, -1, "APFS ISC", "69646961-6700-11aa-aa11-00306543ecac" },
+ { 0xB2, -1, "APFS Recovery","52637672-7900-11aa-aa11-00306543ecac" },
+ { 0xB3, -1, "HiFive FSBL", "5b193300-fc78-40cd-8002-e86c45580b47" },
+ { 0xB4, -1, "HiFive BBL", "2e54b353-1271-4842-806f-e436d6af6985" },
+ { 0xB7, 0xB7, "BSDI filesy*", NULL },
+ { 0xB8, 0xB8, "BSDI swap", NULL },
+ { 0xBF, 0xBF, "Solaris", "6a85cf4d-1dd2-11b2-99a6-080020736631" },
+ { 0xC0, 0xC0, "CTOS", NULL },
+ { 0xC1, 0xC1, "DRDOSs FAT12", NULL },
+ { 0xC4, 0xC4, "DRDOSs < 32M", NULL },
+ { 0xC6, 0xC6, "DRDOSs >=32M", NULL },
+ { 0xC7, 0xC7, "HPFS Disbled", NULL },
+ { 0xDB, 0xDB, "CPM/C.DOS/C*", NULL },
+ { 0xDE, 0xDE, "Dell Maint", NULL },
+ { 0xE1, 0xE1, "SpeedStor", NULL },
+ { 0xE3, 0xE3, "SpeedStor", NULL },
+ { 0xE4, 0xE4, "SpeedStor", NULL },
+ { 0xEB, 0xEB, "BeOS/i386", "42465331-3ba3-10f1-802a-4861696b7521" },
+ { 0xEC, -1, "Legacy MBR", "024dee41-33e7-11d3-9d69-0008c781f39f" },
+ { 0xEE, 0xEE, "EFI GPT", NULL },
+ { 0xEF, 0xEF, "EFI Sys", EFI_SYSTEM_PARTITION_GUID },
+ { 0xF1, 0xF1, "SpeedStor", NULL },
+ { 0xF2, 0xF2, "DOS 3.3+ Sec", NULL },
+ { 0xF4, 0xF4, "SpeedStor", NULL },
+ { 0xFF, 0xFF, "Xenix BBT", NULL },
};
const struct gpt_type *find_gpt_type(const struct uuid *);
const struct mbr_type *find_mbr_type(const int);
int uuid_attr(const struct uuid *);
+int mbr_item(const unsigned int);
+int gpt_item(const unsigned int);
+int nth_menu_item(int (*)(const unsigned int),
+ const unsigned int, unsigned int);
+void print_menu(int (*)(const unsigned int),
+ const unsigned int);
const struct gpt_type *
find_gpt_type(const struct uuid *uuid)
return gt->gt_attr;
}
+void
+print_menu(int (*test)(const unsigned int), const unsigned int columns)
+{
+ int col, col0;
+ unsigned int count, i, j, rows;
+
+ count = 0;
+ for (i = 0; i < nitems(menu_items); i++)
+ if (test(i) == 0)
+ count++;
+ rows = (count + columns - 1) / columns;
+
+ col0 = -1;
+ for (i = 0; i < rows; i++) {
+ col0 = nth_menu_item(test, col0, 1);
+ printf("%02X %-15s", menu_items[col0].mi_menuid,
+ menu_items[col0].mi_name);
+ for (j = 1; j < columns; j++) {
+ col = nth_menu_item(test, col0, j * rows);
+ if (col == -1)
+ break;
+ printf("%02X %-15s", menu_items[col].mi_menuid,
+ menu_items[col].mi_name);
+ }
+ printf("\n");
+ }
+}
+
+int
+mbr_item(const unsigned int item)
+{
+ return menu_items[item].mi_mbrid == -1;
+}
+
+int
+gpt_item(const unsigned int item)
+{
+ return menu_items[item].mi_guid == NULL;
+}
+
+int
+nth_menu_item(int (*test)(const unsigned int), const unsigned int last,
+ unsigned int n)
+{
+ unsigned int i;
+
+ for (i = last + 1; i < nitems(menu_items); i++) {
+ if (test(i) == 0) {
+ n--;
+ if (n == 0)
+ return i;
+ }
+ }
+
+ return -1;
+}
+
int
PRT_protected_uuid(const struct uuid *uuid)
{
void
PRT_print_mbrmenu(char *lbuf, size_t lbuflen)
{
- unsigned int cidx, i, idrows;
-
- idrows = (nitems(mbr_types) + 3) / 4;
+#define MBR_MENU_COLUMNS 4
printf("Choose from the following Partition id values:\n");
- for (i = 0; i < idrows; i++) {
- for (cidx = i; cidx < i + idrows * 3; cidx += idrows) {
- printf("%02X %-15s", mbr_types[cidx].mt_type,
- mbr_types[cidx].mt_name);
- }
- if (cidx < nitems(mbr_types))
- printf("%02X %s", mbr_types[cidx].mt_type,
- mbr_types[cidx].mt_name);
- printf("\n");
- }
+ print_menu(mbr_item, MBR_MENU_COLUMNS);
memset(lbuf, 0, lbuflen); /* Just continue. */
}
void
PRT_print_gptmenu(char *lbuf, size_t lbuflen)
{
- unsigned int cidx, i, idrows;
-
- idrows = (nitems(gpt_types) + 3) / 4;
+#define GPT_MENU_COLUMNS 4
printf("Choose from the following Partition id values:\n");
- for (i = 0; i < idrows; i++) {
- for (cidx = i; cidx < i + idrows * 3; cidx += idrows) {
- printf("%02X %-15s", gpt_types[cidx].gt_menuid,
- gpt_types[cidx].gt_name);
- }
- if (cidx < nitems(gpt_types))
- printf("%02X %s", gpt_types[cidx].gt_menuid,
- gpt_types[cidx].gt_name);
- printf("\n");
- }
+ print_menu(gpt_item, GPT_MENU_COLUMNS);
memset(lbuf, 0, lbuflen); /* Just continue. */
}
{
const struct unit_type *ut;
const struct mbr_type *mt;
+ const char *desc = NULL;
struct chs start, end;
double size;
+ unsigned int i;
size = units_size(units, prt->prt_ns, &ut);
PRT_lba_to_chs(prt, &start, &end);
mt = find_mbr_type(prt->prt_id);
+ if (mt != NULL) {
+ if (mt->mt_desc != NULL)
+ desc = mt->mt_desc;
+ for (i = 0; i < nitems(menu_items) && desc == NULL; i++) {
+ if (mbr_item(i) == 0 &&
+ menu_items[i].mi_mbrid == prt->prt_id)
+ desc = menu_items[i].mi_name;
+ }
+ }
printf("%c%1d: %.2X %6llu %3u %3u - %6llu %3u %3u [%12llu:%12.0f%s] "
"%s\n", (prt->prt_flag == DOSACTIVE) ? '*' : ' ', num, prt->prt_id,
start.chs_cyl, start.chs_head, start.chs_sect,
end.chs_cyl, end.chs_head, end.chs_sect,
- prt->prt_bs, size, ut->ut_abbr, mt ? mt->mt_name : "<Unknown ID>");
+ prt->prt_bs, size, ut->ut_abbr, desc ? desc : "<Unknown ID>");
if (prt->prt_bs >= DL_GETDSIZE(&dl))
printf("partition %d starts beyond the end of %s\n", num,
PRT_uuid_to_name(const struct uuid *uuid)
{
static char typename[UUID_STR_LEN + 1];
- const uint8_t gpt_uuid_msdos[] = GPT_UUID_MSDOS;
- struct uuid uuid_msdos;
const struct gpt_type *gt;
char *uuidstr;
+ unsigned int i;
uint32_t status;
- uuid_dec_be(gpt_uuid_msdos, &uuid_msdos);
- if (uuid_compare(&uuid_msdos, uuid, NULL) == 0)
- return "Microsoft basic data";
-
gt = find_gpt_type(uuid);
- if (gt != NULL)
- return gt->gt_name;
+ if (gt != NULL) {
+ if (gt->gt_desc != NULL)
+ return gt->gt_desc;
+ for (i = 0; i < nitems(menu_items); i++) {
+ if (gpt_item(i) == 0 &&
+ strcasecmp(gt->gt_guid, menu_items[i].mi_guid) == 0)
+ return menu_items[i].mi_name;
+ }
+ }
uuid_to_string(uuid, &uuidstr, &status);
if (status == uuid_s_ok)
PRT_uuid_to_menuid(const struct uuid *uuid)
{
const struct gpt_type *gt;
+ unsigned int i;
gt = find_gpt_type(uuid);
- if (gt == NULL)
- return -1;
- else
- return gt->gt_menuid;
+ if (gt != NULL) {
+ for (i = 0; i < nitems(menu_items); i++) {
+ if (gpt_item(i) == 0 &&
+ strcasecmp(menu_items[i].mi_guid, gt->gt_guid) == 0)
+ return menu_items[i].mi_menuid;
+ }
+ }
+
+ return -1;
}
const struct uuid *
PRT_menuid_to_uuid(const int menuid)
{
static struct uuid guid;
- int i;
+ unsigned int i;
uint32_t status = uuid_s_ok;
- for (i = 0; i < nitems(gpt_types); i++) {
- if (gpt_types[i].gt_menuid == menuid) {
- uuid_from_string(gpt_types[i].gt_guid, &guid, &status);
+ for (i = 0; i < nitems(menu_items); i++) {
+ if (gpt_item(i) == 0 && menu_items[i].mi_menuid == menuid) {
+ uuid_from_string(menu_items[i].mi_guid, &guid, &status);
break;
}
}
- if (i == nitems(gpt_types) || status != uuid_s_ok)
+ if (i == nitems(menu_items) || status != uuid_s_ok)
uuid_create_nil(&guid, NULL);
return &guid;