Enabled GPT type GUIDs with -append_partition, -boot_image any iso_mbr_part_type=, and -as mkisofs -iso_mbr_part_type

This commit is contained in:
2019-02-18 13:19:32 +01:00
parent caf38e81ae
commit fc71cec8f7
17 changed files with 469 additions and 230 deletions

View File

@ -958,11 +958,16 @@ int Xorriso_make_iso_write_opts(struct XorrisO *xorriso, IsoImage *image,
isoburn_igopt_set_partition_img(sopts, i + 1,
xorriso->appended_part_types[i], part_image);
isoburn_igopt_set_part_flag(sopts, i + 1, intvl_string);
isoburn_igopt_set_part_type_guid(sopts, i + 1,
xorriso->appended_part_type_guids[i],
xorriso->appended_part_gpt_flags[i] & 1);
}
isoburn_igopt_set_appended_as_gpt(sopts, xorriso->appended_as_gpt);
isoburn_igopt_set_appended_as_apm(sopts, xorriso->appended_as_apm);
isoburn_igopt_set_part_like_isohybrid(sopts, xorriso->part_like_isohybrid);
isoburn_igopt_set_iso_mbr_part_type(sopts, xorriso->iso_mbr_part_type);
isoburn_igopt_set_iso_type_guid(sopts, xorriso->iso_gpt_type_guid,
xorriso->iso_mbr_part_flag & 1);
isoburn_igopt_set_gpt_guid(sopts, xorriso->gpt_guid, xorriso->gpt_guid_mode);
isoburn_igopt_set_disc_label(sopts, xorriso->ascii_disc_label);
isoburn_igopt_set_hfsp_serial_number(sopts, xorriso->hfsp_serial_number);
@ -3125,20 +3130,14 @@ ex:;
}
int Xorriso_parse_gpt_guid(struct XorrisO *xorriso, char *text, int flag)
/* @param flag bit0= no error message
*/
int Xorriso_parse_guid(struct XorrisO *xorriso, char *text,
uint8_t guid[16], int flag)
{
int bin_count= 0, ret;
uint8_t u[16], tr;
if(strcmp(text, "random") == 0) {
xorriso->gpt_guid_mode= 0;
return(1);
}
if(strcmp(text, "modification-date") == 0 ||
strcmp(text, "volume_date_uuid") == 0) {
xorriso->gpt_guid_mode= 2;
return(1);
}
/* Try RFC 4122 : big endian XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
Translate to UEFI: first three components to little-endian
*/
@ -3163,8 +3162,7 @@ int Xorriso_parse_gpt_guid(struct XorrisO *xorriso, char *text, int flag)
ret= Hex_to_bin(text + 24, 6, &bin_count, u + 10, 0);
if(ret < 0 || bin_count != 6)
goto malformed;
xorriso->gpt_guid_mode= 1;
memcpy(xorriso->gpt_guid, u, 16);
memcpy(guid, u, 16);
return(1);
}
}
@ -3172,15 +3170,67 @@ int Xorriso_parse_gpt_guid(struct XorrisO *xorriso, char *text, int flag)
ret= Hex_to_bin(text, 16, &bin_count, u, 0);
if(ret < 0 || bin_count != 16)
goto malformed;
xorriso->gpt_guid_mode= 1;
memcpy(xorriso->gpt_guid, u, 16);
memcpy(guid, u, 16);
return(1);
}
malformed:;
sprintf(xorriso->info_text, "Malformed GUID string: ");
Text_shellsafe(text, xorriso->info_text, 1);
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
if(!(flag & 1)) {
sprintf(xorriso->info_text, "Malformed GUID string: ");
Text_shellsafe(text, xorriso->info_text, 1);
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
}
return(0);
}
int Xorriso_parse_gpt_guid(struct XorrisO *xorriso, char *text, int flag)
{
int ret;
if(strcmp(text, "random") == 0) {
xorriso->gpt_guid_mode= 0;
return(1);
}
if(strcmp(text, "modification-date") == 0 ||
strcmp(text, "volume_date_uuid") == 0) {
xorriso->gpt_guid_mode= 2;
return(1);
}
ret= Xorriso_parse_guid(xorriso, text, xorriso->gpt_guid, 0);
if(ret <= 0)
return(ret);
xorriso->gpt_guid_mode= 1;
return(1);
}
/* @return Tells the recognition status
0= not recognized as GUID
1= non-EFI type GUID
2= EFI type GUID
*/
int Xorriso_parse_type_guid(struct XorrisO *xorriso, char *text,
uint8_t guid[16], int *mbr_type, int flag)
{
int j, ret;
static uint8_t efi_sys_uuid[16] = {
0x28, 0x73, 0x2a, 0xc1, 0x1f, 0xf8, 0xd2, 0x11,
0xba, 0x4b, 0x00, 0xa0, 0xc9, 0x3e, 0xc9, 0x3b
};
ret= Xorriso_parse_guid(xorriso, text, guid, 1);
if(ret > 0) {
for(j= 0; j < 16; j++)
if(guid[j] != efi_sys_uuid[j])
break;
if(j >= 16) {
*mbr_type= 0xef;
return(2);
} else {
*mbr_type= 0x83;
return(1);
}
}
return(0);
}