Allowing named pipes to go through zstdcli
diff --git a/programs/fileio.c b/programs/fileio.c
index 8a45563..d45e4bb 100644
--- a/programs/fileio.c
+++ b/programs/fileio.c
@@ -513,7 +513,7 @@
return NULL;
}
- if (!UTIL_isRegularFile(srcFileName)) {
+ if (!UTIL_isRegularFile(srcFileName) && !UTIL_isFIFO(srcFileName)) {
DISPLAYLEVEL(1, "zstd: %s is not a regular file -- ignored \n",
srcFileName);
return NULL;
diff --git a/programs/util.c b/programs/util.c
index 3988295..5f97b1c 100644
--- a/programs/util.c
+++ b/programs/util.c
@@ -115,6 +115,19 @@
#endif
}
+U32 UTIL_isFIFO(const char* infilename)
+{
+/* macro guards, as defined in : https://linux.die.net/man/2/lstat */
+#if PLATFORM_POSIX_VERSION >= 200112L
+ stat_t statbuf;
+ int r = UTIL_getFileStat(infilename, &statbuf);
+ if (!r && S_ISFIFO(statbuf.st_mode)) return 1;
+#endif
+ (void)infilename;
+ return 0;
+}
+
+
U32 UTIL_isLink(const char* infilename)
{
/* macro guards, as defined in : https://linux.die.net/man/2/lstat */
diff --git a/programs/util.h b/programs/util.h
index 0080b63..3b15d94 100644
--- a/programs/util.h
+++ b/programs/util.h
@@ -135,6 +135,7 @@
int UTIL_getFileStat(const char* infilename, stat_t* statbuf);
int UTIL_isSameFile(const char* file1, const char* file2);
+U32 UTIL_isFIFO(const char* infilename);
U32 UTIL_isLink(const char* infilename);
#define UTIL_FILESIZE_UNKNOWN ((U64)(-1))
U64 UTIL_getFileSize(const char* infilename);
diff --git a/programs/zstdcli.c b/programs/zstdcli.c
index 98df728..7a0fa6a 100644
--- a/programs/zstdcli.c
+++ b/programs/zstdcli.c
@@ -992,7 +992,7 @@
if (!followLinks) {
unsigned u;
for (u=0, fileNamesNb=0; u<filenameIdx; u++) {
- if (UTIL_isLink(filenameTable[u])) {
+ if (UTIL_isLink(filenameTable[u]) && !UTIL_isFIFO(filenameTable[u])) {
DISPLAYLEVEL(2, "Warning : %s is a symbolic link, ignoring\n", filenameTable[u]);
} else {
filenameTable[fileNamesNb++] = filenameTable[u];