Improved assessment of appended partitions
This commit is contained in:
parent
07007f99d6
commit
369ac4cf74
@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
|
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
|
||||||
|
|
||||||
Copyright 2007-2015 Thomas Schmitt, <scdbackup@gmx.net>
|
Copyright 2007-2016 Thomas Schmitt, <scdbackup@gmx.net>
|
||||||
|
|
||||||
Provided under GPL version 2 or later.
|
Provided under GPL version 2 or later.
|
||||||
|
|
||||||
@ -1108,6 +1108,14 @@ int Findjob_get_found_path(struct FindjoB *o, char **path, int flag)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int Findjob_get_last_data_file_block(struct FindjoB *o, uint32_t *lba,
|
||||||
|
int flag)
|
||||||
|
{
|
||||||
|
*lba= o->last_data_file_block;
|
||||||
|
return(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int Findjob_get_action(struct FindjoB *o, int flag)
|
int Findjob_get_action(struct FindjoB *o, int flag)
|
||||||
{
|
{
|
||||||
return(o->action);
|
return(o->action);
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
|
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
|
||||||
|
|
||||||
Copyright 2007-2015 Thomas Schmitt, <scdbackup@gmx.net>
|
Copyright 2007-2016 Thomas Schmitt, <scdbackup@gmx.net>
|
||||||
|
|
||||||
Provided under GPL version 2 or later.
|
Provided under GPL version 2 or later.
|
||||||
|
|
||||||
@ -181,6 +181,7 @@ struct FindjoB {
|
|||||||
result delivered in XorrisO.find_unique_trunc_result
|
result delivered in XorrisO.find_unique_trunc_result
|
||||||
56= like 54 but tolerating existing truncated names
|
56= like 54 but tolerating existing truncated names
|
||||||
57= like 55 but tolerating existing truncated names
|
57= like 55 but tolerating existing truncated names
|
||||||
|
58= internal: last_data_file_block
|
||||||
*/
|
*/
|
||||||
int action;
|
int action;
|
||||||
int prune;
|
int prune;
|
||||||
@ -199,6 +200,7 @@ struct FindjoB {
|
|||||||
off_t estim_upper_size;
|
off_t estim_upper_size;
|
||||||
off_t estim_lower_size;
|
off_t estim_lower_size;
|
||||||
struct FindjoB *subjob;
|
struct FindjoB *subjob;
|
||||||
|
uint32_t last_data_file_block;
|
||||||
|
|
||||||
/* Errors */
|
/* Errors */
|
||||||
char errmsg[4096];
|
char errmsg[4096];
|
||||||
@ -365,6 +367,9 @@ int Findjob_set_found_path(struct FindjoB *o, char *path, int flag);
|
|||||||
|
|
||||||
int Findjob_get_found_path(struct FindjoB *o, char **path, int flag);
|
int Findjob_get_found_path(struct FindjoB *o, char **path, int flag);
|
||||||
|
|
||||||
|
int Findjob_get_last_data_file_block(struct FindjoB *o, uint32_t *lba,
|
||||||
|
int flag);
|
||||||
|
|
||||||
#else /* Xorriso_findjob_on_expR */
|
#else /* Xorriso_findjob_on_expR */
|
||||||
|
|
||||||
|
|
||||||
@ -442,6 +447,9 @@ int Findjob_set_found_path(struct FindjoB *o, char *path, int flag);
|
|||||||
|
|
||||||
int Findjob_get_found_path(struct FindjoB *o, char **path, int flag);
|
int Findjob_get_found_path(struct FindjoB *o, char **path, int flag);
|
||||||
|
|
||||||
|
int Findjob_get_last_data_file_block(struct FindjoB *o, uint32_t *lba,
|
||||||
|
int flag);
|
||||||
|
|
||||||
#endif /* ! Xorriso_findjob_on_expR */
|
#endif /* ! Xorriso_findjob_on_expR */
|
||||||
|
|
||||||
|
|
||||||
|
@ -1527,6 +1527,31 @@ struct elto_img_par {
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/* @param ptype 0= unknown, 1= gpt-basdat, 2=gpt-hfsplus, 3=EFI
|
||||||
|
@param flag bit0= isohybrid
|
||||||
|
*/
|
||||||
|
static int Xorriso_register_eltorito_gpt(struct XorrisO *xorriso,
|
||||||
|
struct elto_img_par *et_img,
|
||||||
|
int ptype,
|
||||||
|
int *efi_boot_part, int *first_efi,
|
||||||
|
int flag)
|
||||||
|
{
|
||||||
|
if(flag & 1) {
|
||||||
|
if(ptype == 1 || ptype == 3)
|
||||||
|
et_img->do_gpt_basdat= 1;
|
||||||
|
else if(ptype == 2)
|
||||||
|
et_img->do_gpt_hfsplus= 1;
|
||||||
|
return(1);
|
||||||
|
} else if(*first_efi && et_img->platform_id == 0xef) {
|
||||||
|
*efi_boot_part= 1;
|
||||||
|
return(1);
|
||||||
|
}
|
||||||
|
if(et_img->platform_id == 0xef)
|
||||||
|
*first_efi= 0;
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* @param ptype 0= unknown, 1= gpt-basdat, 2=gpt-hfsplus, 3=EFI
|
/* @param ptype 0= unknown, 1= gpt-basdat, 2=gpt-hfsplus, 3=EFI
|
||||||
@param flag bit0= isohybrid
|
@param flag bit0= isohybrid
|
||||||
*/
|
*/
|
||||||
@ -1536,23 +1561,15 @@ static int Xorriso_search_eltorito_path(struct XorrisO *xorriso,
|
|||||||
int *found, int *efi_boot_part,
|
int *found, int *efi_boot_part,
|
||||||
int flag)
|
int flag)
|
||||||
{
|
{
|
||||||
int first_efi= 1, et_idx;
|
int first_efi= 1, et_idx, ret;
|
||||||
|
|
||||||
for(et_idx= 0; et_idx < elto_count; et_idx++) {
|
for(et_idx= 0; et_idx < elto_count; et_idx++) {
|
||||||
if(strcmp(et_imgs[et_idx].path, path) != 0)
|
if(strcmp(et_imgs[et_idx].path, path) != 0)
|
||||||
continue;
|
continue;
|
||||||
if(flag & 1) {
|
ret= Xorriso_register_eltorito_gpt(xorriso, et_imgs + et_idx,
|
||||||
if(ptype == 1 || ptype == 3)
|
ptype, efi_boot_part, &first_efi, flag);
|
||||||
et_imgs[et_idx].do_gpt_basdat= 1;
|
if(ret > 0)
|
||||||
else if(ptype == 2)
|
|
||||||
et_imgs[et_idx].do_gpt_hfsplus= 1;
|
|
||||||
break;
|
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;
|
*found= et_idx;
|
||||||
if(et_idx < elto_count)
|
if(et_idx < elto_count)
|
||||||
@ -1561,7 +1578,51 @@ static int Xorriso_search_eltorito_path(struct XorrisO *xorriso,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int Xorriso_search_eltorito_lba(struct XorrisO *xorriso,
|
||||||
|
struct elto_img_par *et_imgs,
|
||||||
|
int elto_count,
|
||||||
|
unsigned int lba,
|
||||||
|
int *found, int flag)
|
||||||
|
{
|
||||||
|
int et_idx;
|
||||||
|
|
||||||
|
for(et_idx= 0; et_idx < elto_count; et_idx++)
|
||||||
|
if(et_imgs[et_idx].lba == lba)
|
||||||
|
break;
|
||||||
|
*found= et_idx;
|
||||||
|
if(et_idx < elto_count)
|
||||||
|
return(1);
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int Xorriso_highest_data_block(struct XorrisO *xorriso, uint32_t *high_block,
|
||||||
|
int flag)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
struct FindjoB *job= NULL;
|
||||||
|
struct stat dir_stbuf;
|
||||||
|
|
||||||
|
*high_block= 0;
|
||||||
|
ret= Findjob_new(&job, "/", 0);
|
||||||
|
if(ret <= 0) {
|
||||||
|
Xorriso_no_findjob(xorriso, "[internal:last_data_file_block]", 0);
|
||||||
|
{ret= -1; goto ex;}
|
||||||
|
}
|
||||||
|
Findjob_set_action_type(job, 58, 0, 0);
|
||||||
|
ret= Xorriso_findi(xorriso, job, NULL, (off_t) 0,
|
||||||
|
NULL, "/", &dir_stbuf, 0, 0);
|
||||||
|
if(ret <= 0)
|
||||||
|
goto ex;
|
||||||
|
Findjob_get_last_data_file_block(job, high_block, 0);
|
||||||
|
ex:;
|
||||||
|
Findjob_destroy(&job, 0);
|
||||||
|
return(ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* @param flag bit0= do not record but only count
|
/* @param flag bit0= do not record but only count
|
||||||
|
bit1= as_mkisofs
|
||||||
*/
|
*/
|
||||||
static int Xorriso_scan_report_lines(struct XorrisO *xorriso,
|
static int Xorriso_scan_report_lines(struct XorrisO *xorriso,
|
||||||
char **et_lines, int et_line_count,
|
char **et_lines, int et_line_count,
|
||||||
@ -1569,14 +1630,15 @@ static int Xorriso_scan_report_lines(struct XorrisO *xorriso,
|
|||||||
char **cmds, int *cmd_count, int flag)
|
char **cmds, int *cmd_count, int flag)
|
||||||
{
|
{
|
||||||
int ret= 0, i, num_count, mkisofs, line_count, idx, et_idx, isohybrid= 0;
|
int ret= 0, i, num_count, mkisofs, line_count, idx, et_idx, isohybrid= 0;
|
||||||
int ptype, gpt_idx, j, pad;
|
int ptype, gpt_idx, j, pad, mbr_idx;
|
||||||
int efi_boot_part= 0, full_sparc_part= 0, have_sparc_part= 0;
|
int efi_boot_part= 0, full_sparc_part= 0, have_sparc_part= 0, fe_dummy= 1;
|
||||||
int appended_as_gpt= 0, have_prep= 0, did_sysarea= 0, cared_for_apm= 0;
|
int appended_as_gpt= 0, have_prep= 0, did_sysarea= 0, cared_for_apm= 0;
|
||||||
int cared_for_sparc= 0, have_hfsplus= 0;
|
int cared_for_sparc= 0, have_hfsplus= 0;
|
||||||
int have_sysarea= 0, ptable_killer, imported_iso, have_alpha_ldr_path= 0;
|
int have_sysarea= 0, ptable_killer, imported_iso, have_alpha_ldr_path= 0;
|
||||||
int have_protective_msdos= 0;
|
int have_protective_msdos= 0, appended_partition= 0, part_like_isohybrid= 0;
|
||||||
unsigned long int sa_options= 0, partno, id_tag, perms, start_cyl, num_blocks;
|
unsigned long int sa_options= 0, partno, id_tag, perms, start_cyl, num_blocks;
|
||||||
unsigned long int part_status, part_type, start_block;
|
unsigned long int part_status, part_type, start_block;
|
||||||
|
uint32_t high_block= 0;
|
||||||
char name[24], *textpt, *contentpt, *buf= NULL;
|
char name[24], *textpt, *contentpt, *buf= NULL;
|
||||||
char **lines= NULL;
|
char **lines= NULL;
|
||||||
double num[8];
|
double num[8];
|
||||||
@ -1595,14 +1657,18 @@ static int Xorriso_scan_report_lines(struct XorrisO *xorriso,
|
|||||||
uint64_t start_block;
|
uint64_t start_block;
|
||||||
uint64_t block_count;
|
uint64_t block_count;
|
||||||
int appended;
|
int appended;
|
||||||
|
int has_path;
|
||||||
};
|
};
|
||||||
struct mbr_par *mbrpts= NULL;
|
struct mbr_par *mbrpts= NULL;
|
||||||
int mbr_count= 0;
|
int mbr_count= 0;
|
||||||
|
|
||||||
struct gpt_par {
|
struct gpt_par {
|
||||||
int ptype; /* 0= unknown, 1= gpt-basdat, 2=gpt-hfsplus, 3=EFI */
|
int ptype; /* 0= unknown, 1= gpt-basdat, 2=gpt-hfsplus, 3=EFI */
|
||||||
|
int is_gap;
|
||||||
int has_path;
|
int has_path;
|
||||||
char *path;
|
char *path;
|
||||||
|
uint64_t start_block;
|
||||||
|
uint64_t block_count;
|
||||||
};
|
};
|
||||||
struct gpt_par *gpts= NULL;
|
struct gpt_par *gpts= NULL;
|
||||||
int gpt_count= 0;
|
int gpt_count= 0;
|
||||||
@ -1672,6 +1738,12 @@ static int Xorriso_scan_report_lines(struct XorrisO *xorriso,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ret= Xorriso_highest_data_block(xorriso, &high_block, 0);
|
||||||
|
if(ret < 0)
|
||||||
|
goto ex;
|
||||||
|
if(ret == 0)
|
||||||
|
high_block = img_blocks - 1;
|
||||||
|
|
||||||
if(elto_count > 0) {
|
if(elto_count > 0) {
|
||||||
Xorriso_alloc_meM(et_imgs, struct elto_img_par, elto_count);
|
Xorriso_alloc_meM(et_imgs, struct elto_img_par, elto_count);
|
||||||
for(et_idx= 0; et_idx < elto_count; et_idx++) {
|
for(et_idx= 0; et_idx < elto_count; et_idx++) {
|
||||||
@ -1812,6 +1884,10 @@ static int Xorriso_scan_report_lines(struct XorrisO *xorriso,
|
|||||||
if(num_blocks > 0 && start_block + num_blocks > mbr_parts_end)
|
if(num_blocks > 0 && start_block + num_blocks > mbr_parts_end)
|
||||||
mbr_parts_end= start_block + num_blocks;
|
mbr_parts_end= start_block + num_blocks;
|
||||||
|
|
||||||
|
} else if(strcmp(name, "MBR partition path :") == 0) {
|
||||||
|
idx= num[0] - 1;
|
||||||
|
mbrpts[idx].has_path= 1;
|
||||||
|
|
||||||
} else if(strcmp(name, "GPT type GUID :") == 0) {
|
} else if(strcmp(name, "GPT type GUID :") == 0) {
|
||||||
idx= num[0] - 1;
|
idx= num[0] - 1;
|
||||||
if(strcmp(textpt, "a2a0d0ebe5b9334487c068b6b72699c7") == 0)
|
if(strcmp(textpt, "a2a0d0ebe5b9334487c068b6b72699c7") == 0)
|
||||||
@ -1827,14 +1903,19 @@ static int Xorriso_scan_report_lines(struct XorrisO *xorriso,
|
|||||||
idx= num[0] - 1;
|
idx= num[0] - 1;
|
||||||
if(img_blocks <= num[1] && num[2] > 0)
|
if(img_blocks <= num[1] && num[2] > 0)
|
||||||
appended_as_gpt= 1;
|
appended_as_gpt= 1;
|
||||||
|
gpts[idx].start_block= num[1];
|
||||||
/* >>> ??? can there be independent partitions inside the image ? */;
|
gpts[idx].block_count= num[2];
|
||||||
|
|
||||||
} else if(strcmp(name, "GPT partition path :") == 0) {
|
} else if(strcmp(name, "GPT partition path :") == 0) {
|
||||||
idx= num[0] - 1;
|
idx= num[0] - 1;
|
||||||
gpts[idx].has_path= 1;
|
gpts[idx].has_path= 1;
|
||||||
gpts[idx].path= textpt;
|
gpts[idx].path= textpt;
|
||||||
|
|
||||||
|
} else if(strcmp(name, "GPT partition name :") == 0) {
|
||||||
|
idx= num[0] - 1;
|
||||||
|
if(strstr(contentpt, " 470061007000") != NULL) /* "Gap"... */
|
||||||
|
gpts[idx].is_gap= 1;
|
||||||
|
|
||||||
} else if(strcmp(name, "APM partition name :") == 0) {
|
} else if(strcmp(name, "APM partition name :") == 0) {
|
||||||
idx= num[0] - 1;
|
idx= num[0] - 1;
|
||||||
if(strcmp(textpt, "HFSPLUS_Hybrid") == 0)
|
if(strcmp(textpt, "HFSPLUS_Hybrid") == 0)
|
||||||
@ -1855,6 +1936,9 @@ static int Xorriso_scan_report_lines(struct XorrisO *xorriso,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(!have_protective_msdos)
|
||||||
|
appended_as_gpt= 0;
|
||||||
|
|
||||||
/* Second pass: scan for System Area info */
|
/* Second pass: scan for System Area info */
|
||||||
for(i= 0; i < line_count; i++) {
|
for(i= 0; i < line_count; i++) {
|
||||||
buf[0]= 0;
|
buf[0]= 0;
|
||||||
@ -1953,6 +2037,7 @@ static int Xorriso_scan_report_lines(struct XorrisO *xorriso,
|
|||||||
imported_iso);
|
imported_iso);
|
||||||
if(partno >= 1 && (int) partno <= mbr_count)
|
if(partno >= 1 && (int) partno <= mbr_count)
|
||||||
mbrpts[partno - 1].appended= 1;
|
mbrpts[partno - 1].appended= 1;
|
||||||
|
appended_partition= 1;
|
||||||
}
|
}
|
||||||
} else if(part_type == 0x41 && have_prep) {
|
} else if(part_type == 0x41 && have_prep) {
|
||||||
if(mkisofs) {
|
if(mkisofs) {
|
||||||
@ -2041,19 +2126,49 @@ static int Xorriso_scan_report_lines(struct XorrisO *xorriso,
|
|||||||
part_type= 0xef;
|
part_type= 0xef;
|
||||||
else
|
else
|
||||||
part_type= 0xcd;
|
part_type= 0xcd;
|
||||||
if(img_blocks <= num[1] && num[2] > 0) {
|
|
||||||
if(appended_as_gpt == 1) {
|
if(high_block < num[1] && num[2] > 0 && !gpts[idx].is_gap) {
|
||||||
if(mkisofs)
|
for(mbr_idx = 0; mbr_idx < mbr_count; mbr_idx++) {
|
||||||
sprintf(buf, "-appended_part_as_gpt");
|
if(mbrpts[mbr_idx].start_block == num[1] &&
|
||||||
else
|
mbrpts[mbr_idx].block_count == num[2])
|
||||||
sprintf(buf, "-boot_image any appended_part_as=gpt");
|
break;
|
||||||
Xorriso_record_cmd_linE
|
}
|
||||||
appended_as_gpt= 2;
|
if(mbr_idx >= mbr_count) {
|
||||||
|
if(appended_as_gpt == 1) {
|
||||||
|
if(mkisofs)
|
||||||
|
sprintf(buf, "-appended_part_as_gpt");
|
||||||
|
else
|
||||||
|
sprintf(buf, "-boot_image any appended_part_as=gpt");
|
||||||
|
Xorriso_record_cmd_linE
|
||||||
|
appended_as_gpt= 2;
|
||||||
|
}
|
||||||
|
sprintf(buf, "-append_partition %d 0x%lx ", idx + 1, part_type);
|
||||||
|
Xorriso_add_intvl_adr(xorriso, buf, (uint64_t) num[1],
|
||||||
|
(uint64_t) (num[1] + num[2] - 1.0), "d",
|
||||||
|
imported_iso);
|
||||||
|
appended_partition= 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret= Xorriso_search_eltorito_lba(xorriso, et_imgs, elto_count,
|
||||||
|
(unsigned int) (num[1] / 4.0),
|
||||||
|
&et_idx, 0);
|
||||||
|
if(ret > 0) {
|
||||||
|
if(!(et_imgs[et_idx].do_gpt_basdat ||
|
||||||
|
et_imgs[et_idx].do_gpt_hfsplus ||
|
||||||
|
part_like_isohybrid)) {
|
||||||
|
if(mkisofs)
|
||||||
|
sprintf(buf, "-part_like_isohybrid");
|
||||||
|
else
|
||||||
|
sprintf(buf, "-boot_image any part_like_isohybrid=on");
|
||||||
|
Xorriso_record_cmd_linE
|
||||||
|
buf[0]= 0;
|
||||||
|
part_like_isohybrid= 1;
|
||||||
|
}
|
||||||
|
/* mark el torito for -isohybrid-gpt-... */
|
||||||
|
Xorriso_register_eltorito_gpt(xorriso, et_imgs + et_idx,
|
||||||
|
gpts[idx].ptype, &efi_boot_part,
|
||||||
|
&fe_dummy, 1);
|
||||||
}
|
}
|
||||||
sprintf(buf, "-append_partition %d 0x%lx ", idx + 1, part_type);
|
|
||||||
Xorriso_add_intvl_adr(xorriso, buf, (uint64_t) num[1],
|
|
||||||
(uint64_t) (num[1] + num[2] - 1.0), "d",
|
|
||||||
imported_iso);
|
|
||||||
|
|
||||||
} else if(gpts[idx].ptype == 3 && gpts[idx].has_path == 0 &&
|
} else if(gpts[idx].ptype == 3 && gpts[idx].has_path == 0 &&
|
||||||
img_blocks >= num[1] + num[2] && !efi_boot_part) {
|
img_blocks >= num[1] + num[2] && !efi_boot_part) {
|
||||||
@ -2312,6 +2427,68 @@ static int Xorriso_scan_report_lines(struct XorrisO *xorriso,
|
|||||||
sprintf(buf, "-boot_image any next");
|
sprintf(buf, "-boot_image any next");
|
||||||
Xorriso_record_cmd_linE
|
Xorriso_record_cmd_linE
|
||||||
}
|
}
|
||||||
|
if(et_imgs[idx].path[0] == 0) {
|
||||||
|
|
||||||
|
/* >>> need way to eploit El Torito img blks : */;
|
||||||
|
|
||||||
|
/* Check whether appended partition */;
|
||||||
|
for(i= 0; i < mbr_count; i++)
|
||||||
|
if((mbrpts[i].appended || !mbrpts[i].has_path) &&
|
||||||
|
mbrpts[i].start_block == ((uint64_t) et_imgs[idx].lba) * 4 &&
|
||||||
|
(mbrpts[i].block_count == (uint64_t) et_imgs[idx].ldsiz ||
|
||||||
|
et_imgs[idx].ldsiz == 0 || et_imgs[idx].ldsiz == 1))
|
||||||
|
break;
|
||||||
|
if (i < mbr_count) {
|
||||||
|
if(!mbrpts[i].appended) {
|
||||||
|
mbrpts[i].appended= 1;
|
||||||
|
if(!appended_as_gpt) {
|
||||||
|
sprintf(buf, "-append_partition %lu 0x%lx ", (unsigned long) i + 1,
|
||||||
|
(unsigned long) mbrpts[i].ptype);
|
||||||
|
Xorriso_add_intvl_adr(xorriso, buf,
|
||||||
|
(uint64_t) mbrpts[i].start_block,
|
||||||
|
((uint64_t) mbrpts[i].start_block) +
|
||||||
|
mbrpts[i].block_count - 1,
|
||||||
|
"d", imported_iso);
|
||||||
|
Xorriso_record_cmd_linE
|
||||||
|
appended_partition= 1;
|
||||||
|
buf[0]= 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sprintf(app_pseudo_paths[idx],
|
||||||
|
"--interval:appended_partition_%d_start_%lus_size_%lud:all::",
|
||||||
|
i + 1,
|
||||||
|
(unsigned long) et_imgs[idx].lba,
|
||||||
|
(unsigned long) mbrpts[i].block_count);
|
||||||
|
et_imgs[idx].path= app_pseudo_paths[idx];
|
||||||
|
}
|
||||||
|
if (et_imgs[idx].path[0] == 0) {
|
||||||
|
for(i= 0; i < gpt_count; i++) {
|
||||||
|
if(have_protective_msdos && (
|
||||||
|
gpts[i].start_block == ((uint64_t) et_imgs[idx].lba) * 4 &&
|
||||||
|
(gpts[i].block_count == (uint64_t) et_imgs[idx].ldsiz ||
|
||||||
|
et_imgs[idx].ldsiz == 0 || et_imgs[idx].ldsiz == 1)))
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (i < gpt_count) {
|
||||||
|
sprintf(app_pseudo_paths[idx],
|
||||||
|
"--interval:appended_partition_%d_start_%lus_size_%lud:all::",
|
||||||
|
i + 1,
|
||||||
|
(unsigned long) et_imgs[idx].lba,
|
||||||
|
(unsigned long) gpts[i].block_count);
|
||||||
|
et_imgs[idx].path= app_pseudo_paths[idx];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (et_imgs[idx].path[0] == 0) {
|
||||||
|
if(!(flag & 1)) {
|
||||||
|
sprintf(xorriso->info_text,
|
||||||
|
"Cannot enable EL Torito boot image #%d because it is not a data file in the ISO filesystem",
|
||||||
|
idx + 1);
|
||||||
|
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "SORRY", 0);
|
||||||
|
}
|
||||||
|
buf[0]= 0;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
if(et_imgs[idx].platform_id == 0) {
|
if(et_imgs[idx].platform_id == 0) {
|
||||||
if(mkisofs)
|
if(mkisofs)
|
||||||
sprintf(buf, "-b ");
|
sprintf(buf, "-b ");
|
||||||
@ -2328,36 +2505,6 @@ static int Xorriso_scan_report_lines(struct XorrisO *xorriso,
|
|||||||
"Cannot enable EL Torito boot image #%d because Platform Id 0x%2.2x cannot be expressed in mkisofs emulation",
|
"Cannot enable EL Torito boot image #%d because Platform Id 0x%2.2x cannot be expressed in mkisofs emulation",
|
||||||
idx + 1, et_imgs[idx].platform_id);
|
idx + 1, et_imgs[idx].platform_id);
|
||||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "SORRY", 0);
|
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "SORRY", 0);
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(et_imgs[idx].path[0] == 0) {
|
|
||||||
|
|
||||||
/* >>> need way to eploit El Torito img blks : */;
|
|
||||||
|
|
||||||
/* Check whether appended partition */;
|
|
||||||
for(i= 0; i < mbr_count; i++)
|
|
||||||
if(mbrpts[i].appended &&
|
|
||||||
mbrpts[i].start_block == ((uint64_t) et_imgs[idx].lba) * 4 &&
|
|
||||||
(mbrpts[i].block_count == (uint64_t) et_imgs[idx].ldsiz ||
|
|
||||||
et_imgs[idx].ldsiz == 0 || et_imgs[idx].ldsiz == 1))
|
|
||||||
break;
|
|
||||||
if (i < mbr_count) {
|
|
||||||
sprintf(app_pseudo_paths[idx],
|
|
||||||
"--interval:appended_partition_%d_start_%lus_size_%lud:all::",
|
|
||||||
i + 1,
|
|
||||||
(unsigned long) et_imgs[idx].lba,
|
|
||||||
(unsigned long) mbrpts[i].block_count);
|
|
||||||
et_imgs[idx].path= app_pseudo_paths[idx];
|
|
||||||
|
|
||||||
} else {
|
|
||||||
if(!(flag & 1)) {
|
|
||||||
sprintf(xorriso->info_text,
|
|
||||||
"Cannot enable EL Torito boot image #%d because it is not a data file in the ISO filesystem",
|
|
||||||
idx + 1);
|
|
||||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "SORRY", 0);
|
|
||||||
}
|
|
||||||
buf[0]= 0;
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2453,6 +2600,14 @@ after_el_torito:
|
|||||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "SORRY", 0);
|
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "SORRY", 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(appended_partition) {
|
||||||
|
if(mkisofs)
|
||||||
|
sprintf(buf, "-no-pad");
|
||||||
|
else
|
||||||
|
sprintf(buf, "-padding 0");
|
||||||
|
Xorriso_record_cmd_linE
|
||||||
|
}
|
||||||
|
|
||||||
ret= 1;
|
ret= 1;
|
||||||
ex:
|
ex:
|
||||||
xorriso->show_hfs_cmds= NULL;
|
xorriso->show_hfs_cmds= NULL;
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
|
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
|
||||||
|
|
||||||
Copyright 2007-2015 Thomas Schmitt, <scdbackup@gmx.net>
|
Copyright 2007-2016 Thomas Schmitt, <scdbackup@gmx.net>
|
||||||
|
|
||||||
Provided under GPL version 2 or later.
|
Provided under GPL version 2 or later.
|
||||||
|
|
||||||
@ -2632,7 +2632,8 @@ int Xorriso_findi_action(struct XorrisO *xorriso, struct FindjoB *job,
|
|||||||
} else if(action == 21) { /* report_damage */
|
} else if(action == 21) { /* report_damage */
|
||||||
ret= Xorriso_report_damage(xorriso, show_path, node, 0);
|
ret= Xorriso_report_damage(xorriso, show_path, node, 0);
|
||||||
} else if(action == 22) {
|
} else if(action == 22) {
|
||||||
ret= Xorriso_report_lba(xorriso, show_path, node, 0);
|
ret= Xorriso_report_lba(xorriso, show_path, node,
|
||||||
|
&job->last_data_file_block, 0);
|
||||||
} else if(action == 23) { /* internal: memorize path of last matching node */
|
} else if(action == 23) { /* internal: memorize path of last matching node */
|
||||||
ret= Findjob_set_found_path(job, show_path, 0);
|
ret= Findjob_set_found_path(job, show_path, 0);
|
||||||
} else if(action == 24) {
|
} else if(action == 24) {
|
||||||
@ -2813,7 +2814,8 @@ int Xorriso_findi_action(struct XorrisO *xorriso, struct FindjoB *job,
|
|||||||
return(ret);
|
return(ret);
|
||||||
|
|
||||||
} else if(action == 51) { /* report_sections */
|
} else if(action == 51) { /* report_sections */
|
||||||
ret= Xorriso_report_lba(xorriso, show_path, node, 1);
|
ret= Xorriso_report_lba(xorriso, show_path, node,
|
||||||
|
&job->last_data_file_block, 1);
|
||||||
|
|
||||||
} else if(action == 53) { /* internal: show_hfs_cmd */
|
} else if(action == 53) { /* internal: show_hfs_cmd */
|
||||||
ret= Xorriso_get_blessing(xorriso, node, &bless_idx, bless_code, 0);
|
ret= Xorriso_get_blessing(xorriso, node, &bless_idx, bless_code, 0);
|
||||||
@ -2874,6 +2876,10 @@ int Xorriso_findi_action(struct XorrisO *xorriso, struct FindjoB *job,
|
|||||||
ret= Xorriso_truncate_uniquely(xorriso, type, node, abs_path, show_path,
|
ret= Xorriso_truncate_uniquely(xorriso, type, node, abs_path, show_path,
|
||||||
1 | (2 * (action == 57)));
|
1 | (2 * (action == 57)));
|
||||||
|
|
||||||
|
} else if(action == 58) { /* internal: last_data_file_block */
|
||||||
|
ret= Xorriso_report_lba(xorriso, show_path, node,
|
||||||
|
&job->last_data_file_block, 2);
|
||||||
|
|
||||||
} else { /* includes : 15 in_iso */
|
} else { /* includes : 15 in_iso */
|
||||||
Xorriso_esc_filepath(xorriso, show_path, xorriso->result_line, 0);
|
Xorriso_esc_filepath(xorriso, show_path, xorriso->result_line, 0);
|
||||||
strcat(xorriso->result_line, "\n");
|
strcat(xorriso->result_line, "\n");
|
||||||
@ -3287,8 +3293,10 @@ int Xorriso_findi(struct XorrisO *xorriso, struct FindjoB *job,
|
|||||||
action= Findjob_get_action(job, 0);
|
action= Findjob_get_action(job, 0);
|
||||||
if(action<0)
|
if(action<0)
|
||||||
action= 0;
|
action= 0;
|
||||||
if(!(flag & 1))
|
if(!(flag & 1)) {
|
||||||
Xorriso_findi_headline(xorriso, job, 0);
|
Xorriso_findi_headline(xorriso, job, 0);
|
||||||
|
job->last_data_file_block= 0;
|
||||||
|
}
|
||||||
|
|
||||||
dir_node= (IsoDir *) dir_node_generic;
|
dir_node= (IsoDir *) dir_node_generic;
|
||||||
if(dir_node==NULL) {
|
if(dir_node==NULL) {
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
|
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
|
||||||
|
|
||||||
Copyright 2007-2014 Thomas Schmitt, <scdbackup@gmx.net>
|
Copyright 2007-2016 Thomas Schmitt, <scdbackup@gmx.net>
|
||||||
|
|
||||||
Provided under GPL version 2 or later.
|
Provided under GPL version 2 or later.
|
||||||
|
|
||||||
@ -2459,9 +2459,10 @@ int Xorriso_file_eval_damage(struct XorrisO *xorriso, IsoNode *node,
|
|||||||
|
|
||||||
|
|
||||||
/* @param flag bit0= report_sections : section size rather than total size
|
/* @param flag bit0= report_sections : section size rather than total size
|
||||||
|
bit1= last_data_file_block : looking for highest data file block
|
||||||
*/
|
*/
|
||||||
int Xorriso_report_lba(struct XorrisO *xorriso, char *show_path,
|
int Xorriso_report_lba(struct XorrisO *xorriso, char *show_path,
|
||||||
IsoNode *node, int flag)
|
IsoNode *node, uint32_t *last_block, int flag)
|
||||||
{
|
{
|
||||||
int ret, *start_lbas= NULL, *end_lbas= NULL, lba_count, i;
|
int ret, *start_lbas= NULL, *end_lbas= NULL, lba_count, i;
|
||||||
off_t size, *section_sizes= NULL;
|
off_t size, *section_sizes= NULL;
|
||||||
@ -2477,12 +2478,17 @@ int Xorriso_report_lba(struct XorrisO *xorriso, char *show_path,
|
|||||||
for(i= 0; i < lba_count; i++) {
|
for(i= 0; i < lba_count; i++) {
|
||||||
if(flag & 1)
|
if(flag & 1)
|
||||||
size= section_sizes[i];
|
size= section_sizes[i];
|
||||||
sprintf(xorriso->result_line,
|
if(flag & 2) {
|
||||||
"File data lba: %2d , %8d , %8d , %8.f , ",
|
if(end_lbas[i] > 0 && (uint32_t) end_lbas[i] > *last_block)
|
||||||
i, start_lbas[i], end_lbas[i] + 1 - start_lbas[i], (double) size);
|
*last_block= end_lbas[i];
|
||||||
Text_shellsafe(show_path, xorriso->result_line, 1);
|
} else {
|
||||||
strcat(xorriso->result_line, "\n");
|
sprintf(xorriso->result_line,
|
||||||
Xorriso_result(xorriso, 0);
|
"File data lba: %2d , %8d , %8d , %8.f , ",
|
||||||
|
i, start_lbas[i], end_lbas[i] + 1 - start_lbas[i], (double) size);
|
||||||
|
Text_shellsafe(show_path, xorriso->result_line, 1);
|
||||||
|
strcat(xorriso->result_line, "\n");
|
||||||
|
Xorriso_result(xorriso, 0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
ret= 1;
|
ret= 1;
|
||||||
ex:;
|
ex:;
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
|
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
|
||||||
|
|
||||||
Copyright 2007-2014 Thomas Schmitt, <scdbackup@gmx.net>
|
Copyright 2007-2016 Thomas Schmitt, <scdbackup@gmx.net>
|
||||||
|
|
||||||
Provided under GPL version 2 or later.
|
Provided under GPL version 2 or later.
|
||||||
|
|
||||||
@ -83,7 +83,7 @@ int Xorriso_file_eval_damage(struct XorrisO *xorriso, IsoNode *node,
|
|||||||
int flag);
|
int flag);
|
||||||
|
|
||||||
int Xorriso_report_lba(struct XorrisO *xorriso, char *show_path,
|
int Xorriso_report_lba(struct XorrisO *xorriso, char *show_path,
|
||||||
IsoNode *node, int flag);
|
IsoNode *node, uint32_t *last_block, int flag);
|
||||||
|
|
||||||
int Xorriso_report_damage(struct XorrisO *xorriso, char *show_path,
|
int Xorriso_report_damage(struct XorrisO *xorriso, char *show_path,
|
||||||
IsoNode *node, int flag);
|
IsoNode *node, int flag);
|
||||||
|
@ -1 +1 @@
|
|||||||
#define Xorriso_timestamP "2016.03.22.125444"
|
#define Xorriso_timestamP "2016.04.25.100906"
|
||||||
|
Loading…
Reference in New Issue
Block a user