Imported Upstream version 0.79.2

This commit is contained in:
Rogério Brito
2010-11-06 20:36:40 -02:00
parent 294f8623c4
commit 555c0daf7d
855 changed files with 28909 additions and 12770 deletions

View File

@@ -1,5 +1,5 @@
/* dvdisaster: Additional error correction for optical media.
* Copyright (C) 2004-2009 Carsten Gnoerlich.
* Copyright (C) 2004-2010 Carsten Gnoerlich.
* Project home page: http://www.dvdisaster.com
* Email: carsten@dvdisaster.com -or- cgnoerlich@fsfe.org
*
@@ -50,9 +50,9 @@ void CreateEcc(void)
void FixEcc(void)
{ Method *method;
/* Error handling is done within EccFileMethod() */
/* Error handling is done within EccMethod() */
method = EccFileMethod(TRUE);
method = EccMethod(TRUE);
/* Dispatch to the proper method */
@@ -60,7 +60,7 @@ void FixEcc(void)
}
/*
* Verfiy the image against ecc data
* Verifiy the image against ecc data
*/
void Verify(void)
@@ -70,13 +70,13 @@ void Verify(void)
we fall back to the RS01 method for comparing
since it is robust against missing files. */
if(!(method = EccFileMethod(FALSE)))
if(!(method = EccMethod(FALSE)))
if(!(method = FindMethod("RS01")))
Stop(_("RS01 method not available for comparing files."));
/* Dispatch to the proper method */
method->verify(method);
method->verify(method);
}
/*
@@ -99,7 +99,6 @@ typedef enum
MODE_CMP_IMAGES,
MODE_DEBUG_MAINT1,
MODE_ERASE,
MODE_LIST_ASPI,
MODE_MARKED_IMAGE,
MODE_MERGE_IMAGES,
MODE_RANDOM_ERR,
@@ -126,8 +125,8 @@ typedef enum
MODIFIER_FILL_UNREADABLE,
MODIFIER_IGNORE_FATAL_SENSE,
MODIFIER_INTERNAL_REREADS,
MODIFIER_QUERY_SIZE,
MODIFIER_NEW_DS_MARKER,
MODIFIER_OLD_DS_MARKER,
MODIFIER_PREFETCH_SECTORS,
MODIFIER_RANDOM_SEED,
MODIFIER_READ_ATTEMPTS,
MODIFIER_READ_MEDIUM,
@@ -137,7 +136,6 @@ typedef enum
MODIFIER_SIMULATE_DEFECTS,
MODIFIER_SPEED_WARNING,
MODIFIER_SPINUP_DELAY,
MODIFIER_SPLIT_FILES,
MODIFIER_TRUNCATE,
MODIFIER_VERSION,
} run_mode;
@@ -192,6 +190,34 @@ int main(int argc, char *argv[])
_independent_ of the actual locale! */
#ifdef WITH_NLS_YES
#if 0 //WIN_CONSOLE
/* We need to manually set the code page when running
in the console */
if(!g_getenv("OUTPUT_CHARSET")) /* User may override this */
{ gchar *unix_locale = g_win32_getlocale();
if(!strncmp(unix_locale, "cs", 2))
g_setenv("OUTPUT_CHARSET", "CP852", 1);
if(!strncmp(unix_locale, "de", 2))
g_setenv("OUTPUT_CHARSET", "CP850", 1);
if(!strncmp(unix_locale, "it", 2))
g_setenv("OUTPUT_CHARSET", "CP850", 1);
if(!strncmp(unix_locale, "pt_BR", 4))
g_setenv("OUTPUT_CHARSET", "CP850", 1);
if(!strncmp(unix_locale, "ru", 2))
g_setenv("OUTPUT_CHARSET", "CP855", 1);
if(!strncmp(unix_locale, "sv", 2))
g_setenv("OUTPUT_CHARSET", "CP850", 1);
}
#endif /* WIN_CONSOLE */
#ifdef SYS_MINGW
if(!g_getenv("LANG")) /* Unix style setting has precedence */
{ LANGID lang_id;
@@ -237,7 +263,7 @@ int main(int argc, char *argv[])
#ifdef WIN_CONSOLE
g_setenv("OUTPUT_CHARSET", "CP860", 1);
#else
g_setenv("OUTPUT_CHARSET", "CP1251", 1);
g_setenv("OUTPUT_CHARSET", "CP1252", 1);
#endif
}
break;
@@ -263,6 +289,7 @@ int main(int argc, char *argv[])
}
#endif /* SYS_MINGW */
/* This is necessary, but feels broken */
setlocale(LC_CTYPE, "");
setlocale(LC_MESSAGES, "");
textdomain("dvdisaster");
@@ -337,6 +364,7 @@ int main(int argc, char *argv[])
static struct option long_options[] =
{ {"adaptive-read", 0, 0, MODIFIER_ADAPTIVE_READ},
{"auto-suffix", 0, 0, MODIFIER_AUTO_SUFFIX},
{"assume", 1, 0, 'a'},
{"byteset", 1, 0, MODE_BYTESET },
{"copy-sector", 1, 0, MODE_COPY_SECTOR },
{"compare-images", 1, 0, MODE_CMP_IMAGES },
@@ -352,6 +380,7 @@ int main(int argc, char *argv[])
{"device", 0, 0, 'd'},
{"driver", 1, 0, MODIFIER_DRIVER },
{"ecc", 1, 0, 'e'},
{"ecc-target", 1, 0, 'o'},
{"eject", 0, 0, MODIFIER_EJECT },
{"erase", 1, 0, MODE_ERASE },
{"fill-unreadable", 1, 0, MODIFIER_FILL_UNREADABLE },
@@ -367,9 +396,9 @@ int main(int argc, char *argv[])
{"marked-image", 1, 0, MODE_MARKED_IMAGE },
{"merge-images", 1, 0, MODE_MERGE_IMAGES },
{"method", 2, 0, 'm' },
{"new-ds-marker", 0, 0, MODIFIER_NEW_DS_MARKER },
{"old-ds-marker", 0, 0, MODIFIER_OLD_DS_MARKER },
{"prefetch-sectors", 1, 0, MODIFIER_PREFETCH_SECTORS },
{"prefix", 1, 0, 'p'},
{"query-size", 1, 0, MODIFIER_QUERY_SIZE },
{"random-errors", 1, 0, MODE_RANDOM_ERR },
{"random-image", 1, 0, MODE_RANDOM_IMAGE },
{"random-seed", 1, 0, MODIFIER_RANDOM_SEED },
@@ -389,8 +418,7 @@ int main(int argc, char *argv[])
{"sim-defects", 1, 0, MODIFIER_SIMULATE_DEFECTS},
{"speed-warning", 2, 0, MODIFIER_SPEED_WARNING},
{"spinup-delay", 1, 0, MODIFIER_SPINUP_DELAY},
{"split-files", 0, 0, MODIFIER_SPLIT_FILES},
{"test", 0, 0, 't'},
{"test", 2, 0, 't'},
{"threads", 1, 0, 'x'},
{"truncate", 2, 0, MODIFIER_TRUNCATE},
{"unlink", 0, 0, 'u'},
@@ -401,23 +429,30 @@ int main(int argc, char *argv[])
};
c = getopt_long(argc, argv,
"cd:e:fhi:j:lm::n:p:r::s::tuvx:",
"a:cd:e:fhi:j:lm::n:o:p:r::s::t::uvx:",
long_options, &option_index);
if(c == -1) break;
switch(c)
{ case 'r': mode = MODE_SEQUENCE; sequence |= 1<<MODE_READ;
if(optarg) read_range = g_strdup(optarg);
break;
case 's': mode = MODE_SEQUENCE; sequence |= 1<<MODE_SCAN;
if(optarg) read_range = g_strdup(optarg);
break;
{ /* Mingw has not strcasestr() */
case 'a': if(strstr(optarg, "rs02") || strstr(optarg, "RS02"))
Closure->examineRS02 = TRUE;
if(strstr(optarg, "rs03") || strstr(optarg, "RS03"))
Closure->examineRS03 = TRUE;
break;
case 'c': mode = MODE_SEQUENCE; sequence |= 1<<MODE_CREATE; break;
case 'd': if(optarg)
{ g_free(Closure->device);
Closure->device = g_strdup(optarg);
break;
}
case 'e': if(optarg)
{ g_free(Closure->eccName);
Closure->eccName = g_strdup(optarg);
}
break;
case 'f': mode = MODE_SEQUENCE; sequence |= 1<<MODE_FIX; break;
case 't': mode = MODE_SEQUENCE; sequence |= 1<<MODE_VERIFY; break;
case 'u': Closure->unlinkImage = TRUE; break;
case 'h': mode = MODE_HELP; break;
case 'i': if(optarg)
{ g_free(Closure->imageName);
@@ -427,7 +462,6 @@ int main(int argc, char *argv[])
case 'j': if(optarg) Closure->sectorSkip = atoi(optarg) & ~0xf;
if(Closure->sectorSkip<0) Closure->sectorSkip = 0;
break;
case 'l': mode = MODE_LIST_ASPI; break;
case 'm': if(optarg && strlen(optarg) == 4)
{ g_free(Closure->methodName);
Closure->methodName = g_strdup(optarg);
@@ -445,10 +479,11 @@ int main(int argc, char *argv[])
else Closure->mediumSize = (gint64)atoll(optarg);
break;
}
case 'e': if(optarg)
{ g_free(Closure->eccName);
Closure->eccName = g_strdup(optarg);
}
case 'o': if(!strcmp(optarg, "file"))
Closure->eccTarget = ECC_FILE;
else if(!strcmp(optarg, "image"))
Closure->eccTarget = ECC_IMAGE;
else Stop(_("-o/--ecc-target expects 'file' or 'image'"));
break;
case 'p': if(optarg)
{ g_free(Closure->imageName);
@@ -459,14 +494,19 @@ int main(int argc, char *argv[])
g_sprintf(Closure->imageName,"%s.iso",optarg);
}
break;
case 'd': if(optarg)
{ g_free(Closure->device);
Closure->device = g_strdup(optarg);
break;
}
case 'v': Closure->verbose = TRUE;
break;
case 'r': mode = MODE_SEQUENCE; sequence |= 1<<MODE_READ;
if(optarg) read_range = g_strdup(optarg);
break;
case 's': mode = MODE_SEQUENCE; sequence |= 1<<MODE_SCAN;
if(optarg) read_range = g_strdup(optarg);
break;
case 'v': Closure->verbose = TRUE;
break;
case 't': mode = MODE_SEQUENCE; sequence |= 1<<MODE_VERIFY;
if(optarg) Closure->quickVerify = TRUE;
break;
case 'u': Closure->unlinkImage = TRUE; break;
case 'x': Closure->codecThreads = atoi(optarg);
if(Closure->codecThreads < 1 || Closure->codecThreads > MAX_CODEC_THREADS)
Stop(_("--threads must be 1..%d\n"), MAX_CODEC_THREADS);
@@ -543,15 +583,16 @@ int main(int argc, char *argv[])
}
}
break;
case MODIFIER_NEW_DS_MARKER:
Closure->dsmVersion = 1;
case MODIFIER_OLD_DS_MARKER:
Closure->dsmVersion = 0;
break;
case MODIFIER_QUERY_SIZE:
if(!strcmp(optarg, "drive")) Closure->querySize = 0;
else if(!strcmp(optarg, "udf")) Closure->querySize = 1;
else if(!strcmp(optarg, "ecc")) Closure->querySize = 2;
else Stop("--query-size requires one of these arguments: drive udf ecc\n");
break;
case MODIFIER_PREFETCH_SECTORS:
Closure->prefetchSectors = atoi(optarg);
if( Closure->prefetchSectors < 32
|| Closure->prefetchSectors > 8096)
Stop(_("--prefetch-sectors must be in range 32...8096"));
break;
case MODIFIER_RANDOM_SEED:
if(optarg) Closure->randomSeed = atoi(optarg);
break;
@@ -601,9 +642,6 @@ int main(int argc, char *argv[])
if(optarg) Closure->speedWarning = atoi(optarg);
else Closure->speedWarning=10;
break;
case MODIFIER_SPLIT_FILES:
Closure->splitFiles = 1;
break;
case MODIFIER_CLV_SPEED:
Closure->driveSpeed = atoi(optarg);
break;
@@ -848,10 +886,6 @@ int main(int argc, char *argv[])
break;
#ifdef SYS_MINGW
case MODE_LIST_ASPI:
ListAspiDrives();
break;
case MODE_SIGN:
WriteSignature();
exit(0);
@@ -886,62 +920,64 @@ int main(int argc, char *argv[])
" -d,--device device - read from given device (default: %s)\n"
" -p,--prefix prefix - prefix of .iso/.ecc file (default: medium.* )\n"
" -i,--image imagefile - name of image file (default: medium.iso)\n"
" -e,--ecc eccfile - name of parity file (default: medium.ecc)\n"),
Closure->device);
" -e,--ecc eccfile - name of parity file (default: medium.ecc)\n"
" -o,--ecc-target [file image] - where to put ecc data in RS03\n"),
Closure->device);
#ifdef SYS_MINGW
PrintCLI(_(" -l,--list - list drives available under ASPI manager\n\n"));
#else
PrintCLI("\n");
#endif
PrintCLI(_("Tweaking options (see manual before using!)\n"
" -j,--jump n - jump n sectors forward after a read error (default: 16)\n"
" -m n - list/select error correction methods (default: RS01)\n"
" -n,--redundancy n%% - error correction file redundancy (in percent), or\n"
" maximum error correction image size (in sectors)\n"
" -v,--verbose - more diagnostic messages\n"
// " -x, --threads n - use n threads for en-/decoding (if supported by codec)\n"
" --adaptive-read - use optimized strategy for reading damaged media\n"
" --auto-suffix - automatically add .iso and .ecc file suffixes\n"
" --cache-size n - image cache size in MB during -c mode (default: 32MB)\n"
" --dao - assume DAO disc; do not trim image end\n"
" --defective-dump d - directory for saving incomplete raw sectors\n"
" --eject - eject medium after successful read\n"
" --fill-unreadable n - fill unreadable sectors with byte n\n"
" --ignore-fatal-sense - continue reading after potentially fatal error conditon\n"
" --internal-rereads n - drive may attempt n rereads before reporting an error\n"
" --query-size n - query drive/udf/ecc for image size (default: ecc)\n"
" --raw-mode n - mode for raw reading CD media (20 or 21)\n"
" --read-attempts n-m - attempts n upto m reads of a defective sector\n"
" --read-medium n - read the whole medium up to n times\n"
" --read-raw - performs read in raw mode if possible\n"
" --speed-warning n - print warning if speed changes by more than n percent\n"
" --spinup-delay n - wait n seconds for drive to spin up\n"
" --split-files - split image into files <= 2GB\n\n"));
PrintCLI(_("Tweaking options (see manual before using!)\n"));
PrintCLI(_(" -a,--assume x,y,... - assume image is augmented with codec(s) x,y,...\n"));
PrintCLI(_(" -j,--jump n - jump n sectors forward after a read error (default: 16)\n"));
PrintCLI(_(" -m n - list/select error correction methods (default: RS01)\n"));
PrintCLI(_(" -n,--redundancy n%% - error correction file redundancy (in percent), or\n"
" maximum error correction image size (in sectors)\n"));
PrintCLI(_(" -v,--verbose - more diagnostic messages\n"));
PrintCLI(_(" -x,--threads n - use n threads for en-/decoding (if supported by codec)\n"));
PrintCLI(_(" --adaptive-read - use optimized strategy for reading damaged media\n"));
PrintCLI(_(" --auto-suffix - automatically add .iso and .ecc file suffixes\n"));
PrintCLI(_(" --cache-size n - image cache size in MB during -c mode (default: 32MB)\n"));
PrintCLI(_(" --dao - assume DAO disc; do not trim image end\n"));
PrintCLI(_(" --defective-dump d - directory for saving incomplete raw sectors\n"));
#ifdef SYS_LINUX
PrintCLI(_(" --driver=sg - use alternative sg driver (see man page!)\n"));
#endif
PrintCLI(_(" --eject - eject medium after successful read\n"));
PrintCLI(_(" --fill-unreadable n - fill unreadable sectors with byte n\n"));
PrintCLI(_(" --ignore-fatal-sense - continue reading after potentially fatal error conditon\n"));
PrintCLI(_(" --internal-rereads n - drive may attempt n rereads before reporting an error\n"));
PrintCLI(_(" --old-ds-marker - mark missing sectors compatible with dvdisaster <= 0.70\n"));
PrintCLI(_(" --prefetch-sectors n - prefetch n sectors for RS03 encoding (uses ~nMB)\n"));
PrintCLI(_(" --raw-mode n - mode for raw reading CD media (20 or 21)\n"));
PrintCLI(_(" --read-attempts n-m - attempts n upto m reads of a defective sector\n"));
PrintCLI(_(" --read-medium n - read the whole medium up to n times\n"));
PrintCLI(_(" --read-raw - performs read in raw mode if possible\n"));
PrintCLI(_(" --speed-warning n - print warning if speed changes by more than n percent\n"));
PrintCLI(_(" --spinup-delay n - wait n seconds for drive to spin up\n"));
if(Closure->debugMode)
{ PrintCLI(_("Debugging options (purposefully undocumented and possibly harmful)\n"
" --debug - enables the following options\n"
" --byteset s,i,b - set byte i in sector s to b\n"
" --cdump - creates C #include file dumps instead of hexdumps\n"
" --compare-images a,b - compare sectors in images a and b\n"
" --copy-sector a,n,b,m - copy sector n from image a to sector m in image b\n"
" --erase sector - erase the given sector\n"
" --erase n-m - erase sectors n - m, inclusively\n"
" --marked-image n - create image with n marked random sectors\n"
" --merge-images a,b merge image a with b (a receives sectors from b)\n"
" --random-errors r,e seed image with (correctable) random errors\n"
" --random-image n - create image with n sectors of random numbers\n"
" --random-seed n - random seed for built-in random number generator\n"
" --raw-sector n - shows hexdump of the given raw sector from medium in drive\n"
" --read-sector n - shows hexdump of the given sector from medium in drive\n"
" --screen-shot - useful for generating screen shots\n"
" --send-cdb arg - executes given cdb at drive; kills system if used wrong\n"
" --show-sector n - shows hexdump of the given sector in an image file\n"
" --sim-defects n - simulate n%% defective sectors on medium\n"
" --truncate n - truncates image to n sectors\n"
" --zero-unreadable - replace the \"unreadable sector\" markers with zeros\n\n"));
{ PrintCLI("\n");
PrintCLI(_("Debugging options (purposefully undocumented and possibly harmful)\n"));
PrintCLI(_(" --debug - enables the following options\n"));
PrintCLI(_(" --byteset s,i,b - set byte i in sector s to b\n"));
PrintCLI(_(" --cdump - creates C #include file dumps instead of hexdumps\n"));
PrintCLI(_(" --compare-images a,b - compare sectors in images a and b\n"));
PrintCLI(_(" --copy-sector a,n,b,m - copy sector n from image a to sector m in image b\n"));
PrintCLI(_(" --erase sector - erase the given sector\n"));
PrintCLI(_(" --erase n-m - erase sectors n - m, inclusively\n"));
PrintCLI(_(" --marked-image n - create image with n marked random sectors\n"));
PrintCLI(_(" --merge-images a,b merge image a with b (a receives sectors from b)\n"));
PrintCLI(_(" --random-errors r,e seed image with (correctable) random errors\n"));
PrintCLI(_(" --random-image n - create image with n sectors of random numbers\n"));
PrintCLI(_(" --random-seed n - random seed for built-in random number generator\n"));
PrintCLI(_(" --raw-sector n - shows hexdump of the given raw sector from medium in drive\n"));
PrintCLI(_(" --read-sector n - shows hexdump of the given sector from medium in drive\n"));
PrintCLI(_(" --screen-shot - useful for generating screen shots\n"));
PrintCLI(_(" --send-cdb arg - executes given cdb at drive; kills system if used wrong\n"));
PrintCLI(_(" --show-sector n - shows hexdump of the given sector in an image file\n"));
PrintCLI(_(" --sim-defects n - simulate n%% defective sectors on medium\n"));
PrintCLI(_(" --truncate n - truncates image to n sectors\n"));
PrintCLI(_(" --zero-unreadable - replace the \"unreadable sector\" markers with zeros\n\n"));
}
#ifdef WIN_CONSOLE