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);
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 :
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");
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;
* 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);