Enabled use of libisofs interval reader in xorriso

This commit is contained in:
2015-04-23 14:23:45 +00:00
parent 811cbd8b80
commit 8fbd7bbf69
8 changed files with 674 additions and 216 deletions

View File

@ -340,22 +340,69 @@ int Xorriso_auto_format(struct XorrisO *xorriso, int flag)
}
/* @param flag bit0= fail on indev == outdev with "imported_iso"
bit1= fail on indev == NULL with "imported_iso"
*/
int Xorriso_check_intvl_string(struct XorrisO *xorriso, char **part_image,
int flag)
{
char *cpt, *ipt, *orig;
orig= *part_image;
if(strncmp(*part_image, "--interval:", 11) != 0)
return(0);
if(strchr(*part_image + 11, ':') == NULL)
return(0);
(*part_image)+= 11;
if(!(flag & 3))
return(1);
cpt= strchr(*part_image, ':');
ipt= strstr(*part_image, "imported_iso");
if(ipt == NULL || ipt > cpt)
return(1);
if((flag & 2) && xorriso->in_drive_handle == NULL) {
sprintf(xorriso->info_text,
"Interval reader lacks of -indev to read from \"imported_iso\"");
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
goto failure;
}
if(!(flag & 1))
return(1);
if(xorriso->out_drive_handle != xorriso->in_drive_handle)
return(1);
sprintf(xorriso->info_text,
"Interval reader may not read from \"imported_iso\" during write run to same drive");
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
failure:;
sprintf(xorriso->info_text, "Rejected: ");
Text_shellsafe(orig, xorriso->info_text, 1);
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
return(-1);
}
int Xorriso_set_system_area(struct XorrisO *xorriso, struct burn_drive *drive,
IsoImage *img, struct isoburn_imgen_opts *sopts,
int flag)
{
int ret, options, system_area_options, iso_lba= -1, start_lba, image_blocks;
int sa_loaded;
int sa_loaded, read_count, i, read_sum= 0;
char volid[33];
FILE *fp= NULL;
char *buf= NULL, *bufpt= NULL;
off_t hd_lba;
char *buf= NULL, *bufpt= NULL, *intvl;
uint8_t *intvl_buf;
off_t hd_lba, byte_count;
unsigned char *ub;
ElToritoBootImage *bootimg;
IsoFile *bootimg_node;
IsoNode *sparc_core_node;
uint32_t offst;
enum burn_disc_status state;
struct iso_interval_reader *ivr = NULL;
if(xorriso->grub2_sparc_core[0]) {
ret= Xorriso_node_from_path(xorriso, img, xorriso->grub2_sparc_core,
@ -447,19 +494,48 @@ int Xorriso_set_system_area(struct XorrisO *xorriso, struct burn_drive *drive,
memset(buf, 0, 32768);
{ret= 1; goto do_set;}
}
ret= Xorriso_afile_fopen(xorriso, xorriso->system_area_disk_path,
"rb", &fp, 2);
if(ret <= 0)
intvl= xorriso->system_area_disk_path;
ret= Xorriso_check_intvl_string(xorriso, &intvl, 2);
if(ret < 0) {
{ret= 0; goto ex;}
ret= fread(buf, 1, 32768, fp);
if(ret < 32768) {
if(ferror(fp)) {
} else if(ret > 0) {
ret= iso_interval_reader_new(img, intvl, &ivr, &byte_count, 0);
Xorriso_process_msg_queues(xorriso, 0);
if(ret < 0) {
intvl_reader_err:;
sprintf(xorriso->info_text,
"Error when reading -boot_image system_area=");
Text_shellsafe(xorriso->system_area_disk_path, xorriso->info_text, 1);
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, errno, "FAILURE", 0);
{ret= 0; goto ex;}
}
for(i= 0; i < 16; i++) {
intvl_buf= (uint8_t *) (buf + 2048 * i);
ret= iso_interval_reader_read(ivr, intvl_buf, &read_count, 0);
Xorriso_process_msg_queues(xorriso, 0);
if(ret == 0)
break;
if(ret < 0)
goto intvl_reader_err;
read_sum+= read_count;
}
ret= read_sum;
} else {
ret= Xorriso_afile_fopen(xorriso, xorriso->system_area_disk_path,
"rb", &fp, 2);
if(ret <= 0)
{ret= 0; goto ex;}
ret= fread(buf, 1, 32768, fp);
if(ret < 32768) {
if(ferror(fp)) {
sprintf(xorriso->info_text,
"Error when reading -boot_image system_area=");
Text_shellsafe(xorriso->system_area_disk_path, xorriso->info_text, 1);
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, errno, "FAILURE", 0);
{ret= 0; goto ex;}
}
}
}
do_set:;
@ -502,6 +578,7 @@ do_set:;
ex:;
if(fp != NULL && fp != stdin)
fclose(fp);
iso_interval_reader_destroy(&ivr, 0);
Xorriso_free_meM(buf);
return(ret);
}
@ -752,7 +829,7 @@ int Xorriso_retry_write_session(struct XorrisO *xorriso, int flag)
int Xorriso_make_iso_write_opts(struct XorrisO *xorriso, IsoImage *image,
struct isoburn_imgen_opts *sopts, int flag)
{
int ext, i, ret, pad_by_libisofs= 0, is_bootable= 0, relax;
int ext, i, ret, pad_by_libisofs= 0, is_bootable= 0, relax, intvl_string= 0;
char *out_cs, *part_image;
IsoNode *root_node;
uint32_t padding;
@ -814,12 +891,20 @@ int Xorriso_make_iso_write_opts(struct XorrisO *xorriso, IsoImage *image,
xorriso->scdbackup_tag_time,
xorriso->scdbackup_tag_written);
if(xorriso->prep_partition[0]) {
ret= isoburn_igopt_set_prep_partition(sopts, xorriso->prep_partition, 0);
part_image= xorriso->prep_partition;
intvl_string= Xorriso_check_intvl_string(xorriso, &part_image, 3);
if(intvl_string < 0)
{ret= 0; goto ex;}
ret= isoburn_igopt_set_prep_partition(sopts, part_image, intvl_string);
if(ret <= 0)
{ret= 0; goto ex;}
}
if(xorriso->efi_boot_partition[0]) {
ret= isoburn_igopt_set_efi_bootp(sopts, xorriso->efi_boot_partition, 0);
part_image= xorriso->efi_boot_partition;
intvl_string= Xorriso_check_intvl_string(xorriso, &part_image, 3);
if(intvl_string < 0)
{ret= 0; goto ex;}
ret= isoburn_igopt_set_efi_bootp(sopts, part_image, intvl_string);
if(ret <= 0)
{ret= 0; goto ex;}
}
@ -832,8 +917,12 @@ int Xorriso_make_iso_write_opts(struct XorrisO *xorriso, IsoImage *image,
part_image= "";
else
part_image= xorriso->appended_partitions[i];
intvl_string= Xorriso_check_intvl_string(xorriso, &part_image, 3);
if(intvl_string < 0)
{ret= 0; goto ex;}
isoburn_igopt_set_partition_img(sopts, i + 1,
xorriso->appended_part_types[i], part_image);
isoburn_igopt_set_part_flag(sopts, i + 1, intvl_string);
}
isoburn_igopt_set_appended_as_gpt(sopts, xorriso->appended_as_gpt);
isoburn_igopt_set_disc_label(sopts, xorriso->ascii_disc_label);
@ -2831,13 +2920,45 @@ int Xorriso_update_iso_lba0(struct XorrisO *xorriso, int iso_lba, int isosize,
int Xorriso_set_system_area_path(struct XorrisO *xorriso, char *path, int flag)
{
int ret;
char *eff_src= NULL;
char *eff_src= NULL, *intvl;
struct iso_interval_reader *ivr= NULL;
off_t byte_count;
IsoImage *img= NULL;
struct burn_drive_info *source_dinfo;
struct burn_drive *source_drive;
if(path[0] == 0) {
xorriso->system_area_disk_path[0]= 0;
{ret= 1; goto ex;}
}
Xorriso_alloc_meM(eff_src, char, SfileadrL);
intvl = path;
ret = Xorriso_check_intvl_string(xorriso, &intvl, 0);
if(ret > 0) {
/* Check for syntactical correctness */
if(xorriso->in_drive_handle != NULL) {
ret= Xorriso_get_drive_handles(xorriso, &source_dinfo, &source_drive,
"on attempt to verify interval reader string", 0);
if(ret<=0)
goto ex;
img= isoburn_get_attached_image(source_drive);
}
ret= iso_interval_reader_new(img, intvl, &ivr, &byte_count, 1);
Xorriso_process_msg_queues(xorriso, 0);
if(ret < 0) {
sprintf(xorriso->info_text,
"Given path for system area is not accepted by interval reader");
Text_shellsafe(eff_src, xorriso->info_text, 1);
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
{ret= 0; goto ex;}
}
iso_interval_reader_destroy(&ivr, 0);
ret= Sfile_str(xorriso->system_area_disk_path, path, 0);
if(ret <= 0)
{ret= -1; goto ex;}
ret= 1; goto ex;
}
ret= Xorriso_normalize_img_path(xorriso, xorriso->wdx, path, eff_src, 2|4|16);
if(ret < 0)
goto ex;
@ -2860,6 +2981,8 @@ int Xorriso_set_system_area_path(struct XorrisO *xorriso, char *path, int flag)
ret= 1;
ex:
Xorriso_free_meM(eff_src);
if(img != NULL)
iso_image_unref(img);
return(ret);
}