diff --git a/xorriso/iso_img.c b/xorriso/iso_img.c index dd5eadb9..f4c2ded8 100644 --- a/xorriso/iso_img.c +++ b/xorriso/iso_img.c @@ -1516,6 +1516,50 @@ int Xorriso_add_intvl_adr(struct XorrisO *xorriso, char *buf, } +struct elto_img_par { + int n, ldsiz, boot_info_table, grub2_boot_info; + int do_gpt_basdat, do_gpt_hfsplus, do_apm_hfsplus; + unsigned int ld_seg, hdpt, platform_id; + unsigned long int lba; + char pltf[8], b[8], emul[8], boot_image_type[16]; + char *path, *id_string, *sel_crit; +}; + + +/* @param ptype 0= unknown, 1= gpt-basdat, 2=gpt-hfsplus, 3=EFI + @param flag bit0= isohybrid +*/ +static int Xorriso_search_eltorito_path(struct XorrisO *xorriso, + struct elto_img_par *et_imgs, + int elto_count, char *path, int ptype, + int *found, int *efi_boot_part, + int flag) +{ + int first_efi= 1, et_idx; + + for(et_idx= 0; et_idx < elto_count; et_idx++) { + if(strcmp(et_imgs[et_idx].path, path) != 0) + continue; + if(flag & 1) { + if(ptype == 1 || ptype == 3) + et_imgs[et_idx].do_gpt_basdat= 1; + else if(ptype == 2) + et_imgs[et_idx].do_gpt_hfsplus= 1; + break; + } else if(first_efi && et_imgs[et_idx].platform_id == 0xef) { + *efi_boot_part= 1; + break; + } + if(et_imgs[et_idx].platform_id == 0xef) + first_efi= 0; + } + *found= et_idx; + if(et_idx < elto_count) + return(1); + return(0); +} + + /* @param flag bit0= do not record but only count */ static int Xorriso_scan_report_lines(struct XorrisO *xorriso, @@ -1524,7 +1568,8 @@ static int Xorriso_scan_report_lines(struct XorrisO *xorriso, char **cmds, int *cmd_count, int flag) { int ret= 0, i, num_count, mkisofs, line_count, idx, et_idx, isohybrid= 0; - int efi_boot_part= 0, first_efi, full_sparc_part= 0, have_sparc_part= 0; + int ptype, gpt_idx; + int efi_boot_part= 0, full_sparc_part= 0, have_sparc_part= 0; int appended_as_gpt= 0, have_prep= 0, did_sysarea= 0, cared_for_apm= 0; int cared_for_sparc= 0; int have_sysarea= 0, ptable_killer, imported_iso, have_alpha_ldr_path= 0; @@ -1534,14 +1579,6 @@ static int Xorriso_scan_report_lines(struct XorrisO *xorriso, char **lines= NULL; double num[8]; char *cat_path= ""; - struct elto_img_par { - int n, ldsiz, boot_info_table, grub2_boot_info; - int do_gpt_basdat, do_gpt_hfsplus, do_apm_hfsplus; - unsigned int ld_seg, hdpt, platform_id; - unsigned long int lba; - char pltf[8], b[8], emul[8], boot_image_type[16]; - char *path, *id_string, *sel_crit; - }; struct elto_img_par *et_imgs= NULL; int elto_count= 0; uint32_t img_blocks= 0; @@ -1555,6 +1592,7 @@ static int Xorriso_scan_report_lines(struct XorrisO *xorriso, struct gpt_par { int ptype; /* 0= unknown, 1= gpt-basdat, 2=gpt-hfsplus, 3=EFI */ int has_path; + char *path; }; struct gpt_par *gpts= NULL; int gpt_count= 0; @@ -1624,12 +1662,18 @@ static int Xorriso_scan_report_lines(struct XorrisO *xorriso, } } - if(elto_count > 0) + if(elto_count > 0) { Xorriso_alloc_meM(et_imgs, struct elto_img_par, elto_count); + for(et_idx= 0; et_idx < elto_count; et_idx++) + et_imgs[et_idx].path= NULL; + } if(mbr_count > 0) Xorriso_alloc_meM(mbrpts, struct mbr_par, mbr_count); - if(gpt_count > 0) + if(gpt_count > 0) { Xorriso_alloc_meM(gpts, struct gpt_par, gpt_count); + for(gpt_idx= 0; gpt_idx < gpt_count; gpt_idx++) + gpts[gpt_idx].path= NULL; + } if(apm_count > 0) Xorriso_alloc_meM(apms, struct apm_par, apm_count); @@ -1724,6 +1768,7 @@ static int Xorriso_scan_report_lines(struct XorrisO *xorriso, } else if(strcmp(name, "GPT partition path :") == 0) { idx= num[0] - 1; gpts[idx].has_path= 1; + gpts[idx].path= textpt; } else if(strcmp(name, "APM partition type :") == 0) { idx= num[0] - 1; @@ -1845,19 +1890,38 @@ static int Xorriso_scan_report_lines(struct XorrisO *xorriso, } else if(strcmp(name, "MBR partition path :") == 0) { idx= num[0] - 1; - if(mbrpts[idx].ptype == 0xef) { - if(gpt_count < 1 && !(flag & 1)) { + if(!(flag & 1)) { + if(mbrpts[idx].ptype == 0x41) { sprintf(xorriso->info_text, - "Cannot make proposal to mark data file as MBR ESP without being in GPT : "); + "Cannot make proposal to mark PReP partition by data file: "); + Text_shellsafe(textpt, xorriso->info_text, 1); + Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "WARNING", 0); + continue; + } + ptype= 0; + if(mbrpts[idx].ptype == 0xef) + ptype= 3; + ret= Xorriso_search_eltorito_path(xorriso, et_imgs, elto_count, + textpt, ptype, + &et_idx, &efi_boot_part, !!isohybrid); + if(ret <= 0) { + sprintf(xorriso->info_text, + "Cannot make proposal to mark data file as MBR partition without being an El Torito boot image : "); Text_shellsafe(textpt, xorriso->info_text, 1); Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "SORRY", 0); - } /* else "GPT partition path :" will produce -efi-boot-part */ - } else if(!(flag & 1)) { - sprintf(xorriso->info_text, - "Cannot make proposal to mark data file as MBR partition of type 0x%x : ", - (unsigned int) mbrpts[idx].ptype); - Text_shellsafe(textpt, xorriso->info_text, 1); - Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "SORRY", 0); + } else { + for(gpt_idx= 0; gpt_idx < gpt_count; gpt_idx++) { + if(gpts[gpt_idx].path != NULL) + if(strcmp(gpts[gpt_idx].path, textpt) == 0) + break; + } + if(gpt_idx >= gpt_count) { + sprintf(xorriso->info_text, + "Cannot make proposal to mark data file as MBR partition without being in GPT : "); + Text_shellsafe(textpt, xorriso->info_text, 1); + Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "SORRY", 0); + } + } } } else if(strcmp(name, "GPT disk GUID :") == 0) { @@ -1878,25 +1942,10 @@ static int Xorriso_scan_report_lines(struct XorrisO *xorriso, } else if(strcmp(name, "GPT partition path :") == 0) { idx= num[0] - 1; - /* Check El Torito boot images for same path */ - first_efi= 1; - for(et_idx= 0; et_idx < elto_count; et_idx++) { - if(strcmp(et_imgs[et_idx].path, textpt) != 0) - continue; - if(isohybrid) { - if(gpts[idx].ptype == 1 || gpts[idx].ptype == 3) - et_imgs[et_idx].do_gpt_basdat= 1; - else if(gpts[idx].ptype == 2) - et_imgs[et_idx].do_gpt_hfsplus= 1; - break; - } else if(first_efi && et_imgs[et_idx].platform_id == 0xef) { - efi_boot_part= 1; - break; - } - if(et_imgs[et_idx].platform_id == 0xef) - first_efi= 0; - } - if(et_idx >= elto_count) { + ret= Xorriso_search_eltorito_path(xorriso, et_imgs, elto_count, + textpt, gpts[idx].ptype, + &et_idx, &efi_boot_part, !!isohybrid); + if(ret <= 0) { sprintf(xorriso->info_text, "Cannot make proposal to mark data file as GPT partition : "); Text_shellsafe(textpt, xorriso->info_text, 1); diff --git a/xorriso/xorriso_timestamp.h b/xorriso/xorriso_timestamp.h index b24b7dc1..0aac805f 100644 --- a/xorriso/xorriso_timestamp.h +++ b/xorriso/xorriso_timestamp.h @@ -1 +1 @@ -#define Xorriso_timestamP "2015.05.10.093325" +#define Xorriso_timestamP "2015.05.11.160333"