diff --git a/xorriso/emulators.c b/xorriso/emulators.c index b20c202d..71d1eaa4 100644 --- a/xorriso/emulators.c +++ b/xorriso/emulators.c @@ -1455,7 +1455,9 @@ problem_handler_2:; xorriso->patch_isolinux_image= 1; } else if(strcmp(argv[i], "-b") == 0 || strcmp(argv[i], "-eltorito-boot") == 0 || +#ifndef Xorriso_mips_boot_file_pathS strcmp(argv[i], "-mips-boot") == 0 || +#endif strcmp(argv[i], "--efi-boot") == 0 || strcmp(argv[i], "-e") == 0) { i++; @@ -1469,6 +1471,9 @@ problem_handler_2:; boot_path= xorriso->boot_image_bin_path; xorriso->boot_efi_default= 1; emul_boot= xorriso->boot_image_emul= 0; + +#ifndef Xorriso_mips_boot_file_pathS + } else if(strcmp(argv[i - 1], "-mips-boot") == 0) { boot_path= xorriso->boot_image_bin_path; option_b= 0; @@ -1476,6 +1481,7 @@ problem_handler_2:; /* >>> Preliminary : this should be adjustable per boot image */ xorriso->system_area_options= 1 << 2; /* system area type 1 */ +#endif /* ! Xorriso_mips_boot_file_pathS */ } else { boot_path= xorriso->boot_image_bin_path; @@ -1559,6 +1565,24 @@ problem_handler_2:; ret= Xorriso_option_boot_image(xorriso, "any", sfe, 0); if(ret <= 0) goto problem_handler_boot; + +#ifdef Xorriso_mips_boot_file_pathS + + } else if(strcmp(argv[i], "-mips-boot")==0) { + if(i+1>=argc) + goto not_enough_args; + i++; + strcpy(sfe, "mips_path="); + ret= Sfile_str(sfe, argv[i], 1); + if(ret <= 0) + goto ex; + + ret = Xorriso_option_boot_image(xorriso, "any", sfe, 0); + if(ret <= 0) + goto problem_handler_boot; + +#endif /* Xorriso_mips_boot_file_pathS */ + } continue; /* regular bottom of loop */ problem_handler_boot:; diff --git a/xorriso/iso_img.c b/xorriso/iso_img.c index b28ffa9c..6c83afc5 100644 --- a/xorriso/iso_img.c +++ b/xorriso/iso_img.c @@ -376,7 +376,7 @@ int Xorriso_boot_item_status(struct XorrisO *xorriso, char *cat_path, strcpy(bspec, "dir=/boot/isolinux"); memset(zeros, 0, 28); if(bspec[0] && platform_id == 0 && patch_isolinux && - load_size == 2048 && is_default_id) { + load_size == 2048 && is_default_id && emul == 0) { sprintf(line, "-boot_image isolinux %s\n", bspec); Xorriso_status_result(xorriso,filter,fp,flag&2); return(1); @@ -388,7 +388,7 @@ int Xorriso_boot_item_status(struct XorrisO *xorriso, char *cat_path, file_size= ((stbuf.st_size / (off_t) 512) + !!(stbuf.st_size % (off_t) 512)) * 512; if(platform_id == 0xef && !patch_isolinux && - load_size == file_size && is_default_id) { + load_size == file_size && is_default_id && emul == 0) { sprintf(line, "-boot_image any efi_path="); Text_shellsafe(bin_path, line, 1); strcat(line, "\n"); @@ -403,6 +403,12 @@ int Xorriso_boot_item_status(struct XorrisO *xorriso, char *cat_path, strcat(line, "\n"); if(!(is_default && no_defaults)) Xorriso_status_result(xorriso,filter,fp,flag&2); + + is_default= (emul == 0); + sprintf(line, "-boot_image %s emul_type=%s\n", + form, emul == 2 ? "diskette" : emul == 1 ? "hard_disk" : "no_emulation"); + if(!(is_default && no_defaults)) + Xorriso_status_result(xorriso,filter,fp,flag&2); is_default= (platform_id == 0 || (flag & 4)); sprintf(line, "-boot_image %s platform_id=0x%-2.2x\n", form, platform_id); @@ -531,6 +537,12 @@ int Xorriso_boot_image_status(struct XorrisO *xorriso, char *filter, FILE *fp, load_size= el_torito_get_load_size(boots[i]) * 512; el_torito_get_id_string(boots[i], id_string); el_torito_get_selection_crit(boots[i], sel_crit); + if(media_type == ELTORITO_FLOPPY_EMUL) + media_type= 2; + else if(media_type == ELTORITO_HARD_DISC_EMUL) + media_type= 1; + else + media_type= 0; ret= Xorriso_boot_item_status(xorriso, xorriso->boot_image_cat_path, path, platform_id, patch & 1, media_type, load_size, id_string, sel_crit, "any", @@ -959,3 +971,24 @@ ex:; return(ret); } + +int Xorriso_add_mips_boot_file(struct XorrisO *xorriso, char *path, int flag) +{ + int ret; + IsoImage *image; + + ret= Xorriso_get_volume(xorriso, &image, 0); + if(ret <= 0) + return ret; + ret = iso_image_add_mips_boot_file(image, path, 0); + Xorriso_process_msg_queues(xorriso,0); + if (ret < 0) { + Xorriso_report_iso_error(xorriso, "", ret, + "Error when adding MIPS boot file", + 0, "FAILURE", 1); + return(0); + } + return(1); +} + + diff --git a/xorriso/opts_a_c.c b/xorriso/opts_a_c.c index 1de88b00..6dac8065 100644 --- a/xorriso/opts_a_c.c +++ b/xorriso/opts_a_c.c @@ -567,7 +567,7 @@ int Xorriso_option_boot_image(struct XorrisO *xorriso, char *form, { int was_ok= 1, ret, isolinux_grub= 0, count; unsigned int u; - char *formpt, *treatpt; + char *formpt, *treatpt, eff_path[SfileadrL]; double num; formpt= form; @@ -739,6 +739,22 @@ treatment_patch:; xorriso->system_area_options&= ~0xfc; /* system area type 0 */ } else if(strncmp(treatpt, "mips_path=", 10) == 0) { + +#ifdef Xorriso_mips_boot_file_pathS + + /* >>> Check for contradicting xorriso->system_area_options */; + + ret= Xorriso_normalize_img_path(xorriso, xorriso->wdi, treatpt + 10, + eff_path, 2); + if(ret <= 0) + return(ret); + ret= Xorriso_add_mips_boot_file(xorriso, eff_path, 0); + if(ret <= 0) + return(ret); + xorriso->system_area_options= 1 << 2; /* system area type 1 */ + +#else /* Xorriso_mips_boot_file_pathS */ + ret= Xorriso_normalize_img_path(xorriso, xorriso->wdi, treatpt + 10, xorriso->boot_image_bin_path, 2); if(ret <= 0) @@ -749,6 +765,8 @@ treatment_patch:; /* >>> Preliminary : this should be adjustable per boot image */ xorriso->system_area_options&= 1 << 2; /* system area type 1 */ +#endif /* ! Xorriso_mips_boot_file_pathS */ + } else if(strncmp(treatpt, "boot_info_table=", 16)==0) { if(strcmp(treatpt + 16, "off") == 0) xorriso->patch_isolinux_image= 0; diff --git a/xorriso/xorriso_private.h b/xorriso/xorriso_private.h index b2cb3c8a..b87e598e 100644 --- a/xorriso/xorriso_private.h +++ b/xorriso/xorriso_private.h @@ -558,5 +558,8 @@ struct XorrisO { /* the global context of xorriso */ #include "parse_exec.h" +/* <<< */ +#define Xorriso_mips_boot_file_pathS 1 + #endif /* Xorriso_private_includeD */ diff --git a/xorriso/xorriso_timestamp.h b/xorriso/xorriso_timestamp.h index 7a54bb2a..485f63f1 100644 --- a/xorriso/xorriso_timestamp.h +++ b/xorriso/xorriso_timestamp.h @@ -1 +1 @@ -#define Xorriso_timestamP "2010.10.12.103157" +#define Xorriso_timestamP "2010.10.12.183125" diff --git a/xorriso/xorrisoburn.h b/xorriso/xorrisoburn.h index f19bb10a..57ba5c54 100644 --- a/xorriso/xorrisoburn.h +++ b/xorriso/xorrisoburn.h @@ -518,6 +518,9 @@ int Xorriso_boot_image_status(struct XorrisO *xorriso, char *filter, FILE *fp, #define Xorriso_IFBOOT S_IFMT +int Xorriso_add_mips_boot_file(struct XorrisO *xorriso, char *path, int flag); + + int Exprtest_match(struct XorrisO *xorriso, struct ExprtesT *ftest, void *node_pt, char *name, char *path, struct stat *boss_stbuf, struct stat *stbuf, int flag);