diff --git a/xorriso/write_run.c b/xorriso/write_run.c index 64c1a166..e09ffe3e 100644 --- a/xorriso/write_run.c +++ b/xorriso/write_run.c @@ -339,6 +339,7 @@ int Xorriso_set_system_area(struct XorrisO *xorriso, struct burn_drive *drive, int flag) { int ret, options, system_area_options, iso_lba= -1, start_lba, image_blocks; + int sa_loaded; char volid[33]; FILE *fp= NULL; char *buf= NULL, *bufpt= NULL; @@ -378,69 +379,68 @@ int Xorriso_set_system_area(struct XorrisO *xorriso, struct burn_drive *drive, } Xorriso_alloc_meM(buf, char, 32768); - system_area_options= xorriso->system_area_options; memset(buf, 0, 32768); - if(xorriso->system_area_disk_path[0] == 0) { - if(xorriso->patch_system_area) { - ret= iso_image_get_system_area(img, buf, &options, 0); - if(ret == 0) { - goto do_set; - } else if(ret < 0) { - Xorriso_process_msg_queues(xorriso,0); - Xorriso_report_iso_error(xorriso, "", ret, + system_area_options= xorriso->system_area_options; + sa_loaded= iso_image_get_system_area(img, buf, &options, 0); + if(sa_loaded < 0) { + Xorriso_process_msg_queues(xorriso,0); + Xorriso_report_iso_error(xorriso, "", ret, "Error when inquiring System Area data of ISO 9660 image", 0, "FAILURE", 1); - {ret= 0; goto ex;} - } else { - system_area_options= xorriso->patch_system_area; - /* Check whether partition 1 ends at image end */; - ub= (unsigned char *) buf; - hd_lba= (ub[454] | (ub[455] << 8) | (ub[456] << 16) | (ub[457] << 24)) + - (ub[458] | (ub[459] << 8) | (ub[460] << 16) | (ub[461] << 24)); + {ret= 0; goto ex;} + } if(sa_loaded > 0) + bufpt= buf; + if(xorriso->system_area_disk_path[0] == 0) { + if(xorriso->patch_system_area && xorriso->system_area_options == 0 && + sa_loaded > 0) { + system_area_options= xorriso->patch_system_area; + /* Check whether partition 1 ends at image end */; + ub= (unsigned char *) buf; + hd_lba= (ub[454] | (ub[455] << 8) | (ub[456] << 16) | (ub[457] << 24)) + + (ub[458] | (ub[459] << 8) | (ub[460] << 16) | (ub[461] << 24)); - iso_lba= -1; - ret= isoburn_disc_get_msc1(drive, &start_lba); - if(ret > 0) { - ret= isoburn_read_iso_head(drive, start_lba, &image_blocks, - volid, 1); - if(ret > 0) - iso_lba= start_lba + image_blocks; - } - if(((off_t) iso_lba) * (off_t) 4 > hd_lba) { - system_area_options= 0; - } else if((xorriso->patch_system_area & 1) && - ((off_t) iso_lba) * (off_t) 4 != hd_lba) { - system_area_options= 0; - } else if((xorriso->patch_system_area & 2) && - ((off_t) iso_lba) * (off_t) 4 + (off_t) (63 * 256) < hd_lba) { - system_area_options= 0; - } else if(xorriso->patch_system_area & 2) { /* isohybrid patching */ - /* Check whether bytes 432-345 point to ElTorito LBA */ - hd_lba= ub[432] | (ub[433] << 8) | (ub[434] << 16) | (ub[435] << 24); - ret= iso_image_get_boot_image(img, &bootimg, &bootimg_node, NULL); - if(ret != 1) + iso_lba= -1; + ret= isoburn_disc_get_msc1(drive, &start_lba); + if(ret > 0) { + ret= isoburn_read_iso_head(drive, start_lba, &image_blocks, + volid, 1); + if(ret > 0) + iso_lba= start_lba + image_blocks; + } + if(((off_t) iso_lba) * (off_t) 4 > hd_lba) { + system_area_options= 0; + } else if((xorriso->patch_system_area & 1) && + ((off_t) iso_lba) * (off_t) 4 != hd_lba) { + system_area_options= 0; + } else if((xorriso->patch_system_area & 2) && + ((off_t) iso_lba) * (off_t) 4 + (off_t) (63 * 256) < hd_lba) { + system_area_options= 0; + } else if(xorriso->patch_system_area & 2) { /* isohybrid patching */ + /* Check whether bytes 432-345 point to ElTorito LBA */ + hd_lba= ub[432] | (ub[433] << 8) | (ub[434] << 16) | (ub[435] << 24); + ret= iso_image_get_boot_image(img, &bootimg, &bootimg_node, NULL); + if(ret != 1) { + system_area_options= 0; + } else if(bootimg_node != NULL) { + Xorriso__file_start_lba((IsoNode *) bootimg_node, &(iso_lba), 0); + if(((off_t) iso_lba) * (off_t) 4 != hd_lba) system_area_options= 0; - else if(bootimg_node != NULL) { - Xorriso__file_start_lba((IsoNode *) bootimg_node, &(iso_lba), 0); - if(((off_t) iso_lba) * (off_t) 4 != hd_lba) - system_area_options= 0; - } - } - if(system_area_options == 0) { - Xorriso_msgs_submit(xorriso, 0, - "Loaded System Area data are not suitable for MBR patching.", - 0, "DEBUG", 0); } } - bufpt= buf; - ret= 1; - } else - ret= 0; - goto do_set; - } - if(strcmp(xorriso->system_area_disk_path, "/dev/zero") == 0) + if(system_area_options == 0) { + Xorriso_msgs_submit(xorriso, 0, + "Loaded System Area data are not suitable for MBR patching.", + 0, "DEBUG", 0); + } + } {ret= 1; goto do_set;} + } + bufpt= buf; + if(strcmp(xorriso->system_area_disk_path, "/dev/zero") == 0) { + memset(buf, 0, 32768); + {ret= 1; goto do_set;} + } ret= Xorriso_afile_fopen(xorriso, xorriso->system_area_disk_path, "rb", &fp, 2); if(ret <= 0) @@ -455,7 +455,6 @@ int Xorriso_set_system_area(struct XorrisO *xorriso, struct burn_drive *drive, {ret= 0; goto ex;} } } - bufpt= buf; do_set:; if(ret > 0 && xorriso->system_area_disk_path[0]) { @@ -1063,7 +1062,7 @@ int Xorriso_write_session(struct XorrisO *xorriso, int flag) } } if(image!=NULL && !(flag&1)) { - if(xorriso->boot_count > 0) { + if(xorriso->boot_count > 0 || freshly_bootable) { /* Eventually rename boot catalog node to changed boot_image_cat_path */ if(is_bootable > 0) { ret= Xorriso_path_from_node(xorriso, (IsoNode *) bootcat_node, sfe, 0); diff --git a/xorriso/xorriso_timestamp.h b/xorriso/xorriso_timestamp.h index 906db953..ab5e2b2c 100644 --- a/xorriso/xorriso_timestamp.h +++ b/xorriso/xorriso_timestamp.h @@ -1 +1 @@ -#define Xorriso_timestamP "2014.10.28.140220" +#define Xorriso_timestamP "2014.10.28.140313"