Added : option -t
to test compressed files integrity
This commit is contained in:
parent
0068be94d8
commit
accfd80c37
@ -50,7 +50,6 @@
|
|||||||
/*-*************************************
|
/*-*************************************
|
||||||
* Common constants
|
* Common constants
|
||||||
***************************************/
|
***************************************/
|
||||||
#define ZSTD_MAGICNUMBER 0xFD2FB525 /* v0.5 */
|
|
||||||
#define ZSTD_DICT_MAGIC 0xEC30A435
|
#define ZSTD_DICT_MAGIC 0xEC30A435
|
||||||
|
|
||||||
#define KB *(1 <<10)
|
#define KB *(1 <<10)
|
||||||
|
@ -48,6 +48,12 @@ extern "C" {
|
|||||||
#include "mem.h"
|
#include "mem.h"
|
||||||
|
|
||||||
|
|
||||||
|
/*-*************************************
|
||||||
|
* Constants
|
||||||
|
***************************************/
|
||||||
|
#define ZSTD_MAGICNUMBER 0xFD2FB525 /* v0.5 */
|
||||||
|
|
||||||
|
|
||||||
/*-*************************************
|
/*-*************************************
|
||||||
* Types
|
* Types
|
||||||
***************************************/
|
***************************************/
|
||||||
|
@ -587,7 +587,10 @@ static int FIO_decompressSrcFile(dRess_t ress, const char* srcFileName)
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
#endif /* ZSTD_LEGACY_SUPPORT */
|
#endif /* ZSTD_LEGACY_SUPPORT */
|
||||||
|
if (MEM_readLE32(ress.srcBuffer) != ZSTD_MAGICNUMBER) {
|
||||||
|
DISPLAYLEVEL(1, "zstd: %s: not in zstd format \n", srcFileName);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
filesize += FIO_decompressFrame(ress, dstFile, srcFile, toRead);
|
filesize += FIO_decompressFrame(ress, dstFile, srcFile, toRead);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -648,12 +651,23 @@ int FIO_decompressMultipleFilenames(const char** srcNamesTable, unsigned nbFiles
|
|||||||
if (dstFileName==NULL) EXM_THROW(70, "not enough memory for dstFileName");
|
if (dstFileName==NULL) EXM_THROW(70, "not enough memory for dstFileName");
|
||||||
ress = FIO_createDResources(dictFileName);
|
ress = FIO_createDResources(dictFileName);
|
||||||
|
|
||||||
if (suffix) {
|
if (!strcmp(suffix, stdoutmark) || !strcmp(suffix, nulmark)) {
|
||||||
|
ress.dstFile = FIO_openDstFile(suffix);
|
||||||
|
if (ress.dstFile == 0) EXM_THROW(71, "cannot open %s", suffix);
|
||||||
|
for (u=0; u<nbFiles; u++)
|
||||||
|
missingFiles += FIO_decompressSrcFile(ress, srcNamesTable[u]);
|
||||||
|
if (fclose(ress.dstFile)) EXM_THROW(39, "Write error : cannot properly close %s", stdoutmark);
|
||||||
|
} else {
|
||||||
for (u=0; u<nbFiles; u++) { /* create dstFileName */
|
for (u=0; u<nbFiles; u++) { /* create dstFileName */
|
||||||
const char* srcFileName = srcNamesTable[u];
|
const char* srcFileName = srcNamesTable[u];
|
||||||
size_t sfnSize = strlen(srcFileName);
|
size_t sfnSize = strlen(srcFileName);
|
||||||
const char* suffixPtr = srcFileName + sfnSize - suffixSize;
|
const char* suffixPtr = srcFileName + sfnSize - suffixSize;
|
||||||
if (dfnSize <= sfnSize-suffixSize+1) { free(dstFileName); dfnSize = sfnSize + 20; dstFileName = (char*)malloc(dfnSize); if (dstFileName==NULL) EXM_THROW(71, "not enough memory for dstFileName"); }
|
if (dfnSize+suffixSize <= sfnSize+1) {
|
||||||
|
free(dstFileName);
|
||||||
|
dfnSize = sfnSize + 20;
|
||||||
|
dstFileName = (char*)malloc(dfnSize);
|
||||||
|
if (dstFileName==NULL) EXM_THROW(71, "not enough memory for dstFileName");
|
||||||
|
}
|
||||||
if (sfnSize <= suffixSize || strcmp(suffixPtr, suffix) != 0) {
|
if (sfnSize <= suffixSize || strcmp(suffixPtr, suffix) != 0) {
|
||||||
DISPLAYLEVEL(1, "zstd: %s: unknown suffix (%4s expected) -- ignored \n", srcFileName, suffix);
|
DISPLAYLEVEL(1, "zstd: %s: unknown suffix (%4s expected) -- ignored \n", srcFileName, suffix);
|
||||||
skippedFiles++;
|
skippedFiles++;
|
||||||
@ -663,15 +677,10 @@ int FIO_decompressMultipleFilenames(const char** srcNamesTable, unsigned nbFiles
|
|||||||
dstFileName[sfnSize-suffixSize] = '\0';
|
dstFileName[sfnSize-suffixSize] = '\0';
|
||||||
|
|
||||||
missingFiles += FIO_decompressFile_extRess(ress, dstFileName, srcFileName);
|
missingFiles += FIO_decompressFile_extRess(ress, dstFileName, srcFileName);
|
||||||
}
|
} }
|
||||||
} else {
|
|
||||||
ress.dstFile = stdout;
|
|
||||||
for (u=0; u<nbFiles; u++)
|
|
||||||
missingFiles += FIO_decompressSrcFile(ress, srcNamesTable[u]);
|
|
||||||
if (fclose(ress.dstFile)) EXM_THROW(39, "Write error : cannot properly close %s", stdoutmark);
|
|
||||||
}
|
|
||||||
|
|
||||||
FIO_freeDResources(ress);
|
FIO_freeDResources(ress);
|
||||||
free(dstFileName);
|
free(dstFileName);
|
||||||
return missingFiles + skippedFiles;
|
return missingFiles + skippedFiles;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -64,7 +64,6 @@ int FIO_decompressFilename (const char* outfilename, const char* infilename, con
|
|||||||
* Multiple File functions
|
* Multiple File functions
|
||||||
***************************************/
|
***************************************/
|
||||||
/** FIO_compressMultipleFilenames() :
|
/** FIO_compressMultipleFilenames() :
|
||||||
if `suffix == NULL`, output is stdout.
|
|
||||||
@return : nb of missing files */
|
@return : nb of missing files */
|
||||||
int FIO_compressMultipleFilenames(const char** srcNamesTable, unsigned nbFiles,
|
int FIO_compressMultipleFilenames(const char** srcNamesTable, unsigned nbFiles,
|
||||||
const char* suffix,
|
const char* suffix,
|
||||||
|
@ -115,7 +115,7 @@ static int usage(const char* programName)
|
|||||||
DISPLAY( " -# : # compression level (1-%u, default:1) \n", ZSTD_maxCLevel());
|
DISPLAY( " -# : # compression level (1-%u, default:1) \n", ZSTD_maxCLevel());
|
||||||
DISPLAY( " -d : decompression \n");
|
DISPLAY( " -d : decompression \n");
|
||||||
DISPLAY( " -D file: use `file` as Dictionary \n");
|
DISPLAY( " -D file: use `file` as Dictionary \n");
|
||||||
DISPLAY( " -o file: result stored into `file` (only possible if 1 input file) \n");
|
DISPLAY( " -o file: result stored into `file` (only if 1 input file) \n");
|
||||||
DISPLAY( " -f : overwrite output without prompting \n");
|
DISPLAY( " -f : overwrite output without prompting \n");
|
||||||
DISPLAY( " -h/-H : display help/long help and exit\n");
|
DISPLAY( " -h/-H : display help/long help and exit\n");
|
||||||
return 0;
|
return 0;
|
||||||
@ -128,6 +128,7 @@ static int usage_advanced(const char* programName)
|
|||||||
DISPLAY( "\n");
|
DISPLAY( "\n");
|
||||||
DISPLAY( "Advanced arguments :\n");
|
DISPLAY( "Advanced arguments :\n");
|
||||||
DISPLAY( " -V : display Version number and exit\n");
|
DISPLAY( " -V : display Version number and exit\n");
|
||||||
|
DISPLAY( " -t : test compressed file integrity \n");
|
||||||
DISPLAY( " -v : verbose mode\n");
|
DISPLAY( " -v : verbose mode\n");
|
||||||
DISPLAY( " -q : suppress warnings; specify twice to suppress errors too\n");
|
DISPLAY( " -q : suppress warnings; specify twice to suppress errors too\n");
|
||||||
DISPLAY( " -c : force write to standard output, even if it is the console\n");
|
DISPLAY( " -c : force write to standard output, even if it is the console\n");
|
||||||
@ -266,6 +267,9 @@ int main(int argCount, const char** argv)
|
|||||||
/* keep source file (default anyway, so useless; for gzip/xz compatibility) */
|
/* keep source file (default anyway, so useless; for gzip/xz compatibility) */
|
||||||
case 'k': argument++; break;
|
case 'k': argument++; break;
|
||||||
|
|
||||||
|
/* test compressed file */
|
||||||
|
case 't': decode=1; outFileName=nulmark; FIO_overwriteMode(); argument++; break;
|
||||||
|
|
||||||
/* dictionary name */
|
/* dictionary name */
|
||||||
case 'o': nextArgumentIsOutFileName=1; argument++; break;
|
case 'o': nextArgumentIsOutFileName=1; argument++; break;
|
||||||
|
|
||||||
@ -380,7 +384,7 @@ int main(int argCount, const char** argv)
|
|||||||
if (outFileName && !strcmp(outFileName, stdoutmark) && IS_CONSOLE(stdout) && !forceStdout) return badusage(programName);
|
if (outFileName && !strcmp(outFileName, stdoutmark) && IS_CONSOLE(stdout) && !forceStdout) return badusage(programName);
|
||||||
|
|
||||||
/* user-selected output filename, only possible with a single file */
|
/* user-selected output filename, only possible with a single file */
|
||||||
if (outFileName && strcmp(outFileName,stdoutmark) && (filenameIdx>1)) {
|
if (outFileName && strcmp(outFileName,stdoutmark) && strcmp(outFileName,nulmark) && (filenameIdx>1)) {
|
||||||
DISPLAY("Too many files (%u) on the command line. \n", filenameIdx);
|
DISPLAY("Too many files (%u) on the command line. \n", filenameIdx);
|
||||||
return filenameIdx;
|
return filenameIdx;
|
||||||
}
|
}
|
||||||
@ -395,12 +399,12 @@ int main(int argCount, const char** argv)
|
|||||||
if (filenameIdx==1 && outFileName)
|
if (filenameIdx==1 && outFileName)
|
||||||
operationResult = FIO_decompressFilename(outFileName, filenameTable[0], dictFileName);
|
operationResult = FIO_decompressFilename(outFileName, filenameTable[0], dictFileName);
|
||||||
else
|
else
|
||||||
operationResult = FIO_decompressMultipleFilenames(filenameTable, filenameIdx, forceStdout ? NULL : ZSTD_EXTENSION, dictFileName);
|
operationResult = FIO_decompressMultipleFilenames(filenameTable, filenameIdx, outFileName ? outFileName : ZSTD_EXTENSION, dictFileName);
|
||||||
} else { /* compression */
|
} else { /* compression */
|
||||||
if (filenameIdx==1 && outFileName)
|
if (filenameIdx==1 && outFileName)
|
||||||
operationResult = FIO_compressFilename(outFileName, filenameTable[0], dictFileName, cLevel);
|
operationResult = FIO_compressFilename(outFileName, filenameTable[0], dictFileName, cLevel);
|
||||||
else
|
else
|
||||||
operationResult = FIO_compressMultipleFilenames(filenameTable, filenameIdx, forceStdout ? NULL : ZSTD_EXTENSION, dictFileName, cLevel);
|
operationResult = FIO_compressMultipleFilenames(filenameTable, filenameIdx, outFileName ? outFileName : ZSTD_EXTENSION, dictFileName, cLevel);
|
||||||
}
|
}
|
||||||
|
|
||||||
_end:
|
_end:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user