From e594ba293a0a76cb77f400880a9d243885a97f24 Mon Sep 17 00:00:00 2001 From: Thomas Schmitt Date: Tue, 20 Sep 2022 10:28:25 +0200 Subject: [PATCH] New command -assess_indev_features --- xorriso/drive_mgt.c | 496 ++++++++++++++++++++++++++++++------ xorriso/opts_a_c.c | 21 +- xorriso/parse_exec.c | 9 +- xorriso/text_io.c | 2 + xorriso/xorriso.1 | 44 +++- xorriso/xorriso.h | 10 +- xorriso/xorriso.info | 128 ++++++---- xorriso/xorriso.texi | 46 +++- xorriso/xorriso_timestamp.h | 2 +- xorriso/xorrisoburn.h | 5 +- 10 files changed, 637 insertions(+), 126 deletions(-) diff --git a/xorriso/drive_mgt.c b/xorriso/drive_mgt.c index 7546cbaf..1a0cbd3f 100644 --- a/xorriso/drive_mgt.c +++ b/xorriso/drive_mgt.c @@ -240,6 +240,94 @@ ex:; } +int Xorriso_make_read_options(struct XorrisO *xorriso, + struct burn_drive *drive, + struct isoburn_read_opts **ropts, + int flag) +{ + int ret, ext, load_lba; + enum burn_disc_status state; + + /* fill read opts */ + ret= isoburn_ropt_new(ropts, 0); + if(ret<=0) + goto ex; + + ret= Xorriso_set_data_cache(xorriso, *ropts, xorriso->cache_num_tiles, + xorriso->cache_tile_blocks, + xorriso->cache_default); + if(ret<=0) + goto ex; + + ext= isoburn_ropt_noiso1999; + if(xorriso->read_fs & 1) + ext|= isoburn_ropt_norock; + if(xorriso->read_fs & 2) + ext|= isoburn_ropt_nojoliet; + if((xorriso->ino_behavior & (1 | 2)) && !(xorriso->do_aaip & (1 | 4 | 32)) + && !(xorriso->do_md5 & 1) && !(xorriso->do_hfsplus)) + ext|= isoburn_ropt_noaaip; + if(!(xorriso->do_aaip & 1)) + ext|= isoburn_ropt_noacl; + if(!(xorriso->do_aaip & 4)) + ext|= isoburn_ropt_noea; + if(xorriso->ino_behavior & 1) + ext|= isoburn_ropt_noino; + if(!(xorriso->do_md5 & 1)) + ext|= isoburn_ropt_nomd5; + if(xorriso->do_md5 & 32) + ext|= isoburn_ropt_nomd5tag; + if(xorriso->ecma119_map == 0) + ext|= isoburn_ropt_map_unmapped; + else if(xorriso->ecma119_map == 2) + ext|= isoburn_ropt_map_uppercase; + else if(xorriso->ecma119_map == 3) + ext|= isoburn_ropt_map_lowercase; + else + ext|= isoburn_ropt_map_stripped; + if(xorriso->joliet_map == 0) + ext|= isoburn_ropt_joliet_unmapped; + else + ext|= isoburn_ropt_joliet_stripped; + + isoburn_ropt_set_extensions(*ropts, ext); + + isoburn_ropt_set_default_perms(*ropts, (uid_t) 0, (gid_t) 0, (mode_t) 0555); + isoburn_ropt_set_input_charset(*ropts, xorriso->in_charset); + isoburn_ropt_set_auto_incharset(*ropts, !!(xorriso->do_aaip & 512)); + isoburn_ropt_set_displacement(*ropts, xorriso->displacement, + xorriso->displacement_sign); + isoburn_ropt_set_truncate_mode(*ropts, 1, xorriso->file_name_limit); + + Xorriso_set_image_severities(xorriso, 1); /* No DEBUG messages */ + + /* <<< Trying to work around too much tolerance on bad image trees. + Better would be a chance to instruct libisofs what to do in + case of image read errors. There is a risk to mistake other SORRYs. + */ + if(xorriso->img_read_error_mode>0) + iso_set_abort_severity("SORRY"); + + state= isoburn_disc_get_status(drive); + if(state != BURN_DISC_BLANK) { + ret= isoburn_disc_get_msc1(drive, &load_lba); + if(ret > 0) { + sprintf(xorriso->info_text, + "Loading ISO image tree from LBA %d", load_lba); + Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "NOTE", 0); + } + ret= Xorriso_assert_volid(xorriso, load_lba, 0); + if(ret <= 0) + goto ex; + } + Xorriso_set_speed(xorriso, drive, xorriso->read_speed, 0, 1); + + ret= 1; +ex: + return(ret); +} + + /* @param flag bit0= acquire as isoburn input drive bit1= acquire as libburn output drive (as isoburn drive if bit0) bit2= regard overwritable media as blank @@ -257,7 +345,7 @@ ex:; int Xorriso_aquire_drive(struct XorrisO *xorriso, char *adr, char *show_adr, int flag) { - int ret, hret, not_writeable= 0, has_what, aquire_flag, load_lba, ext; + int ret, hret, not_writeable= 0, has_what, aquire_flag; int lba, track, session, params_flag, adr_mode, read_ret, start_lba; int truncate_mode; uint32_t size, offst; @@ -540,83 +628,16 @@ int Xorriso_aquire_drive(struct XorrisO *xorriso, char *adr, char *show_adr, Xorriso_give_up_drive(xorriso, 1|((flag&32)>>2)); ret= 3; goto ex; } - /* fill read opts */ - ret= isoburn_ropt_new(&ropts, 0); - if(ret<=0) + + ret= Xorriso_make_read_options(xorriso, drive, &ropts, 0); + if(ret <= 0) goto ex; - - ret= Xorriso_set_data_cache(xorriso, ropts, xorriso->cache_num_tiles, - xorriso->cache_tile_blocks, - xorriso->cache_default); - if(ret<=0) - goto ex; - - ext= isoburn_ropt_noiso1999; - if(xorriso->read_fs & 1) - ext|= isoburn_ropt_norock; - if(xorriso->read_fs & 2) - ext|= isoburn_ropt_nojoliet; - if((xorriso->ino_behavior & (1 | 2)) && !(xorriso->do_aaip & (1 | 4 | 32)) - && !(xorriso->do_md5 & 1) && !(xorriso->do_hfsplus)) - ext|= isoburn_ropt_noaaip; - if(!(xorriso->do_aaip & 1)) - ext|= isoburn_ropt_noacl; - if(!(xorriso->do_aaip & 4)) - ext|= isoburn_ropt_noea; - if(xorriso->ino_behavior & 1) - ext|= isoburn_ropt_noino; - if(!(xorriso->do_md5 & 1)) - ext|= isoburn_ropt_nomd5; - if(xorriso->do_md5 & 32) - ext|= isoburn_ropt_nomd5tag; - if(xorriso->ecma119_map == 0) - ext|= isoburn_ropt_map_unmapped; - else if(xorriso->ecma119_map == 2) - ext|= isoburn_ropt_map_uppercase; - else if(xorriso->ecma119_map == 3) - ext|= isoburn_ropt_map_lowercase; - else - ext|= isoburn_ropt_map_stripped; - if(xorriso->joliet_map == 0) - ext|= isoburn_ropt_joliet_unmapped; - else - ext|= isoburn_ropt_joliet_stripped; - - isoburn_ropt_set_extensions(ropts, ext); - - isoburn_ropt_set_default_perms(ropts, (uid_t) 0, (gid_t) 0, (mode_t) 0555); - isoburn_ropt_set_input_charset(ropts, xorriso->in_charset); - isoburn_ropt_set_auto_incharset(ropts, !!(xorriso->do_aaip & 512)); - isoburn_ropt_set_displacement(ropts, xorriso->displacement, - xorriso->displacement_sign); - isoburn_ropt_set_truncate_mode(ropts, 1, xorriso->file_name_limit); - - Xorriso_set_image_severities(xorriso, 1); /* No DEBUG messages */ Xorriso_pacifier_reset(xorriso, 0); isoburn_set_read_pacifier(drive, Xorriso__read_pacifier, (void *) xorriso); - /* <<< Trying to work around too much tolerance on bad image trees. - Better would be a chance to instruct libisofs what to do in - case of image read errors. There is a risk to mistake other SORRYs. - */ - if(xorriso->img_read_error_mode>0) - iso_set_abort_severity("SORRY"); - - if(state != BURN_DISC_BLANK) { - ret= isoburn_disc_get_msc1(drive, &load_lba); - if(ret > 0) { - sprintf(xorriso->info_text, - "Loading ISO image tree from LBA %d", load_lba); - Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "NOTE", 0); - } - ret= Xorriso_assert_volid(xorriso, load_lba, 0); - if(ret <= 0) - goto ex; - } - Xorriso_set_speed(xorriso, drive, xorriso->read_speed, 0, 1); read_ret= ret= isoburn_read_image(drive, ropts, &volset); - /* <<< Resetting to normal thresholds */ + /* <<< Resetting to normal thresholds, after Xorriso_make_read_options */ if(xorriso->img_read_error_mode>0) Xorriso_set_abort_severity(xorriso, 0); @@ -3635,3 +3656,334 @@ int Xorriso_obtain_indev_readsize(struct XorrisO *xorriso, uint32_t *blocks, } +/* @param flag bit0= as_mkisofs, else cmd +*/ +int Xorriso_feature_to_cmd(struct XorrisO *xorriso, char *name, char *value, + int flag) +{ + int i, as_m; + double val_num= -123456789; + static char *ignored_names[]= {"size", "eltorito", "tree_loaded", + "tree_loaded_text", "rr_loaded", "aaip", + "relaxed_vol_atts", "rrip_1_10_px_ino", + ""}; + + sscanf(value, "%lf", &val_num); + for(i= 0; ignored_names[i][0] != 0; i++) + if(strcmp(name, ignored_names[i]) == 0) + return(0); + as_m= flag & 1; + if(strcmp(name, "iso_level") == 0) { + if(as_m) { + sprintf(xorriso->result_line, "-iso-level %s", value); + } else { + sprintf(xorriso->result_line, "-compliance iso_9660_level=%s", value); + } + } else if(strcmp(name, "rockridge") == 0) { + if(as_m) { + if(val_num > 0.0) + sprintf(xorriso->result_line, "-R"); + else + sprintf(xorriso->result_line, "--norock"); + } else { + sprintf(xorriso->result_line, "-rockridge %s", + val_num > 0.0 ? "on" : "off"); + } + } else if(strcmp(name, "joliet") == 0) { + if(as_m) { + if(val_num <= 0.0) + return(0); + sprintf(xorriso->result_line, "-J"); + } else { + sprintf(xorriso->result_line, "-joliet %s", + val_num > 0.0 ? "on" : "off"); + } + } else if(strcmp(name, "iso1999") == 0) { + if(as_m) { + if(val_num <= 0.0) + return(0); + sprintf(xorriso->result_line, "-iso-level 4"); + } else { + sprintf(xorriso->result_line, "-compliance iso_9660_1999%s", + val_num > 0.0 ? "" : "_off"); + } + } else if(strcmp(name, "untranslated_name_len") == 0) { + if(as_m) { + if(val_num <= 0.0) + return(0); + sprintf(xorriso->result_line, "-untranslated_name_len %s", value); + } else { + sprintf(xorriso->result_line, "-compliance untranslated_name_len=%s", + value); + } + } else if(strcmp(name, "allow_dir_id_ext") == 0) { + if(as_m) { + if(val_num > 0.0) + return(0); + sprintf(xorriso->result_line, "-disallow_dir_id_ext"); + } else { + sprintf(xorriso->result_line, "-compliance allow_dir_id_ext%s", + val_num > 0.0 ? "" : "_off"); + } + } else if(strcmp(name, "omit_version_numbers") == 0) { + if(as_m) { + if(val_num <= 0.0) + return(0); + sprintf(xorriso->result_line, "-N"); + } else { + if(val_num <= 0.0) + sprintf(xorriso->result_line, + "-compliance omit_version_off:only_iso_version_off"); + else if(val_num == 2.0) + sprintf(xorriso->result_line, + "-compliance omit_version_off:only_iso_version"); + else + sprintf(xorriso->result_line, + "-compliance omit_version:only_iso_version_off"); + } + } else if(strcmp(name, "allow_deep_paths") == 0) { + if(as_m) { + if(val_num <= 0.0) + return(0); + sprintf(xorriso->result_line, "-D"); + } else { + sprintf(xorriso->result_line, "-compliance deep_paths%s", + val_num > 0.0 ? "" : "_off"); + } + } else if(strcmp(name, "allow_longer_paths") == 0) { + if(as_m) { + if(val_num <= 0.0) + return(0); + sprintf(xorriso->result_line, "-U"); + } else { + sprintf(xorriso->result_line, "-compliance long_paths%s", + val_num > 0.0 ? "" : "_off"); + } + } else if(strcmp(name, "allow_full_ascii") == 0) { + if(as_m) { + if(val_num <= 0.0) + return(0); + sprintf(xorriso->result_line, "-U"); + } else { + sprintf(xorriso->result_line, "-compliance full_ascii%s", + val_num > 0.0 ? "" : "_off"); + } + } else if(strcmp(name, "max_37_char_filenames") == 0) { + if(as_m) { + if(val_num <= 0.0) + return(0); + sprintf(xorriso->result_line, "-max-iso9660-filenames"); + } else { + sprintf(xorriso->result_line, "-compliance long_names%s", + val_num > 0.0 ? "" : "_off"); + } + } else if(strcmp(name, "no_force_dots") == 0) { + if(as_m) { + if(val_num <= 0.0) + return(0); + sprintf(xorriso->result_line, "-d"); + } else { + sprintf(xorriso->result_line, + "-compliance no_force_dots%s:no_j_force_dots%s", + ((int) val_num) & 1 ? "" : "_off", + ((int) val_num) & 2 ? "" : "_off"); + } + } else if(strcmp(name, "allow_lowercase") == 0) { + if(as_m) { + if(val_num <= 0.0) + return(0); + sprintf(xorriso->result_line, "-allow-lowercase"); + } else { + sprintf(xorriso->result_line, "-compliance lowercase%s", + val_num > 0.0 ? "" : "_off"); + } + } else if(strcmp(name, "joliet_longer_paths") == 0) { + if(as_m) { + if(val_num <= 0.0) + return(0); + sprintf(xorriso->result_line, "-joliet-long"); + } else { + sprintf(xorriso->result_line, "-compliance joliet_long_paths%s", + val_num > 0.0 ? "" : "_off"); + } + } else if(strcmp(name, "joliet_long_names") == 0) { + if(as_m) { + if(val_num <= 0.0) + return(0); + sprintf(xorriso->result_line, "-joliet-long"); + } else { + sprintf(xorriso->result_line, "-compliance joliet_long_names%s", + val_num > 0.0 ? "" : "_off"); + } + } else if(strcmp(name, "joliet_utf16") == 0) { + if(as_m) { + if(val_num <= 0.0) + return(0); + sprintf(xorriso->result_line, "-joliet-utf16"); + } else { + sprintf(xorriso->result_line, "-compliance joliet_utf16%s", + val_num > 0.0 ? "" : "_off"); + } + } else if(strcmp(name, "rrip_version_1_10") == 0) { + if(as_m) { + return(0); + } else { + sprintf(xorriso->result_line, "-compliance %s_rr", + val_num > 0.0 ? "old" : "new"); + } + } else if(strcmp(name, "aaip_susp_1_10") == 0) { + if(as_m) { + return(0); + } else { + sprintf(xorriso->result_line, "-compliance aaip_susp_1_10%s", + val_num > 0.0 ? "" : "_off"); + } + } else if(strcmp(name, "record_md5_session") == 0) { + if(as_m) { + if(val_num <= 0.0) + return(0); + sprintf(xorriso->result_line, "--md5"); + } else { + sprintf(xorriso->result_line, "-md5 %s", val_num > 0.0 ? "on" : "off"); + } + } else if(strcmp(name, "record_md5_files") == 0) { + if(as_m) { + if(val_num <= 0.0) + return(0); + sprintf(xorriso->result_line, "--md5"); + } else { + sprintf(xorriso->result_line, "-md5 %s", val_num > 0.0 ? "on" : "off"); + } + } else { + sprintf(xorriso->info_text, "Program error: unexpected feature name '%s'", + name); + Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "DEBUG", 0); + + return(-1); + } + return(1); +} + + +int Xorriso_assess_written_features(struct XorrisO *xorriso, char *mode, + int flag) +{ + int ret, l, ftext_l, replay_count= 0, max_line_size= 2 * SfileadrL; + struct burn_drive_info *dinfo; + struct burn_drive *drive; + enum burn_disc_status s; + struct isoburn_read_opts *ropts= NULL; + IsoReadImageFeatures *features= NULL; + struct isoburn_imgen_opts *imgen_opts= NULL; + char *ftext= NULL, *cpt, *npt, *ept, *prev_line= NULL, *cmd_line= NULL; + static char *tree_loaded_names[3]= {"ISO9660", "Joliet", "ISO9660:1999"}; + int tree_loaded_names_max= 2; + + Xorriso_alloc_meM(prev_line, char, max_line_size); + Xorriso_alloc_meM(cmd_line, char, max_line_size); + prev_line[0]= 0; + ret= Xorriso_get_drive_handles(xorriso, &dinfo, &drive, + "when assessing written features", 0); + if(ret <= 0) + {ret= 0; goto ex;} + s= isoburn_disc_get_status(drive); + if(s != BURN_DISC_APPENDABLE && s != BURN_DISC_FULL) { + Xorriso_msgs_submit(xorriso, 0, + "The disc in the input drive offers no readable content", 0, "NOTE", 0); + ret= 2; goto ex; + } + ret= Xorriso_make_read_options(xorriso, drive, &ropts, 0); + if(ret <= 0) + goto ex; + ret = isoburn_assess_written_features(drive, ropts, &features, &imgen_opts, + 0); + Xorriso_process_msg_queues(xorriso,0); + /* <<< Resetting to normal thresholds, after Xorriso_make_read_options */ + if(xorriso->img_read_error_mode > 0) + Xorriso_set_abort_severity(xorriso, 0); + if(ret <= 0) + {ret= 0; goto ex;} + ret= iso_read_image_features_text(features, 1, &ftext); + if(ret < 0) + {ret= 0; goto ex;} + + /* print results, depending on mode */ + ftext_l= strlen(ftext); + for(cpt= ftext ; cpt - ftext < ftext_l ; cpt+= l + 1) { + npt= strchr(cpt, '\n'); + if(npt == NULL) + l= strlen(cpt); + else + l= npt - cpt; + cpt[l]= 0; + ept= strchr(cpt, '='); + if(ept == NULL) + continue; + if(strcmp(mode, "cmd") == 0 || strcmp(mode, "replay") == 0 || + strcmp(mode, "as_mkisofs") == 0 ) { + *ept= 0; + ret= Xorriso_feature_to_cmd(xorriso, cpt, ept + 1, + strcmp(mode, "as_mkisofs") == 0); + if(ret <= 0) + continue; + } else { /* "plain" and any other */ + strcpy(xorriso->result_line, "Indev feature: "); + if(strncmp(cpt, "tree_loaded=", 12) == 0) { + sprintf(xorriso->result_line + strlen(xorriso->result_line), + "tree_loaded=%d", xorriso->tree_loaded); + } else if(strncmp(cpt, "tree_loaded_text=", 17) == 0) { + if(xorriso->tree_loaded >= 0 && + xorriso->tree_loaded <= tree_loaded_names_max) + sprintf(xorriso->result_line + strlen(xorriso->result_line), + "tree_loaded_text=%s", + tree_loaded_names[xorriso->tree_loaded]); + } else if(strncmp(cpt, "rr_loaded=", 10) == 0) { + sprintf(xorriso->result_line + strlen(xorriso->result_line), + "rr_loaded=%d", xorriso->rr_loaded); + } else { + strcat(xorriso->result_line, cpt); + } + } + /* Truncate to plausible length */ + xorriso->result_line[max_line_size - 1]= 0; + + if(strcmp(xorriso->result_line, prev_line) == 0) + continue; + strcpy(prev_line, xorriso->result_line); + if(strcmp(mode, "replay") == 0) { + /* Perform result_line as command */ + strcpy(cmd_line, xorriso->result_line); + ret= Xorriso_execute_option(xorriso, cmd_line, (1 << 16)); + if(ret <= 0) { + + /* >>> ??? what to do on error */; + + } + replay_count++; + } else { + strcat(xorriso->result_line, "\n"); + Xorriso_result(xorriso, 0); + } + } + + if(strcmp(mode, "replay") == 0) { + sprintf(xorriso->info_text, + "-assess_indev_features replay : Number of performed commands: %d\n", + replay_count); + Xorriso_info(xorriso, 0); + } + ret= 1; +ex:; + Xorriso_process_msg_queues(xorriso,0); + if(ropts != NULL) + isoburn_ropt_destroy(&ropts, 0); + if(features != NULL) + iso_read_image_features_destroy(features); + if(imgen_opts != NULL) + isoburn_igopt_destroy(&imgen_opts, 0); + Xorriso_free_meM(ftext); + Xorriso_free_meM(cmd_line); + Xorriso_free_meM(prev_line); + return(ret); +} + diff --git a/xorriso/opts_a_c.c b/xorriso/opts_a_c.c index 56075387..b08994ab 100644 --- a/xorriso/opts_a_c.c +++ b/xorriso/opts_a_c.c @@ -1,7 +1,7 @@ /* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images. - Copyright 2007-2021 Thomas Schmitt, + Copyright 2007-2022 Thomas Schmitt, Provided under GPL version 2 or later. @@ -487,6 +487,25 @@ int Xorriso_option_assert_volid(struct XorrisO *xorriso, char *pattern, } +/* Command -assess_indev_features */ +int Xorriso_option_assess_indev_features(struct XorrisO *xorriso, char *mode, + int flag) +{ + int ret; + + if(strcmp(mode, "plain") != 0 && strcmp(mode, "cmd") != 0 && + strcmp(mode, "as_mkisofs") != 0 && strcmp(mode, "replay") != 0 && + mode[0] != 0) { + sprintf(xorriso->info_text, "-assess_indev_features: unknown mode '%s'", + mode); + Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0); + return(0); + } + ret= Xorriso_assess_written_features(xorriso, mode, 0); + return(ret); +} + + /* Option -auto_charset "on"|"off" */ int Xorriso_option_auto_charset(struct XorrisO *xorriso, char *mode, int flag) { diff --git a/xorriso/parse_exec.c b/xorriso/parse_exec.c index 57a1589e..c7ed9701 100644 --- a/xorriso/parse_exec.c +++ b/xorriso/parse_exec.c @@ -1,7 +1,7 @@ /* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images. - Copyright 2007-2021 Thomas Schmitt, + Copyright 2007-2022 Thomas Schmitt, Provided under GPL version 2 or later. @@ -535,7 +535,7 @@ int Xorriso_count_args(struct XorrisO *xorriso, int argc, char **argv, }; static char arg1_commands[][40]= { "abort_on","acl","add_plainly","application_id","application_use", - "auto_charset","abstract_file", + "auto_charset","abstract_file","assess_indev_features", "backslash_codes","blank","biblio_file", "calm_drive","cd","cdi","cdx","changes_pending","charset", "close","close_damaged", @@ -710,6 +710,7 @@ int Xorriso_cmd_sorting_rank(struct XorrisO *xorriso, "* Drive and media related inquiry actions (2):", "list_profiles", "list_formats", "list_speeds", "toc", "toc_of", "pvd_info", "report_system_area", "report_el_torito", + "assess_indev_features", "* Settings for file insertion:", "file_name_limit", "file_size_limit", @@ -1082,6 +1083,10 @@ next_command:; (*idx)+= 2; ret= Xorriso_option_assert_volid(xorriso, arg1, arg2, 0); + } else if(strcmp(cmd,"assess_indev_features")==0) { + (*idx)++; + ret= Xorriso_option_assess_indev_features(xorriso, arg1, 0); + } else if(strcmp(cmd,"auto_charset")==0) { (*idx)++; ret= Xorriso_option_auto_charset(xorriso, arg1, 0); diff --git a/xorriso/text_io.c b/xorriso/text_io.c index 63fe7eb4..f1913983 100644 --- a/xorriso/text_io.c +++ b/xorriso/text_io.c @@ -2084,6 +2084,8 @@ int Xorriso_sieve_big(struct XorrisO *xorriso, int flag) 10000, 1}, {"Image size :", 3, "Image size :", "", 1, { 0, -1, -1, -1, -1, -1}, 1, 0}, + {"Indev feature:", 3, "Indev feature:", "= ", 2, { 0, 1, -1, -1, -1, -1}, + 10000, 1}, {"Jigdo files :", 3, "Jigdo files :", "", 1, { 0, -1, -1, -1, -1, -1}, 1, 0}, {"Local ACL :", 3, "Local ACL :", "", 1, { 0, -1, -1, -1, -1, -1}, diff --git a/xorriso/xorriso.1 b/xorriso/xorriso.1 index c67babd5..5f57f8ce 100644 --- a/xorriso/xorriso.1 +++ b/xorriso/xorriso.1 @@ -9,7 +9,7 @@ .\" First parameter, NAME, should be all caps .\" Second parameter, SECTION, should be 1-8, maybe w/ subsection .\" other parameters are allowed: see man(7), man(1) -.TH XORRISO 1 "Version 1.5.5, Jun 02, 2022" +.TH XORRISO 1 "Version 1.5.5, Sep 18, 2022" .\" Please adjust this date whenever revising the manpage. .\" .\" Some roff macros, for reference: @@ -4440,6 +4440,48 @@ summary of drive state and medium content is printed. As further difference to \-toc, this command does not emit FAILURE events if the desired drive is not acquired. .TP +\fB\-assess_indev_features\fR "plain"|"cmd"|"as_mkisofs"|"replay" +Inspect the filesystem on \-indev for the presence of Rock Ridge, Joliet, or +ISO 9660:1999, and for traces of other write options which seem to have been +used when the filesystem was created. +.br +Note that this command does not detect and report a possibly present HFS+ tree. +.br +Mode "cmd" lists xorriso commands which would activate the detected settings. +.br +Mode "as_mkisofs" lists options of the \-as mkisofs emulation, which would +activate those of the detected settings which are not default. +.br +Mode "replay" performs the commands which get listed by mode "cmd". +.br +Mode "plain" lists after a "Indev feature: " header name\-value pairs as +delivered by libisofs function iso_read_image_feature_named(). See libisofs.h. +The other modes derive their output from this list. I.e. the sequence of +commands from "cmd" follows the sequence of "plain". +.br +Not leading to "cmd" lines are: +.br +"size=" tells the number of 2048 byte blocks of the filesystem. +.br +"eltorito=1" tells that El Torito boot equipment was detected. +.br +"tree_loaded=" tells which tree was loaded by \-indev: +.br + 0 = ISO 9660 , 1 = Joliet , 2 = ISO 9660:1999 +.br +"tree_loaded_text=" tells the same by name: "ISO9660", "Joliet", "ISO9660:1999" +.br +"rr_loaded=1" tells that Rock Ridge information was loaded with the tree. +.br +"aaip=1" tells that AAIP information was detected (ACL, xattr, MD5, ...). +.br +"relaxed_vol_atts=1" tells that the volume attributes like \-volid or +\-preparer_id bear characters outside the restricted character sets which are +specified for them by ECMA\-119. +.br +"rrip_1_10_px_ino=1" tells that with Rock Ridge 1.10 a PX entry was found which +looks like from Rock Ridge 1.12. +.TP \fB\-mount_cmd\fR drive entity id path Emit an appropriate command line for mounting the ISO session indicated by drive, entity and id. diff --git a/xorriso/xorriso.h b/xorriso/xorriso.h index eae325ec..b3124183 100644 --- a/xorriso/xorriso.h +++ b/xorriso/xorriso.h @@ -2,7 +2,7 @@ /* xorriso - libisoburn higher level API which creates, loads, manipulates and burns ISO 9660 filesystem images. - Copyright 2007-2021 Thomas Schmitt, + Copyright 2007-2022 Thomas Schmitt, Provided under GPL version 2 or later. @@ -867,6 +867,9 @@ int Xorriso_sieve_dispose(struct XorrisO *xorriso, int flag); argv[3]= Volume Id "Image size :" up to 1 result from -print_size argv[0]= number of blocks with "s" appended + "Indev feature:" up to 10000 results from -assess_indev_features plain + argv[0]= name + argv[1]= value "Jigdo files :" up to 1 result from -list_extras argv[0]= "yes" or "no" "Local ACL :" up to 1 result from -list_extras @@ -1293,6 +1296,11 @@ int Xorriso_option_as(struct XorrisO *xorriso, int argc, char **argv, int Xorriso_option_assert_volid(struct XorrisO *xorriso, char *pattern, char *severity, int flag); +/* Command -assess_indev_features */ +/* @since 1.5.6 */ +int Xorriso_option_assess_indev_features(struct XorrisO *xorriso, char *mode, + int flag); + /* Command -auto_charset "on"|"off" */ /* @since 0.3.8 */ int Xorriso_option_auto_charset(struct XorrisO *xorriso, char *mode, int flag); diff --git a/xorriso/xorriso.info b/xorriso/xorriso.info index ede2591b..6b54206c 100644 --- a/xorriso/xorriso.info +++ b/xorriso/xorriso.info @@ -3734,6 +3734,40 @@ File: xorriso.info, Node: Inquiry, Next: Navigate, Prev: DialogCtl, Up: Comm short summary of drive state and medium content is printed. As further difference to -toc, this command does not emit FAILURE events if the desired drive is not acquired. +-assess_indev_features "plain"|"cmd"|"as_mkisofs"|"replay" + Inspect the filesystem on -indev for the presence of Rock Ridge, + Joliet, or ISO 9660:1999, and for traces of other write options + which seem to have been used when the filesystem was created. + Note that this command does not detect and report a possibly + present HFS+ tree. + Mode "cmd" lists xorriso commands which would activate the detected + settings. + Mode "as_mkisofs" lists options of the -as mkisofs emulation, which + would activate those of the detected settings which are not + default. + Mode "replay" performs the commands which get listed by mode "cmd". + + Mode "plain" lists after a "Indev feature: " header name-value + pairs as delivered by libisofs function + iso_read_image_feature_named(). See libisofs.h. The other modes + derive their output from this list. I.e. the sequence of commands + from "cmd" follows the sequence of "plain". + Not leading to "cmd" lines are: + "size=" tells the number of 2048 byte blocks of the filesystem. + "eltorito=1" tells that El Torito boot equipment was detected. + "tree_loaded=" tells which tree was loaded by -indev: + 0 = ISO 9660 , 1 = Joliet , 2 = ISO 9660:1999 + "tree_loaded_text=" tells the same by name: "ISO9660", "Joliet", + "ISO9660:1999" + "rr_loaded=1" tells that Rock Ridge information was loaded with the + tree. + "aaip=1" tells that AAIP information was detected (ACL, xattr, MD5, + ...). + "relaxed_vol_atts=1" tells that the volume attributes like -volid + or -preparer_id bear characters outside the restricted character + sets which are specified for them by ECMA-119. + "rrip_1_10_px_ino=1" tells that with Rock Ridge 1.10 a PX entry was + found which looks like from Rock Ridge 1.12. -mount_cmd drive entity id path Emit an appropriate command line for mounting the ISO session indicated by drive, entity and id. The result will be different on @@ -5603,6 +5637,7 @@ File: xorriso.info, Node: CommandIdx, Next: ConceptIdx, Prev: Legal, Up: Top * -application_use sets application use field: SetWrite. (line 272) * -as emulates mkisofs or cdrecord: Emulation. (line 13) * -assert_volid rejects undesired images: Loading. (line 105) +* -assess_indev_features shows filesystem features: Inquiry. (line 49) * -auto_charset learns character set from image: Loading. (line 117) * -backslash_codes enables backslash conversion: Scripting. (line 71) * -ban_stdio_write demands real drive: Loading. (line 346) @@ -5729,8 +5764,8 @@ File: xorriso.info, Node: CommandIdx, Next: ConceptIdx, Prev: Legal, Up: Top * -mkdir creates ISO directory: Insert. (line 187) * -modesty_on_drive keep drive buffer hungry: SetWrite. (line 419) * -mount issues mount command for ISO session: Restore. (line 204) -* -mount_cmd composes mount command line: Inquiry. (line 49) -* -mount_cmd controls mount command: Inquiry. (line 65) +* -mount_cmd composes mount command line: Inquiry. (line 83) +* -mount_cmd controls mount command: Inquiry. (line 99) * -msg_op perform operations on program messages: Frontend. (line 27) * -mv renames files in ISO image: Manip. (line 37) * -mv renames single file in ISO image: Manip. (line 31) @@ -5756,12 +5791,12 @@ File: xorriso.info, Node: CommandIdx, Next: ConceptIdx, Prev: Legal, Up: Top * -print prints result text line: Scripting. (line 102) * -print_info prints message text line: Scripting. (line 104) * -print_mark prints synchronizing text line: Scripting. (line 106) -* -print_size predicts image size: Inquiry. (line 86) +* -print_size predicts image size: Inquiry. (line 120) * -prog sets program name: Frontend. (line 176) * -prog_help prints help text: Frontend. (line 178) * -prompt prompts for enter key: Scripting. (line 110) * -publisher sets publisher id: SetWrite. (line 192) -* -pvd_info shows image id strings: Inquiry. (line 108) +* -pvd_info shows image id strings: Inquiry. (line 142) * -pwd tells working directory in ISO: Navigate. (line 19) * -pwdx tells working directory on disk: Navigate. (line 21) * -quoted_not_list sets exclusions: SetInsert. (line 74) @@ -5772,8 +5807,8 @@ File: xorriso.info, Node: CommandIdx, Next: ConceptIdx, Prev: Legal, Up: Top * -read_speed set read speed: Loading. (line 11) * -reassure enables confirmation question: DialogCtl. (line 29) * -report_about controls verbosity: Exception. (line 53) -* -report_el_torito shows Boot Catalog: Inquiry. (line 116) -* -report_system_area shows MBR, GPT, and alike: Inquiry. (line 138) +* -report_el_torito shows Boot Catalog: Inquiry. (line 150) +* -report_system_area shows MBR, GPT, and alike: Inquiry. (line 172) * -return_with controls exit value: Exception. (line 38) * -rm deletes files from ISO image: Manip. (line 20) * -rmdir deletes ISO directory: Manip. (line 29) @@ -5788,7 +5823,7 @@ File: xorriso.info, Node: CommandIdx, Next: ConceptIdx, Prev: Legal, Up: Top * -scsi_dev_family choose Linux device file type: AqDrive. (line 95) * -scsi_log reports SCSI commands: Scripting. (line 143) * -session_log logs written sessions: Scripting. (line 134) -* -session_string composes session info line: Inquiry. (line 74) +* -session_string composes session info line: Inquiry. (line 108) * -setfacl sets ACL in ISO image: Manip. (line 68) * -setfacl_list sets ACL in ISO image: Manip. (line 94) * -setfacl_r sets ACL in ISO image: Manip. (line 92) @@ -5811,7 +5846,7 @@ File: xorriso.info, Node: CommandIdx, Next: ConceptIdx, Prev: Legal, Up: Top * -stdio_sync controls stdio buffer: SetWrite. (line 469) * -stream_recording controls defect management: SetWrite. (line 389) * -system_id sets system id: SetWrite. (line 205) -* -tell_media_space reports free space: Inquiry. (line 98) +* -tell_media_space reports free space: Inquiry. (line 132) * -temp_mem_limit curbs memory consumption: Scripting. (line 96) * -toc shows list of sessions: Inquiry. (line 27) * -toc_of shows list of sessions: Inquiry. (line 41) @@ -5925,6 +5960,7 @@ File: xorriso.info, Node: ConceptIdx, Prev: CommandIdx, Up: Top * File names, curb length, -file_name_limit: Loading. (line 276) * File names, if Joliet is loaded: Loading. (line 242) * File names, if neither Rock Ridge nor Joliet: Loading. (line 229) +* Filesytem features, show, -assess_indev_features: Inquiry. (line 49) * Filter, apply to file tree, -set_filter_r: Filter. (line 84) * Filter, apply to file, -set_filter: Filter. (line 58) * Filter, ban registration, -close_filter_list: Filter. (line 50) @@ -5966,9 +6002,9 @@ File: xorriso.info, Node: ConceptIdx, Prev: CommandIdx, Up: Top * Image, set volume id, -volid: SetWrite. (line 168) * Image, set volume set id, -volset_id: SetWrite. (line 188) * Image, set volume timestamp, -volume_date: SetWrite. (line 211) -* Image, show Boot Catalog: Inquiry. (line 116) -* Image, show id strings, -pvd_info: Inquiry. (line 108) -* Image, show MBR, GPT, and alike, -pvd_info: Inquiry. (line 138) +* Image, show Boot Catalog: Inquiry. (line 150) +* Image, show id strings, -pvd_info: Inquiry. (line 142) +* Image, show MBR, GPT, and alike, -pvd_info: Inquiry. (line 172) * Image, _definition: Model. (line 9) * Input Character Set, _definition: Charset. (line 25) * Insert, enable overwriting, -overwrite: SetInsert. (line 139) @@ -6103,11 +6139,11 @@ File: xorriso.info, Node: ConceptIdx, Prev: CommandIdx, Up: Top (line 61) * Rock Ridge, _definition: Extras. (line 6) * Session, altered start address, -displacement: Loading. (line 78) -* Session, info string, -session_string: Inquiry. (line 74) +* Session, info string, -session_string: Inquiry. (line 108) * Session, issue mount command, -mount: Restore. (line 204) * Session, log when written, -session_log: Scripting. (line 134) -* Session, mount command line, -mount_cmd: Inquiry. (line 49) -* Session, mount parameters, -mount_opts: Inquiry. (line 65) +* Session, mount command line, -mount_cmd: Inquiry. (line 83) +* Session, mount parameters, -mount_opts: Inquiry. (line 99) * Session, select as input, -load: Loading. (line 54) * Session, _definition: Model. (line 6) * Sorting order, for -x, -list_arg_sorting: ArgSort. (line 26) @@ -6141,12 +6177,12 @@ File: xorriso.info, Node: ConceptIdx, Prev: CommandIdx, Up: Top * Write, enable HFS+, -hfsplus: SetWrite. (line 14) * Write, enable Joliet, -joliet: SetWrite. (line 10) * Write, fifo size, -fs: SetWrite. (line 479) -* Write, free space, -tell_media_space: Inquiry. (line 98) +* Write, free space, -tell_media_space: Inquiry. (line 132) * Write, log problematic disk files, -errfile_log: Scripting. (line 116) * Write, log written sessions, -session_log: Scripting. (line 134) * Write, padding image, -padding: SetWrite. (line 507) * Write, pending ISO image, -commit: Writing. (line 27) -* Write, predict image size, -print_size: Inquiry. (line 86) +* Write, predict image size, -print_size: Inquiry. (line 120) * Write, set speed, -speed: SetWrite. (line 371) * Write, simulation, -dummy: SetWrite. (line 476) * Write, TAO or SAO/DAO, -write_type: SetWrite. (line 500) @@ -6187,35 +6223,35 @@ Node: Charset189084 Node: Exception192413 Node: DialogCtl198542 Node: Inquiry201144 -Node: Navigate210026 -Node: Verify218733 -Node: Restore229882 -Node: Emulation242090 -Node: Scripting252546 -Node: Frontend260329 -Node: Examples269955 -Node: ExDevices271133 -Node: ExCreate271794 -Node: ExDialog273094 -Node: ExGrowing274365 -Node: ExModifying275174 -Node: ExBootable275684 -Node: ExCharset276239 -Node: ExPseudo277135 -Node: ExCdrecord278062 -Node: ExMkisofs278382 -Node: ExGrowisofs280279 -Node: ExException281432 -Node: ExTime281890 -Node: ExIncBackup282348 -Node: ExRestore286374 -Node: ExRecovery287320 -Node: Files287892 -Node: Environ289226 -Node: Seealso289974 -Node: Bugreport290691 -Node: Legal291282 -Node: CommandIdx292294 -Node: ConceptIdx310119 +Node: Navigate211859 +Node: Verify220566 +Node: Restore231715 +Node: Emulation243923 +Node: Scripting254379 +Node: Frontend262162 +Node: Examples271788 +Node: ExDevices272966 +Node: ExCreate273627 +Node: ExDialog274927 +Node: ExGrowing276198 +Node: ExModifying277007 +Node: ExBootable277517 +Node: ExCharset278072 +Node: ExPseudo278968 +Node: ExCdrecord279895 +Node: ExMkisofs280215 +Node: ExGrowisofs282112 +Node: ExException283265 +Node: ExTime283723 +Node: ExIncBackup284181 +Node: ExRestore288207 +Node: ExRecovery289153 +Node: Files289725 +Node: Environ291059 +Node: Seealso291807 +Node: Bugreport292524 +Node: Legal293115 +Node: CommandIdx294127 +Node: ConceptIdx312025  End Tag Table diff --git a/xorriso/xorriso.texi b/xorriso/xorriso.texi index 0050a005..5ae9405e 100644 --- a/xorriso/xorriso.texi +++ b/xorriso/xorriso.texi @@ -50,7 +50,7 @@ @c man .\" First parameter, NAME, should be all caps @c man .\" Second parameter, SECTION, should be 1-8, maybe w/ subsection @c man .\" other parameters are allowed: see man(7), man(1) -@c man .TH XORRISO 1 "Version 1.5.5, Jun 02, 2022" +@c man .TH XORRISO 1 "Version 1.5.5, Sep 18, 2022" @c man .\" Please adjust this date whenever revising the manpage. @c man .\" @c man .\" Some roff macros, for reference: @@ -5082,6 +5082,50 @@ summary of drive state and medium content is printed. As further difference to -toc, this command does not emit FAILURE events if the desired drive is not acquired. @c man .TP +@item -assess_indev_features "plain"|"cmd"|"as_mkisofs"|"replay" +@kindex -assess_indev_features shows filesystem features +@cindex Filesytem features, show, -assess_indev_features +Inspect the filesystem on -indev for the presence of Rock Ridge, Joliet, or +ISO 9660:1999, and for traces of other write options which seem to have been +used when the filesystem was created. +@* +Note that this command does not detect and report a possibly present HFS+ tree. +@* +Mode "cmd" lists xorriso commands which would activate the detected settings. +@* +Mode "as_mkisofs" lists options of the -as mkisofs emulation, which would +activate those of the detected settings which are not default. +@* +Mode "replay" performs the commands which get listed by mode "cmd". +@* +Mode "plain" lists after a "Indev feature: " header name-value pairs as +delivered by libisofs function iso_read_image_feature_named(). See libisofs.h. +The other modes derive their output from this list. I.e. the sequence of +commands from "cmd" follows the sequence of "plain". +@* +Not leading to "cmd" lines are: +@* +"size=" tells the number of 2048 byte blocks of the filesystem. +@* +"eltorito=1" tells that El Torito boot equipment was detected. +@* +"tree_loaded=" tells which tree was loaded by -indev: +@* + 0 = ISO 9660 , 1 = Joliet , 2 = ISO 9660:1999 +@* +"tree_loaded_text=" tells the same by name: "ISO9660", "Joliet", "ISO9660:1999" +@* +"rr_loaded=1" tells that Rock Ridge information was loaded with the tree. +@* +"aaip=1" tells that AAIP information was detected (ACL, xattr, MD5, ...). +@* +"relaxed_vol_atts=1" tells that the volume attributes like -volid or +-preparer_id bear characters outside the restricted character sets which are +specified for them by ECMA-119. +@* +"rrip_1_10_px_ino=1" tells that with Rock Ridge 1.10 a PX entry was found which +looks like from Rock Ridge 1.12. +@c man .TP @item -mount_cmd drive entity id path @kindex -mount_cmd composes mount command line @cindex Session, mount command line, -mount_cmd diff --git a/xorriso/xorriso_timestamp.h b/xorriso/xorriso_timestamp.h index 084351d6..ea79bcd0 100644 --- a/xorriso/xorriso_timestamp.h +++ b/xorriso/xorriso_timestamp.h @@ -1 +1 @@ -#define Xorriso_timestamP "2022.06.13.205546" +#define Xorriso_timestamP "2022.09.20.082738" diff --git a/xorriso/xorrisoburn.h b/xorriso/xorrisoburn.h index 1b5151d7..10fa6261 100644 --- a/xorriso/xorrisoburn.h +++ b/xorriso/xorrisoburn.h @@ -4,7 +4,7 @@ a command line oriented batch and dialog tool which creates, loads, manipulates and burns ISO 9660 filesystem images. - Copyright 2007-2021 Thomas Schmitt, + Copyright 2007-2022 Thomas Schmitt, Provided under GPL version 2 or later. @@ -676,6 +676,9 @@ int Xorriso_set_libisofs_now(struct XorrisO *xorriso, int flag); int Xorriso_obtain_indev_readsize(struct XorrisO *xorriso, uint32_t *blocks, int flag); +int Xorriso_assess_written_features(struct XorrisO *xorriso, char *mode, + int flag); + /* Frontend to isoburn_conv_name_chars() */ int Xorriso_conv_name_chars(struct XorrisO *xorriso, char *name, char **result, size_t *result_len,