diff --git a/programs/fileio.c b/programs/fileio.c index dc7636949..b1303a2ad 100644 --- a/programs/fileio.c +++ b/programs/fileio.c @@ -585,8 +585,6 @@ FIO_openDstFile(FIO_ctx_t* fCtx, FIO_prefs_t* const prefs, const char* srcFileName, const char* dstFileName, const int mode) { - int isDstRegFile; - if (prefs->testMode) return NULL; /* do not open file in test mode */ assert(dstFileName != NULL); @@ -606,16 +604,7 @@ FIO_openDstFile(FIO_ctx_t* fCtx, FIO_prefs_t* const prefs, return NULL; } - isDstRegFile = UTIL_isRegularFile(dstFileName); /* invoke once */ - if (prefs->sparseFileSupport == 1) { - prefs->sparseFileSupport = ZSTD_SPARSE_DEFAULT; - if (!isDstRegFile) { - prefs->sparseFileSupport = 0; - DISPLAYLEVEL(4, "Sparse File Support is disabled when output is not a file \n"); - } - } - - if (isDstRegFile) { + if (UTIL_isRegularFile(dstFileName)) { /* Check if destination file already exists */ #if !defined(_WIN32) /* this test does not work on Windows : @@ -658,6 +647,16 @@ FIO_openDstFile(FIO_ctx_t* fCtx, FIO_prefs_t* const prefs, f = fdopen(fd, "wb"); } #endif + + if (prefs->sparseFileSupport == 1) { + prefs->sparseFileSupport = ZSTD_SPARSE_DEFAULT; + /* Check regular file after opening with O_CREAT */ + if (!UTIL_isFdRegularFile(fd)) { + prefs->sparseFileSupport = 0; + DISPLAYLEVEL(4, "Sparse File Support is disabled when output is not a file \n"); + } + } + if (f == NULL) { if (UTIL_isFileDescriptorPipe(dstFileName)) { DISPLAYLEVEL(1, "zstd: error: no output specified (use -o or -c). \n"); diff --git a/programs/util.c b/programs/util.c index 94c40cc95..850bcacd2 100644 --- a/programs/util.c +++ b/programs/util.c @@ -197,6 +197,16 @@ int UTIL_stat(const char* filename, stat_t* statbuf) return UTIL_fstat(-1, filename, statbuf); } +int UTIL_isFdRegularFile(int fd) +{ + stat_t statbuf; + int ret; + UTIL_TRACE_CALL("UTIL_isFdRegularFile(%d)", fd); + ret = UTIL_fstat(fd, "", &statbuf) && UTIL_isRegularFileStat(&statbuf); + UTIL_TRACE_RET(ret); + return ret; +} + int UTIL_isRegularFile(const char* infilename) { stat_t statbuf; diff --git a/programs/util.h b/programs/util.h index 427bcf441..65e12633a 100644 --- a/programs/util.h +++ b/programs/util.h @@ -184,6 +184,7 @@ int UTIL_fchmod(const int fd, char const* filename, const stat_t* statbuf, mode_ * compute the needed information. */ +int UTIL_isFdRegularFile(int fd); int UTIL_isRegularFile(const char* infilename); int UTIL_isDirectory(const char* infilename); int UTIL_isSameFile(const char* file1, const char* file2);