From 58b5aadb1fc5d937e81c8f33e0e8290f2097c6bb Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Mon, 18 May 2015 22:09:37 +0100 Subject: Fixed sparse issue with non seekable streams (#105) --- programs/Makefile | 5 ++++- programs/lz4cli.c | 2 +- programs/lz4io.c | 18 ++++++++++++------ 3 files changed, 17 insertions(+), 8 deletions(-) diff --git a/programs/Makefile b/programs/Makefile index 23cbc3d..7e04811 100644 --- a/programs/Makefile +++ b/programs/Makefile @@ -150,7 +150,7 @@ test-all: test test32 test-travis: $(TRAVIS_TARGET) test-lz4-sparse: lz4 datagen - @echo ---- test sparse file support ---- + @echo "\n ---- test sparse file support ----" ./datagen -g5M -P100 > tmpSrc ./lz4 -B4D tmpSrc | ./lz4 -dv --sparse > tmpB4 diff -s tmpSrc tmpB4 @@ -167,6 +167,9 @@ test-lz4-sparse: lz4 datagen ./datagen -s1 -g1200007 -P100 | diff -s - tmpOdd ls -ls tmpOdd @rm tmp* + @echo "\n Compatibility with Console :" + ./lz4 COPYING | ./lz4 -d -c + ./lz4 COPYING | ./lz4 -d | cat test-lz4-contentSize: lz4 datagen @echo ---- test original size support ---- diff --git a/programs/lz4cli.c b/programs/lz4cli.c index 970856d..65af428 100644 --- a/programs/lz4cli.c +++ b/programs/lz4cli.c @@ -473,7 +473,7 @@ int main(int argc, char** argv) if (multiple_inputs) input_filename = inFileNames[0], output_filename = (const char*)(inFileNames[0]); if(!input_filename) { input_filename=stdinmark; } - /* Check if input or output are defined as console; trigger an error in this case */ + /* Check if input is defined as console; trigger an error in this case */ if (!strcmp(input_filename, stdinmark) && IS_CONSOLE(stdin) ) badusage(); /* Check if benchmark is selected */ diff --git a/programs/lz4io.c b/programs/lz4io.c index 209f5ed..92f8706 100644 --- a/programs/lz4io.c +++ b/programs/lz4io.c @@ -303,6 +303,12 @@ static int LZ4IO_getFiles(const char* input_filename, const char* output_filenam if ( *pfoutput==0) EXM_THROW(13, "Pb opening %s", output_filename); + if (g_sparseFileSupport) + { + long int ftr = ftell(*pfoutput); + if (ftr==-1) g_sparseFileSupport = 0; + } + return 0; } @@ -639,7 +645,7 @@ static unsigned LZ4IO_fwriteSparse(FILE* file, const void* buffer, size_t buffer if (!g_sparseFileSupport) /* normal write */ { size_t sizeCheck = fwrite(buffer, 1, bufferSize, file); - if (sizeCheck != bufferSize) EXM_THROW(68, "Write error : cannot write decoded block"); + if (sizeCheck != bufferSize) EXM_THROW(70, "Write error : cannot write decoded block"); return 0; } @@ -647,7 +653,7 @@ static unsigned LZ4IO_fwriteSparse(FILE* file, const void* buffer, size_t buffer if (storedSkips > 1 GB) { int seekResult = fseek(file, 1 GB, SEEK_CUR); - if (seekResult != 0) EXM_THROW(68, "1 GB skip error (sparse file support)"); + if (seekResult != 0) EXM_THROW(71, "1 GB skip error (sparse file support)"); storedSkips -= 1 GB; } @@ -667,12 +673,12 @@ static unsigned LZ4IO_fwriteSparse(FILE* file, const void* buffer, size_t buffer { size_t sizeCheck; seekResult = fseek(file, storedSkips, SEEK_CUR); - if (seekResult) EXM_THROW(68, "Skip error (sparse file)"); + if (seekResult) EXM_THROW(72, "Skip error (sparse file)"); storedSkips = 0; seg0SizeT -= nb0T; ptrT += nb0T; sizeCheck = fwrite(ptrT, sizeT, seg0SizeT, file); - if (sizeCheck != seg0SizeT) EXM_THROW(68, "Write error : cannot write decoded block"); + if (sizeCheck != seg0SizeT) EXM_THROW(73, "Write error : cannot write decoded block"); } ptrT += seg0SizeT; } @@ -689,10 +695,10 @@ static unsigned LZ4IO_fwriteSparse(FILE* file, const void* buffer, size_t buffer { size_t sizeCheck; int seekResult = fseek(file, storedSkips, SEEK_CUR); - if (seekResult) EXM_THROW(68, "Skip error (end of block)"); + if (seekResult) EXM_THROW(74, "Skip error (end of block)"); storedSkips = 0; sizeCheck = fwrite(restPtr, 1, restEnd - restPtr, file); - if (sizeCheck != (size_t)(restEnd - restPtr)) EXM_THROW(68, "Write error : cannot write decoded end of block"); + if (sizeCheck != (size_t)(restEnd - restPtr)) EXM_THROW(75, "Write error : cannot write decoded end of block"); } } -- cgit v0.12