Preparing for -report_system_area formats "cmd" and "as_mkisofs"

This commit is contained in:
Thomas Schmitt 2014-10-28 14:03:42 +00:00
parent 5a3d6ef153
commit 726696747a
2 changed files with 806 additions and 39 deletions

View File

@ -375,7 +375,7 @@ int Xorriso_boot_item_status(struct XorrisO *xorriso, char *cat_path,
char *filter, FILE *fp, int flag) char *filter, FILE *fp, int flag)
{ {
int is_default, no_defaults, i, is_default_id= 0, ret; int is_default, no_defaults, i, is_default_id= 0, ret;
char *line, *bspec= NULL, zeros[28]; char *line, *bspec= NULL, zeros[28], *partition_entry;
off_t file_size; off_t file_size;
struct stat stbuf; struct stat stbuf;
@ -407,7 +407,7 @@ int Xorriso_boot_item_status(struct XorrisO *xorriso, char *cat_path,
"/boot/isolinux/boot.cat") == 0) "/boot/isolinux/boot.cat") == 0)
strcpy(bspec, "dir=/boot/isolinux"); strcpy(bspec, "dir=/boot/isolinux");
memset(zeros, 0, 28); memset(zeros, 0, 28);
if(bspec[0] && platform_id == 0 && (patch_isolinux & 3) && if(bspec[0] && platform_id == 0 && (patch_isolinux & 0x3ff) == 1 &&
load_size == 2048 && is_default_id && emul == 0) { load_size == 2048 && is_default_id && emul == 0) {
sprintf(line, "-boot_image isolinux %s\n", bspec); sprintf(line, "-boot_image isolinux %s\n", bspec);
Xorriso_status_result(xorriso,filter,fp,flag&2); Xorriso_status_result(xorriso,filter,fp,flag&2);
@ -419,7 +419,7 @@ int Xorriso_boot_item_status(struct XorrisO *xorriso, char *cat_path,
if(ret == 0) if(ret == 0)
file_size= ((stbuf.st_size / (off_t) 512) + file_size= ((stbuf.st_size / (off_t) 512) +
!!(stbuf.st_size % (off_t) 512)) * 512; !!(stbuf.st_size % (off_t) 512)) * 512;
if(platform_id == 0xef && !(patch_isolinux & 3) && if(platform_id == 0xef && (patch_isolinux & 0x3ff) == 0 &&
load_size == file_size && is_default_id && emul == 0) { load_size == file_size && is_default_id && emul == 0) {
sprintf(line, "-boot_image any efi_path="); sprintf(line, "-boot_image any efi_path=");
Text_shellsafe(bin_path, line, 1); Text_shellsafe(bin_path, line, 1);
@ -489,6 +489,27 @@ int Xorriso_boot_item_status(struct XorrisO *xorriso, char *cat_path,
strcat(line, "\n"); strcat(line, "\n");
if(!(is_default && no_defaults)) if(!(is_default && no_defaults))
Xorriso_status_result(xorriso,filter,fp,flag&2); Xorriso_status_result(xorriso,filter,fp,flag&2);
is_default= 1;
partition_entry= "";
if((patch_isolinux & 0x0fc) == (1 << 2))
partition_entry= "gpt_basdat";
else if((patch_isolinux & 0x0fc) == (2 << 2))
partition_entry= "gpt_hfsplus";
if(partition_entry[0]) {
sprintf(line, "-boot_image isolinux partition_entry=%s\n", partition_entry);
Xorriso_status_result(xorriso, filter, fp, flag & 2);
is_default= 0;
}
if(patch_isolinux & (1 << 8)) {
sprintf(line, "-boot_image isolinux partition_entry=apm_hfsplus\n");
Xorriso_status_result(xorriso, filter, fp, flag & 2);
is_default= 0;
}
if(is_default && !no_defaults) {
sprintf(line, "-boot_image isolinux partition_entry=off\n");
Xorriso_status_result(xorriso, filter, fp, flag & 2);
}
ret= 1; ret= 1;
ex:; ex:;
@ -1301,12 +1322,9 @@ reject:;
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0); Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
goto hint_revoke; goto hint_revoke;
} }
if(!(flag & 1)) { if(!(flag & 1))
xorriso->system_area_options= (xorriso->system_area_options & ~0x3cff) | xorriso->system_area_options= (xorriso->system_area_options & ~0x3cff) |
((sa_type << 2) & 0xfc) | (options & 0x3c03); ((sa_type << 2) & 0xfc) | (options & 0x3c03);
if(sa_type == 0)
xorriso->patch_system_area= xorriso->system_area_options;
}
return(1); return(1);
hint_revoke:; hint_revoke:;
@ -1354,6 +1372,722 @@ ex:;
} }
static int Xorriso_split_report_line(struct XorrisO *xorriso, char *line,
int num_limit,
char *name, char **contentpt,
double *num, int *num_count,
char **textpt, int flag)
{
int i;
char *spt, *ept, *cpt;
if(strlen(line) < 21) {
undigestible:
sprintf(xorriso->info_text,
"Undigestible report line with -report_* mode cmd: '%s'", line);
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "SORRY", 0);
return(0);
}
if(line[19] != ':')
goto undigestible;
strncpy(name, line, 20);
name[20]= 0;
for(spt= line + 20; *spt == ' '; spt++);
*textpt= *contentpt= spt;
*num_count= 0;
for(i= 0; i < num_limit; i++) {
/* Get word */
for(spt= *textpt; *spt == ' '; spt++);
if(*spt == 0) {
*textpt= spt;
break;
}
for(ept= spt + 1; *ept != ' ' && *ept != 0; ept++);
/* Look for decimal number */
if(ept - spt > 16)
break;
for(cpt= spt; cpt < ept; cpt++)
if(*cpt < '0' || *cpt > '9')
break;
if(cpt != ept)
break;
sscanf(spt, "%lf", num + *num_count);
(*num_count)++;
*textpt= ept;
}
/* Set *textpt to next non-blank */
for(; **textpt == ' '; (*textpt)++);
return(1);
}
static int Xorriso_record_cmd_line(struct XorrisO *xorriso, char *buf,
char **cmds, int *cmd_count, int flag)
{
int ret;
if(flag & 1) {
(*cmd_count)++;
ret= 1; goto ex;
}
Xorriso_alloc_meM(cmds[*cmd_count], char, strlen(buf) + 1);
strcpy(cmds[*cmd_count], buf);
(*cmd_count)++;
ret= 1;
ex:;
return(ret);
}
/* @param flag bit0= do not record but only count
*/
static int Xorriso_scan_report_lines(struct XorrisO *xorriso,
char **et_lines, int et_line_count,
char **sa_lines, int sa_line_count,
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;
unsigned long int sa_options= 0, partno, id_tag, perms, start_cyl, num_blocks;
char name[24], *textpt, *contentpt, *buf= NULL, *sa_summary= "";
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;
struct gpt_par {
int ptype; /* 0= unknown, 1= gpt-basdat, 2=gpt-hfsplus */
};
struct gpt_par *gpts= NULL;
int gpt_count= 0;
struct apm_par {
int ptype; /* 0= unknown, 1= Apple_HFS */
};
struct apm_par *apms= NULL;
int apm_count= 0;
#define Xorriso_record_cmd_linE { \
ret= Xorriso_record_cmd_line(xorriso, buf, cmds, cmd_count, flag & 1); \
if(ret <= 0) \
goto ex; \
}
mkisofs= !!(flag & 2);
*cmd_count= 0;
line_count= et_line_count + sa_line_count;
if(line_count <= 0)
{ret= 1; goto ex;}
Xorriso_alloc_meM(buf, char, 80 + SfileadrL);
Xorriso_alloc_meM(lines, char *, line_count);
for(i= 0; i < et_line_count; i++)
lines[i]= et_lines[i];
for(i= 0; i < sa_line_count; i++)
lines[i + et_line_count]= sa_lines[i];
/* Pre-scan to establish context */
for(i= 0; i < line_count; i++) {
ret= Xorriso_split_report_line(xorriso, lines[i], 8, name, &contentpt,
num, &num_count, &textpt, 0);
if(ret <= 0)
goto ex;
if(strcmp(name, "System area options:") == 0) {
sscanf(contentpt, "%lx", &sa_options);
} else if(strcmp(name, "System area summary:") == 0) {
sa_summary= contentpt;
} else if(strcmp(name, "El Torito boot img :") == 0) {
if(num[0] > elto_count)
elto_count= num[0];
} else if(strcmp(name, "GPT partition name :") == 0) {
if(num[0] > gpt_count)
gpt_count= num[0];
} else if(strcmp(name, "APM partition name :") == 0) {
if(num[0] > apm_count)
apm_count= num[0];
} else if(strcmp(name, "ISO image size/512 :") == 0) {
img_blocks= num[0];
}
}
if(elto_count > 0)
Xorriso_alloc_meM(et_imgs, struct elto_img_par, elto_count);
if(gpt_count > 0)
Xorriso_alloc_meM(gpts, struct gpt_par, gpt_count);
if(apm_count > 0)
Xorriso_alloc_meM(apms, struct apm_par, apm_count);
/* First pass: set up objects, record El Torito and info needed in 2nd pass */
for(i= 0; i < line_count; i++) {
buf[0]= 0;
ret= Xorriso_split_report_line(xorriso, lines[i], 8, name, &contentpt,
num, &num_count, &textpt, 0);
if(ret <= 0)
goto ex;
if(strcmp(name, "El Torito cat path :") == 0) {
cat_path= textpt;
} else if(strcmp(name, "El Torito boot img :") == 0) {
/* Platform Id, bootability, emulation, load segment,
Hard disk emulation partition type, Load size
*/
idx= num[0] - 1;
sscanf(contentpt, "%d %s %s %s %x %x %d %lu",
&(et_imgs[idx].n), et_imgs[idx].pltf, et_imgs[idx].b,
et_imgs[idx].emul, &(et_imgs[idx].ld_seg), &(et_imgs[idx].hdpt),
&(et_imgs[idx].ldsiz), &(et_imgs[idx].lba));
if(strcmp(et_imgs[idx].pltf, "BIOS") == 0)
et_imgs[idx].platform_id= 0;
else if(strcmp(et_imgs[idx].pltf, "PPC") == 0)
et_imgs[idx].platform_id= 1;
else if(strcmp(et_imgs[idx].pltf, "Mac") == 0)
et_imgs[idx].platform_id= 2;
else if(strcmp(et_imgs[idx].pltf, "UEFI") == 0)
et_imgs[idx].platform_id= 0xef;
else
sscanf(et_imgs[idx].pltf, "%x", &(et_imgs[idx].platform_id));
strcpy(et_imgs[idx].boot_image_type, "any");
et_imgs[idx].boot_info_table= 0;
et_imgs[idx].grub2_boot_info= 0;
et_imgs[idx].path= et_imgs[idx].id_string= et_imgs[idx].sel_crit= "";
et_imgs[idx].do_gpt_basdat= et_imgs[idx].do_gpt_hfsplus= 0;
et_imgs[idx].do_apm_hfsplus= 0;
} else if(strcmp(name, "El Torito img path :") == 0) {
idx= num[0] - 1;
et_imgs[idx].path= textpt;
} else if(strcmp(name, "El Torito img opts :") == 0) {
idx= num[0] - 1;
if(strstr(textpt, "boot-info-table") != NULL)
et_imgs[idx].boot_info_table= 1;
if(strstr(textpt, "isohybrid-suitable") != NULL)
strcpy(et_imgs[idx].boot_image_type, "isolinux");
if(strstr(textpt, "grub2-boot-info") != NULL) {
strcpy(et_imgs[idx].boot_image_type, "grub");
et_imgs[idx].grub2_boot_info= 1;
}
} else if(strcmp(name, "El Torito id string:") == 0) {
idx= num[0] - 1;
et_imgs[idx].id_string= textpt;
} else if(strcmp(name, "El Torito sel crit :") == 0) {
idx= num[0] - 1;
et_imgs[idx].sel_crit= textpt;
} else if(strcmp(name, "GPT type GUID :") == 0) {
idx= num[0] - 1;
if(strcmp(textpt, "a2a0d0ebe5b9334487c068b6b72699c7") == 0)
gpts[idx].ptype= 1; /* Basic data */
else if(strcmp(textpt, "005346480000aa11aa1100306543ecac") == 0)
gpts[idx].ptype= 2; /* HFS+ */
else
gpts[idx].ptype= 0;
} else if(strcmp(name, "APM partition type :") == 0) {
idx= num[0] - 1;
if(strcmp(textpt, "Apple_HFS") == 0)
apms[idx].ptype= 1;
else
apms[idx].ptype= 0;
}
}
/* Second pass: scan for System Area info */
for(i= 0; i < line_count; i++) {
buf[0]= 0;
ret= Xorriso_split_report_line(xorriso, lines[i], 8, name, &contentpt,
num, &num_count, &textpt, 0);
if(ret <= 0)
goto ex;
if(strcmp(name, "System area options:") == 0) {
if((sa_options & 0x3c00) == 0x0400) {
if(mkisofs)
sprintf(buf, "-chrp-boot-part ");
else
sprintf(buf, "-boot_image any chrp_boot_part=on ");
}
} else if(strcmp(name, "System area summary:") == 0) {
if(strstr(textpt, "isohybrid") != NULL) {
isohybrid= 1;
if(mkisofs)
sprintf(buf, "-isohybrid-mbr .");
else
sprintf(buf, "-boot_image isolinux partition_table=on");
Xorriso_record_cmd_linE
}
if(strstr(textpt, "grub2-mbr") != NULL) {
if(mkisofs)
sprintf(buf, "--grub2-mbr .");
else
sprintf(buf, "-boot_image grub grub2_mbr=.");
Xorriso_record_cmd_linE
}
if(strstr(textpt, "protective-msdos-label") != NULL) {
if(mkisofs)
sprintf(buf, "--protective-msdos-label");
else
sprintf(buf, "-boot_image any partition_table=on");
Xorriso_record_cmd_linE
}
if(strstr(textpt, "cyl-align-off") != NULL) {
if(mkisofs)
sprintf(buf, "-partition_cyl_align off");
else
sprintf(buf, "-boot_image any partition_cyl_align=off");
} else if(strstr(textpt, "cyl-align-all") != NULL) {
if(mkisofs)
sprintf(buf, "-partition_cyl_align all");
else
sprintf(buf, "-boot_image any partition_cyl_align=all");
} else if(strstr(textpt, "cyl-align-") != NULL) {
if(mkisofs)
sprintf(buf, "-partition_cyl_align on");
else
sprintf(buf, "-boot_image any partition_cyl_align=on");
} else
buf[0]= 0;
} else if(strcmp(name, "Partition offset :") == 0 &&
(num[0] == 0 || num[0] == 16)) {
if(mkisofs)
sprintf(buf, "-partition_offset %.f", num[0]);
else
sprintf(buf, "-boot_image any partition_offset=%.f", num[0]);
} else if(strcmp(name, "MBR heads per cyl :") == 0 &&
(num[0] > 0 && num[0] <= 255)) {
if(mkisofs)
sprintf(buf, "-partition_hd_cyl %.f", num[0]);
else
sprintf(buf, "-boot_image any partition_hd_cyl=%.f", num[0]);
} else if(strcmp(name, "MBR secs per head :") == 0 &&
(num[0] > 0 && num[0] <= 63)) {
if(mkisofs)
sprintf(buf, "-partition_sec_hd %.f", num[0]);
else
sprintf(buf, "-boot_image any partition_sec_hd=%.f", num[0]);
} else if(strcmp(name, "MBR partition :") == 0) {
/* >>> ??? is this an independent partition ? */;
} else if(strcmp(name, "MBR partition path :") == 0) {
/* >>> ??? are there independent partition paths ? */;
} else if(strcmp(name, "PReP boot partition:") == 0) {
/* >>> -boot_image any prep_boot_part=
needs opportunity to set a prep path in the input ISO */;
} else if(strcmp(name, "GPT disk GUID :") == 0) {
/* >>> ??? need command to set disk GUID */;
} else if(strcmp(name, "GPT partition name :") == 0) {
/* >>> ??? need command to set partition name for partition number */;
} else if(strcmp(name, "GPT partition GUID :") == 0) {
/* >>> ??? need command to set partition GUID for partition number */;
} else if(strcmp(name, "GPT partition flags:") == 0) {
/* >>> check whether 0x1000000000000001 . Else: complain */;
} 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)
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;
}
/* >>> ??? Are there independent GPT partition paths ? */;
} else if(strcmp(name, "APM block size :") == 0) {
if(mkisofs)
sprintf(buf, "-apm-block-size %.f", num[0]);
else
sprintf(buf, "-boot_image any apm_block_size=%.f", num[0]);
} else if(strcmp(name, "APM partition name :") == 0) {
/* >>> ??? need command to set APM partition name for partition number */;
} else if(strcmp(name, "APM partition path :") == 0) {
idx= num[0] - 1;
/* Check El Torito EFI boot images for same path */
for(et_idx= 0; isohybrid && et_idx < elto_count; et_idx++)
if(strcmp(et_imgs[et_idx].path, textpt) == 0) {
if(apms[idx].ptype == 1)
et_imgs[et_idx].do_apm_hfsplus= 1;
break;
}
} else if(strcmp(name, "MIPS-BE boot path :") == 0) {
if(mkisofs)
sprintf(buf, "-mips-boot ");
else
sprintf(buf, "-boot_image any mips_path=");
Text_shellsafe(textpt, buf, 1);
} else if(strcmp(name, "MIPS-LE boot path :") == 0) {
if(mkisofs)
sprintf(buf, "-mipsel-boot ");
else
sprintf(buf, "-boot_image any mipsel_path=");
Text_shellsafe(textpt, buf, 1);
} else if(strcmp(name, "SUN SPARC disklabel:") == 0) {
if(mkisofs)
sprintf(buf, "-sparc-label ");
else
sprintf(buf, "-boot_image any sparc_label=");
Text_shellsafe(textpt, buf, 1);
} else if(strcmp(name, "SPARC GRUB2 path :") == 0) {
if(mkisofs)
sprintf(buf, "--grub2-sparc-core ");
else
sprintf(buf, "-boot_image grub grub2_sparc_core=");
Text_shellsafe(textpt, buf, 1);
} else if(strcmp(name, "SUN SPARC partition:") == 0) {
have_sparc_part= 1;
partno= id_tag= perms= num_blocks= 0;
start_cyl= 0xffffffff;
sscanf(contentpt, "%lu 0x%lx 0x%lx %lu %lu",
&partno, &id_tag, &perms, &start_cyl, &num_blocks);
if(partno > 0 && partno < 9 && start_cyl == 0 && num_blocks == img_blocks
&& ((partno == 1 && id_tag == 4) || (partno > 1 && id_tag == 2)))
full_sparc_part|= (1 << (partno - 1));
} else if(strcmp(name, "PALO header version:") == 0) {
if(mkisofs)
sprintf(buf, "-hppa-hdrversion %.f", num[0]);
else
sprintf(buf, "-boot_image any hppa_hdrversion=%.f", num[0]);
} else if(strcmp(name, "HP-PA cmdline :") == 0) {
if(mkisofs)
sprintf(buf, "-hppa-cmdline ");
else
sprintf(buf, "-boot_image any hppa_cmdline=");
Text_shellsafe(textpt, buf, 1);
} else if(strcmp(name, "HP-PA 32-bit kernel:") == 0) {
if(mkisofs)
sprintf(buf, "-hppa-kernel-32 ");
else
sprintf(buf, "-boot_image any hppa_kernel_32=");
Text_shellsafe(textpt, buf, 1);
} else if(strcmp(name, "HP-PA 64-bit kernel:") == 0) {
if(mkisofs)
sprintf(buf, "-hppa-kernel-64 ");
else
sprintf(buf, "-boot_image any hppa_kernel_64=");
Text_shellsafe(textpt, buf, 1);
} else if(strcmp(name, "HP-PA ramdisk :") == 0) {
if(mkisofs)
sprintf(buf, "-hppa-ramdisk ");
else
sprintf(buf, "-boot_image any hppa_ramdisk=");
Text_shellsafe(textpt, buf, 1);
} else if(strcmp(name, "HP-PA bootloader :") == 0) {
if(mkisofs)
sprintf(buf, "-hppa-bootloader ");
else
sprintf(buf, "-boot_image any hppa_bootloader=");
Text_shellsafe(textpt, buf, 1);
}
if(buf[0])
Xorriso_record_cmd_linE
}
if(have_sparc_part) {
if(full_sparc_part == 255) {
if(mkisofs) {
sprintf(buf, "-G .");
Xorriso_record_cmd_linE
sprintf(buf, "-B ...");
Xorriso_record_cmd_linE
} else {
sprintf(buf, "-boot_image any system_area=.");
Xorriso_record_cmd_linE
for(i= 2; i <= 8; i++) {
sprintf(buf, "-append_partition %d 0x00 .", i);
Xorriso_record_cmd_linE
}
}
} else {
/* >>> Warn of non-trivial partition situation */;
}
}
/* >>> Issue commands related to El Torito */;
if(elto_count <= 0)
goto after_el_torito;
if(efi_boot_part) {
if(mkisofs)
sprintf(buf, "-efi-boot-part --efi-boot-image");
else
sprintf(buf, "-boot_image any efi_boot_part=--efi-boot-image");
Xorriso_record_cmd_linE
}
if(cat_path[0]) {
if(mkisofs)
sprintf(buf, "-c ");
else
sprintf(buf, "-boot_image any cat_path=");
Text_shellsafe(cat_path, buf, 1);
} else {
if(mkisofs)
sprintf(buf, "--boot-catalog-hide");
else
sprintf(buf, "-boot_image any cat_hidden=on");
}
Xorriso_record_cmd_linE
for(idx= 0; idx < elto_count; idx++) {
if(et_imgs[idx].ld_seg != 0 && et_imgs[idx].ld_seg != 0x07c0) {
/* >>> Warn that load segment cannot be represented */;
continue;
}
if(idx > 0) {
if(mkisofs)
sprintf(buf, "-eltorito-alt-boot");
else
sprintf(buf, "-boot_image any next");
Xorriso_record_cmd_linE
}
if(et_imgs[idx].platform_id == 0) {
if(mkisofs)
sprintf(buf, "-b ");
else
sprintf(buf, "-boot_image %s bin_path=", et_imgs[idx].boot_image_type);
} else if(et_imgs[idx].platform_id == 0xef) {
if(mkisofs)
sprintf(buf, "-e ");
else
sprintf(buf, "-boot_image %s efi_path=", et_imgs[idx].boot_image_type);
} else {
if(mkisofs) {
/* >>> Warn that platform id cannot be represented by -as mkisofs */;
continue;
}
}
if(et_imgs[idx].path[0] == 0) {
/* >>> need way to eploit El Torito img blks : */;
/* >>> Warn that no file was found which matches LBA of boot image */;
continue;
}
Text_shellsafe(et_imgs[idx].path, buf, 1);
Xorriso_record_cmd_linE
if(!mkisofs) {
sprintf(buf, "-boot_image any platform_id=0x%2.2x",
et_imgs[idx].platform_id);
Xorriso_record_cmd_linE
}
if(strcmp(et_imgs[idx].emul, "none") == 0) {
if(mkisofs)
sprintf(buf, "-no-emul-boot");
else
sprintf(buf, "-boot_image any emul_type=no_emulation");
} else if(strcmp(et_imgs[idx].emul, "hd") == 0) {
if(mkisofs)
sprintf(buf, "-hard-disk-boot");
else
sprintf(buf, "-boot_image any emul_type=hard_disk");
} else {
if(mkisofs)
buf[0]= 0;
else
sprintf(buf, "-boot_image any emul_type=diskette");
}
if(buf[0])
Xorriso_record_cmd_linE
if(et_imgs[idx].ldsiz > 0) {
if(mkisofs)
sprintf(buf, "-boot-load-size %d", et_imgs[idx].ldsiz);
else
sprintf(buf, "-boot_image any load_size=%d", et_imgs[idx].ldsiz * 512);
Xorriso_record_cmd_linE
}
if(et_imgs[idx].boot_info_table) {
if(mkisofs)
sprintf(buf, "-boot-info-table");
else
sprintf(buf, "-boot_image any boot_info_table=on");
Xorriso_record_cmd_linE
}
if(et_imgs[idx].grub2_boot_info) {
if(mkisofs)
sprintf(buf, "--grub2-boot-info");
else
sprintf(buf, "-boot_image grub grub2_boot_info=on");
Xorriso_record_cmd_linE
}
if(et_imgs[idx].id_string[0] != 0) {
if(mkisofs)
sprintf(buf, "-eltorito-id ");
else
sprintf(buf, "-boot_image any id_string=");
Text_shellsafe(et_imgs[idx].id_string, buf, 1);
Xorriso_record_cmd_linE
}
if(et_imgs[idx].sel_crit[0] != 0) {
if(mkisofs)
sprintf(buf, "-eltorito-selcrit ");
else
sprintf(buf, "-boot_image any sel_crit=");
Text_shellsafe(et_imgs[idx].sel_crit, buf, 1);
Xorriso_record_cmd_linE
}
if(et_imgs[idx].do_gpt_basdat) {
if(mkisofs)
sprintf(buf, "-isohybrid-gpt-basdat");
else
sprintf(buf, "-boot_image isolinux partition_entry=gpt_basdat");
Xorriso_record_cmd_linE
}
if(et_imgs[idx].do_gpt_hfsplus) {
if(mkisofs)
sprintf(buf, "-isohybrid-gpt-hfsplus");
else
sprintf(buf, "-boot_image isolinux partition_entry=gpt_hfsplus");
Xorriso_record_cmd_linE
}
if(et_imgs[idx].do_apm_hfsplus) {
if(mkisofs)
sprintf(buf, "-isohybrid-apm-hfsplus");
else
sprintf(buf, "-boot_image isolinux partition_entry=apm_hfsplus");
Xorriso_record_cmd_linE
}
}
after_el_torito:
ret= 1;
ex:
Xorriso_free_meM(apms);
Xorriso_free_meM(gpts);
Xorriso_free_meM(et_imgs);
Xorriso_free_meM(lines);
Xorriso_free_meM(buf);
return(ret);
#undef Xorriso_record_cmd_linE
}
/* @param flag bit0= currently not significant:
report is about El Torito rather than System Area
bit1= report -as mkisofsoptions
bit15= dispose cmds
*/
static int Xorriso_report_to_cmd(struct XorrisO *xorriso,
char **et_lines, int et_line_count,
char **sa_lines, int sa_line_count,
char ***cmds, int *cmd_count, int flag)
{
int ret= 0, i;
if(flag & (1 << 15))
{ret= 1; goto ex;}
*cmds= NULL;
*cmd_count= 0;
/* Count commands */
ret= Xorriso_scan_report_lines(xorriso, et_lines, et_line_count,
sa_lines, sa_line_count, *cmds, cmd_count,
1 | (flag & 2));
if(ret <= 0)
goto ex;
if(*cmd_count <= 0)
{ret= 2; goto ex;}
Xorriso_alloc_meM(*cmds, char *, *cmd_count);
for(i= 0; i < *cmd_count; i++)
(*cmds)[i]= NULL;
/* Record commands */
ret= Xorriso_scan_report_lines(xorriso, et_lines, et_line_count,
sa_lines, sa_line_count, *cmds, cmd_count,
flag & 2);
if(ret <= 0)
goto ex;
ret= 1;
ex:
if(ret <= 0 || (flag & (1 << 15))) {
if(*cmds != NULL) {
for(i= 0; i < *cmd_count; i++)
if((*cmds)[i] != NULL)
Xorriso_free_meM((*cmds)[i]);
Xorriso_free_meM(*cmds);
*cmds= NULL;
}
}
return(ret);
}
static void Xorriso_report_lines(struct XorrisO *xorriso, static void Xorriso_report_lines(struct XorrisO *xorriso,
char **lines, int line_count) char **lines, int line_count)
{ {
@ -1367,18 +2101,25 @@ static void Xorriso_report_lines(struct XorrisO *xorriso,
/* @param flag bit0= report El Torito rather than System Area /* @param flag bit0= report El Torito rather than System Area
>>> bit1= with form "cmd" do not report but rather execute
*/ */
int Xorriso_report_system_area(struct XorrisO *xorriso, char *form, int flag) int Xorriso_report_system_area(struct XorrisO *xorriso, char *form, int flag)
{ {
int ret, line_count; int ret, line_count, cmd_count, et_line_count= 0, sa_line_count= 0;
char **lines = NULL; int do_cmd= 0, as_mkisofs= 0;
char **lines = NULL, **et_lines= NULL, **sa_lines= NULL, **cmds= NULL;
IsoImage *image; IsoImage *image;
if(strcmp(form, "cmd") == 0 || strcmp(form, "as_mkisofs") == 0 || (flag & 2))
do_cmd= 1;
if(strcmp(form, "as_mkisofs") == 0)
as_mkisofs= 1;
if(strcmp(form, "help") == 0) { if(strcmp(form, "help") == 0) {
if(flag & 1) if(flag & 1)
ret= iso_image_report_el_torito(NULL, &lines, &line_count, 1); ret= iso_image_report_el_torito(NULL, &et_lines, &et_line_count, 1);
else else
ret= iso_image_report_system_area(NULL, &lines, &line_count, 1); ret= iso_image_report_system_area(NULL, &sa_lines, &sa_line_count, 1);
if(ret <= 0) if(ret <= 0)
goto ex; goto ex;
sprintf(xorriso->result_line, sprintf(xorriso->result_line,
@ -1395,15 +2136,25 @@ int Xorriso_report_system_area(struct XorrisO *xorriso, char *form, int flag)
sprintf(xorriso->result_line, "\n"); sprintf(xorriso->result_line, "\n");
Xorriso_result(xorriso, 0); Xorriso_result(xorriso, 0);
} else if(strcmp(form, "") == 0 || strcmp(form, "plain") == 0) { } else if(strcmp(form, "") == 0 || strcmp(form, "plain") == 0 || do_cmd) {
ret= Xorriso_get_volume(xorriso, &image, 0); ret= Xorriso_get_volume(xorriso, &image, 0);
if(ret <= 0) if(ret <= 0)
goto ex; goto ex;
if(flag & 1) if(do_cmd || (flag & 1))
ret= iso_image_report_el_torito(image, &lines, &line_count, 0); ret= iso_image_report_el_torito(image, &et_lines, &et_line_count, 0);
else if(ret < 0)
ret= iso_image_report_system_area(image, &lines, &line_count, 0); goto ex;
if(do_cmd || !(flag & 1))
ret= iso_image_report_system_area(image, &sa_lines, &sa_line_count, 0);
if(ret < 0)
goto ex;
if(do_cmd) {
ret= Xorriso_report_to_cmd(xorriso, et_lines, et_line_count,
sa_lines, sa_line_count, &cmds, &cmd_count,
(flag & 1) | (as_mkisofs << 1));
if(ret <= 0)
goto ex;
}
} else if(strncmp(form, "gpt_crc_of:", 11) == 0 && !(flag & 1)) { } else if(strncmp(form, "gpt_crc_of:", 11) == 0 && !(flag & 1)) {
ret = Xorriso_gpt_crc(xorriso, form + 11, 0); ret = Xorriso_gpt_crc(xorriso, form + 11, 0);
goto ex; goto ex;
@ -1418,31 +2169,47 @@ int Xorriso_report_system_area(struct XorrisO *xorriso, char *form, int flag)
} }
if(ret < 0) if(ret < 0)
goto ex; goto ex;
if(lines == NULL || ret == 0) { if(flag & 1) {
if(flag & 1) lines= et_lines;
strcpy(xorriso->info_text, "No El Torito information was loaded"); line_count= et_line_count;
else } else {
strcpy(xorriso->info_text, "No System Area was loaded"); lines= sa_lines;
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "NOTE", 0); line_count= sa_line_count;
ret= 2; goto ex;
} }
if(line_count == 0) { if(!do_cmd) {
if(flag & 1) if(lines == NULL || ret == 0) {
strcpy(xorriso->info_text, "No El Torito information available"); if(flag & 1)
else strcpy(xorriso->info_text, "No El Torito information was loaded");
strcpy(xorriso->info_text, "System Area only contains 0-bytes"); else
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "NOTE", 0); strcpy(xorriso->info_text, "No System Area was loaded");
ret= 2; goto ex; Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "NOTE", 0);
ret= 2; goto ex;
}
if(line_count == 0) {
if(flag & 1)
strcpy(xorriso->info_text, "No El Torito information available");
else
strcpy(xorriso->info_text, "System Area only contains 0-bytes");
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "NOTE", 0);
ret= 2; goto ex;
}
}
if(flag & 2) {
/* >>> execute commands */;
} else if(do_cmd) {
Xorriso_report_lines(xorriso, cmds, cmd_count);
} else {
Xorriso_report_lines(xorriso, lines, line_count);
} }
Xorriso_report_lines(xorriso, lines, line_count);
ret= 1; ret= 1;
ex:; ex:;
if(lines != NULL) { Xorriso_report_to_cmd(xorriso, NULL, 0, NULL, 0, &cmds, &cmd_count, 1 << 15);
if(flag & 1) if(et_lines != NULL)
iso_image_report_el_torito(NULL, &lines, &line_count, 1 << 15); iso_image_report_el_torito(NULL, &et_lines, &et_line_count, 1 << 15);
else if(sa_lines != NULL)
iso_image_report_system_area(NULL, &lines, &line_count, 1 << 15); iso_image_report_system_area(NULL, &sa_lines, &sa_line_count, 1 << 15);
}
return(ret); return(ret);
} }

View File

@ -1 +1 @@
#define Xorriso_timestamP "2014.10.03.180649" #define Xorriso_timestamP "2014.10.28.140220"