feat: add -z (--strip) to remove ECC data from an iso

This commit is contained in:
Stéphane Lesimple
2021-01-30 12:18:03 +01:00
parent fd4f8424f7
commit c336d039a9
12 changed files with 165 additions and 8 deletions

View File

@@ -114,6 +114,7 @@ src/inlined-icons.h: icons/read.png icons/create.png icons/scan.png icons/fix.pn
@gdk-pixbuf-csource --raw --name=dvdisaster_scan icons/scan.png >>src/inlined-icons.h @gdk-pixbuf-csource --raw --name=dvdisaster_scan icons/scan.png >>src/inlined-icons.h
@gdk-pixbuf-csource --raw --name=dvdisaster_fix icons/fix.png >>src/inlined-icons.h @gdk-pixbuf-csource --raw --name=dvdisaster_fix icons/fix.png >>src/inlined-icons.h
@gdk-pixbuf-csource --raw --name=dvdisaster_verify icons/verify.png >>src/inlined-icons.h @gdk-pixbuf-csource --raw --name=dvdisaster_verify icons/verify.png >>src/inlined-icons.h
@gdk-pixbuf-csource --raw --name=dvdisaster_strip icons/strip.png >>src/inlined-icons.h
@gdk-pixbuf-csource --raw --name=dvdisaster_open_ecc icons/open-ecc.png >>src/inlined-icons.h @gdk-pixbuf-csource --raw --name=dvdisaster_open_ecc icons/open-ecc.png >>src/inlined-icons.h
@gdk-pixbuf-csource --raw --name=dvdisaster_open_img icons/open-img.png >>src/inlined-icons.h @gdk-pixbuf-csource --raw --name=dvdisaster_open_img icons/open-img.png >>src/inlined-icons.h
@gdk-pixbuf-csource --raw --name=dvdisaster_cd icons/cd.png >>src/inlined-icons.h @gdk-pixbuf-csource --raw --name=dvdisaster_cd icons/cd.png >>src/inlined-icons.h

BIN
icons/strip.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

View File

@@ -260,10 +260,11 @@ function run_regtest()
if test "$answer" == "a"; then if test "$answer" == "a"; then
cp $REFLOG $LOGDIR cp $REFLOG $LOGDIR
head -n 2 $LOGDIR/${CODEC_PREFIX}_${testsymbol} >$REFLOG head -n 2 $LOGDIR/${CODEC_PREFIX}_${testsymbol} >$REFLOG
sed -e "s=${SED_REMOVE_ISO_DIR}==g" $NEWLOG >>$REFLOG sed -re "s=${SED_REMOVE_ISO_DIR}==g" $NEWLOG >>$REFLOG
pass="skip" pass="skip"
elif test "$answer" == "v"; then elif test "$answer" == "v"; then
vimdiff $REFLOG $NEWLOG vimdiff $REFLOG $NEWLOG
continue continue
else else
pass="false" pass="false"
@@ -295,7 +296,7 @@ function run_regtest()
image_md5=$(head -n 1 $REFLOG) image_md5=$(head -n 1 $REFLOG)
ecc_md5=$(head -n 2 $REFLOG | tail -n 1) ecc_md5=$(head -n 2 $REFLOG | tail -n 1)
if test ${image_md5} != "ignore"; then if test "${image_md5}" != "ignore"; then
md5=$($MD5SUM ${testiso} | cut -d\ -f 1) md5=$($MD5SUM ${testiso} | cut -d\ -f 1)
if test "$image_md5" != "$md5"; then if test "$image_md5" != "$md5"; then
if [ "$REGTEST_NO_UTF8" = 1 ]; then if [ "$REGTEST_NO_UTF8" = 1 ]; then
@@ -309,7 +310,7 @@ function run_regtest()
fi fi
fi fi
if test ${ecc_md5} != "ignore"; then if test "${ecc_md5}" != "ignore"; then
md5=$($MD5SUM ${testecc} | cut -d\ -f 1) md5=$($MD5SUM ${testecc} | cut -d\ -f 1)
if test "$ecc_md5" != "$md5"; then if test "$ecc_md5" != "$md5"; then
if [ "$pass" = false ] || [ "$REGTEST_NO_UTF8" = 1 ]; then if [ "$pass" = false ] || [ "$REGTEST_NO_UTF8" = 1 ]; then
@@ -340,7 +341,7 @@ function run_regtest()
[ $nbfailed -ge 256 ] && nbfailed=255 [ $nbfailed -ge 256 ] && nbfailed=255
echo "test symbol for config: $testsymbol" echo "test symbol for config: $testsymbol"
if test "$fail_on_bad" == "yes"; then if test "$fail_on_bad" == "yes"; then
next=$(grep -A 1 ${CODEC_PREFIX}_$testsymbol config.txt | tail -n 1 | cut -d\ -f 1) next=$(grep -A 1 "${CODEC_PREFIX}_$testsymbol" config.txt | tail -n 1 | cut -d\ -f 1)
echo "FAIL_ON_BAD set to yes -- exiting" echo "FAIL_ON_BAD set to yes -- exiting"
if test "$gui_mode" == "true"; then if test "$gui_mode" == "true"; then
guiarg="gui" guiarg="gui"

View File

@@ -170,6 +170,11 @@ RS01_adaptive_medium_with_dsm yes
### RS02 tests ### RS02 tests
# Strip tests
RS02_strip_ecc yes
RS02_strip_ecc_not yes
# Verify tests # Verify tests
RS02_good yes RS02_good yes
RS02_good_quick yes RS02_good_quick yes
@@ -335,6 +340,11 @@ RS02_adaptive_with_wrong_rs03_file yes
### RS03 augmented image tests ### RS03 augmented image tests
# Strip tests
RS03i_strip_ecc yes
RS03i_strip_ecc_not yes
# Verify tests # Verify tests
RS03i_good yes RS03i_good yes

View File

@@ -440,15 +440,16 @@ fi
# Read image with wrong ecc file and create new (other) ecc in the same program call. # Read image with wrong ecc file and create new (other) ecc in the same program call.
# Tests whether CRC and ECC information is taken from the read process, # Tests whether CRC and ECC information is taken from the read process,
# not the wrong ecc file. # not the wrong ecc file.
# FIXME expected output not in database, disabling for now:
if try "read image with wrong ecc (RS01) and create new ecc" ecc_recreate_after_read_wrong_rs01; then if false && try "read image with wrong ecc (RS01) and create new ecc" ecc_recreate_after_read_wrong_rs01; then
cp $MASTERISO $SIMISO cp $MASTERISO $SIMISO
$NEWVER --debug -i$TMPISO --random-image $((ISOSIZE-777)) --random-seed 1337 >>$LOGFILE 2>&1 $NEWVER --debug -i$TMPISO --random-image $((ISOSIZE-777)) --random-seed 1337 >>$LOGFILE 2>&1
$NEWVER --regtest --debug --set-version $SETVERSION -i$TMPISO -e$TMPECC -c -n 8 >>$LOGFILE 2>&1 $NEWVER --regtest --debug --set-version $SETVERSION -i$TMPISO -e$TMPECC -c -n 8 >>$LOGFILE 2>&1
extra_args="--debug --set-version $SETVERSION --sim-cd=$SIMISO --fixed-speed-values" extra_args="--debug --set-version $SETVERSION --sim-cd=$SIMISO --fixed-speed-values"
#run_regtest ecc_recreate_after_read_wrong_rs01 "-r -c $REDUNDANCY --spinup-delay=0 -v" $TMPISO $TMPECC run_regtest ecc_recreate_after_read_wrong_rs01 "-r -c $REDUNDANCY --spinup-delay=0 -v" $TMPISO $TMPECC
fi fi
REGTEST_SECTION="Fixing tests" REGTEST_SECTION="Fixing tests"

View File

@@ -39,6 +39,27 @@ if ! file_exists $ISO_PLUS137; then
FILE_MSG="" FILE_MSG=""
fi fi
### Strip tests
REGTEST_SECTION="Strip tests"
# Strip ECC from an augmented image
if try "strip ECC from augmented image" strip_ecc; then
cp $MASTERISO $TMPISO
run_regtest strip_ecc "-v --strip" $TMPISO
fi
# Strip ECC from a non-augmented image
if try "strip ECC from a non-augmented image" strip_ecc_not; then
cp $MASTERISO $TMPISO
$NEWVER -i$TMPISO --strip >>$LOGFILE 2>&1
run_regtest strip_ecc_not "-v --strip" $TMPISO
fi
### Verification tests ### Verification tests
REGTEST_SECTION="Verify tests" REGTEST_SECTION="Verify tests"

View File

@@ -36,6 +36,27 @@ if ! file_exists $LARGEMASTERISO; then
FILE_MSG="" FILE_MSG=""
fi fi
### Strip tests
REGTEST_SECTION="Strip tests"
# Strip ECC from an augmented image
if try "strip ECC from augmented image" strip_ecc; then
cp $MASTERISO $TMPISO
run_regtest strip_ecc "-v --strip" $TMPISO
fi
# Strip ECC from a non-augmented image
if try "strip ECC from a non-augmented image" strip_ecc_not; then
cp $MASTERISO $TMPISO
$NEWVER -i$TMPISO --strip >>$LOGFILE 2>&1
run_regtest strip_ecc_not "-v --strip" $TMPISO
fi
### Verification tests ### Verification tests
REGTEST_SECTION="Verify tests" REGTEST_SECTION="Verify tests"

View File

@@ -67,6 +67,7 @@ typedef enum
MODE_SHOW_SECTOR, MODE_SHOW_SECTOR,
MODE_TRUNCATE, MODE_TRUNCATE,
MODE_ZERO_UNREADABLE, MODE_ZERO_UNREADABLE,
MODE_STRIP_ECC,
/* don't use the ascii range 32-127 so that we /* don't use the ascii range 32-127 so that we
avoid collision with the single-char options */ avoid collision with the single-char options */
@@ -280,6 +281,7 @@ int main(int argc, char *argv[])
{"sim-defects", 1, 0, MODIFIER_SIMULATE_DEFECTS}, {"sim-defects", 1, 0, MODIFIER_SIMULATE_DEFECTS},
{"speed-warning", 2, 0, MODIFIER_SPEED_WARNING}, {"speed-warning", 2, 0, MODIFIER_SPEED_WARNING},
{"spinup-delay", 1, 0, MODIFIER_SPINUP_DELAY}, {"spinup-delay", 1, 0, MODIFIER_SPINUP_DELAY},
{"strip", 0, 0, 'z'},
{"test", 2, 0, 't'}, {"test", 2, 0, 't'},
{"threads", 1, 0, 'x'}, {"threads", 1, 0, 'x'},
{"truncate", 2, 0, MODIFIER_TRUNCATE}, {"truncate", 2, 0, MODIFIER_TRUNCATE},
@@ -291,7 +293,7 @@ int main(int argc, char *argv[])
}; };
c = getopt_long(argc, argv, c = getopt_long(argc, argv,
"a:cd:e:fhi:j:lm::n:o:p:r::s::t::uvx:", "a:cd:e:fhi:j:lm::n:o:p:r::s::t::uvx:z",
long_options, &option_index); long_options, &option_index);
if(c == -1) break; if(c == -1) break;
@@ -395,6 +397,9 @@ int main(int argc, char *argv[])
if(Closure->codecThreads < 1 || Closure->codecThreads > MAX_CODEC_THREADS) if(Closure->codecThreads < 1 || Closure->codecThreads > MAX_CODEC_THREADS)
Stop(_("--threads must be 1..%d\n"), MAX_CODEC_THREADS); Stop(_("--threads must be 1..%d\n"), MAX_CODEC_THREADS);
break; break;
case 'z':
mode = MODE_STRIP_ECC;
break;
case 0 : break; /* flag argument */ case 0 : break; /* flag argument */
@@ -918,6 +923,10 @@ int main(int argc, char *argv[])
TruncateImageFile(debug_arg); TruncateImageFile(debug_arg);
break; break;
case MODE_STRIP_ECC:
StripECCFromImageFile();
break;
case MODE_ZERO_UNREADABLE: case MODE_ZERO_UNREADABLE:
ZeroUnreadable(); ZeroUnreadable();
break; break;
@@ -945,6 +954,7 @@ int main(int argc, char *argv[])
" dvdisaster -f,--fix # Try to fix medium image using .ecc information.\n" " dvdisaster -f,--fix # Try to fix medium image using .ecc information.\n"
" dvdisaster -s,--scan # Scan the medium for read errors.\n" " dvdisaster -s,--scan # Scan the medium for read errors.\n"
" dvdisaster -t,--test # Test integrity of the .iso and .ecc files.\n" " dvdisaster -t,--test # Test integrity of the .iso and .ecc files.\n"
" dvdisaster -z,--strip # Strip ECC data from an augmented .iso.\n"
" dvdisaster -u,--unlink # Delete .iso files (when other actions complete)\n\n")); " dvdisaster -u,--unlink # Delete .iso files (when other actions complete)\n\n"));
PrintCLI(_("Drive and file specification:\n" PrintCLI(_("Drive and file specification:\n"

View File

@@ -354,6 +354,7 @@ typedef struct _GlobalClosure
GtkWidget *scanButton; GtkWidget *scanButton;
GtkWidget *fixButton; GtkWidget *fixButton;
GtkWidget *testButton; GtkWidget *testButton;
GtkWidget *stripButton;
/*** The preferences window */ /*** The preferences window */
@@ -1012,7 +1013,8 @@ typedef enum
ACTION_VERIFY, /* VERIFY, CREATE and FIX have separate windows assigned */ ACTION_VERIFY, /* VERIFY, CREATE and FIX have separate windows assigned */
ACTION_CREATE, /* for each method. */ ACTION_CREATE, /* for each method. */
ACTION_CREATE_CONT, ACTION_CREATE_CONT,
ACTION_FIX ACTION_FIX,
ACTION_STRIP /* --- does not have a window */
} MajorActions; } MajorActions;
void CreateMainWindow(int*, char***); void CreateMainWindow(int*, char***);
@@ -1200,6 +1202,7 @@ void LockLabelSize(GtkLabel*, char*, ...) PRINTF_FORMAT(2);
int ConfirmImageDeletion(char *); int ConfirmImageDeletion(char *);
int ConfirmEccDeletion(char *); int ConfirmEccDeletion(char *);
void StripECCFromImageFile(void);
#ifndef WITH_CLI_ONLY_YES #ifndef WITH_CLI_ONLY_YES
/*** /***

View File

@@ -72,6 +72,7 @@ void CreateIconFactory()
create_icon(ifact, "dvdisaster-scan", dvdisaster_scan); create_icon(ifact, "dvdisaster-scan", dvdisaster_scan);
create_icon(ifact, "dvdisaster-fix", dvdisaster_fix); create_icon(ifact, "dvdisaster-fix", dvdisaster_fix);
create_icon(ifact, "dvdisaster-verify", dvdisaster_verify); create_icon(ifact, "dvdisaster-verify", dvdisaster_verify);
create_icon(ifact, "dvdisaster-strip", dvdisaster_strip);
/*** Stock GTK icons to defeat theming */ /*** Stock GTK icons to defeat theming */

View File

@@ -189,6 +189,11 @@ static void action_cb(GtkWidget *widget, gpointer data)
CreateGThread((GThreadFunc)ReadMediumLinear, (gpointer)1); CreateGThread((GThreadFunc)ReadMediumLinear, (gpointer)1);
break; break;
case ACTION_STRIP:
AllowActions(FALSE);
CreateGThread((GThreadFunc)StripECCFromImageFile, (gpointer)0);
break;
case ACTION_VERIFY: case ACTION_VERIFY:
/* If something is wrong with the .iso or .ecc files /* If something is wrong with the .iso or .ecc files
we fall back to the RS01 method for verifying since it is robust we fall back to the RS01 method for verifying since it is robust
@@ -315,6 +320,13 @@ static GtkWidget* create_action_bar(GtkNotebook *notebook)
gtk_box_pack_start(GTK_BOX(vbox), wid, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), wid, FALSE, FALSE, 0);
AttachTooltip(wid, _("tooltip|Consistency check"), _("Tests consistency of error correction data and image file.")); AttachTooltip(wid, _("tooltip|Consistency check"), _("Tests consistency of error correction data and image file."));
/*** Strip */
Closure->stripButton = wid = create_button(_("button|Strip"), "dvdisaster-strip");
g_signal_connect(G_OBJECT(wid), "clicked", G_CALLBACK(action_cb), (gpointer)ACTION_STRIP);
gtk_box_pack_start(GTK_BOX(vbox), wid, FALSE, FALSE, 0);
AttachTooltip(wid, _("tooltip|Strip ECC"), _("Strip ECC data from an augmented image."));
/*** Stop */ /*** Stop */
wid = create_button(_("button|Stop"), "dvdisaster-gtk-stop"); wid = create_button(_("button|Stop"), "dvdisaster-gtk-stop");

View File

@@ -822,6 +822,7 @@ static gboolean allow_actions_idle_func(gpointer data)
gtk_widget_set_sensitive(Closure->createButton, s); gtk_widget_set_sensitive(Closure->createButton, s);
gtk_widget_set_sensitive(Closure->fixButton, s); gtk_widget_set_sensitive(Closure->fixButton, s);
gtk_widget_set_sensitive(Closure->testButton, s); gtk_widget_set_sensitive(Closure->testButton, s);
gtk_widget_set_sensitive(Closure->stripButton, s);
gtk_widget_set_sensitive(Closure->prefsButton, s); gtk_widget_set_sensitive(Closure->prefsButton, s);
if(!s && Closure->prefsWindow) if(!s && Closure->prefsWindow)
@@ -1358,3 +1359,78 @@ int ConfirmEccDeletion(char *file)
#endif #endif
} }
/*
* --strip method and associated cleanup func
*/
static void stripecc_cleanup(gpointer data)
{
Image *image = (Image*)data;
UnregisterCleanup();
if (image)
CloseImage(image);
#ifndef WITH_CLI_ONLY_YES
if(Closure->guiMode)
{ AllowActions(TRUE);
g_thread_exit(0);
}
#endif
}
void StripECCFromImageFile()
{ Image *image = NULL;
gint64 end;
RegisterCleanup(_("Strip ECC aborted"), stripecc_cleanup, (gpointer)image);
/*** Open the image file */
image = OpenImageFromFile(Closure->imageName, O_RDWR, IMG_PERMS);
if(!image)
Stop(_("Can't open %s:\n%s"), Closure->imageName, strerror(errno));
if (!image->eccHeader)
Stop(_("Image is not augmented (no dvdisaster signature found)."));
PrintLog("Image is augmented (expected sectors = %" PRId64 ")\n", image->expectedSectors);
end = uchar_to_gint64(image->eccHeader->sectors);
if (end <= 0)
Stop(_("Invalid end data sector (%" PRId64 "), aborting"), end);
PrintLog(_("Truncating image to %" PRId64 " sectors.\n"), end);
/*** Last chance to cancel in GUI mode */
#ifndef WITH_CLI_ONLY_YES
if(Closure->guiMode)
{ int answer = ModalDialog(GTK_MESSAGE_QUESTION, GTK_BUTTONS_OK_CANCEL, NULL,
_("We're about to truncate the image from %" PRId64 " sectors (%" PRId64 " MiB)\n"
"to %" PRId64 " sectors (%" PRId64 " MiB), removing any dvdisaster-added ECC data.\n"
"This will restore the image to its pre-augmented original size."),
image->expectedSectors, image->expectedSectors >> 9, end, end >> 9);
/* >> 9 is 2048 bytes (1 sector) to MiB */
if (answer != 1)
Stop(_("Aborted on user request"));
}
#endif
/*** Truncate it. */
if(!LargeTruncate(image->file, (gint64)(2048*end)))
Stop(_("Could not truncate %s: %s\n"),Closure->imageName,strerror(errno));
PrintLog(_("Image successfully truncated back to its original size.\n"));
#ifndef WITH_CLI_ONLY_YES
ModalDialog(GTK_MESSAGE_INFO, GTK_BUTTONS_OK, NULL, _("Image successfully truncated"));
#endif
/*** Clean up */
stripecc_cleanup((gpointer)image);
}