From e7fb4d151d104764e5e8f988c679fdff8807683e Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Mon, 16 Mar 2015 20:38:25 +0100 Subject: lz4 utility supports "pass-through" mode --- NEWS | 8 ++++++-- programs/Makefile | 2 ++ programs/lz4io.c | 35 +++++++++++++++++++++++++++++++++-- 3 files changed, 41 insertions(+), 4 deletions(-) diff --git a/NEWS b/NEWS index 6da779c..e721ca6 100644 --- a/NEWS +++ b/NEWS @@ -1,17 +1,21 @@ r128: New : lz4 cli sparse file support New : command -m, to compress multiple files in a single command -Fixed : Restored lz4hc compression ratio (slightly lower since r124) +Fixed : Restored lz4hc compression ratio (was slightly lower since r124) New : lz4frame supports skippable frames Changed:Default "make install" directory is /usr/local +New : lz4 cli supports "pass-through" mode New : g++ compatibility tests New : datagen can generate sparse files New : scan-build tests Fixed : Fuzzer + frametest compatibility with NetBSD (issue #48) Added : Visual project directory +r127: +N/A : added a file on SVN + r126: -New : lz4frame API is now integrated into liblz4 +New : lz4frame API is now integrated into liblz4 Fixed : GCC 4.9 bug on highest performance settings, reported by Greg Slazinski Fixed : bug within LZ4 HC streaming mode, reported by James Boyle Fixed : older compiler don't like nameless unions, reported by Cheyi Lin diff --git a/programs/Makefile b/programs/Makefile index ae38943..3fa2cfd 100644 --- a/programs/Makefile +++ b/programs/Makefile @@ -177,6 +177,8 @@ test-lz4: lz4 datagen ./datagen -g50M -P100 | diff -s - tmpB6 ./datagen -g50M -P100 | diff -s - tmpB7 @rm tmp* + @echo ---- test pass-through ---- + ./datagen | ./lz4 -dfvq > /dev/null test-lz4c: lz4c datagen diff --git a/programs/lz4io.c b/programs/lz4io.c index 34fbe10..13d1887 100644 --- a/programs/lz4io.c +++ b/programs/lz4io.c @@ -205,7 +205,7 @@ int LZ4IO_setNotificationLevel(int level) /* Default setting : 0 (disabled) */ int LZ4IO_setSparseFile(int enable) { - g_sparseFileSupport = enable; + g_sparseFileSupport = (enable!=0); return g_sparseFileSupport; } @@ -671,6 +671,28 @@ static unsigned long long decodeLZ4S(FILE* finput, FILE* foutput) } +static unsigned long long LZ4IO_passThrough(FILE* finput, FILE* foutput, unsigned char U32store[MAGICNUMBER_SIZE]) +{ + void* buffer = malloc(64 KB); + size_t read = 1, sizeCheck; + unsigned long long total = MAGICNUMBER_SIZE; + + sizeCheck = fwrite(U32store, 1, MAGICNUMBER_SIZE, foutput); + if (sizeCheck != MAGICNUMBER_SIZE) EXM_THROW(50, "Pass-through error at start"); + + while (read) + { + read = fread(buffer, 1, 64 KB, finput); + total += read; + sizeCheck = fwrite(buffer, 1, read, foutput); + if (sizeCheck != read) EXM_THROW(50, "Pass-through error"); + } + + free(buffer); + return total; +} + + #define ENDOFSTREAM ((unsigned long long)-1) static unsigned long long selectDecoder( FILE* finput, FILE* foutput) { @@ -678,6 +700,10 @@ static unsigned long long selectDecoder( FILE* finput, FILE* foutput) unsigned magicNumber, size; int errorNb; size_t nbReadBytes; + static unsigned nbCalls = 0; + + /* init */ + nbCalls++; /* Check Archive Header */ nbReadBytes = fread(U32store, 1, MAGICNUMBER_SIZE, finput); @@ -703,7 +729,12 @@ static unsigned long long selectDecoder( FILE* finput, FILE* foutput) return selectDecoder(finput, foutput); EXTENDED_FORMAT; default: - if (ftell(finput) == MAGICNUMBER_SIZE) EXM_THROW(44,"Unrecognized header : file cannot be decoded"); /* Wrong magic number at the beginning of 1st stream */ + if (nbCalls == 1) /* just started */ + { + if (g_overwrite) + return LZ4IO_passThrough(finput, foutput, U32store); + EXM_THROW(44,"Unrecognized header : file cannot be decoded"); /* Wrong magic number at the beginning of 1st stream */ + } DISPLAYLEVEL(2, "Stream followed by unrecognized data\n"); return ENDOFSTREAM; } -- cgit v0.12