Allowing 1 BIOS boot image and 1 EFI boot image: -boot_image grub efi_path=

This commit is contained in:
Thomas Schmitt 2010-04-22 14:40:49 +00:00
parent 8bf6e31379
commit 83e41ceabd
4 changed files with 123 additions and 64 deletions

View File

@ -4900,6 +4900,7 @@ int Xorriso_new(struct XorrisO ** xorriso,char *progname, int flag)
m->boot_image_isohybrid= 0; m->boot_image_isohybrid= 0;
#endif #endif
m->boot_image_efi_path[0]= 0;
m->system_area_disk_path[0]= 0; m->system_area_disk_path[0]= 0;
m->system_area_options= 0; m->system_area_options= 0;
m->patch_system_area= 0; m->patch_system_area= 0;
@ -11248,7 +11249,7 @@ int Xorriso_genisofs(struct XorrisO *xorriso, char *whom,
int *weight_list= NULL, weight_count= 0; int *weight_list= NULL, weight_count= 0;
char sfe[5*SfileadrL], adr[SfileadrL+8], ra_text[80], pathspec[2*SfileadrL]; char sfe[5*SfileadrL], adr[SfileadrL+8], ra_text[80], pathspec[2*SfileadrL];
char *ept, *add_pt, eff_path[SfileadrL], indev[SfileadrL+8], msc[80], *cpt; char *ept, *add_pt, eff_path[SfileadrL], indev[SfileadrL+8], msc[80], *cpt;
struct stat stbuf; char *boot_path;
static char *lower_r_args[3]= {"/", "-exec", "mkisofs_r"}; static char *lower_r_args[3]= {"/", "-exec", "mkisofs_r"};
static char *sort_weight_args[4]= {"", "-exec", "sort_weight", ""}; static char *sort_weight_args[4]= {"", "-exec", "sort_weight", ""};
@ -11338,33 +11339,26 @@ int Xorriso_genisofs(struct XorrisO *xorriso, char *whom,
if(i+1>=argc) if(i+1>=argc)
goto not_enough_args; goto not_enough_args;
i++; i++;
xorriso->boot_image_bin_path[0]= 0; /* >>> provisory: ts B00421
if(argv[i][0] != '/') Only one BIOS boot image and one EFI boot image are possible.
strcat(xorriso->boot_image_bin_path, "/");
ret= Sfile_str(xorriso->boot_image_bin_path
+ strlen(xorriso->boot_image_bin_path), argv[i], 0);
if(ret <= 0)
goto ex;
option_b= 1;
xorriso->keep_boot_image= 0;
/* >>> provisory: ts B00419
Only one boot image with parameters determined now.
Later: Later:
Several boot images shall be kept in a list. One is the Default. Several boot images shall be kept in a list. One is the Default.
They can have type BIOS or EFI. If an EFI boot image is present, They can have type BIOS or EFI.
then platform ID shall be 0xef.
The following parameters shall be set later according to the type
of the particular boot image list items.
*/ */
if(strcmp(argv[i - 1], "--efi-boot") == 0) { if(strcmp(argv[i - 1], "--efi-boot") == 0)
xorriso->boot_platform_id= 0xef; boot_path= xorriso->boot_image_efi_path;
no_emul_boot= 1; else {
xorriso->patch_isolinux_image= 0; boot_path= xorriso->boot_image_bin_path;
/* -load-size is done in pass 2 */
was_other_option= 1;
} else
xorriso->boot_platform_id= 0x00; xorriso->boot_platform_id= 0x00;
option_b= 1;
}
boot_path[0]= 0;
if(argv[i][0] != '/')
strcat(boot_path, "/");
ret= Sfile_str(boot_path + strlen(boot_path), argv[i], 0);
if(ret <= 0)
goto ex;
xorriso->keep_boot_image= 0;
} else if(strcmp(argv[i], "-c") == 0 || } else if(strcmp(argv[i], "-c") == 0 ||
strcmp(argv[i], "-eltorito-catalog") == 0) { strcmp(argv[i], "-eltorito-catalog") == 0) {
@ -11750,21 +11744,6 @@ problem_handler_2:;
continue; continue;
goto ex; goto ex;
} }
if(xorriso->boot_image_bin_path[0] && xorriso->boot_platform_id == 0xef) {
/* >>> provisory: ts B00419
get size of xorriso->boot_image_bin_path, round up to 512
*/;
ret= Xorriso_normalize_img_path(xorriso, xorriso->wdi,
xorriso->boot_image_bin_path, sfe, 2 | 8);
if(ret<=0)
goto problem_handler_2;
ret= Xorriso_iso_lstat(xorriso, sfe, &stbuf, 2 | 4);
if(ret < 0)
goto problem_handler_2;
xorriso->boot_image_load_size= ((stbuf.st_size / (off_t) 512) +
!!(stbuf.st_size % (off_t) 512)) * 512;
}
if(do_print_size) { if(do_print_size) {
ret= Xorriso_option_print_size(xorriso, 1); ret= Xorriso_option_print_size(xorriso, 1);
if(ret<=0) if(ret<=0)
@ -13920,6 +13899,8 @@ int Xorriso_option_boot_image(struct XorrisO *xorriso, char *form,
} else } else
was_ok= 0; was_ok= 0;
} else if(strcmp(treatpt, "bin_path=") == 0) {
xorriso->boot_image_bin_path[0] = 0;
} else if(strncmp(treatpt, "bin_path=", 9) == 0) { } else if(strncmp(treatpt, "bin_path=", 9) == 0) {
ret= Xorriso_normalize_img_path(xorriso, xorriso->wdi, treatpt + 9, ret= Xorriso_normalize_img_path(xorriso, xorriso->wdi, treatpt + 9,
xorriso->boot_image_bin_path, 2); xorriso->boot_image_bin_path, 2);
@ -13934,6 +13915,15 @@ int Xorriso_option_boot_image(struct XorrisO *xorriso, char *form,
} else } else
strcpy(xorriso->boot_image_bin_form, "any"); strcpy(xorriso->boot_image_bin_form, "any");
} else if(strcmp(treatpt, "efi_path=") == 0) {
xorriso->boot_image_efi_path[0] = 0;
} else if(strncmp(treatpt, "efi_path=", 9) == 0) {
ret= Xorriso_normalize_img_path(xorriso, xorriso->wdi, treatpt + 9,
xorriso->boot_image_efi_path, 2);
if(ret <= 0)
return(ret);
xorriso->keep_boot_image= 0;
} else if(strncmp(treatpt, "boot_info_table=", 16)==0) { } else if(strncmp(treatpt, "boot_info_table=", 16)==0) {
if(strcmp(treatpt + 16, "off") == 0) if(strcmp(treatpt + 16, "off") == 0)
xorriso->patch_isolinux_image= 0; xorriso->patch_isolinux_image= 0;
@ -13942,6 +13932,8 @@ int Xorriso_option_boot_image(struct XorrisO *xorriso, char *form,
else else
was_ok= 0; was_ok= 0;
} else if(strcmp(treatpt, "cat_path=") == 0) {
xorriso->boot_image_cat_path[0] = 0;
} else if(strncmp(treatpt, "cat_path=", 9) == 0) { } else if(strncmp(treatpt, "cat_path=", 9) == 0) {
ret= Xorriso_normalize_img_path(xorriso, xorriso->wdi, treatpt + 9, ret= Xorriso_normalize_img_path(xorriso, xorriso->wdi, treatpt + 9,
xorriso->boot_image_cat_path, 2); xorriso->boot_image_cat_path, 2);

View File

@ -270,6 +270,7 @@ struct XorrisO { /* the global context of xorriso */
char boot_image_cat_path[SfileadrL]; char boot_image_cat_path[SfileadrL];
off_t boot_image_load_size; off_t boot_image_load_size;
int boot_image_isohybrid; /* 0=off , 1=auto , 2=on , 3=force */ int boot_image_isohybrid; /* 0=off , 1=auto , 2=on , 3=force */
char boot_image_efi_path[SfileadrL];
char system_area_disk_path[SfileadrL]; char system_area_disk_path[SfileadrL];
int system_area_options; /* bit0= "GRUB protective msdos label" int system_area_options; /* bit0= "GRUB protective msdos label"
(a simple partition table) (a simple partition table)

View File

@ -1 +1 @@
#define Xorriso_timestamP "2010.04.20.142540" #define Xorriso_timestamP "2010.04.22.143944"

View File

@ -1826,10 +1826,13 @@ int Xorriso_write_session(struct XorrisO *xorriso, int flag)
enum burn_disc_status s; enum burn_disc_status s;
IsoImage *image= NULL; IsoImage *image= NULL;
IsoNode *node, *root_node; IsoNode *node, *root_node;
ElToritoBootImage *bootimg; ElToritoBootImage *bootimg, *efi_bootimg;
enum eltorito_boot_media_type emul_type= ELTORITO_NO_EMUL; enum eltorito_boot_media_type emul_type= ELTORITO_NO_EMUL;
int profile_number; int profile_number;
char profile_name[80]; char profile_name[80], *boot_image_bin_path;
int boot_image_emul, boot_platform_id;
off_t boot_image_load_size;
struct stat stbuf;
ret= Xorriso_finish_hl_update(xorriso, 0); ret= Xorriso_finish_hl_update(xorriso, 0);
if(ret <= 0) if(ret <= 0)
@ -1910,21 +1913,41 @@ int Xorriso_write_session(struct XorrisO *xorriso, int flag)
goto ex; goto ex;
/* Activate, adjust or discard boot image */ /* Activate, adjust or discard boot image */
boot_image_bin_path= xorriso->boot_image_bin_path;
boot_image_emul= xorriso->boot_image_emul;
boot_platform_id= xorriso->boot_platform_id;
boot_image_load_size= xorriso->boot_image_load_size;
/* >>> This is kindof a quick hack.
Needed would be a list of boot images with own parameters each.
*/
if(xorriso->boot_image_efi_path[0]) {
if(xorriso->boot_image_bin_path[0] == 0) {
/* Let EFI boot image be the default image */
boot_image_bin_path= xorriso->boot_image_efi_path;
boot_image_emul= ELTORITO_NO_EMUL;
boot_platform_id= 0xef;
ret= Xorriso_iso_lstat(xorriso, xorriso->boot_image_efi_path,
&stbuf, 2 | 4);
if(ret <= 0)
goto ex;
boot_image_load_size= ((stbuf.st_size / (off_t) 512) +
!!(stbuf.st_size % (off_t) 512)) * 512;
}
}
/* >>> ??? move down to libisoburn ? */ /* >>> ??? move down to libisoburn ? */
if(image!=NULL && !(flag&1)) { if(image!=NULL && !(flag&1)) {
ret= iso_image_get_boot_image(image, &bootimg, NULL, NULL); ret= iso_image_get_boot_image(image, &bootimg, NULL, NULL);
if(boot_image_bin_path[0]) {
/* >>> || xorriso->system_area_disk_path[0] */
if(xorriso->boot_image_bin_path[0]) {
/* discard old boot image, set new one */ /* discard old boot image, set new one */
if(ret == 1) if(ret == 1)
iso_image_remove_boot_image(image); iso_image_remove_boot_image(image);
if(xorriso->boot_image_emul == 1) if(boot_image_emul == 1)
emul_type= ELTORITO_HARD_DISC_EMUL; emul_type= ELTORITO_HARD_DISC_EMUL;
else if(xorriso->boot_image_emul == 2) else if(boot_image_emul == 2)
emul_type= ELTORITO_FLOPPY_EMUL; emul_type= ELTORITO_FLOPPY_EMUL;
if(xorriso->boot_image_cat_path[0] == 0) { if(xorriso->boot_image_cat_path[0] == 0) {
strcpy(xorriso->boot_image_cat_path, xorriso->boot_image_bin_path); strcpy(xorriso->boot_image_cat_path, boot_image_bin_path);
cpt= strrchr(xorriso->boot_image_cat_path, '/'); cpt= strrchr(xorriso->boot_image_cat_path, '/');
if(cpt == NULL) if(cpt == NULL)
cpt= xorriso->boot_image_cat_path; cpt= xorriso->boot_image_cat_path;
@ -1933,18 +1956,18 @@ int Xorriso_write_session(struct XorrisO *xorriso, int flag)
strcpy(cpt, "boot.cat"); strcpy(cpt, "boot.cat");
} }
sprintf(xorriso->info_text, "Activating boot image %s", sprintf(xorriso->info_text, "Activating boot image %s",
Text_shellsafe(xorriso->boot_image_bin_path, sfe, 0)); Text_shellsafe(boot_image_bin_path, sfe, 0));
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "NOTE", 0); Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "NOTE", 0);
sprintf(xorriso->info_text, "Creating El Torito boot catalog file %s", sprintf(xorriso->info_text, "Creating El Torito boot catalog file %s",
Text_shellsafe(xorriso->boot_image_cat_path, sfe, 0)); Text_shellsafe(xorriso->boot_image_cat_path, sfe, 0));
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "NOTE", 0); Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "NOTE", 0);
ret= Xorriso_node_from_path(xorriso, image, xorriso->boot_image_bin_path, ret= Xorriso_node_from_path(xorriso, image, boot_image_bin_path,
&node, 1); &node, 1);
if(ret <= 0) { if(ret <= 0) {
sprintf(xorriso->info_text, sprintf(xorriso->info_text,
"Cannot find in ISO image: -boot_image ... bin_path=%s", "Cannot find in ISO image: -boot_image ... bin_path=%s",
Text_shellsafe(xorriso->boot_image_bin_path, sfe, 0)); Text_shellsafe(boot_image_bin_path, sfe, 0));
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0); Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
{ret= 0; goto ex;} {ret= 0; goto ex;}
} }
@ -1969,7 +1992,7 @@ int Xorriso_write_session(struct XorrisO *xorriso, int flag)
} }
} }
ret= iso_image_set_boot_image(image, xorriso->boot_image_bin_path, ret= iso_image_set_boot_image(image, boot_image_bin_path,
emul_type, xorriso->boot_image_cat_path, emul_type, xorriso->boot_image_cat_path,
&bootimg); &bootimg);
if(ret < 0) { if(ret < 0) {
@ -1982,13 +2005,35 @@ int Xorriso_write_session(struct XorrisO *xorriso, int flag)
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0); Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
{ret= 0; goto ex;} {ret= 0; goto ex;}
} }
el_torito_set_boot_platform_id(bootimg, el_torito_set_boot_platform_id(bootimg, (uint8_t) boot_platform_id);
(uint8_t) xorriso->boot_platform_id);
iso_image_set_boot_catalog_weight(image, 1000000000); iso_image_set_boot_catalog_weight(image, 1000000000);
el_torito_set_load_size(bootimg, xorriso->boot_image_load_size / 512); el_torito_set_load_size(bootimg, boot_image_load_size / 512);
ret= Xorriso_set_isolinux_options(xorriso, image, 0); ret= Xorriso_set_isolinux_options(xorriso, image, 0);
if(ret <= 0) if(ret <= 0)
goto ex; goto ex;
if(boot_image_bin_path == xorriso->boot_image_bin_path &&
xorriso->boot_image_efi_path[0]) {
/* Add EFI image */
sprintf(xorriso->info_text, "Activating additional EFI boot image %s",
Text_shellsafe(xorriso->boot_image_efi_path, sfe, 0));
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "NOTE", 0);
ret= iso_image_add_boot_image(image, xorriso->boot_image_efi_path,
ELTORITO_NO_EMUL, 0, &efi_bootimg);
if(ret < 0) {
Xorriso_process_msg_queues(xorriso,0);
Xorriso_report_iso_error(xorriso, "", ret,
"Error when adding EFI boot image", 0, "FAILURE", 1);
goto ex;
}
el_torito_set_boot_platform_id(efi_bootimg, (uint8_t) 0xef);
ret= Xorriso_iso_lstat(xorriso, xorriso->boot_image_efi_path,
&stbuf, 2 | 4);
if(ret != 0)
goto ex;
boot_image_load_size= ((stbuf.st_size / (off_t) 512) +
!!(stbuf.st_size % (off_t) 512));
el_torito_set_load_size(efi_bootimg, boot_image_load_size);
}
} else if(xorriso->patch_isolinux_image) { } else if(xorriso->patch_isolinux_image) {
if(ret==1) { if(ret==1) {
relax|= isoburn_igopt_allow_full_ascii; relax|= isoburn_igopt_allow_full_ascii;
@ -5311,7 +5356,7 @@ int Xorriso_toc_line(struct XorrisO *xorriso, int flag)
*/ */
int Xorriso_show_boot_info(struct XorrisO *xorriso, int flag) int Xorriso_show_boot_info(struct XorrisO *xorriso, int flag)
{ {
int ret, bin_path_valid= 0,has_isolinux_mbr= 0, i; int ret, bin_path_valid= 0,has_isolinux_mbr= 0, i, num_boots;
unsigned int mbr_lba= 0; unsigned int mbr_lba= 0;
off_t lb0_count; off_t lb0_count;
char *respt, sfe[5*SfileadrL], path[SfileadrL]; char *respt, sfe[5*SfileadrL], path[SfileadrL];
@ -5319,8 +5364,8 @@ int Xorriso_show_boot_info(struct XorrisO *xorriso, int flag)
struct burn_drive_info *dinfo; struct burn_drive_info *dinfo;
struct burn_drive *drive; struct burn_drive *drive;
IsoImage *image= NULL; IsoImage *image= NULL;
ElToritoBootImage *bootimg; ElToritoBootImage *bootimg, **boots = NULL;
IsoFile *bootimg_node; IsoFile *bootimg_node, **bootnodes = NULL;
IsoBoot *bootcat_node; IsoBoot *bootcat_node;
respt= xorriso->result_line; respt= xorriso->result_line;
@ -5336,14 +5381,11 @@ no_boot:;
sprintf(respt, "Boot record : none\n"); sprintf(respt, "Boot record : none\n");
Xorriso_toc_line(xorriso, flag & 8); Xorriso_toc_line(xorriso, flag & 8);
} }
return(ret); goto ex;
} }
/* Important: no return before iso_image_unref(image); */
/* Using the nodes with extreme care . They might be deleted meanwhile. */ /* Using the nodes with extreme care . They might be deleted meanwhile. */
ret= iso_image_get_boot_image(image, &bootimg, &bootimg_node, &bootcat_node); ret= iso_image_get_boot_image(image, &bootimg, &bootimg_node, &bootcat_node);
iso_image_unref(image); /* release obtained reference */
image= NULL;
if(ret != 1) if(ret != 1)
goto no_boot; goto no_boot;
ret= Xorriso_path_from_lba(xorriso, NULL, xorriso->loaded_boot_bin_lba, ret= Xorriso_path_from_lba(xorriso, NULL, xorriso->loaded_boot_bin_lba,
@ -5388,7 +5430,7 @@ no_boot:;
strcat(respt, "\n"); strcat(respt, "\n");
Xorriso_toc_line(xorriso, flag & 8); Xorriso_toc_line(xorriso, flag & 8);
if(flag & 2) if(flag & 2)
return(1); {ret= 1; goto ex;}
if(bin_path_valid) if(bin_path_valid)
sprintf(respt, "Boot bin_path: %s\n", Text_shellsafe(path, sfe, 0)); sprintf(respt, "Boot bin_path: %s\n", Text_shellsafe(path, sfe, 0));
else if(xorriso->loaded_boot_bin_lba <= 0) else if(xorriso->loaded_boot_bin_lba <= 0)
@ -5397,13 +5439,37 @@ no_boot:;
sprintf(respt, "Boot bin_path: -not-found-any-more-by-lba=%d\n", sprintf(respt, "Boot bin_path: -not-found-any-more-by-lba=%d\n",
xorriso->loaded_boot_bin_lba); xorriso->loaded_boot_bin_lba);
Xorriso_toc_line(xorriso, flag & 8); Xorriso_toc_line(xorriso, flag & 8);
ret= iso_image_get_all_boot_imgs(image, &num_boots, &boots, &bootnodes, 0);
Xorriso_process_msg_queues(xorriso,0);
if(ret == 1 && num_boots > 1) {
for(i= 1; i < num_boots; i++) {
ret= el_torito_get_boot_platform_id(boots[i]);
if(ret == 0xef) {
ret= Xorriso_path_from_node(xorriso, (IsoNode *) bootnodes[i], path, 0);
if(ret > 0) {
sprintf(respt, "Boot efi_path: %s\n", Text_shellsafe(path, sfe, 0));
Xorriso_toc_line(xorriso, flag & 8);
break;
}
}
}
}
if(xorriso->loaded_boot_cat_path[0]) if(xorriso->loaded_boot_cat_path[0])
sprintf(respt, "Boot cat_path: %s\n", sprintf(respt, "Boot cat_path: %s\n",
Text_shellsafe(xorriso->loaded_boot_cat_path, sfe, 0)); Text_shellsafe(xorriso->loaded_boot_cat_path, sfe, 0));
else else
sprintf(respt, "Boot cat_path: -not-found-at-load-time-\n"); sprintf(respt, "Boot cat_path: -not-found-at-load-time-\n");
Xorriso_toc_line(xorriso, flag & 8); Xorriso_toc_line(xorriso, flag & 8);
return(1); ret= 1;
ex:;
if(boots != NULL)
free(boots);
if(bootnodes != NULL);
free(bootnodes);
if(image != NULL)
iso_image_unref(image); /* release obtained reference */
return(ret);
} }