|
|
|
@ -137,16 +137,106 @@ int isoburn_root_defaults(IsoImage *image, int flag)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* @return <=0 = error , 1 = ok , 2 = no ISO filesystem found
|
|
|
|
|
*/
|
|
|
|
|
int isoburn_make_iso_read_opts(struct burn_drive *d,
|
|
|
|
|
struct isoburn *o,
|
|
|
|
|
struct isoburn_read_opts *read_opts,
|
|
|
|
|
IsoReadOpts **ropts)
|
|
|
|
|
{
|
|
|
|
|
int ret, int_num, dummy;
|
|
|
|
|
uint32_t ms_block;
|
|
|
|
|
char *msg= NULL;
|
|
|
|
|
|
|
|
|
|
msg= calloc(1, 160);
|
|
|
|
|
*ropts= NULL;
|
|
|
|
|
|
|
|
|
|
ret = isoburn_disc_get_msc1(d, &int_num);
|
|
|
|
|
if (ret <= 0)
|
|
|
|
|
{ret= -2; goto ex;}
|
|
|
|
|
ms_block= int_num;
|
|
|
|
|
if (o != NULL)
|
|
|
|
|
o->image_start_lba= ms_block;
|
|
|
|
|
ret = isoburn_read_iso_head(d, int_num, &dummy, NULL, 0);
|
|
|
|
|
if (ret <= 0) {
|
|
|
|
|
sprintf(msg, "No ISO 9660 image at LBA %d.", int_num);
|
|
|
|
|
isoburn_msgs_submit(o, 0x00060000, msg, 0, "WARNING", 0);
|
|
|
|
|
{ret= 2; goto ex;}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(read_opts->displacement != 0 && abs(read_opts->displacement_sign) == 1) {
|
|
|
|
|
/* Apply reverse displacement to session start */
|
|
|
|
|
if(read_opts->displacement_sign == -1) {
|
|
|
|
|
if(ms_block+ read_opts->displacement < ms_block) {
|
|
|
|
|
displacement_rollover:;
|
|
|
|
|
sprintf(msg, "Displacement offset leads outside 32 bit range.");
|
|
|
|
|
isoburn_msgs_submit(o, 0x00060000, msg, 0, "FAILURE", 0);
|
|
|
|
|
{ret= 0; goto ex;}
|
|
|
|
|
}
|
|
|
|
|
ms_block+= read_opts->displacement;
|
|
|
|
|
} else {
|
|
|
|
|
if(ms_block < read_opts->displacement)
|
|
|
|
|
goto displacement_rollover;
|
|
|
|
|
ms_block-= read_opts->displacement;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ret = iso_read_opts_new(ropts, 0);
|
|
|
|
|
if (ret < 0) {
|
|
|
|
|
isoburn_report_iso_error(ret, "Cannot create write opts", 0, "FATAL", 0);
|
|
|
|
|
goto ex;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
iso_read_opts_set_start_block(*ropts, ms_block);
|
|
|
|
|
iso_read_opts_set_no_rockridge(*ropts, read_opts->norock);
|
|
|
|
|
iso_read_opts_set_no_aaip(*ropts, read_opts->noaaip);
|
|
|
|
|
if(read_opts->nomd5 == 2)
|
|
|
|
|
int_num= 2;
|
|
|
|
|
else if(read_opts->nomd5 == 1)
|
|
|
|
|
int_num= 1;
|
|
|
|
|
else
|
|
|
|
|
int_num= 0;
|
|
|
|
|
iso_read_opts_set_no_md5(*ropts, int_num);
|
|
|
|
|
if(read_opts->do_ecma119_map)
|
|
|
|
|
iso_read_opts_set_ecma119_map(*ropts, read_opts->map_mode);
|
|
|
|
|
if(read_opts->do_joliet_map)
|
|
|
|
|
iso_read_opts_set_joliet_map(*ropts, read_opts->joliet_map_mode);
|
|
|
|
|
iso_read_opts_set_new_inos(*ropts, read_opts->noino);
|
|
|
|
|
|
|
|
|
|
iso_read_opts_set_no_joliet(*ropts, read_opts->nojoliet);
|
|
|
|
|
iso_read_opts_set_no_iso1999(*ropts, read_opts->noiso1999);
|
|
|
|
|
iso_read_opts_set_preferjoliet(*ropts, read_opts->preferjoliet);
|
|
|
|
|
iso_read_opts_set_default_permissions(*ropts,
|
|
|
|
|
read_opts->mode, read_opts->dirmode);
|
|
|
|
|
iso_read_opts_set_default_uid(*ropts, read_opts->uid);
|
|
|
|
|
iso_read_opts_set_default_gid(*ropts, read_opts->gid);
|
|
|
|
|
iso_read_opts_set_input_charset(*ropts, read_opts->input_charset);
|
|
|
|
|
iso_read_opts_auto_input_charset(*ropts, read_opts->auto_input_charset);
|
|
|
|
|
iso_read_opts_load_system_area(*ropts, 1);
|
|
|
|
|
iso_read_opts_keep_import_src(*ropts, 1);
|
|
|
|
|
|
|
|
|
|
ret= 1;
|
|
|
|
|
ex:;
|
|
|
|
|
if(ret <= 0) {
|
|
|
|
|
if(*ropts != NULL)
|
|
|
|
|
iso_read_opts_free(*ropts);
|
|
|
|
|
*ropts= NULL;
|
|
|
|
|
}
|
|
|
|
|
if(msg != NULL)
|
|
|
|
|
free(msg);
|
|
|
|
|
return(ret);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* API function. See libisoburn.h
|
|
|
|
|
*/
|
|
|
|
|
int isoburn_read_image(struct burn_drive *d,
|
|
|
|
|
struct isoburn_read_opts *read_opts,
|
|
|
|
|
IsoImage **image)
|
|
|
|
|
{
|
|
|
|
|
int ret, int_num, dummy, ignore_aclea= 0;
|
|
|
|
|
int ret, ignore_aclea= 0;
|
|
|
|
|
IsoReadOpts *ropts= NULL;
|
|
|
|
|
IsoReadImageFeatures *features= NULL;
|
|
|
|
|
uint32_t ms_block;
|
|
|
|
|
char *msg= NULL;
|
|
|
|
|
enum burn_disc_status status= BURN_DISC_BLANK;
|
|
|
|
|
IsoDataSource *ds= NULL;
|
|
|
|
@ -223,73 +313,19 @@ create_blank_image:;
|
|
|
|
|
{ret= -4; goto ex;}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ret = isoburn_disc_get_msc1(d, &int_num);
|
|
|
|
|
if (ret <= 0)
|
|
|
|
|
{ret= -2; goto ex;}
|
|
|
|
|
ms_block= int_num;
|
|
|
|
|
if (o != NULL)
|
|
|
|
|
o->image_start_lba= ms_block;
|
|
|
|
|
ret = isoburn_read_iso_head(d, int_num, &dummy, NULL, 0);
|
|
|
|
|
if (ret <= 0) {
|
|
|
|
|
sprintf(msg, "No ISO 9660 image at LBA %d. Creating blank image.", int_num);
|
|
|
|
|
isoburn_msgs_submit(o, 0x00060000, msg, 0, "WARNING", 0);
|
|
|
|
|
goto create_blank_image;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(read_opts->displacement != 0 && abs(read_opts->displacement_sign) == 1) {
|
|
|
|
|
/* Apply reverse displacement to session start */
|
|
|
|
|
if(read_opts->displacement_sign == -1) {
|
|
|
|
|
if(ms_block+ read_opts->displacement < ms_block) {
|
|
|
|
|
displacement_rollover:;
|
|
|
|
|
sprintf(msg, "Displacement offset leads outside 32 bit range.");
|
|
|
|
|
isoburn_msgs_submit(o, 0x00060000, msg, 0, "FAILURE", 0);
|
|
|
|
|
{ret= 0; goto ex;}
|
|
|
|
|
}
|
|
|
|
|
ms_block+= read_opts->displacement;
|
|
|
|
|
} else {
|
|
|
|
|
if(ms_block < read_opts->displacement)
|
|
|
|
|
goto displacement_rollover;
|
|
|
|
|
ms_block-= read_opts->displacement;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* create the data source */
|
|
|
|
|
ret = iso_read_opts_new(&ropts, 0);
|
|
|
|
|
if (ret < 0) {
|
|
|
|
|
isoburn_report_iso_error(ret, "Cannot create write opts", 0, "FATAL", 0);
|
|
|
|
|
ret= isoburn_make_iso_read_opts(d, o, read_opts, &ropts);
|
|
|
|
|
if(ret <= 0)
|
|
|
|
|
goto ex;
|
|
|
|
|
if(ret == 2) {
|
|
|
|
|
sprintf(msg, "Creating blank image.");
|
|
|
|
|
isoburn_msgs_submit(o, 0x00060000, msg, 0, "WARNING", 0);
|
|
|
|
|
goto create_blank_image;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Important: do not return until iso_read_opts_free() */
|
|
|
|
|
|
|
|
|
|
iso_read_opts_set_start_block(ropts, ms_block);
|
|
|
|
|
iso_read_opts_set_no_rockridge(ropts, read_opts->norock);
|
|
|
|
|
iso_read_opts_set_no_aaip(ropts, read_opts->noaaip);
|
|
|
|
|
if(read_opts->nomd5 == 2)
|
|
|
|
|
int_num= 2;
|
|
|
|
|
else if(read_opts->nomd5 == 1)
|
|
|
|
|
int_num= 1;
|
|
|
|
|
else
|
|
|
|
|
int_num= 0;
|
|
|
|
|
iso_read_opts_set_no_md5(ropts, int_num);
|
|
|
|
|
if(read_opts->do_ecma119_map)
|
|
|
|
|
iso_read_opts_set_ecma119_map(ropts, read_opts->map_mode);
|
|
|
|
|
if(read_opts->do_joliet_map)
|
|
|
|
|
iso_read_opts_set_joliet_map(ropts, read_opts->joliet_map_mode);
|
|
|
|
|
iso_read_opts_set_new_inos(ropts, read_opts->noino);
|
|
|
|
|
|
|
|
|
|
iso_read_opts_set_no_joliet(ropts, read_opts->nojoliet);
|
|
|
|
|
iso_read_opts_set_no_iso1999(ropts, read_opts->noiso1999);
|
|
|
|
|
iso_read_opts_set_preferjoliet(ropts, read_opts->preferjoliet);
|
|
|
|
|
iso_read_opts_set_default_permissions(ropts,
|
|
|
|
|
read_opts->mode, read_opts->dirmode);
|
|
|
|
|
iso_read_opts_set_default_uid(ropts, read_opts->uid);
|
|
|
|
|
iso_read_opts_set_default_gid(ropts, read_opts->gid);
|
|
|
|
|
iso_read_opts_set_input_charset(ropts, read_opts->input_charset);
|
|
|
|
|
iso_read_opts_auto_input_charset(ropts, read_opts->auto_input_charset);
|
|
|
|
|
iso_read_opts_load_system_area(ropts, 1);
|
|
|
|
|
iso_read_opts_keep_import_src(ropts, 1);
|
|
|
|
|
ret= iso_image_set_truncate_mode(o->image, read_opts->truncate_mode,
|
|
|
|
|
read_opts->truncate_length);
|
|
|
|
|
if(ret < 0)
|
|
|
|
@ -346,6 +382,170 @@ ex:;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* API function. See libisoburn.h
|
|
|
|
|
*/
|
|
|
|
|
int isoburn_assess_written_features(struct burn_drive *d,
|
|
|
|
|
struct isoburn_read_opts *read_opts,
|
|
|
|
|
IsoReadImageFeatures **features,
|
|
|
|
|
struct isoburn_imgen_opts **imgen_opts,
|
|
|
|
|
int flag)
|
|
|
|
|
{
|
|
|
|
|
int ret, type, ext;
|
|
|
|
|
int64_t num_value;
|
|
|
|
|
void *pt_value;
|
|
|
|
|
size_t pt_size;
|
|
|
|
|
IsoReadOpts *ropts= NULL;
|
|
|
|
|
char *msg= NULL;
|
|
|
|
|
enum burn_disc_status status= BURN_DISC_BLANK;
|
|
|
|
|
IsoDataSource *ds= NULL;
|
|
|
|
|
struct isoburn *o= NULL;
|
|
|
|
|
IsoWriteOpts *write_opts= NULL;
|
|
|
|
|
|
|
|
|
|
msg= calloc(1, 160);
|
|
|
|
|
|
|
|
|
|
if(d != NULL) {
|
|
|
|
|
ret = isoburn_find_emulator(&o, d, 0);
|
|
|
|
|
if (ret < 0 || o == NULL)
|
|
|
|
|
{ret= 0; goto ex;}
|
|
|
|
|
status = isoburn_disc_get_status(d);
|
|
|
|
|
o->image_start_lba= -1;
|
|
|
|
|
}
|
|
|
|
|
if(read_opts==NULL) {
|
|
|
|
|
isoburn_msgs_submit(o, 0x00060000,
|
|
|
|
|
"Program error: isoburn_read_image: read_opts==NULL",
|
|
|
|
|
0, "FATAL", 0);
|
|
|
|
|
{ret= -1; goto ex;}
|
|
|
|
|
}
|
|
|
|
|
if (d == NULL || read_opts->pretend_blank ||
|
|
|
|
|
(status != BURN_DISC_APPENDABLE && status != BURN_DISC_FULL)) {
|
|
|
|
|
isoburn_msgs_submit(o, 0x00060000,
|
|
|
|
|
"Empty drive, unsuitable medium state, or read option 'pretend_blank'",
|
|
|
|
|
0, "FAILURE", 0);
|
|
|
|
|
{ret= 0; goto ex;}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ret= isoburn_make_iso_read_opts(d, o, read_opts, &ropts);
|
|
|
|
|
if(ret <= 0)
|
|
|
|
|
goto ex;
|
|
|
|
|
if(ret == 2)
|
|
|
|
|
{ret= 0; goto ex;}
|
|
|
|
|
|
|
|
|
|
/* ??? Only if o->iso_data_source == NULL ? */
|
|
|
|
|
ds = isoburn_data_source_new(d, read_opts->displacement,
|
|
|
|
|
read_opts->displacement_sign,
|
|
|
|
|
read_opts->cache_tiles, read_opts->cache_tile_blocks);
|
|
|
|
|
if (ds == NULL) {
|
|
|
|
|
isoburn_report_iso_error(ret, "Cannot create IsoDataSource object", 0,
|
|
|
|
|
"FATAL", 0);
|
|
|
|
|
ret= -1; goto ex;
|
|
|
|
|
}
|
|
|
|
|
if(o->iso_data_source != NULL)
|
|
|
|
|
iso_data_source_unref(o->iso_data_source);
|
|
|
|
|
o->iso_data_source= ds;
|
|
|
|
|
|
|
|
|
|
ret= iso_assess_written_features(ds, ropts, features, &write_opts);
|
|
|
|
|
if(ret < 0) {
|
|
|
|
|
isoburn_report_iso_error(ret, "Failed to assess ISO filesystem features",
|
|
|
|
|
0, "FAILURE", 0);
|
|
|
|
|
ret= 0; goto ex;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ret= isoburn_igopt_new(imgen_opts, 0);
|
|
|
|
|
if(ret <= 0)
|
|
|
|
|
goto ex;
|
|
|
|
|
|
|
|
|
|
/* Convert features to imgen_opts */
|
|
|
|
|
|
|
|
|
|
if(iso_read_image_feature_named(*features, "iso_level", NULL, &type,
|
|
|
|
|
&num_value, &pt_value, &pt_size) == 1)
|
|
|
|
|
isoburn_igopt_set_level(*imgen_opts, num_value);
|
|
|
|
|
ext= 0;
|
|
|
|
|
if(iso_read_image_feature_named(*features, "rock_ridge", NULL, &type,
|
|
|
|
|
&num_value, &pt_value, &pt_size) == 1)
|
|
|
|
|
ext|= isoburn_igopt_rockridge * !!num_value;
|
|
|
|
|
if(iso_read_image_feature_named(*features, "joliet", NULL, &type,
|
|
|
|
|
&num_value, &pt_value, &pt_size) == 1)
|
|
|
|
|
ext|= isoburn_igopt_joliet * !!num_value;
|
|
|
|
|
if(iso_read_image_feature_named(*features, "iso1999", NULL, &type,
|
|
|
|
|
&num_value, &pt_value, &pt_size) == 1)
|
|
|
|
|
ext|= isoburn_igopt_iso1999 * !!num_value;
|
|
|
|
|
if(iso_read_image_feature_named(*features, "aaip", NULL, &type,
|
|
|
|
|
&num_value, &pt_value, &pt_size) == 1)
|
|
|
|
|
ext|= isoburn_igopt_aaip * !!num_value;
|
|
|
|
|
if(iso_read_image_feature_named(*features, "record_md5_session", NULL, &type,
|
|
|
|
|
&num_value, &pt_value, &pt_size) == 1)
|
|
|
|
|
ext|= isoburn_igopt_session_md5 * !!num_value;
|
|
|
|
|
if(iso_read_image_feature_named(*features, "record_md5_files", NULL, &type,
|
|
|
|
|
&num_value, &pt_value, &pt_size) == 1)
|
|
|
|
|
ext|= isoburn_igopt_file_md5 * !!num_value;
|
|
|
|
|
isoburn_igopt_set_extensions(*imgen_opts, ext);
|
|
|
|
|
|
|
|
|
|
ext= 0;
|
|
|
|
|
if(iso_read_image_feature_named(*features, "omit_version_numbers", NULL, &type,
|
|
|
|
|
&num_value, &pt_value, &pt_size) == 1) {
|
|
|
|
|
if((num_value & 3) == 2)
|
|
|
|
|
ext|= isoburn_igopt_only_iso_versions;
|
|
|
|
|
else if(num_value & 3)
|
|
|
|
|
ext|= isoburn_igopt_omit_version_numbers;
|
|
|
|
|
}
|
|
|
|
|
if(iso_read_image_feature_named(*features, "allow_deep_paths", NULL, &type,
|
|
|
|
|
&num_value, &pt_value, &pt_size) == 1)
|
|
|
|
|
ext|= isoburn_igopt_allow_deep_paths * !!num_value;
|
|
|
|
|
if(iso_read_image_feature_named(*features, "allow_longer_paths", NULL, &type,
|
|
|
|
|
&num_value, &pt_value, &pt_size) == 1)
|
|
|
|
|
ext|= isoburn_igopt_allow_longer_paths * !!num_value;
|
|
|
|
|
if(iso_read_image_feature_named(*features, "max_37_char_filenames", NULL,
|
|
|
|
|
&type, &num_value, &pt_value, &pt_size) == 1)
|
|
|
|
|
ext|= isoburn_igopt_max_37_char_filenames * !!num_value;
|
|
|
|
|
if(iso_read_image_feature_named(*features, "no_force_dots", NULL, &type,
|
|
|
|
|
&num_value, &pt_value, &pt_size) == 1) {
|
|
|
|
|
if(num_value & 1)
|
|
|
|
|
ext|= isoburn_igopt_only_iso_versions;
|
|
|
|
|
if(num_value & 2)
|
|
|
|
|
ext|= isoburn_igopt_no_force_dots;
|
|
|
|
|
}
|
|
|
|
|
if(iso_read_image_feature_named(*features, "allow_lowercase", NULL, &type,
|
|
|
|
|
&num_value, &pt_value, &pt_size) == 1)
|
|
|
|
|
ext|= isoburn_igopt_allow_lowercase * !!num_value;
|
|
|
|
|
if(iso_read_image_feature_named(*features, "allow_full_ascii", NULL, &type,
|
|
|
|
|
&num_value, &pt_value, &pt_size) == 1)
|
|
|
|
|
ext|= isoburn_igopt_allow_full_ascii * !!num_value;
|
|
|
|
|
if(iso_read_image_feature_named(*features, "joliet_longer_paths", NULL, &type,
|
|
|
|
|
&num_value, &pt_value, &pt_size) == 1)
|
|
|
|
|
ext|= isoburn_igopt_joliet_longer_paths * !!num_value;
|
|
|
|
|
if(iso_read_image_feature_named(*features, "rrip_version_1_10", NULL, &type,
|
|
|
|
|
&num_value, &pt_value, &pt_size) == 1)
|
|
|
|
|
ext|= isoburn_igopt_rrip_version_1_10 * !!num_value;
|
|
|
|
|
if(iso_read_image_feature_named(*features, "aaip_susp_1_10", NULL, &type,
|
|
|
|
|
&num_value, &pt_value, &pt_size) == 1)
|
|
|
|
|
ext|= isoburn_igopt_aaip_susp_1_10 * !!num_value;
|
|
|
|
|
if(iso_read_image_feature_named(*features, "allow_dir_id_ext", NULL, &type,
|
|
|
|
|
&num_value, &pt_value, &pt_size) == 1)
|
|
|
|
|
ext|= isoburn_igopt_allow_dir_id_ext * !!num_value;
|
|
|
|
|
if(iso_read_image_feature_named(*features, "joliet_long_names", NULL, &type,
|
|
|
|
|
&num_value, &pt_value, &pt_size) == 1)
|
|
|
|
|
ext|= isoburn_igopt_joliet_long_names * !!num_value;
|
|
|
|
|
if(iso_read_image_feature_named(*features, "joliet_utf16", NULL, &type,
|
|
|
|
|
&num_value, &pt_value, &pt_size) == 1)
|
|
|
|
|
ext|= isoburn_igopt_joliet_utf16 * !!num_value;
|
|
|
|
|
isoburn_igopt_set_relaxed(*imgen_opts, ext);
|
|
|
|
|
|
|
|
|
|
if(iso_read_image_feature_named(*features, "untranslated_name_len", NULL,
|
|
|
|
|
&type, &num_value, &pt_value, &pt_size) == 1)
|
|
|
|
|
isoburn_igopt_set_untranslated_name_len(*imgen_opts, num_value);
|
|
|
|
|
|
|
|
|
|
ret= 1;
|
|
|
|
|
ex:;
|
|
|
|
|
if(msg != NULL)
|
|
|
|
|
free(msg);
|
|
|
|
|
if(ropts != NULL)
|
|
|
|
|
iso_read_opts_free(ropts);
|
|
|
|
|
if(write_opts != NULL)
|
|
|
|
|
iso_write_opts_free(write_opts);
|
|
|
|
|
return(ret);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* API function. See libisoburn.h
|
|
|
|
|
*/
|
|
|
|
|
int isoburn_attach_image(struct burn_drive *d, IsoImage *image)
|
|
|
|
|