Enabled use of libisofs interval reader in xorriso
This commit is contained in:
@ -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);
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user