From 00fc1ba8ddcfd9a0c1b9b32bf6da3978901c723e Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Sun, 1 Oct 2017 12:10:26 -0700 Subject: [PATCH] cli: add Ctrl-C support, requested by @mike155 in #854 Now, pressing Ctrl-C during compression or decompression will erase operation artefact (unfinished destination file) before leaving execution. --- programs/fileio.c | 36 ++++++++++++++++++++++++++++++++++++ programs/zstdcli.c | 1 + 2 files changed, 37 insertions(+) diff --git a/programs/fileio.c b/programs/fileio.c index 507cc5c6..83934bee 100644 --- a/programs/fileio.c +++ b/programs/fileio.c @@ -140,6 +140,21 @@ static clock_t g_time = 0; } } +/*-************************************ +* Signal (Ctrl-C trapping) +**************************************/ +#include + +const char* g_artefact = NULL; +void INThandler(int sig) +{ + signal(sig, SIG_IGN); + remove(g_artefact); + DISPLAY("\n"); + exit(1); +} + + /* ************************************************************ * Avoid fseek()'s 2GiB barrier with MSVC, MacOS, *BSD, MinGW ***************************************************************/ @@ -929,6 +944,14 @@ static int FIO_compressFilename_dstFile(cRess_t ress, ress.dstFile = FIO_openDstFile(dstFileName); if (ress.dstFile==NULL) return 1; /* could not open dstFileName */ + if (UTIL_isRegularFile(dstFileName)) { + g_artefact = dstFileName; + signal(SIGINT, INThandler); + } else { + g_artefact = NULL; + } + + if (strcmp (srcFileName, stdinmark) && UTIL_getFileStat(srcFileName, &statbuf)) stat_result = 1; result = FIO_compressFilename_srcFile(ress, dstFileName, srcFileName, compressionLevel); @@ -943,6 +966,9 @@ static int FIO_compressFilename_dstFile(cRess_t ress, } else if (strcmp (dstFileName, stdoutmark) && stat_result) UTIL_setFileStat(dstFileName, &statbuf); + + signal(SIGINT, SIG_DFL); + return result; } @@ -1629,6 +1655,13 @@ static int FIO_decompressDstFile(dRess_t ress, ress.dstFile = FIO_openDstFile(dstFileName); if (ress.dstFile==0) return 1; + if (UTIL_isRegularFile(dstFileName)) { + g_artefact = dstFileName; + signal(SIGINT, INThandler); + } else { + g_artefact = NULL; + } + if ( strcmp(srcFileName, stdinmark) && UTIL_getFileStat(srcFileName, &statbuf) ) stat_result = 1; @@ -1649,6 +1682,9 @@ static int FIO_decompressDstFile(dRess_t ress, && stat_result ) /* file permissions correctly extracted from src */ UTIL_setFileStat(dstFileName, &statbuf); /* transfer file permissions from src into dst */ } + + signal(SIGINT, SIG_DFL); + return result; } diff --git a/programs/zstdcli.c b/programs/zstdcli.c index 801dc448..3f836734 100644 --- a/programs/zstdcli.c +++ b/programs/zstdcli.c @@ -406,6 +406,7 @@ int main(int argCount, const char* argv[]) int cover = 1; #endif + /* init */ (void)recursive; (void)cLevelLast; /* not used when ZSTD_NOBENCH set */ (void)dictCLevel; (void)dictSelect; (void)dictID; (void)maxDictSize; /* not used when ZSTD_NODICT set */