Using libisofs system area summary in -toc line "Boot record"

This commit is contained in:
Thomas Schmitt 2014-04-25 06:45:30 +00:00
parent e41108bccd
commit 3dfd764d74
2 changed files with 27 additions and 99 deletions

View File

@ -211,40 +211,6 @@ int Xorriso_is_isohybrid(struct XorrisO *xorriso, IsoFile *bootimg_node,
} }
/* @return <0 yes , 0 no , <0 error */
int Xorriso_is_grub2_elto(struct XorrisO *xorriso, IsoFile *bootimg_node,
int flag)
{
#define Xorriso_grub2_boot_info_poS 2548
int ret, i;
unsigned char buf[Xorriso_grub2_boot_info_poS + 8];
void *data_stream= NULL;
off_t blk;
ret= Xorriso_iso_file_open(xorriso, "", (void *) bootimg_node,
&data_stream, 1);
if(ret <= 0)
return(-1);
ret= Xorriso_iso_file_read(xorriso, data_stream, (char *) buf,
Xorriso_grub2_boot_info_poS + 8, 0);
Xorriso_iso_file_close(xorriso, &data_stream, 0);
if(ret < Xorriso_grub2_boot_info_poS + 8)
return(0);
/* >>> ??? Check for some id */;
/* Check whether it has grub2_boot_info patching */
blk= 0;
for(i= 0; i < 8; i++)
blk|= buf[Xorriso_grub2_boot_info_poS + i] << (8 * i);
blk-= 5;
blk/= 4;
if(blk != (off_t) xorriso->loaded_boot_bin_lba)
return(0);
return(1);
}
int Xorriso_image_has_md5(struct XorrisO *xorriso, int flag) int Xorriso_image_has_md5(struct XorrisO *xorriso, int flag)
{ {
int ret; int ret;
@ -811,11 +777,8 @@ int Xorriso__append_boot_params(char *line, ElToritoBootImage *bootimg,
*/ */
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, num_boots, has_mbr= 0; int ret, bin_path_valid= 0, i, num_boots, sa_count;
int has_grub2_mbr= 0; char *respt, *path= NULL, **sa_report= NULL, *sa_summary= NULL;
unsigned int mbr_lba= 0;
off_t lb0_count, blk;
char *respt, *path;
unsigned char *lb0= NULL; unsigned char *lb0= NULL;
struct burn_drive_info *dinfo; struct burn_drive_info *dinfo;
struct burn_drive *drive; struct burn_drive *drive;
@ -831,7 +794,7 @@ int Xorriso_show_boot_info(struct XorrisO *xorriso, int flag)
if(xorriso->boot_count > 0) { if(xorriso->boot_count > 0) {
if(!(flag & 1)) { if(!(flag & 1)) {
sprintf(respt, "Boot record : overridden by -boot_image any next\n"); sprintf(respt, "Boot record : (overridden by -boot_image any next)\n");
Xorriso_toc_line(xorriso, flag & 8); Xorriso_toc_line(xorriso, flag & 8);
} }
ret= 1; goto ex; ret= 1; goto ex;
@ -852,11 +815,27 @@ no_boot:;
goto ex; goto ex;
} }
ret= iso_image_report_system_area(image, &sa_report, &sa_count, 0);
if(ret > 0 && sa_report != NULL)
for(i= 0; i < sa_count; i++)
if(strncmp(sa_report[i], "System area summary: ", 21) == 0) {
Xorriso_alloc_meM(sa_summary, char, strlen(sa_report[i] + 21) + 1);
strcpy(sa_summary, sa_report[i] + 21);
break;
}
if(sa_report != NULL)
iso_image_report_system_area(image, &sa_report, &sa_count, 1 << 15);
Xorriso_process_msg_queues(xorriso,0);
/* 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);
if(ret != 1) if(ret != 1) {
if(sa_summary == NULL)
goto no_boot; goto no_boot;
sprintf(respt, "Boot record : (system area only) , %s\n", sa_summary);
Xorriso_toc_line(xorriso, flag & 8);
ret= 1; goto ex;
}
ret= iso_image_get_all_boot_imgs(image, &num_boots, &boots, &bootnodes, 0); ret= iso_image_get_all_boot_imgs(image, &num_boots, &boots, &bootnodes, 0);
Xorriso_process_msg_queues(xorriso,0); Xorriso_process_msg_queues(xorriso,0);
if(ret != 1) { if(ret != 1) {
@ -867,59 +846,9 @@ no_boot:;
bin_path_valid= 1; bin_path_valid= 1;
} }
sprintf(respt, "Boot record : El Torito"); sprintf(respt, "Boot record : El Torito");
/* Load and examine potential MBR */ if(sa_summary != NULL)
ret= burn_read_data(drive, (off_t) 0, (char *) lb0, (off_t) 2048, sprintf(respt + strlen(respt), " , %s", sa_summary);
&lb0_count, 2);
if(ret > 0)
if(lb0[510] == 0x55 && lb0[511] == 0xaa)
has_mbr= 1;
if(bin_path_valid)
ret= Xorriso_is_isohybrid(xorriso, bootimg_node, 0);
else
ret= 0;
if(ret > 0) {
if(has_mbr) {
has_isolinux_mbr= 1;
mbr_lba= lb0[432] | (lb0[433] << 8) | (lb0[434] << 16) | (lb0[435] << 24);
mbr_lba/= 4;
if(mbr_lba != (unsigned int) xorriso->loaded_boot_bin_lba)
has_isolinux_mbr= 0;
if(has_isolinux_mbr) {
for(i= 0; i < 426; i++)
if(strncmp((char *) (lb0 + i), "isolinux", 8) == 0)
break;
if(i >= 426)
has_isolinux_mbr= 0;
}
}
if(has_isolinux_mbr)
strcat(respt, " , ISOLINUX isohybrid MBR pointing to boot image");
else
strcat(respt, " , ISOLINUX boot image capable of isohybrid");
}
if(bin_path_valid)
ret= Xorriso_is_grub2_elto(xorriso, bootimg_node, 0);
else
ret= 0;
if(ret > 0) {
if(has_mbr) {
has_grub2_mbr= 1;
blk= 0;
for(i= 0; i < 8; i++)
blk|= lb0[i + 0x1b0] << (8 * i);
blk-= 4;
blk/= 4;
if(blk != (off_t) xorriso->loaded_boot_bin_lba)
has_grub2_mbr= 0;
for(i= 32; i < 427; i++)
if(strncmp((char *) (lb0 + i), "GRUB", 4) == 0)
break;
if(i >= 427)
has_grub2_mbr= 0;
}
if(has_grub2_mbr)
strcat(respt, " , GRUB2 MBR pointing to first boot image");
}
strcat(respt, "\n"); strcat(respt, "\n");
Xorriso_toc_line(xorriso, flag & 8); Xorriso_toc_line(xorriso, flag & 8);
if(flag & 2) if(flag & 2)
@ -970,6 +899,7 @@ ex:;
iso_image_unref(image); /* release obtained reference */ iso_image_unref(image); /* release obtained reference */
Xorriso_free_meM(path); Xorriso_free_meM(path);
Xorriso_free_meM(lb0); Xorriso_free_meM(lb0);
Xorriso_free_meM(sa_summary);
return(ret); return(ret);
} }
@ -1464,8 +1394,6 @@ int Xorriso_report_system_area(struct XorrisO *xorriso, char *form, int flag)
if(ret <= 0) if(ret <= 0)
goto ex; goto ex;
is_elto= 1; is_elto= 1;
sprintf(xorriso->result_line, "\n");
Xorriso_result(xorriso, 0);
sprintf(xorriso->result_line, sprintf(xorriso->result_line,
"------------------------------------------------------------------------------\n"); "------------------------------------------------------------------------------\n");
Xorriso_result(xorriso, 0); Xorriso_result(xorriso, 0);

View File

@ -1 +1 @@
#define Xorriso_timestamP "2014.04.24.084540" #define Xorriso_timestamP "2014.04.25.064456"